From c106cce63d27889807111bad4dbc6f89b738f716 Mon Sep 17 00:00:00 2001
From: jiazx0107 <jiazx0107@163.com>
Date: 星期二, 30 十二月 2025 20:45:34 +0800
Subject: [PATCH] 新增工单流程配置页面

---
 fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java                  |   89 +++
 fzzy-igdss-core/src/main/java/com/fzzy/work/domain/WorkOrderConf.java         |   80 +++
 fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java                 |    1 
 fzzy-igdss-web/src/main/resources/templates/work/flow-conf.html               |  359 +++++++++++++
 fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java           |   25 
 fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java     |   33 
 fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderConfService.java |   61 ++
 fzzy-igdss-core/src/main/java/com/fzzy/work/mapper/WorkOrderConfMapper.java   |   10 
 fzzy-igdss-view/src/main/java/com/fzzy/igds/InoutNoticeIn.view.xml            |    8 
 /dev/null                                                                     |   33 -
 fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java                   |    1 
 fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcess.view.xml              |    2 
 fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java             |   41 +
 fzzy-igdss-view/src/main/java/com/fzzy/igds/ConfByDept.view.xml               |   16 
 fzzy-igdss-web/src/main/resources/templates/test/flow.html                    |  499 +++++++++++++++++++
 fzzy-igdss-web/src/main/resources/d7/common.css                               |    2 
 fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderConf.view.xml            |  279 ++++++++++
 17 files changed, 1,483 insertions(+), 56 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java
