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; } } 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; } 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> { } 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("å é¤å¤±è´¥"); } } 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); } } 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> 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> 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; 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; 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> 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(); } } 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> fzzy-igdss-view/src/main/java/com/fzzy/work/WorkProcessPR.java
ÎļþÒÑɾ³ý 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"; } } 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 { 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> 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>