Python 自研审批流引擎,可根据封装的审批引擎接口对接各类表单!!

查看 110|回复 9
作者:Summer000   
这两个月给部门使用Django框架开发了一套内部人员使用的工作平台,想着可能很快就结束了,临到结束,领导要求增加两个调整申请审批单,需要有审批流,并且附带会签。可以自定义审批节点,本来想着找个开源的审批流引擎,发现市场上都是Activiti、Airflow、Zope之类的审批流引擎,引用起来还比较麻烦,不能很好的通过接口直接调用,比较烦人,索性自己开发了一套审批流引擎,暂且叫它MapFlow吧,为啥是Map呢,主要是配置很灵活,开箱即用。
      好了,言归正传,开始讲思路与功能点:
      首先,我需要使用一个类似于绘制前端动态图的方式绘制一张审批流程图,我需要保存当前绘制审批流程图的相关点位,对当前节点进行分类,是属于开始结束类还是步骤类,以及使用不同代码区分当前步骤节点,便于后期封装接口,这个后期再讲,上图:


f7ea199c07ac6ecf496e551fdada7be.png (39.02 KB, 下载次数: 0)
下载附件
2024-1-10 21:26 上传



2.png (43.58 KB, 下载次数: 0)
下载附件
2024-1-10 21:20 上传



3.png (50.33 KB, 下载次数: 0)
下载附件
2024-1-10 21:20 上传



4.png (26.18 KB, 下载次数: 0)
下载附件
2024-1-10 21:20 上传



5.png (22.34 KB, 下载次数: 0)
下载附件
2024-1-10 21:20 上传

  
呃,图片咋贴出来这么chou,先将就着看吧。。。
整个审批流引擎一共使用了12张表,包括两个完全不同的申请单,两个审批流审核,审批节点记录表,审批记录表等;
这个代码粘贴的太丑了,为啥不能直接上小方块呢?
[m_shl_code=python,true]    function init() {
        var $ = go.GraphObject.make;  // for conciseness in defining template
myDiagram =
            $(go.Diagram, "myDiagramDiv",  // must name or refer to the DIV HTML element
                {
                    "LinkDrawn": showLinkLabel,  // this DiagramEvent listener is defined below
                    "LinkRelinked": showLinkLabel,
                    "undoManager.isEnabled": true  // enable undo & redo
                });
        myDiagram.addDiagramListener("Modified", function(e) {
            var button = document.getElementById("SaveButton");
            if (button) button.disabled = !myDiagram.isModified;
            var idx = document.title.indexOf("*");
            if (myDiagram.isModified) {
                if (idx = 0) document.title = document.title.substr(0, idx);
            }
        });
        function nodeStyle() {
            return [
                new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
                {
                    locationSpot: go.Spot.Center
                }
            ];
        }
        function makePort(name, align, spot, output, input) {
            var horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
            return $(go.Shape,
                {
                    fill: "transparent",  // changed to a color in the mouseEnter event handler
                    strokeWidth: 0,  // no stroke
                    width: horizontal ? NaN : 8,  // if not stretching horizontally, just 8 wide
                    height: !horizontal ? NaN : 8,  // if not stretching vertically, just 8 tall
                    alignment: align,  // align the port on the main Shape
                    stretch: (horizontal ? go.GraphObject.Horizontal : go.GraphObject.Vertical),
                    portId: name,  // declare this object to be a "port"
                    fromSpot: spot,  // declare where links may connect at this port
                    fromLinkable: output,  // declare whether the user may draw links from here
                    toSpot: spot,  // declare where links may connect at this port
                    toLinkable: input,  // declare whether the user may draw links to here
                    cursor: "pointer",  // show a different cursor to indicate potential link point
                    mouseEnter: function(e, port) {  // the PORT argument will be this Shape
                        if (!e.diagram.isReadOnly) port.fill = "rgba(255,0,255,0.5)";
                    },
                    mouseLeave: function(e, port) {
                        port.fill = "transparent";
                    }
                });
        }
        function textStyle() {
            return {
                font: "bold 11pt Lato, Helvetica, Arial, sans-serif",
                stroke: "#F8F8F8"
            }
        }
        function makeButton(text, action, visiblePredicate) {
            return $("ContextMenuButton",
                $(go.TextBlock, text),
                { click: action },
                visiblePredicate ? new go.Binding("visible", "", function(o, e) { return o.diagram ? visiblePredicate(o, e) : false; }).ofObject() : {});
        }
        var myContextMenu =  $("ContextMenu",
            makeButton("✰配置✰",
                function(e, obj) {  // OBJ is this Button
                    var contextmenu = obj.part;  // the Button is in the context menu Adornment
                    var part = contextmenu.adornedPart;  // the adornedPart is the Part that the context menu adorns
                    if (part instanceof go.Link) alert(linkInfo(part.data));
                    else if (part instanceof go.Group) alert(groupInfo(contextmenu));
                    else nodeInfo(part.data);
                }),
function isInArray(arr,value){
            for(var i = 0; i

下载次数, 节点

知心   


Summer000 发表于 2024-1-10 21:24
咱论坛代码不好粘贴呀

[Python] 纯文本查看 复制代码
myDiagram =
    $(go.Diagram, "myDiagramDiv",  // must name or refer to the DIV HTML element
        {
            "LinkDrawn": showLinkLabel,  // this DiagramEvent listener is defined below
            "LinkRelinked": showLinkLabel,
            "undoManager.isEnabled": true  // enable undo & redo
        });
myDiagram.addDiagramListener("Modified", function(e) {
    var button = document.getElementById("SaveButton");
    if (button) button.disabled = !myDiagram.isModified;
    var idx = document.title.indexOf("*");
    if (myDiagram.isModified) {
        if (idx = 0) document.title = document.title.substr(0, idx);
    }
});
这还可以吧
青蛙考拉   

  File "", line 936, in exec_module
  File "", line 1074, in get_code
  File "", line 1004, in source_to_code
  File "", line 241, in _call_with_frames_removed
  File "C:\Users\1\PycharmProjects\djangoProject\djangoProject\urls.py", line 1
    [md]function init() {
IndentationError: unexpected indent
你确定你做的程序能跑?
Summer000
OP
  

咱论坛代码不好粘贴呀
blindcat   

学习学习,感谢分享
milu1123   

老大。有成品嘛?
15126819695   

主要是学习你的项目数据结构的啦     这个东西那几家收费的目前比较有优势
Summer000
OP
  


青蛙考拉 发表于 2024-1-10 21:43
File "", line 936, in exec_module
  File "", line 1074, in get_code
  File "", line 1004, in sou ...

必须能跑,代码贴的不全,抽空我会都放上去,
Summer000
OP
  


milu1123 发表于 2024-1-11 08:47
老大。有成品嘛?

必须有!!一种是直接内部调用审批流的,一种是对接系统封装的外部接口。
weilai8023   

大佬,有应用程序成品吗
您需要登录后才可以回帖 登录 | 立即注册

返回顶部