new file mode 100644
index 0000000..12ff457
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/data/WorkBizType.java
@@ -0,0 +1,41 @@
+package com.fzzy.work.data;
+
+/**
+ * @Desc: 宸ュ崟涓氬姟鍒嗙被鏋氫妇绫�
+ * @Author: Andy.jia
+ * @Date: 2025/12/18
+ */
+public enum WorkBizType {
+
+    TYPE_10("10", "鍏ュ簱閫氱煡鍗曟祦绋�"),
+    TYPE_20("20", "鍑哄簱閫氱煡鍗曟祦绋�"),
+    TYPE_30("30", "AI浜嬩欢"),
+    TYPE_40("40", "棰勮/璀﹀憡"),
+    TYPE_99("99", "鍏朵粬");
+
+    private String code;
+    private String msg;
+
+    WorkBizType(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public static String getMsg(String code) {
+        if(null == code) return null;
+        if(WorkBizType.TYPE_10.getCode().equals(code)) return WorkBizType.TYPE_10.getMsg();
+        if(WorkBizType.TYPE_20.getCode().equals(code)) return WorkBizType.TYPE_20.getMsg();
+        if(WorkBizType.TYPE_30.getCode().equals(code)) return WorkBizType.TYPE_30.getMsg();
+        if(WorkBizType.TYPE_40.getCode().equals(code)) return WorkBizType.TYPE_40.getMsg();
+        if(WorkBizType.TYPE_99.getCode().equals(code)) return WorkBizType.TYPE_99.getMsg();
+        return code;
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/domain/WorkOrderConf.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/domain/WorkOrderConf.java
new file mode 100644
index 0000000..19c4fee
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/domain/WorkOrderConf.java
@@ -0,0 +1,80 @@
+package com.fzzy.work.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.domain.BizBaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * @Desc: 宸ュ崟閰嶇疆绫�
+ * @Author: Andy.jia
+ * @Date: 2025/12/29
+ */
+@Data
+@Entity
+@Table(name = "work_order_conf")
+@TableName("work_order_conf")
+@EqualsAndHashCode(callSuper = false)
+public class WorkOrderConf extends BizBaseEntity implements Serializable {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @Column(name = "id", columnDefinition = "varchar(40) COMMENT '涓婚敭'")
+    @TableId(value = "id", type = IdType.NONE)
+    @TableField("id")
+    private String id;
+
+    @Column(name = "dept_id", columnDefinition = "varchar(40) COMMENT '鎵�灞炲簱鍖�'")
+    @TableField("dept_id")
+    private String deptId;
+
+    @Column(name = "biz_type", columnDefinition = "varchar(20) COMMENT '涓氬姟鍒嗙被'")
+    @TableField("biz_type")
+    private String bizType;
+
+    @Column(name = "val_tag", columnDefinition = "varchar(2) COMMENT '鏄湁鍚敤'")
+    @TableField("val_tag")
+    private String valTag = Constant.YN_Y;
+
+    @Column(name = "node_name1", columnDefinition = "varchar(30) COMMENT '鑺傜偣鍚嶇О'")
+    @TableField("node_name1")
+    private String nodeName1 = "搴撳尯瀹℃壒";
+
+    @Column(name = "node_val1", columnDefinition = "varchar(2) COMMENT '鏄惁鏈夋晥'")
+    @TableField("node_val1")
+    private String nodeVal1 = Constant.YN_N;
+
+    @Column(name = "node_name2", columnDefinition = "varchar(30) COMMENT '鑺傜偣鍚嶇О'")
+    @TableField("node_name2")
+    private String nodeName2 = "鐩戠瀹℃壒";
+
+    @Column(name = "node_val2", columnDefinition = "varchar(2) COMMENT '鏄惁鏈夋晥'")
+    @TableField("node_val2")
+    private String nodeVal2 = Constant.YN_Y;
+
+    @Column(name = "node_name3", columnDefinition = "varchar(30) COMMENT '鑺傜偣鍚嶇О'")
+    @TableField("node_name3")
+    private String nodeName3 = "閾惰瀹℃壒";
+
+    @Column(name = "node_val3", columnDefinition = "varchar(2) COMMENT '鏄惁鏈夋晥'")
+    @TableField("node_val3")
+    private String nodeVal3 = Constant.YN_Y;
+
+    @Column(name = "remark", columnDefinition = "varchar(200) COMMENT '澶囨敞淇℃伅'")
+    @TableField("remark")
+    private String remark;
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/mapper/WorkOrderConfMapper.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/mapper/WorkOrderConfMapper.java
new file mode 100644
index 0000000..18cf887
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/mapper/WorkOrderConfMapper.java
@@ -0,0 +1,10 @@
+package com.fzzy.work.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fzzy.work.domain.WorkOrderConf;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface WorkOrderConfMapper extends BaseMapper<WorkOrderConf> {
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderConfService.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderConfService.java
new file mode 100644
index 0000000..2be2b13
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderConfService.java
@@ -0,0 +1,61 @@
+package com.fzzy.work.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fzzy.igds.data.BaseResp;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.work.domain.WorkOrderConf;
+import com.fzzy.work.mapper.WorkOrderConfMapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Desc:
+ * @Author: Andy.jia
+ * @Date: 2025/12/29
+ */
+@Service
+public class WorkOrderConfService {
+
+    @Resource
+    private WorkOrderConfMapper mapper;
+
+    public List<WorkOrderConf> queryList(String deptId) {
+        if (StringUtils.isEmpty(deptId)) return null;
+        QueryWrapper<WorkOrderConf> queryWrapper = new QueryWrapper<>();
+
+        queryWrapper.eq("dept_id", deptId);
+
+        return mapper.selectList(queryWrapper);
+    }
+
+
+    public WorkOrderConf selectById(String id) {
+        if (StringUtils.isEmpty(id)) return null;
+        return mapper.selectById(id);
+    }
+
+    public void insertConf(WorkOrderConf data) {
+        data.setId(ContextUtil.generateId());
+        data.setCreateBy(ContextUtil.getLoginUserName());
+        data.setCreateTime(new Date());
+        data.setUpdateBy(ContextUtil.getLoginUserName());
+        data.setUpdateTime(new Date());
+        if(null == data.getCompanyId()) data.setCompanyId(ContextUtil.getCompanyId());
+        mapper.insert(data);
+    }
+
+    public void updateConf(WorkOrderConf data) {
+        data.setUpdateBy(ContextUtil.getLoginUserName());
+        data.setUpdateTime(new Date());
+        mapper.updateById(data);
+    }
+
+    public BaseResp deleteConf(WorkOrderConf data) {
+        if (null == data.getId()) return BaseResp.success();
+        return mapper.deleteById(data.getId()) > 0 ? BaseResp.success() : BaseResp.error("鍒犻櫎澶辫触");
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java b/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java
index ab65b94..7ecf0f3 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/work/service/WorkOrderService.java
@@ -5,6 +5,7 @@
 import com.fzzy.igds.utils.ContextUtil;
 import com.fzzy.igds.utils.DateUtil;
 import com.fzzy.work.data.OrderStatus;
+import com.fzzy.work.data.WorkBizType;
 import com.fzzy.work.data.WorkOrderParam;
 import com.fzzy.work.domain.WorkOrder;
 import com.fzzy.work.mapper.WorkOrderMapper;
@@ -36,7 +37,7 @@
             param = new WorkOrderParam();
 
         }
-        if(null == param.getCompanyId())param.setCompanyId(ContextUtil.getCompanyId());
+        if (null == param.getCompanyId()) param.setCompanyId(ContextUtil.getCompanyId());
 
         queryWrapper.eq("company_id", param.getCompanyId());
 
@@ -45,23 +46,31 @@
         queryWrapper.like(null != param.getName(), "title", param.getName());
         queryWrapper.eq(null != param.getStatus(), "status", param.getStatus());
 
-        if(null != param.getStart()){
+        if (null != param.getStart()) {
             queryWrapper.gt("create_time", DateUtil.getNextZero(param.getStart()));
         }
-        if(null != param.getEnd()){
+        if (null != param.getEnd()) {
             queryWrapper.lt("create_time", DateUtil.getCurZero(param.getEnd()));
         }
 
         workOrderMapper.selectPage(page, queryWrapper);
     }
 
-	public List<SysDictData> triggerStatus() {
-		 List<SysDictData> list = new ArrayList<SysDictData>();
-	        for (OrderStatus w : OrderStatus.values()) {
-	            list.add(new SysDictData(w.getMsg(), w.getCode()));
-	        }
-	        return list;
-	}
+    public List<SysDictData> triggerStatus() {
+        List<SysDictData> list = new ArrayList<SysDictData>();
+        for (OrderStatus w : OrderStatus.values()) {
+            list.add(new SysDictData(w.getMsg(), w.getCode()));
+        }
+        return list;
+    }
+
+    public List<SysDictData> triggerType() {
+        List<SysDictData> list = new ArrayList<SysDictData>();
+        for (WorkBizType w : WorkBizType.values()) {
+            list.add(new SysDictData(w.getMsg(), w.getCode()));
+        }
+        return list;
+    }
 
     /**
      * 鑾峰彇鐢ㄦ埛寰呭鐞嗗伐鍗曟暟
@@ -72,7 +81,7 @@
     public Integer getNumByUser(String status, String userId) {
 
         QueryWrapper<WorkOrder> queryWrapper = new QueryWrapper<>();
-        if(StringUtils.isBlank(userId) || StringUtils.isBlank(status)){
+        if (StringUtils.isBlank(userId) || StringUtils.isBlank(status)) {
             return 0;
         }
 
@@ -81,4 +90,6 @@
 
         return workOrderMapper.selectCount(queryWrapper);
     }
+
+
 }
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/ConfByDept.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/ConfByDept.view.xml
index da119a6..d6c3de7 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/ConfByDept.view.xml
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/ConfByDept.view.xml
@@ -175,12 +175,26 @@
     }else{&#xD;
         $notify(&quot;璇峰厛閫夋嫨搴撳尯鈥︹��&quot;);&#xD;
     }
+};
+
+/**
+* 宸ュ崟閰嶇疆
+*/
+workOrderConf = function(){
+    var cur = view.get(&quot;#dgMain&quot;).get(&quot;selection&quot;);
+    if(cur){
+        var deptId = cur.get(&quot;id&quot;);
+        var url = &quot;/com.fzzy.work.WorkOrderConf.d?deptId=&quot;+ deptId;
+        window.$openTab(&quot;宸ュ崟閰嶇疆&quot;, url);
+    }else{
+        $notify(&quot;璇峰厛閫夋嫨搴撳尯鈥︹��&quot;);
+    }
 };&#xD;
 
 //鎿嶄綔&#xD;
 renderCell1 = function(arg,self){&#xD;
     var data = arg.data;&#xD;
-    var htm = &quot;&lt;a onClick='inoutConf()' class='a-btn1'>鍑哄叆搴撻厤缃�&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='snapConf()' class='a-btn2'>鎶撴媿閰嶇疆&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='patrolConf()' class='a-btn4'>宸℃閰嶇疆&lt;/a>&quot;;&#xD;
+    var htm = &quot;&lt;a onClick='inoutConf()' class='a-btn1'>鍑哄叆搴撻厤缃�&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='snapConf()' class='a-btn2'>鎶撴媿閰嶇疆&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='patrolConf()' class='a-btn4'>宸℃閰嶇疆&lt;/a>&amp;nbsp;|&amp;nbsp;&lt;a onClick='workOrderConf()' class='a-btn2'>宸ュ崟瀹℃壒&lt;/a>&quot;;&#xD;
     arg.dom.innerHTML = htm;&#xD;
 };&#xD;
 &#xD;</ClientEvent>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/InoutNoticeIn.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/InoutNoticeIn.view.xml
index 705e7c2..ae66b78 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/InoutNoticeIn.view.xml
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/InoutNoticeIn.view.xml
@@ -34,11 +34,11 @@
           <Property name="mapValues">
             <Collection>
               <Entity>
-                <Property name="name">搴撳尯閫氱煡鍗�</Property>
+                <Property name="name">搴撳尯鑷缓閫氱煡鍗�</Property>
                 <Property name="code">10</Property>
               </Entity>
               <Entity>
-                <Property name="name">鐩戠閫氱煡鍗�</Property>
+                <Property name="name">璐ㄦ娂鐩戠閫氱煡鍗�</Property>
                 <Property name="code">20</Property>
               </Entity>
             </Collection>
@@ -310,7 +310,7 @@
         </ToolBarButton>
       </ToolBar>
       <DataGrid id="dataGridMain" layoutConstraint="padding:8">
-        <ClientEvent name="onDataRowClick">view.get(&quot;#dataGridMain&quot;).set(&quot;selection&quot;,arg.data);</ClientEvent>
+        <ClientEvent name="onDataRowClick">self.set(&quot;selection&quot;,arg.data);</ClientEvent>
         <Property name="dataSet">dsMain</Property>
         <Property name="readOnly">true</Property>
         <Property name="selectionMode">singleRow</Property>
@@ -452,7 +452,7 @@
             <AutoFormElement>
               <Property name="name">type</Property>
               <Property name="property">type</Property>
-              <Property name="editorType">RadioGroup</Property>
+              <Property name="trigger">autoMappingDropDown1</Property>
               <Editor/>
             </AutoFormElement>
             <AutoFormElement>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java
index cee7d46..d08a1e0 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SelectDeptPR.java
@@ -7,7 +7,6 @@
 import com.fzzy.igds.service.CoreCompanyService;
 import com.fzzy.igds.service.CoreDeptService;
 import com.fzzy.igds.utils.ContextUtil;
-import com.ruoyi.common.config.FrameworkConfig;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import org.springframework.stereotype.Component;
 
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java
index dfb4143..2277682 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java
@@ -3,7 +3,6 @@
 import com.bstek.dorado.annotation.DataProvider;
 import com.bstek.dorado.annotation.DataResolver;
 import com.bstek.dorado.annotation.Expose;
-import com.fzzy.igds.data.BaseResp;
 import com.fzzy.igds.domain.SnapConf;
 import com.fzzy.igds.service.SnapConfService;
 import com.fzzy.igds.utils.ContextUtil;
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderConf.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderConf.view.xml
new file mode 100644
index 0000000..6bda731
--- /dev/null
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderConf.view.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewConfig>
+  <Arguments/>
+  <Context/>
+  <Model>
+    <DataType name="dtWorkConf">
+      <Property name="creationType">com.fzzy.work.domain.WorkOrderConf</Property>
+      <PropertyDef name="id">
+        <Property/>
+      </PropertyDef>
+      <PropertyDef name="deptId">
+        <Property/>
+        <Property name="label">鎵�灞炲簱鍖�</Property>
+        <Property name="required">true</Property>
+      </PropertyDef>
+      <PropertyDef name="bizType">
+        <Property/>
+        <Property name="label">涓氬姟绫诲瀷</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;workOrderPR#triggerType&quot;).getResult()}</Property>
+          <Property name="keyProperty">dictValue</Property>
+          <Property name="valueProperty">dictLabel</Property>
+        </Property>
+        <Property name="required">true</Property>
+      </PropertyDef>
+      <PropertyDef name="valTag">
+        <Property/>
+        <Property name="label">鍚敤娴佺▼</Property>
+        <Property name="mapping">
+          <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#triggerYN&quot;).getResult()}</Property>
+          <Property name="keyProperty">dictValue</Property>
+          <Property name="valueProperty">dictLabel</Property>
+        </Property>
+        <Property name="required">true</Property>
+      </PropertyDef>
+      <PropertyDef name="nodeName1">
+        <Property/>
+        <Property name="label">鑺傜偣鍚嶇О</Property>
+      </PropertyDef>
+      <PropertyDef name="nodeVal1">
+        <Property/>
+        <Property name="label">鏄惁鏈夋晥</Property>
+      </PropertyDef>
+      <PropertyDef name="nodeName2">
+        <Property/>
+        <Property name="label">鑺傜偣鍚嶇О</Property>
+      </PropertyDef>
+      <PropertyDef name="nodeVal2">
+        <Property/>
+        <Property name="label">鏄惁鏈夋晥</Property>
+      </PropertyDef>
+      <PropertyDef name="nodeName3">
+        <Property/>
+        <Property name="label">鑺傜偣鍚嶇О</Property>
+      </PropertyDef>
+      <PropertyDef name="nodeVal3">
+        <Property/>
+        <Property name="label">鏄惁鏈夋晥</Property>
+      </PropertyDef>
+      <PropertyDef name="remark">
+        <Property/>
+        <Property name="label">澶囨敞淇℃伅</Property>
+      </PropertyDef>
+      <PropertyDef name="companyId">
+        <Property/>
+      </PropertyDef>
+      <PropertyDef name="createBy">
+        <Property/>
+        <Property name="label">鍒涘缓浜�</Property>
+      </PropertyDef>
+      <PropertyDef name="createTime">
+        <Property name="dataType">DateTime</Property>
+        <Property name="label">鍒涘缓鏃堕棿</Property>
+      </PropertyDef>
+      <PropertyDef name="updateBy">
+        <Property/>
+        <Property name="label">淇敼浜�</Property>
+      </PropertyDef>
+      <PropertyDef name="updateTime">
+        <Property name="dataType">DateTime</Property>
+        <Property name="label">淇敼鏃堕棿</Property>
+      </PropertyDef>
+    </DataType>
+  </Model>
+  <View layout="padding:10">
+    <ClientEvent name="onReady">var deptId = &quot;${request.getParameter('deptId')}&quot;;&#xD;
+&#xD;
+query = function(){&#xD;
+    view.get(&quot;#dsMain&quot;).set(&quot;parameter&quot;,deptId).flushAsync();&#xD;
+}&#xD;
+query();&#xD;
+&#xD;
+&#xD;
+addData = function(){&#xD;
+	view.get(&quot;#dsMain&quot;).insert({&#xD;
+		deptId:deptId&#xD;
+	});&#xD;
+	&#xD;
+	//娴佺▼鍥�&#xD;
+	view.get(&quot;#iFrameFlow&quot;).set(&quot;path&quot;,&quot;work/flow-conf?id=&quot;)&#xD;
+	&#xD;
+	&#xD;
+	view.get(&quot;#dialogMain&quot;).show();&#xD;
+}&#xD;
+&#xD;
+showDetail = function(){&#xD;
+	var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
+	//娴佺▼鍥�&#xD;
+	view.get(&quot;#iFrameFlow&quot;).set(&quot;path&quot;,&quot;work/flow-conf?id=&quot;+cur.get(&quot;id&quot;));&#xD;
+	&#xD;
+	view.get(&quot;#dialogMain&quot;).show();&#xD;
+}&#xD;
+&#xD;
+//娴佺▼鍥句腑鑺傜偣鍚敤绂佺敤鐨勬柟娉�&#xD;
+onNodeValChange = function(nodes){&#xD;
+	if(!nodes) return;&#xD;
+	var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
+	nodes.forEach(function(node,index){&#xD;
+		if(&quot;node1&quot; == node.node){&#xD;
+			if(node.val){cur.set(&quot;nodeVal1&quot;,&quot;Y&quot;);} else{cur.set(&quot;nodeVal1&quot;,&quot;N&quot;);}&#xD;
+			cur.set(&quot;nodeName1&quot;,node.name);&#xD;
+		}&#xD;
+		if(&quot;node2&quot; == node.node){&#xD;
+			if(node.val){cur.set(&quot;nodeVal2&quot;,&quot;Y&quot;);} else{cur.set(&quot;nodeVal2&quot;,&quot;N&quot;);}&#xD;
+			cur.set(&quot;nodeName2&quot;,node.name);&#xD;
+		}&#xD;
+		if(&quot;node3&quot; == node.node){&#xD;
+			if(node.val){cur.set(&quot;nodeVal3&quot;,&quot;Y&quot;);} else{cur.set(&quot;nodeVal3&quot;,&quot;N&quot;);}&#xD;
+			cur.set(&quot;nodeName3&quot;,node.name);&#xD;
+		}&#xD;
+	});&#xD;
+}&#xD;
+</ClientEvent>
+    <Property name="packages">font-awesome,css-common</Property>
+    <DataSet id="dsMain">
+      <Property name="dataType">[dtWorkConf]</Property>
+      <Property name="dataProvider">workOrderPR#confList</Property>
+      <Property name="loadMode">manual</Property>
+    </DataSet>
+    <Container>
+      <Property name="className">c-data</Property>
+      <ToolBar>
+        <ToolBarButton>
+          <ClientEvent name="onClick">addData();</ClientEvent>
+          <Property name="caption">鏂板</Property>
+          <Property name="exClassName">btn1</Property>
+          <Property name="width">100</Property>
+          <Property name="iconClass">fa fa-plus</Property>
+        </ToolBarButton>
+        <ToolBarButton>
+          <ClientEvent name="onClick">showDetail();</ClientEvent>
+          <Property name="id">btnUpdate</Property>
+          <Property name="caption">淇敼</Property>
+          <Property name="exClassName">btn2</Property>
+          <Property name="width">100</Property>
+          <Property name="iconClass">fa fa-pencil-square-o</Property>
+        </ToolBarButton>
+        <ToolBarButton>
+          <ClientEvent name="onClick">var data = view.get(&quot;#dsMian.data:#&quot;);
+if (!data) {
+	$alert(&quot;璇烽�夋嫨鏁版嵁&quot;);
+	return;
+}
+view.get(&quot;#ajaxDelData&quot;).set(&quot;parameter&quot;, data).execute(function(result){
+	if(&quot;200&quot;!=result.respCode){
+		$alert(&quot;寮傚父淇℃伅锛�&quot;+result.respMsg);
+	}else{
+		$notify(&quot;鎵ц鎴愬姛&quot;);
+        query();
+	}
+});</ClientEvent>
+          <Property name="caption">鍒犻櫎</Property>
+          <Property name="exClassName">btn3</Property>
+          <Property name="width">100</Property>
+          <Property name="iconClass">fa fa-times</Property>
+        </ToolBarButton>
+      </ToolBar>
+      <DataGrid id="dgMain" layoutConstraint="padding:8" selectionMode="singleRow">
+        <ClientEvent name="onDataRowClick">self.set(&quot;selection&quot;, arg.data)</ClientEvent>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="readOnly">true</Property>
+        <RowSelectorColumn/>
+        <RowNumColumn/>
+        <DataColumn name="deptId">
+          <Property name="property">deptId</Property>
+        </DataColumn>
+        <DataColumn name="bizType">
+          <Property name="property">bizType</Property>
+        </DataColumn>
+        <DataColumn name="valTag">
+          <Property name="property">valTag</Property>
+        </DataColumn>
+        <DataColumn name="updateBy">
+          <Property name="property">updateBy</Property>
+        </DataColumn>
+        <DataColumn name="updateTime">
+          <Property name="property">updateTime</Property>
+        </DataColumn>
+        <DataColumn name="remark">
+          <Property name="property">remark</Property>
+        </DataColumn>
+      </DataGrid>
+    </Container>
+    <Dialog id="dialogMain">
+      <Property name="width">1100</Property>
+      <Property name="caption">宸ュ崟瀹℃牳閰嶇疆</Property>
+      <Property name="closeable">false</Property>
+      <Property name="iconClass">fa fa-tasks</Property>
+      <Buttons>
+        <Button>
+          <ClientEvent name="onClick">view.get(&quot;#saveAction&quot;).execute(function(){&#xD;
+	self.get(&quot;parent&quot;).hide();&#xD;
+});</ClientEvent>
+          <Property name="caption">淇濆瓨</Property>
+          <Property name="iconClass">fa fa-check-circle</Property>
+          <Property name="exClassName">btn1</Property>
+          <Property name="width">120</Property>
+        </Button>
+        <Button>
+          <ClientEvent name="onClick">view.get(&quot;#dsMain.data:#&quot;).cancel();&#xD;
+self.get(&quot;parent&quot;).hide();</ClientEvent>
+          <Property name="caption">鍙栨秷</Property>
+          <Property name="exClassName">btn3</Property>
+          <Property name="iconClass">fa fa-times-circle</Property>
+          <Property name="width">120</Property>
+        </Button>
+      </Buttons>
+      <Children>
+        <Container>
+          <AutoForm layoutConstraint="padding:10">
+            <Property name="cols">*,*,*</Property>
+            <Property name="dataSet">dsMain</Property>
+            <Property name="labelSeparator">锛�</Property>
+            <Property name="labelAlign">right</Property>
+            <Property name="labelWidth">120</Property>
+            <AutoFormElement>
+              <Property name="name">deptId</Property>
+              <Property name="property">deptId</Property>
+              <Editor/>
+            </AutoFormElement>
+            <AutoFormElement>
+              <Property name="name">bizType</Property>
+              <Property name="property">bizType</Property>
+              <Editor/>
+            </AutoFormElement>
+            <AutoFormElement>
+              <Property name="name">valTag</Property>
+              <Property name="property">valTag</Property>
+              <Editor/>
+            </AutoFormElement>
+            <AutoFormElement layoutConstraint="colSpan:3">
+              <Property name="name">remark</Property>
+              <Property name="property">remark</Property>
+              <Property name="editorType">TextArea</Property>
+              <Editor/>
+            </AutoFormElement>
+          </AutoForm>
+        </Container>
+        <IFrame id="iFrameFlow">
+          <Property name="path">work/flow-conf</Property>
+          <Property name="height">280</Property>
+          <Property name="width">100%</Property>
+        </IFrame>
+      </Children>
+      <Tools/>
+    </Dialog>
+    <UpdateAction id="saveAction">
+      <Property name="dataResolver">workOrderPR#saveConf</Property>
+      <UpdateItem>
+        <Property name="dataSet">dsMain</Property>
+        <Property name="dataPath">[#current]</Property>
+      </UpdateItem>
+    </UpdateAction>
+    <AjaxAction id="ajaxDelData">
+      <Property name="confirmMessage">纭畾瑕佸垹闄ゆ暟鎹箞锛�</Property>
+      <Property name="service">workOrderPR#delConf</Property>
+    </AjaxAction>
+  </View>
+</ViewConfig>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java
index 5e57c5f..0c1f823 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkOrderPR.java
@@ -1,14 +1,22 @@
 package com.fzzy.work;
 
 import com.bstek.dorado.annotation.DataProvider;
+import com.bstek.dorado.annotation.DataResolver;
+import com.bstek.dorado.annotation.Expose;
 import com.bstek.dorado.data.provider.Page;
+import com.fzzy.igds.data.BaseResp;
 import com.fzzy.igds.utils.ContextUtil;
 import com.fzzy.work.data.OrderStatus;
 import com.fzzy.work.domain.WorkOrder;
 import com.fzzy.work.data.WorkOrderParam;
+import com.fzzy.work.domain.WorkOrderConf;
+import com.fzzy.work.domain.WorkOrderProcess;
+import com.fzzy.work.service.WorkOrderConfService;
+import com.fzzy.work.service.WorkOrderProcessService;
 import com.fzzy.work.service.WorkOrderService;
 import com.ruoyi.common.core.domain.entity.SysDictData;
 
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -25,7 +33,10 @@
 
     @Resource
     private WorkOrderService workOrderService;
-
+    @Resource
+    private WorkOrderProcessService workOrderProcessService;
+    @Resource
+    private WorkOrderConfService workOrderConfService;
 
     /**
      *
@@ -71,8 +82,8 @@
         page.setEntities(corePage.getRecords());
         page.setEntityCount(Integer.parseInt(String.valueOf(corePage.getTotal())));
     }
-    
-    
+
+
     /**
      * 宸ュ崟鐘舵��
      * ${dorado.getDataProvider("workOrderPR#triggerStatus").getResult()}
@@ -83,4 +94,76 @@
     public List<SysDictData> triggerStatus() {
         return workOrderService.triggerStatus();
     }
+
+
+    //--------------------宸ュ崟瀹℃壒鍘嗗彶淇℃伅鏌ヨ--------------------
+
+    /**
+     *
+     * workOrderPR#processList
+     * 淇℃伅鍒楄〃
+     * @param orderId 宸ュ崟ID
+     */
+    @DataProvider
+    public List<WorkOrderProcess> processList(String orderId) {
+        return workOrderProcessService.queryList(orderId);
+    }
+
+
+    //--------------------宸ュ崟瀹℃壒閰嶇疆淇℃伅绠$悊--------------------
+
+    /**
+     *
+     * workOrderPR#confList
+     * 淇℃伅鍒楄〃
+     *
+     */
+    @DataProvider
+    public List<WorkOrderConf> confList(String deptId) {
+        return workOrderConfService.queryList(deptId);
+    }
+
+    /**
+     *
+     * workOrderPR#saveConf
+     * 淇℃伅鍒楄〃
+     *
+     */
+    @DataResolver
+    public void saveConf(WorkOrderConf data) {
+
+        WorkOrderConf newData = new WorkOrderConf();
+        BeanUtils.copyProperties(data, newData);
+
+        if (null == data.getId()) {
+            workOrderConfService.insertConf(newData);
+        } else {
+            workOrderConfService.updateConf(newData);
+        }
+    }
+
+
+    /**
+     *
+     * workOrderPR#deleteConf
+     * 淇℃伅鍒楄〃
+     *
+     */
+    @Expose
+    public BaseResp deleteConf(WorkOrderConf data) {
+        WorkOrderConf newData = new WorkOrderConf();
+        BeanUtils.copyProperties(data, newData);
+        return workOrderConfService.deleteConf(newData);
+    }
+
+    /**
+     * 宸ュ崟涓氬姟绫诲瀷
+     * ${dorado.getDataProvider("workOrderPR#triggerType").getResult()}
+     *
+     * @return
+     */
+    @DataProvider
+    public List<SysDictData> triggerType() {
+        return workOrderService.triggerType();
+    }
 }
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcess.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcess.view.xml
index d48f32c..0180f88 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcess.view.xml
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcess.view.xml
@@ -37,7 +37,7 @@
     <DataSet id="dsMain">
       <ClientEvent name="onLoadData">$notify(&quot;鏁版嵁鍔犺浇瀹屾垚鈥︹��&quot;);</ClientEvent>
       <Property name="dataType">[dtMain]</Property>
-      <Property name="dataProvider">workProcessPR#queryList</Property>
+      <Property name="dataProvider">workOrderPR#processList</Property>
       <Property name="parameter">${request.getParameter('orderId')}</Property>
     </DataSet>
     <Container>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcessPR.java b/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcessPR.java
deleted file mode 100644
index 7d66ca6..0000000
--- a/fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcessPR.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.fzzy.work;
-
-import com.bstek.dorado.annotation.DataProvider;
-import com.fzzy.work.domain.WorkOrderProcess;
-import com.fzzy.work.service.WorkOrderProcessService;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import java.util.List;
-
-/**
- * @Desc: 宸ュ崟绠$悊
- * @Author: Andy.jia
- * @Date: 2025/12/19
- */
-@Component
-public class WorkProcessPR {
-
-    @Resource
-    private WorkOrderProcessService service;
-
-
-    /**
-     *
-     * workProcessPR#queryList
-     * 鍒嗛〉鏌ヨ
-     * @param orderId 宸ュ崟ID
-     */
-    @DataProvider
-    public List<WorkOrderProcess> queryList(String orderId) {
-        return service.queryList(orderId);
-    }
-}
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java b/fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java
index 882513a..dce8891 100644
--- a/fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/work/WorkOrderController.java
@@ -1,10 +1,15 @@
 package com.fzzy.work;
 
+import com.fzzy.work.domain.WorkOrderConf;
+import com.fzzy.work.service.WorkOrderConfService;
 import com.ruoyi.common.core.controller.BaseController;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.annotation.Resource;
 
 /**
  * 宸ュ崟绠$悊
@@ -13,7 +18,11 @@
 @RequestMapping("/work")
 public class WorkOrderController extends BaseController {
 
+
     private static final String prefix = "work";
+
+    @Resource
+    private WorkOrderConfService workOrderConfService;
 
 
     /**
@@ -36,4 +45,20 @@
 
         return prefix + "/no-business";
     }
+
+    /**
+     * 鏍规嵁閰嶇疆ID 鑾峰彇鍒伴厤缃俊鎭�
+     * 宸ュ崟娴佺▼鍥鹃厤缃�
+     *
+     */
+    @GetMapping("/flow-conf")
+    public String noBusiness(@RequestParam("id") String id, ModelMap mmap) {
+
+        WorkOrderConf conf = workOrderConfService.selectById(id);
+        if (null == conf) conf = new WorkOrderConf();
+
+        mmap.put("data", conf);
+
+        return prefix + "/flow-conf";
+    }
 }
diff --git a/fzzy-igdss-web/src/main/resources/d7/common.css b/fzzy-igdss-web/src/main/resources/d7/common.css
index d8cfc10..1e89904 100644
--- a/fzzy-igdss-web/src/main/resources/d7/common.css
+++ b/fzzy-igdss-web/src/main/resources/d7/common.css
@@ -329,7 +329,7 @@
 
 /**琛ㄥ崟TITLE**/
 .f-title{
-    font: bold 30px Arial, sans-serif;
+    font: bold 30px Georgia, serif;
     text-align: center;
 }
 .bar-title {
diff --git a/fzzy-igdss-web/src/main/resources/templates/test/flow.html b/fzzy-igdss-web/src/main/resources/templates/test/flow.html
new file mode 100644
index 0000000..e417447
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/test/flow.html
@@ -0,0 +1,499 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>娴佺▼鑺傜偣閰嶇疆</title>
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
+        }
+
+        body {
+            background-color: #f5f7fa;
+            color: #333;
+            line-height: 1.6;
+            padding: 20px;
+            min-height: 100vh;
+        }
+        .container {
+            max-width: 1000px;
+            margin: 0 auto;
+            padding: 30px;
+            background-color: white;
+            border-radius: 12px;
+            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
+        }
+        header {
+            text-align: center;
+            margin-bottom: 40px;
+        }
+
+        h1 {
+            color: #2c3e50;
+            margin-bottom: 10px;
+            font-size: 28px;
+        }
+
+        .description {
+            color: #7f8c8d;
+            max-width: 600px;
+            margin: 0 auto;
+        }
+
+        .process-container {
+            position: relative;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin-bottom: 60px;
+        }
+
+        /* 杩炴帴绾� */
+        .process-line {
+            position: absolute;
+            top: 40px;
+            left: 80px;
+            right: 80px;
+            height: 4px;
+            background-color: #e0e0e0;
+            z-index: 1;
+        }
+
+        .process-line.active {
+            background-color: #3498db;
+        }
+
+        .node {
+            position: relative;
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            width: 120px;
+            z-index: 2;
+        }
+
+        .node-indicator {
+            width: 80px;
+            height: 80px;
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 20px;
+            font-weight: bold;
+            color: white;
+            margin-bottom: 15px;
+            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+            transition: all 0.3s ease;
+            cursor: pointer;
+        }
+
+        .node-indicator.start {
+            background: linear-gradient(135deg, #1abc9c, #16a085);
+        }
+
+        .node-indicator.manager {
+            background: linear-gradient(135deg, #3498db, #2980b9);
+        }
+
+        .node-indicator.leader {
+            background: linear-gradient(135deg, #9b59b6, #8e44ad);
+        }
+
+        .node-indicator.group {
+            background: linear-gradient(135deg, #e67e22, #d35400);
+        }
+
+        .node-indicator.end {
+            background: linear-gradient(135deg, #e74c3c, #c0392b);
+        }
+
+        .node-indicator.disabled {
+            background: #bdc3c7;
+            transform: scale(0.9);
+            opacity: 0.7;
+        }
+
+        .node-label {
+            font-weight: 600;
+            margin-bottom: 8px;
+            color: #2c3e50;
+            text-align: center;
+        }
+
+        .toggle-container {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+
+        /* 鍒囨崲寮�鍏虫牱寮� */
+        .toggle-switch {
+            position: relative;
+            display: inline-block;
+            width: 50px;
+            height: 24px;
+        }
+
+        .toggle-switch input {
+            opacity: 0;
+            width: 0;
+            height: 0;
+        }
+
+        .toggle-slider {
+            position: absolute;
+            cursor: pointer;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            background-color: #ccc;
+            transition: .4s;
+            border-radius: 24px;
+        }
+
+        .toggle-slider:before {
+            position: absolute;
+            content: "";
+            height: 18px;
+            width: 18px;
+            left: 3px;
+            bottom: 3px;
+            background-color: white;
+            transition: .4s;
+            border-radius: 50%;
+        }
+
+        input:checked + .toggle-slider {
+            background-color: #2ecc71;
+        }
+
+        input:checked + .toggle-slider:before {
+            transform: translateX(26px);
+        }
+
+        .toggle-label {
+            margin-left: 8px;
+            font-size: 14px;
+            color: #7f8c8d;
+        }
+
+        .toggle-label.active {
+            color: #2ecc71;
+            font-weight: 600;
+        }
+
+        .toggle-label.inactive {
+            color: #e74c3c;
+        }
+
+        .controls {
+            display: flex;
+            justify-content: center;
+            gap: 20px;
+            margin-top: 40px;
+            padding-top: 30px;
+            border-top: 1px solid #eee;
+        }
+
+        .btn {
+            padding: 12px 30px;
+            border: none;
+            border-radius: 6px;
+            font-size: 16px;
+            font-weight: 600;
+            cursor: pointer;
+            transition: all 0.3s ease;
+        }
+
+        .btn-save {
+            background-color: #3498db;
+            color: white;
+        }
+
+        .btn-save:hover {
+            background-color: #2980b9;
+            transform: translateY(-2px);
+        }
+
+        .btn-reset {
+            background-color: #ecf0f1;
+            color: #34495e;
+        }
+
+        .btn-reset:hover {
+            background-color: #d5dbdb;
+        }
+
+        .status-bar {
+            background-color: #f8f9fa;
+            padding: 15px 20px;
+            border-radius: 8px;
+            margin-top: 30px;
+            border-left: 4px solid #3498db;
+        }
+
+        .status-text {
+            font-size: 15px;
+            color: #2c3e50;
+        }
+
+        .status-text .enabled-count {
+            font-weight: bold;
+            color: #27ae60;
+        }
+
+        .status-text .disabled-count {
+            font-weight: bold;
+            color: #e74c3c;
+        }
+
+        @media (max-width: 768px) {
+            .process-container {
+                flex-direction: column;
+                align-items: center;
+            }
+
+            .node {
+                margin-bottom: 30px;
+                width: 100%;
+            }
+
+            .process-line {
+                display: none;
+            }
+
+            .controls {
+                flex-direction: column;
+            }
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+
+    <div class="process-container">
+        <!-- 杩炴帴绾� -->
+        <div class="process-line" id="processLine"></div>
+
+        <!-- 寮�濮嬭妭鐐� -->
+        <div class="node">
+            <div class="node-indicator start" id="node-start">寮�濮�</div>
+            <div class="node-label">寮�濮嬭妭鐐�</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="start" checked>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-start">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 缁忕悊瀹℃壒鑺傜偣 -->
+        <div class="node">
+            <div class="node-indicator manager" id="node-manager">缁忕悊</div>
+            <div class="node-label">缁忕悊瀹℃壒</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="manager" checked>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-manager">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 棰嗗瀹℃壒鑺傜偣 -->
+        <div class="node">
+            <div class="node-indicator leader" id="node-leader">棰嗗</div>
+            <div class="node-label">棰嗗瀹℃壒</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="leader" checked>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-leader">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 闆嗗洟瀹℃壒鑺傜偣 -->
+        <div class="node">
+            <div class="node-indicator group" id="node-group">闆嗗洟</div>
+            <div class="node-label">闆嗗洟瀹℃壒</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="group" checked>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-group">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 缁撴潫鑺傜偣 -->
+        <div class="node">
+            <div class="node-indicator end" id="node-end">缁撴潫</div>
+            <div class="node-label">缁撴潫鑺傜偣</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="end" checked disabled>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-end">鍚敤</span>
+            </div>
+        </div>
+    </div>
+
+    <div class="status-bar">
+        <p class="status-text">褰撳墠鐘舵�侊細<span id="enabledCount" class="enabled-count">5</span>涓妭鐐瑰凡鍚敤锛�<span id="disabledCount" class="disabled-count">0</span>涓妭鐐瑰凡绂佺敤銆�<span id="statusDetail">鎵�鏈夎妭鐐瑰潎宸插惎鐢紝娴佺▼鍙甯告墽琛屻��</span></p>
+    </div>
+
+    <div class="controls">
+        <button class="btn btn-save" id="saveBtn">淇濆瓨閰嶇疆</button>
+        <button class="btn btn-reset" id="resetBtn">閲嶇疆涓洪粯璁�</button>
+    </div>
+</div>
+
+<script>
+    document.addEventListener('DOMContentLoaded', function() {
+        // 鑾峰彇鎵�鏈夎妭鐐瑰垏鎹㈠紑鍏�
+        const nodeToggles = document.querySelectorAll('.node-toggle');
+        const processLine = document.getElementById('processLine');
+
+        // 鏇存柊杩炴帴绾跨姸鎬�
+        function updateProcessLine() {
+            const enabledNodes = [];
+
+            nodeToggles.forEach(toggle => {
+                if (toggle.checked) {
+                    enabledNodes.push(toggle.dataset.node);
+                }
+            });
+
+            // 濡傛灉鎵�鏈夎妭鐐归兘鍚敤锛屽皢杩炴帴绾胯缃负婵�娲荤姸鎬�
+            if (enabledNodes.length === nodeToggles.length) {
+                processLine.classList.add('active');
+            } else {
+                processLine.classList.remove('active');
+            }
+
+            // 鏇存柊鑺傜偣鎸囩ず鍣ㄧ姸鎬�
+            nodeToggles.forEach(toggle => {
+                const node = toggle.dataset.node;
+                const nodeIndicator = document.getElementById(`node-${node}`);
+                const label = document.getElementById(`label-${node}`);
+
+                if (toggle.checked) {
+                    nodeIndicator.classList.remove('disabled');
+                    label.textContent = '鍚敤';
+                    label.className = 'toggle-label active';
+                } else {
+                    nodeIndicator.classList.add('disabled');
+                    label.textContent = '绂佺敤';
+                    label.className = 'toggle-label inactive';
+                }
+            });
+
+            // 鏇存柊鐘舵�佹爮
+            updateStatusBar();
+        }
+
+        // 鏇存柊鐘舵�佹爮淇℃伅
+        function updateStatusBar() {
+            const enabledCount = document.querySelectorAll('.node-toggle:checked').length;
+            const disabledCount = nodeToggles.length - enabledCount;
+
+            document.getElementById('enabledCount').textContent = enabledCount;
+            document.getElementById('disabledCount').textContent = disabledCount;
+
+            const statusDetail = document.getElementById('statusDetail');
+
+            if (enabledCount === nodeToggles.length) {
+                statusDetail.textContent = '鎵�鏈夎妭鐐瑰潎宸插惎鐢紝娴佺▼鍙甯告墽琛屻��';
+            } else if (disabledCount === nodeToggles.length) {
+                statusDetail.textContent = '鎵�鏈夎妭鐐瑰潎宸茬鐢紝娴佺▼鏃犳硶鎵ц銆�';
+            } else if (disabledCount === 1) {
+                statusDetail.textContent = '鏈�1涓妭鐐硅绂佺敤锛屾祦绋嬪皢璺宠繃璇ヨ妭鐐规墽琛屻��';
+            } else {
+                statusDetail.textContent = `鏈�${disabledCount}涓妭鐐硅绂佺敤锛屾祦绋嬪皢璺宠繃杩欎簺鑺傜偣鎵ц銆俙;
+            }
+        }
+
+        // 涓烘瘡涓垏鎹㈠紑鍏虫坊鍔犱簨浠剁洃鍚�
+        nodeToggles.forEach(toggle => {
+            toggle.addEventListener('change', updateProcessLine);
+        });
+
+        // 淇濆瓨閰嶇疆鎸夐挳
+        document.getElementById('saveBtn').addEventListener('click', function() {
+            const config = {};
+            nodeToggles.forEach(toggle => {
+                config[toggle.dataset.node] = toggle.checked;
+            });
+
+            // 鍦ㄥ疄闄呭簲鐢ㄤ腑锛岃繖閲屼細鍙戦�侀厤缃埌鏈嶅姟鍣�
+            // 鐜板湪鍙樉绀轰竴涓彁绀�
+            alert('閰嶇疆宸蹭繚瀛橈紒\n\n褰撳墠閰嶇疆锛歕n' +
+                JSON.stringify(config, null, 2));
+
+            // 娣诲姞瑙嗚鍙嶉
+            this.textContent = '淇濆瓨鎴愬姛锛�';
+            this.style.backgroundColor = '#2ecc71';
+
+            setTimeout(() => {
+                this.textContent = '淇濆瓨閰嶇疆';
+                this.style.backgroundColor = '#3498db';
+            }, 1500);
+        });
+
+        // 閲嶇疆鎸夐挳
+        document.getElementById('resetBtn').addEventListener('click', function() {
+            if (confirm('纭畾瑕侀噸缃墍鏈夎妭鐐归厤缃负榛樿鐘舵�佸悧锛�')) {
+                nodeToggles.forEach(toggle => {
+                    // 缁撴潫鑺傜偣濮嬬粓鍚敤涓斾笉鍙洿鏀�
+                    if (toggle.dataset.node === 'end') {
+                        toggle.checked = true;
+                        toggle.disabled = true;
+                    } else {
+                        toggle.checked = true;
+                    }
+                });
+
+                updateProcessLine();
+
+                // 娣诲姞瑙嗚鍙嶉
+                this.textContent = '宸查噸缃紒';
+                this.style.backgroundColor = '#9b59b6';
+
+                setTimeout(() => {
+                    this.textContent = '閲嶇疆涓洪粯璁�';
+                    this.style.backgroundColor = '#ecf0f1';
+                }, 1500);
+            }
+        });
+
+        // 涓鸿妭鐐规寚绀哄櫒娣诲姞鐐瑰嚮鍒囨崲鍔熻兘
+        document.querySelectorAll('.node-indicator').forEach(indicator => {
+            // 璺宠繃缁撴潫鑺傜偣锛屽洜涓哄畠涓嶅彲绂佺敤
+            if (indicator.id === 'node-end') return;
+
+            indicator.addEventListener('click', function() {
+                const nodeId = this.id.replace('node-', '');
+                const toggle = document.querySelector(`.node-toggle[data-node="${nodeId}"]`);
+
+                if (toggle && !toggle.disabled) {
+                    toggle.checked = !toggle.checked;
+                    toggle.dispatchEvent(new Event('change'));
+                }
+            });
+        });
+
+        // 鍒濆鍖栫姸鎬�
+        updateProcessLine();
+    });
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/templates/work/flow-conf.html b/fzzy-igdss-web/src/main/resources/templates/work/flow-conf.html
new file mode 100644
index 0000000..c432081
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/work/flow-conf.html
@@ -0,0 +1,359 @@
+<!DOCTYPE html>
+<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>娴佺▼鑺傜偣閰嶇疆</title>
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
+        }
+
+        body {
+            background-color: #FFF;
+            color: #333;
+            line-height: 1.6;
+            overflow: hidden;
+        }
+
+        .container {
+            max-width: 1000px;
+            margin: 0 auto;
+            padding: 10px;
+        }
+
+        .process-container {
+            position: relative;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin-bottom: 25px;
+        }
+
+        /* 杩炴帴绾� */
+        .process-line {
+            position: absolute;
+            top: 40px;
+            left: 80px;
+            right: 80px;
+            height: 4px;
+            background-color: #e0e0e0;
+            z-index: 1;
+        }
+
+        .process-line.active {
+            background-color: #3498db;
+        }
+
+        .node {
+            position: relative;
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            width: 120px;
+            z-index: 2;
+        }
+
+        .node-indicator {
+            width: 80px;
+            height: 80px;
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 20px;
+            font-weight: bold;
+            color: #FFF;
+            margin-bottom: 15px;
+            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+            transition: all 0.3s ease;
+            cursor: pointer;
+        }
+
+        .node-indicator.start {
+            background: linear-gradient(135deg, #1abc9c, #16a085);
+        }
+
+        .node-indicator.node1 {
+            background: linear-gradient(135deg, #3498db, #2980b9);
+        }
+
+        .node-indicator.node2 {
+            background: linear-gradient(135deg, #9b59b6, #8e44ad);
+        }
+
+        .node-indicator.node3 {
+            background: linear-gradient(135deg, #e67e22, #d35400);
+        }
+
+        .node-indicator.end {
+            background: linear-gradient(135deg, #e74c3c, #c0392b);
+        }
+
+        .node-indicator.disabled {
+            background: #bdc3c7;
+            transform: scale(0.9);
+            opacity: 0.7;
+        }
+
+        .node-label {
+            font-weight: 600;
+            margin-bottom: 8px;
+            color: #2c3e50;
+            text-align: center;
+        }
+
+        .toggle-container {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+
+        /* 鍒囨崲寮�鍏虫牱寮� */
+        .toggle-switch {
+            position: relative;
+            display: inline-block;
+            width: 50px;
+            height: 24px;
+        }
+
+        .toggle-switch input {
+            opacity: 0;
+            width: 0;
+            height: 0;
+        }
+
+        .toggle-slider {
+            position: absolute;
+            cursor: pointer;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            background-color: #ccc;
+            transition: .4s;
+            border-radius: 24px;
+        }
+
+        .toggle-slider:before {
+            position: absolute;
+            content: "";
+            height: 18px;
+            width: 18px;
+            left: 3px;
+            bottom: 3px;
+            background-color: #FFF;
+            transition: .4s;
+            border-radius: 50%;
+        }
+
+        input:checked + .toggle-slider {
+            background-color: #2ecc71;
+        }
+
+        input:checked + .toggle-slider:before {
+            transform: translateX(26px);
+        }
+
+        .toggle-label {
+            margin-left: 8px;
+            font-size: 14px;
+            color: #7f8c8d;
+        }
+
+        .toggle-label.active {
+            color: #2ecc71;
+            font-weight: 600;
+        }
+
+        .toggle-label.inactive {
+            color: #e74c3c;
+        }
+
+        .status-bar {
+            background-color: #f8f9fa;
+            padding: 15px 15px;
+            border-radius: 6px;
+            margin-top: 15px;
+            border-left: 4px solid #037d41;
+        }
+        .status-text {
+            font-size: 13px;
+            color: #2c3e50;
+        }
+        @media (max-width: 768px) {
+            .process-container {
+                flex-direction: column;
+                align-items: center;
+            }
+            .node {
+                margin-bottom: 15px;
+                width: 100%;
+            }
+            .process-line {
+                display: none;
+            }
+        }
+    </style>
+</head>
+<body>
+<div class="container">
+
+    <div class="process-container">
+        <!-- 杩炴帴绾� -->
+        <div class="process-line" id="processLine"></div>
+
+        <!-- 寮�濮嬭妭鐐� -->
+        <div class="node">
+            <div class="node-indicator start" id="node-start">寮�濮�</div>
+            <div class="node-label" id="name-start">寮�濮嬭妭鐐�</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="start" checked disabled>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-start">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 搴撳尯瀹℃壒 -->
+        <div class="node">
+            <div class="node-indicator node1" id="node-node1">搴撳尯</div>
+            <div class="node-label" id="name-node1">搴撳尯棰嗗瀹℃壒</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="node1" id="nodeVal1" th:checked="${data.nodeVal1=='Y'}" >
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-node1" th:text="${data.nodeVal1=='Y'?'鍚敤':'绂佺敤'}">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 鐩戠瀹℃壒 -->
+        <div class="node">
+            <div class="node-indicator node2" id="node-node2">鐩戠</div>
+            <div class="node-label" id="name-node2">鐩戠瀹℃壒</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="node2" id="nodeVal2" th:checked="${data.nodeVal2=='Y'}">
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-node2" th:text="${data.nodeVal2=='Y'?'鍚敤':'绂佺敤'}">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 閾惰瀹℃壒 -->
+        <div class="node">
+            <div class="node-indicator node3" id="node-node3">閾惰</div>
+            <div class="node-label" id="name-node3">閾惰瀹℃壒</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="node3" id="nodeVal3" th:checked="${data.nodeVal3=='Y'}">
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-node3" th:text="${data.nodeVal3=='Y'?'鍚敤':'绂佺敤'}">鍚敤</span>
+            </div>
+        </div>
+
+        <!-- 缁撴潫鑺傜偣 -->
+        <div class="node">
+            <div class="node-indicator end" id="node-end">缁撴潫</div>
+            <div class="node-label" id="name-end">缁撴潫鑺傜偣</div>
+            <div class="toggle-container">
+                <label class="toggle-switch">
+                    <input type="checkbox" class="node-toggle" data-node="end" checked disabled>
+                    <span class="toggle-slider"></span>
+                </label>
+                <span class="toggle-label active" id="label-end">鍚敤</span>
+            </div>
+        </div>
+    </div>
+
+    <div class="status-bar">
+        <p class="status-text">
+           	娉細1.鍚敤娴佺▼=鍚︼紝褰撳墠娴佺▼涓嶄娇鐢紝涓氬姟娴佺▼涓嶉厤缃搴斾笟鍔′笉鎵ц宸ュ崟瀹℃壒銆�<br>
+           2.鍚敤鑺傜偣鐨勬湁鏉冮檺鐨勪换浣曚汉鍧囧彲杩涜澶勭悊鍜屽鎵癸紝濡傚伐鍗曟寚娲句汉鍛橈紝鍒欎粎澶勭悊浜哄彲浠ュ鐞嗐��
+        </p>
+    </div>
+</div>
+</body>
+
+<script th:inline="javascript">
+    const data = [[${data}]];
+</script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script>
+    $(function () {
+        // 鑾峰彇鎵�鏈夎妭鐐瑰垏鎹㈠紑鍏�
+        const nodeToggles = document.querySelectorAll('.node-toggle');
+        const processLine = document.getElementById('processLine');
+
+        // 鏇存柊杩炴帴绾跨姸鎬�
+        function updateProcessLine() {
+            const nodes =[];
+            const enabledNodes = [];
+            nodeToggles.forEach(toggle => {
+                if (toggle.checked) {
+                    enabledNodes.push(toggle.dataset.node);
+                }
+            });
+            // 濡傛灉鎵�鏈夎妭鐐归兘鍚敤锛屽皢杩炴帴绾胯缃负婵�娲荤姸鎬�
+            if (enabledNodes.length === nodeToggles.length) {
+                processLine.classList.add('active');
+            } else {
+               // processLine.classList.remove('active');
+            }
+            // 鏇存柊鑺傜偣鎸囩ず鍣ㄧ姸鎬�
+            nodeToggles.forEach(toggle => {
+                const node = toggle.dataset.node;
+                const nodeIndicator = document.getElementById(`node-${node}`);
+                const label = document.getElementById(`label-${node}`);
+                const name = document.getElementById(`name-${node}`);
+                if (toggle.checked) {
+                    nodeIndicator.classList.remove('disabled');
+                    label.textContent = '鍚敤';
+                    label.className = 'toggle-label active';
+                } else {
+                    nodeIndicator.classList.add('disabled');
+                    label.textContent = '绂佺敤';
+                    label.className = 'toggle-label inactive';
+                }
+
+                //灏佽鏁版嵁鐢ㄤ簬浼犻�掔粰鍚庡彴
+                nodes.push({
+                    node: node,
+                    val: toggle.checked,
+                    name: name.textContent
+                });
+            });
+            //console.log(nodes);
+            //鏁版嵁浼犺緭缁欎笂绾ч〉闈�
+            window.parent.onNodeValChange(nodes);
+        }
+
+        // 涓烘瘡涓垏鎹㈠紑鍏虫坊鍔犱簨浠剁洃鍚�
+        nodeToggles.forEach(toggle => {
+            toggle.addEventListener('change', updateProcessLine);
+        });
+
+        // 涓鸿妭鐐规寚绀哄櫒娣诲姞鐐瑰嚮鍒囨崲鍔熻兘
+        document.querySelectorAll('.node-indicator').forEach(indicator => {
+            // 璺宠繃缁撴潫鑺傜偣锛屽洜涓哄畠涓嶅彲绂佺敤
+            if (indicator.id === 'node-end' || indicator.id === 'node-start') return;
+            indicator.addEventListener('click', function () {
+                const nodeId = this.id.replace('node-', '');
+                const toggle = document.querySelector(`.node-toggle[data-node="${nodeId}"]`);
+                if (toggle && !toggle.disabled) {
+                    toggle.checked = !toggle.checked;
+                    toggle.dispatchEvent(new Event('change'));
+                }
+            });
+        });
+        // 鍒濆鍖栫姸鎬�
+        updateProcessLine();
+    });
+</script>
+</html>
\ No newline at end of file

--
Gitblit v1.9.3