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{
$notify("璇峰厛閫夋嫨搴撳尯鈥︹��");
}
+};
+
+/**
+* 宸ュ崟閰嶇疆
+*/
+workOrderConf = function(){
+ var cur = view.get("#dgMain").get("selection");
+ if(cur){
+ var deptId = cur.get("id");
+ var url = "/com.fzzy.work.WorkOrderConf.d?deptId="+ deptId;
+ window.$openTab("宸ュ崟閰嶇疆", url);
+ }else{
+ $notify("璇峰厛閫夋嫨搴撳尯鈥︹��");
+ }
};
//鎿嶄綔
renderCell1 = function(arg,self){
var data = arg.data;
- var htm = "<a onClick='inoutConf()' class='a-btn1'>鍑哄叆搴撻厤缃�</a>&nbsp;|&nbsp;<a onClick='snapConf()' class='a-btn2'>鎶撴媿閰嶇疆</a>&nbsp;|&nbsp;<a onClick='patrolConf()' class='a-btn4'>宸℃閰嶇疆</a>";
+ var htm = "<a onClick='inoutConf()' class='a-btn1'>鍑哄叆搴撻厤缃�</a>&nbsp;|&nbsp;<a onClick='snapConf()' class='a-btn2'>鎶撴媿閰嶇疆</a>&nbsp;|&nbsp;<a onClick='patrolConf()' class='a-btn4'>宸℃閰嶇疆</a>&nbsp;|&nbsp;<a onClick='workOrderConf()' class='a-btn2'>宸ュ崟瀹℃壒</a>";
arg.dom.innerHTML = htm;
};

</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("#dataGridMain").set("selection",arg.data);</ClientEvent>
+ <ClientEvent name="onDataRowClick">self.set("selection",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("workOrderPR#triggerType").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("dicPR#triggerYN").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 = "${request.getParameter('deptId')}";
+
+query = function(){
+ view.get("#dsMain").set("parameter",deptId).flushAsync();
+}
+query();
+
+
+addData = function(){
+ view.get("#dsMain").insert({
+ deptId:deptId
+ });
+ 
+ //娴佺▼鍥�
+ view.get("#iFrameFlow").set("path","work/flow-conf?id=")
+ 
+ 
+ view.get("#dialogMain").show();
+}
+
+showDetail = function(){
+ var cur = view.get("#dsMain.data:#");
+ //娴佺▼鍥�
+ view.get("#iFrameFlow").set("path","work/flow-conf?id="+cur.get("id"));
+ 
+ view.get("#dialogMain").show();
+}
+
+//娴佺▼鍥句腑鑺傜偣鍚敤绂佺敤鐨勬柟娉�
+onNodeValChange = function(nodes){
+ if(!nodes) return;
+ var cur = view.get("#dsMain.data:#");
+ nodes.forEach(function(node,index){
+ if("node1" == node.node){
+ if(node.val){cur.set("nodeVal1","Y");} else{cur.set("nodeVal1","N");}
+ cur.set("nodeName1",node.name);
+ }
+ if("node2" == node.node){
+ if(node.val){cur.set("nodeVal2","Y");} else{cur.set("nodeVal2","N");}
+ cur.set("nodeName2",node.name);
+ }
+ if("node3" == node.node){
+ if(node.val){cur.set("nodeVal3","Y");} else{cur.set("nodeVal3","N");}
+ cur.set("nodeName3",node.name);
+ }
+ });
+}
+</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("#dsMian.data:#");
+if (!data) {
+ $alert("璇烽�夋嫨鏁版嵁");
+ return;
+}
+view.get("#ajaxDelData").set("parameter", data).execute(function(result){
+ if("200"!=result.respCode){
+ $alert("寮傚父淇℃伅锛�"+result.respMsg);
+ }else{
+ $notify("鎵ц鎴愬姛");
+ 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("selection", 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("#saveAction").execute(function(){
+ self.get("parent").hide();
+});</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("#dsMain.data:#").cancel();
+self.get("parent").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("鏁版嵁鍔犺浇瀹屾垚鈥︹��");</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