浏览代码

修改sop配置页面

bzd_wsp 3 月之前
父节点
当前提交
e05509d37a

+ 21 - 31
health-admin/src/main/resources/templates/dtp/followUp/followUpList.html

@@ -71,6 +71,7 @@
 									<option value="待处理" >待处理</option>
 									<option value="已完成" >已完成</option>
 									<option value="已过期" >已过期</option>
+									<option value="无" >无</option>
 								</select>
 							</div>
 							<div class="customize-form-group">
@@ -122,21 +123,13 @@
 								</select>
 							</div>
 						</div>
-
-
 					</form>
 				</div>
-
-
-
 				<div class="col-sm-12 select-table table-striped" style="width: 100%; overflow-x: hidden;">
 					<table id="bootstrap-table" class="fixed-layout-table"></table>
 				</div>
-
 			</div>
-
 		</div>
-
 	</div>
 	<div class="modal inmodal" id="myModal" tabindex="-1" role="dialog" aria-hidden="true">
 		<div class="modal-dialog">
@@ -162,7 +155,6 @@
 								<label for="uploadImage"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#007bff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line><line x1="8" y1="12" x2="16" y2="12"></line></svg></label>
 							</div>
 						</div>
-
 					</div>
 					<div class="modal-footer">
 						<button type="button" class="btn btn-white" data-dismiss="modal">关闭</button>
@@ -217,18 +209,32 @@
 				showFooter:true,  //是否显示表格底部区域。
 				clickToSelect: true, //是否启用点击行时选中整行的功能。
 				singleSelect: false, //是否仅允许选择一行
-            fixedColumns: true,
-            //fixedNumber: 3,
-            fixedRightNumber: 1,
+				fixedColumns: true,
+				//fixedNumber: 3,
+				fixedRightNumber: 1,
 		        columns: [
 				{ field: 'appointmentDate', title: '预约日期', align: 'center' },
 				{ field: 'businessBelonging', title: '业务归属', align: 'center' },
-				{ field: 'taskName', title: '任务名称', align: 'center' },
+				{ field: 'taskName', title: '任务名称',width: 170, align: 'center' ,
+					formatter: function(value, row, index) {
+						if (row.id) {
+							return '<a href="javascript:void(0)" onclick="$.operate.editTab(\'' + row.patientId + '\')">' + value + '</a>';
+						} else {
+							return "";
+						}
+					}},
 				{ field: 'taskTheme', title: '任务主题', align: 'center' },
-				{ field: 'patientName', title: '患者姓名', align: 'center' },
+				{ field: 'patientName', title: '患者姓名',width: 200, align: 'center' ,
+					formatter: function(value, row, index) {
+						if (row.id) {
+							return '<a href="javascript:void(0)" onclick="$.operate.editTab(\'' + row.id + '\')">' + value + '</a>';
+						} else {
+							return "";
+						}
+					} },
 				{ field: 'gender', title: '性别', align: 'center' },
 				{ field: 'age', title: '年龄', align: 'center' },
-				{ field: 'followUpSummary', title: '随访小结', align: 'center' },
+				{ field: 'followUpSummary', title: '随访小结',width: 500, align: 'center' },
 				{ field: 'disease', title: '疾病', align: 'center' },
 				{ field: 'storeName', title: '门店', align: 'center' },
 				{ field: 'genericName', title: '药品通用名', align: 'center' },
@@ -308,20 +314,6 @@
 			_refresh();
 		}
 
-		/*const inputs = document.querySelectorAll('.styled-input');
-
-		// 遍历所有输入框并添加事件监听器
-		inputs.forEach(function(input) {
-			// 当鼠标进入输入框时改变背景色
-			input.addEventListener('mouseover', function() {
-				this.style.backgroundColor = '#f0f0f0'; // 浅灰色背景
-			});
-
-			// 当鼠标离开输入框时调用公共函数
-			input.addEventListener('mouseout', function() {
-				this.style.backgroundColor = ''; // 清空背景色属性,使用默认值
-			});
-		});*/
 
 		/* 用户状态显示 */
 		function statusTools(row) {
@@ -376,7 +368,5 @@
 		min-height: 150px;
 	}
 
-
-
 </style>
 </html>

+ 1 - 0
health-admin/src/main/resources/templates/dtp/sfrw/SDtpYypzFollowUpSopAdd.html

@@ -849,6 +849,7 @@
             '<option value="">请选择</option>' +
             '<option value="用药指导">用药指导</option>' +
             '<option value="脱落召回">脱落召回</option>' +
+            '<option value="常规随访">常规随访</option>' +
             '</select>' +
             '<p>'+
             '</p>'+

+ 485 - 231
health-admin/src/main/resources/templates/dtp/sfrw/SDtpYypzFollowUpSopPageEdit.html

@@ -2,7 +2,7 @@
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
 <head>
     <th:block th:include="include :: header('随访SOP表修改')" />
-        <th:block th:include="include :: datetimepicker-css" />
+<!--        <th:block th:include="include :: datetimepicker-css" />-->
         <th:block th:include="include :: select2-css" />
         <th:block th:include="include :: layout-latest-css" />
 </head>
@@ -13,8 +13,7 @@
             <div class="ibox-title">
                 <div class="ibox-tools" style="margin-top: -11px;    float: left; ">
                     <label class="control-label">最后更新时间:</label>
-                    <input type="hidden" id="id" name="id" th:value="${Template.id}">
-                    <input type="hidden" id="templateId" name="templateId" th:value="${Template.templateId}">
+<!--                    <input type="hidden" id="templateId" name="templateId" th:value="${Template.templateId}">-->
                     <input name="lastUpdateTime"  class="styled-input input-field" type="text" style="border: none" th:value="${Template.updatedTime}"  readonly>
                     <span><input type="text" style="border: none;font-size: 13px;width: 60px;color: orangered;" class="styled-input"
                                  th:value="${Template.status == 0 ? '已创建' : (Template.status == 1 ? '启用中' : '禁用中')}"
@@ -30,22 +29,27 @@
             </div>
 
             <div class="ibox-content">
-
                 <form id="form-SDtpYypzFollowUpSop-edit">
-                    <div class="customize-form-group-row">
-                        <label class="control-label is-required">随访SOP:</label>
-                        <input name="phoneNumber" placeholder="随访SOP模版名称" class="styled-input input-field"
-                               type="text" th:value="${Template.templateName}" required>
-
-                    </div>
-                    <div class="customize-form-group-row">
-                        <label class="control-label is-required">业务归属:&nbsp;&nbsp;:</label>
-                        <select name="businessBelonging" class="styled-input input-field"  th:with="type=${@dict.getType('sys_select_dtp_ywgs')}" disabled>
-                            <option value="">业务归属</option>
-                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictLabel}" th:selected="${Template.businessBelonging == dict.dictLabel}"></option>
-                        </select>
-                    </div>
-                    <form id="form-syyp-durg">
+                        <div class="customize-form-group-row">
+                            <label class="col-sm-1 control-label is-required">模版名称:</label>
+                            <input type="hidden" id="id" name="id" th:value="${Template.id}">
+                            <input name="templateName" id="templateName" placeholder="随访SOP模版名称" class="styled-input"
+                                   type="text" th:value="${Template.templateName}" required>
+                        </div>
+                         <div class="customize-form-group-row">
+                            <label class="col-sm-1 control-label is-required">业务归属:&nbsp;&nbsp;:</label>
+                            <select name="businessBelonging" id="businessBelonging" class="styled-input"  th:with="type=${@dict.getType('sys_select_dtp_ywgs')}" disabled>
+                                <option value="">业务归属</option>
+                                <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictLabel}" th:selected="${Template.businessBelonging == dict.dictLabel}"></option>
+                            </select>
+                        </div>
+                            <div class="customize-form-group-row">
+                            <label class="col-sm-1 control-label is-required">模版ID:</label>
+                            <input name="templateId" id="templateId" placeholder="模版ID" class="styled-input" style="background:#eee;color: #999"
+                                   type="text" th:value="${Template.templateId}" readonly>
+                        </div>
+                </form>
+                <form id="form-syyp-durg">
                         <div class="ibox" id="data-ibox" style="overflow: auto;">
                             <div class="ibox-title" style="width: 100%;">适用药品:已选择 <span id="drug-count">0</span> 种药品</div>
                             <table class="fixed-layout-table table1" id="drugInfoTable">
@@ -63,8 +67,8 @@
                                 </tbody>
                             </table>
                         </div>
-                    </form>
-                    <form id="form-jdpz-nodes" >
+                </form>
+                <form id="form-jdpz-nodes" >
                         <div class="customize-form-group-row">
                             <label class="control-label is-required">节点配置:</label>
                             <div class="col-sm-6">
@@ -79,7 +83,6 @@
                                 </div>
                             </div>
                         </div>
-                    </form>
                 </form>
             </div>
         </div>
@@ -93,7 +96,7 @@
     </div>
 </div>
 <th:block th:include="include :: footer" />
-<th:block th:include="include :: datetimepicker-js" />
+<!--<th:block th:include="include :: datetimepicker-js" />-->
 <th:block th:include="include :: select2-js" />
 <th:block th:include="include :: bootstrap-table-fixed-columns-js" />
 <th:block th:include="include :: layout-latest-js" />
@@ -121,6 +124,21 @@
             deleteRow(productCode);
         });
 
+        // 获取 Template.status 的值
+        var status = $('#switchFlag').val();
+        debugger;
+        // 根据 status 设置开关的状态和样式
+        if (status === '启用中') {
+            // 设置开关为开启状态
+            $('#switchFlag2').prop('checked', true);
+            // 应用绿色样式
+            $('.toggle-switch span').addClass('on');
+        } else {
+            // 设置开关为关闭状态
+            $('#switchFlag2').prop('checked', false);
+            // 移除绿色样式
+            $('.toggle-switch span').removeClass('on');
+        }
 
         //在初始化的时候赋值给 表格 获取到查询出来的药品 drugs 并赋值给 表格
         var tableBody = $('#drugInfoTable tbody');
@@ -185,25 +203,25 @@
     });
 
     function submitHandler() {
-        var businessBelonging=$("#businessBelonging").val();
+        var switchFlag=$("#switchFlag").val();
         var templateName=$("#templateName").val();
         if(templateName=="" || templateName==undefined){
-            $.modal.alertWarning("请输入SOP名称");
-            return;
-        }
-        if(businessBelonging=="" || businessBelonging==undefined){
-            $.modal.alertWarning("请选择业务归属");
+            $.modal.alertWarning("请输入SOP模版名称");
             return;
         }
+
         applicableDrug=  getTableData();
         if(applicableDrug.length==0){
             $.modal.alertWarning("请添加药品");
             return;
         }
+        debugger;
         var prefix = ctx + "dtp/sdtpyypzfollowupsop";
         var data = $("#form-SDtpYypzFollowUpSop-edit").serializeArray();
         data.push({name:"nodesData",value:JSON.stringify(collectNodesData())});
         data.push({name:"applicableDrug",value:JSON.stringify(applicableDrug)});
+        data.push({name:"switchFlag",value:switchFlag});
+
         console.log("data="+data)
         $.operate.saveTab(prefix + "/sDtpYypzFollowUpSopEdit", data);
     }
@@ -269,6 +287,7 @@
         row.remove();
     }
     function collectNodesData() {
+        debugger;
         // 获取所有节点
         const nodes = document.querySelectorAll('.tabs-container .tab-pane');
         // 创建一个空数组来保存所有节点的数据
@@ -279,7 +298,7 @@
             // 创建一个空对象来保存当前节点的数据
             const nodeData = {};
             var nodeIdStr=node.id;
-            var nodeId=  nodeIdStr.substring(4);
+            var nodeId = parseInt(nodeIdStr.substring(4)); // 提取并转换为整数
             console.log("nodeId="+nodeId);
             // 获取节点内的所有输入字段
             const inputs = node.querySelectorAll('input, select');
@@ -480,7 +499,7 @@
         levelTwoSelect.className = 'styled-input';
 
         if (filterConditions) {
-            // 假设这里有一个函数可以填充二级下拉菜单的内容  到这里
+            // 假设这里有一个函数可以填充二级下拉菜单的内容
             populateLevelTwoSelect(levelTwoSelect, filterConditions[0].traits);
             levelTwoSelect.value = filterConditions[0].traitValue;
         }
@@ -862,6 +881,16 @@
             document.getElementById('level-three'+id).style.display = 'block';
         }
     }
+
+  function  duanxin(carNum){
+      var chudaSelect = $('#rwdz'+carNum).val();
+      if (chudaSelect === '触达任务') {
+          var divElement = document.getElementById("rwdzform" + carNum); // 获取 div 引用
+          divElement.style.display = "none";
+          var divElementID = document.getElementById("rwdzID" + carNum); // 获取 div 引用
+          divElementID.style.display = "block";
+      }
+    }
     function bindTabEvents(carNum) {
         console.log("carNum"+carNum);
         var flag = true ;
@@ -965,7 +994,9 @@
 
         // 绑定 change 事件
         $(document).on('change', '#rwdz'+carNum, function(e) {
+            debugger;
             var chudaSelect = $(this).val();
+            console.log("chudaSelect="+chudaSelect);
             var roleSelect = document.getElementById("js"+carNum);
 
             // 清空当前的所有选项
@@ -997,30 +1028,46 @@
                 option.value = "系统";
                 option.text = "系统";
                 roleSelect.appendChild(option);
-                selectedOption.push("duanxiqudan" + carNum);
-                // 选中短信
-                document.getElementById("duanxiqudan" + carNum).checked = true;
-            }else if (chudaSelect === '') {
-                var elementsToDelete = [];
-                elementsToDelete.push('duanxiqudan' + carNum);
-                elementsToDelete.push('yaoshigzt' + carNum);
-                var filteredArray = selectedOption.filter(item => !elementsToDelete.includes(item));
-                console.log("filteredArray="+filteredArray);
-                // 取消选中
-                document.getElementById("duanxiqudan" + carNum).checked = false;
-                document.getElementById("yaoshigzt" + carNum).checked = false;
             }
 
         });
     }
 
 
-    $(function(){
-        $("#datetimepicker-demo-3").datetimepicker({
-            format: 'HH:mm:ss',
-            autoclose: true
-        });
+    // $(function(){
+    //     $("#datetimepicker-demo-3").datetimepicker({
+    //         format: 'HH:mm:ss',
+    //         autoclose: true
+    //     });
+    // });
+
+    document.addEventListener('DOMContentLoaded', function () {
+        const inputElement = document.getElementById('datetimepicker-demo-3');
+        console.log('DOM fully loaded and parsed');
+        if (inputElement) {
+            inputElement.addEventListener('input', function (e) {
+                // 正则表达式匹配 hh:mm:ss 格式
+                console.log('DOM 正则表达式匹配 hh:mm:ss 格式');
+                const timePattern = /^([01]?[0-9]|2[0-3])(:[0-5][0-9]){2}$/;
+                let inputValue = e.target.value;
+
+                // 如果输入不符合格式,限制输入
+                if (!timePattern.test(inputValue) && inputValue.length > 0) {
+                    // 移除最后一个字符
+                    inputValue = inputValue.slice(0, -1);
+                    e.target.value = inputValue;
+                }
+
+                // 自动添加冒号
+                if ((inputValue.length === 2 || inputValue.length === 5) && !inputValue.endsWith(':')) {
+                    inputValue += ':';
+                    e.target.value = inputValue;
+                }
+            });
+        }
     });
+
+
     document.addEventListener("DOMContentLoaded", function() {
 
         // 监听点击事件,激活指定的选项卡
@@ -1033,31 +1080,6 @@
             var clickedA = $(e.target);
             var new_id = clickedA[0].id
             carNum=new_id.substring(2);
-            var Select = document.getElementById("rwdz"+carNum);
-            if (Select) { // 确保元素存在
-                var selectedOption = Select.options[Select.selectedIndex];
-                console.log(selectedOption.text); // 输出选中文本
-                if(selectedOption.text =='请选择'){
-                    document.getElementById("duanxiqudan" + carNum).checked = false;
-                }else {
-                    document.getElementById("duanxiqudan" + carNum).checked = true;
-                }
-            }
-            var Select = document.getElementById("rwdz" + carNum);
-            if (Select) { // 确保元素存在
-                var selectedOption = Select.options[Select.selectedIndex];
-                console.log(selectedOption.text); // 输出选中文本
-                if(selectedOption.text =='请选择'){
-                    document.getElementById("yaoshigzt" + carNum).checked = false;
-                }else {
-                    document.getElementById("yaoshigzt" + carNum).checked = true;
-                }
-
-            }
-            // // 将目标内容区滚动到视口中央
-            // $('html, body').animate({
-            //     scrollTop: $(target).offset().top - ($(window).height() / 2)
-            // }, 500); // 500毫秒动画时间
         });
         // 初始绑定
         bindTabEvents(carNum);
@@ -1069,13 +1091,8 @@
         count++;
 
         // 生成 ibox 容器
-        if(count===1){
-            c = "active";
-            t = "true"
-        }else{
-            c="";
-            t="false"
-        }
+        var c = count === 1 ? "active" : "";
+        var t = count === 1 ? "true" : "false";
         var addNode = '<div id="tab-' + count + '" class="tab-pane '+c+'">' +
             '<div class="panel-body">'+
             '<strong>激活节点:</strong>'+
@@ -1137,6 +1154,7 @@
             '<option value="">请选择</option>' +
             '<option value="用药指导">用药指导</option>' +
             '<option value="脱落召回">脱落召回</option>' +
+            '<option value="常规随访">常规随访</option>' +
             '</select>' +
             '<p>'+
             '</p>'+
@@ -1165,8 +1183,11 @@
             '</div><p>'+
             '</p>'+
             '<strong>&emsp;&emsp;&emsp;&emsp;&nbsp;</strong>下发渠道&nbsp;'+
-            '<input type="radio" id="duanxiqudan' + count + '" name="deliveryChannel" class="form-check-radio" value="短信"> 短信 ' +
-            '<input type="radio" id="yaoshigzt' + count + '" name="deliveryChannel" class="form-check-radio" value="药师工作台"> 药师工作台 ' +
+            '<select name="deliveryChannel" id="xfqd' + count + '" class="styled-input">'+
+               ' <option value="">请选择下发渠道</option>'+
+                '<option value="短信">短信</option>'+
+                '<option value="药师工作台">药师工作台</option>'+
+            '</select>'+
             '</div>'+
             '</div>';
         // 添加到容器
@@ -1174,7 +1195,7 @@
             '节点' + count +'</span><span class="close-tab" onclick="deleteNode(\'' + count + '\')"><i class="fa fa-times"></i></span></a></li>';
         $('#addNode').append(addNode);
         $('#addNodeSelect').append(NodeSelect);
-// 主动重新绑定事件
+        // 主动重新绑定事件
         bindTabEvents(count);
     }
     function doSubmit2(index, layero) {
@@ -1296,204 +1317,437 @@
     }
 
 
-
     function echoNodes() {
-         count = 0; // 重置计数器
+        count = 0; // 重置计数器
         NodeList.forEach(function (node) {
             count++;
 
-
             // 生成 ibox 容器
             var c = count === 1 ? "active" : "";
             var t = count === 1 ? "true" : "false";
-
+            try {
+                // 确保 filterCondition 是有效的 JSON 字符串并解析为数组
+                node.filterCondition = Array.isArray(node.filterCondition)
+                    ? node.filterCondition
+                    : JSON.parse(node.filterCondition || '[]');
+            } catch (e) {
+                console.error('Invalid JSON in filterCondition:', e);
+                node.filterCondition = []; // 如果解析失败,设置为空数组
+            }
             // 动态选择所有列并映射到更具描述性的名称
             var columnsData = {
+                filterCondition: node.filterCondition || [], // 确保有默认值
+                createTaskExecutionTimes: node.createTaskExecutionTimes,
+                createTaskEvery: node.createTaskEvery || "",
                 activateStructures: node.activateStructures || "",
-                activateWhichDay: node.activateWhichDay || "",
-                activateNodeRule: node.activateNodeRule || "单次节点",
+                activateWhichDay: node.activateWhichDay,
+                activateNodeRule: node.activateNodeRule || "",
                 createTaskStructures: node.createTaskStructures || "",
-                createTaskDi: node.createTaskDi || "",
+                createTaskDi: node.createTaskDi,
                 taskActionMode: node.taskActionMode || "创建",
                 taskActionTaskType: node.taskActionTaskType || "",
                 taskActionRole: node.taskActionRole || "",
-                generationDaysAfter: node.generationDaysAfter || "",
+                generationDaysAfter: node.generationDaysAfter,
                 generationHMS: node.generationHMS || "",
                 followUpSubject: node.followUpSubject || "",
-                taskValidity: node.taskValidity || "",
+                taskValidity: node.taskValidity,
                 taskMaterial: node.taskMaterial || "表单",
                 useForm: node.useForm || "",
                 smsId: node.smsId || "",
-                deliveryChannel: node.deliveryChannel || "短信"
+                deliveryChannel: node.deliveryChannel || ""
             };
 
             // 构建节点HTML片段
-            var addNodeHtml = `
-            <div id="tab-${count}" class="tab-pane ${c}">
-                <div class="panel-body">
-                    <strong>激活节点:</strong>
-                    按
-                    <select name="activateStructures" id="jhjd${count}" class="styled-input">
-                        <option value="">请选择</option>
-                        <option value="创建计划" ${columnsData.activateStructures === '创建计划' ? 'selected' : ''}>创建计划</option>
-                    </select>
-                    第
-                    <input type="number" name="activateWhichDay" placeholder="规格" class="styled-input" value="${columnsData.activateWhichDay}">
-                    天激活
-                    <select name="activateNodeRule" id="ts${count}" class="styled-input">
-                        <option value="单次节点" ${columnsData.activateNodeRule === '单次节点' ? 'selected' : ''}>单次节点</option>
-                        <option value="周期节点" ${columnsData.activateNodeRule === '周期节点' ? 'selected' : ''}>周期节点</option>
+                var addNodeHtml = `
+                <div id="tab-${count}" class="tab-pane ${c}">
+                    <div class="panel-body">
+                        <strong>激活节点:</strong>
+                        
+                        <select name="activateStructures" id="jhjd${count}" class="styled-input">
+                            <option value="">请选择</option>
+                            <option value="创建计划" ${node.activateStructures === '创建计划' ? 'selected' : ''}>创建计划</option>
+                        </select>
+                        
+                        <input type="number" name="activateWhichDay" placeholder="规则" class="styled-input" value="${node.activateWhichDay}">
+                        天激活
+                     <select name="activateNodeRule" id="ts${count}" class="styled-input">
+                        <option value="单次节点" ${node.activateNodeRule === '单次节点' ? 'selected' : ''}>单次节点</option>
+                        <option value="周期节点" ${node.activateNodeRule === '周期节点' ? 'selected' : ''}>周期节点</option>
                     </select>
-                    <p></p id="sctask">
+                    <p id="sctask${count}"></p>
                     <strong>生成任务:</strong>
                     <select name="createTaskStructures" id="scrw${count}" class="styled-input">
                         <option value="">请选择</option>
-                        <option value="时间条件" ${columnsData.createTaskStructures === '时间条件' ? 'selected' : ''}>时间条件</option>
-                        <option value="事件条件" ${columnsData.createTaskStructures === '事件条件' ? 'selected' : ''}>事件条件</option>
+                        <option value="时间条件" ${node.createTaskStructures === '时间条件' ? 'selected' : ''}>时间条件</option>
+                        <option value="事件条件" ${node.createTaskStructures === '事件条件' ? 'selected' : ''}>事件条件</option>
                     </select>
-                    <span id="span${count}">第
-                        <input type="number" id="createTaskDi${count}" name="createTaskDi" placeholder="请输入" class="styled-input" value="${columnsData.createTaskDi}">
-                        天生成任务 </span>&nbsp;<a href="#" onclick="toTask()" id="toTask">添加过滤条件</a>
+                    <span id="span${count}"></span>
+                    &nbsp;<a href="#" onclick="toTask()" id="toTask${count}">添加过滤条件</a>
                     <div id="filtersContainer${count}" name="filtersContainer"></div>
-                    <p></p>
-                    <strong>任务动作: &emsp;&nbsp;</strong>
-                    <select name="taskActionMode" id="cj${count}" class="styled-input">
-                        <option value="创建" ${columnsData.taskActionMode === '创建' ? 'selected' : ''}>创建</option>
-                    </select>
-                    &emsp;&nbsp;&nbsp;
-                    <select name="taskActionTaskType" id="rwdz${count}" class="styled-input">
-                        <option value="">请选择</option>
-                        <option value="表单任务" ${columnsData.taskActionTaskType === '表单任务' ? 'selected' : ''}>表单任务</option>
-                        <option value="触达任务" ${columnsData.taskActionTaskType === '触达任务' ? 'selected' : ''}>触达任务</option>
-                    </select>
-                    类型,由角色
-                    <select name="taskActionRole" id="js${count}" class="styled-input">
-                        <option value=""></option>
-                        <option value="药师" ${columnsData.taskActionRole === '药师' ? 'selected' : ''}>药师</option>
-                        <option value="系统" ${columnsData.taskActionRole === '系统' ? 'selected' : ''}>系统</option>
-                    </select>
-                    执行
-                    <p></p>
-                    <strong>执行任务:</strong>生成后第&nbsp;
-                    <input type="number" name="generationDaysAfter" placeholder="请输入" class="styled-input" value="${columnsData.generationDaysAfter}">
-                     天
-                    <input type="text" name="generationHMS" placeholder="请输入时间(时分秒)" id="datetimepicker-demo-3" class="styled-input" value="${columnsData.generationHMS}">
-                    执行任务
-                    <p></p>
-                    <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>随访主题&nbsp;
-                    <select name="followUpSubject" id="sfzt${count}" class="styled-input">
-                        <option value="">请选择</option>
-                        <option value="用药指导" ${columnsData.followUpSubject === '用药指导' ? 'selected' : ''}>用药指导</option>
-                        <option value="脱落召回" ${columnsData.followUpSubject === '脱落召回' ? 'selected' : ''}>脱落召回</option>
-                    </select>
-                    <p></p>
-                    <strong>&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>任务有效期&nbsp;
-                    <input type="number" name="taskValidity" placeholder="请输入" class="styled-input" value="${columnsData.taskValidity}">&emsp;天
-                    <p></p>
-                    <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>任务素材&nbsp;
-                    <select name="taskMaterial" id="1-${count}" class="styled-input">
-                        <option value="表单" ${columnsData.taskMaterial === '表单' ? 'selected' : ''}>表单</option>
-                        <option value="表单2" ${columnsData.taskMaterial === '表单2' ? 'selected' : ''}>表单2</option>
-                    </select>
-                    <p></p><div id="rwdzform${count}" class="myDivrwdz">
-                    <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>使用表单&nbsp;
-                    <select name="useForm" id="2-${count}" class="styled-input">
-                        <option value="">请选择</option>
-                        <option value="单任务表单" ${columnsData.useForm === '单任务表单' ? 'selected' : ''}>单任务表单</option>
-                        <option value="随访任务表单" ${columnsData.useForm === '随访任务表单' ? 'selected' : ''}>随访任务表单</option>
-                        <option value="脱落召回随访表单" ${columnsData.useForm === '脱落召回随访表单' ? 'selected' : ''}>脱落召回随访表单</option>
-                    </select>
-                    </div><p></p><div id="rwdzID${count}" class="myDivrwdz">
-                    <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>短信ID&emsp;&nbsp;
-                    <input type="text" name="smsId" class="styled-input" placeholder="请输入短信ID" value="${columnsData.smsId}">
-                    </div><p></p>
-                    <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;</strong>下发渠道&nbsp;
-                    <input type="radio" id="duanxiqudan${count}" name="deliveryChannel" class="form-check-radio" value="短信" ${columnsData.deliveryChannel === '短信' ? 'checked' : ''}> 短信
-                    <input type="radio" id="yaoshigzt${count}" name="deliveryChannel" class="form-check-radio" value="药师工作台" ${columnsData.deliveryChannel === '药师工作台' ? 'checked' : ''}> 药师工作台
+                        <p></p>
+                        <strong>任务动作: &emsp;&nbsp;</strong>
+                        <select name="taskActionMode" id="cj${count}" class="styled-input">
+                            <option value="创建" ${node.taskActionMode === '创建' ? 'selected' : ''}>创建</option>
+                        </select>
+                        &emsp;&nbsp;&nbsp;
+                        <select name="taskActionTaskType" id="rwdz${count}" class="styled-input">
+                            <option value="">请选择</option>
+                            <option value="表单任务" ${node.taskActionTaskType === '表单任务' ? 'selected' : ''}>表单任务</option>
+                            <option value="触达任务" ${node.taskActionTaskType === '触达任务' ? 'selected' : ''}>触达任务</option>
+                        </select>
+                        类型,由角色
+                        <select name="taskActionRole" id="js${count}" class="styled-input">
+                            <option value=""></option>
+                            <option value="药师" ${node.taskActionRole === '药师' ? 'selected' : ''}>药师</option>
+                            <option value="系统" ${node.taskActionRole === '系统' ? 'selected' : ''}>系统</option>
+                        </select>
+                        执行
+                        <p></p>
+                        <strong>执行任务:</strong>生成后第&nbsp;
+                        <input type="number" name="generationDaysAfter"   placeholder="请输入" class="styled-input" value="${node.generationDaysAfter}">
+                         天
+                        <input type="text" name="generationHMS" placeholder="请输入时间(时分秒)" id="datetimepicker-demo-3" class="styled-input" value="${node.generationHMS}">
+                        执行任务
+                        <p></p>
+                        <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>随访主题&nbsp;
+                        <select name="followUpSubject" id="sfzt${count}" class="styled-input">
+                            <option value="">请选择</option>
+                            <option value="用药指导" ${node.followUpSubject === '用药指导' ? 'selected' : ''}>用药指导</option>
+                            <option value="脱落召回" ${node.followUpSubject === '脱落召回' ? 'selected' : ''}>脱落召回</option>
+                            <option value="常规随访" ${node.followUpSubject === '常规随访' ? 'selected' : ''}>常规随访</option>
+                        </select>
+                        <p></p>
+                        <strong>&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>任务有效期&nbsp;
+                        <input type="number" name="taskValidity" placeholder="请输入" class="styled-input" value="${node.taskValidity}">&emsp;天
+                        <p></p>
+                        <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>任务素材&nbsp;
+                        <select name="taskMaterial" id="1-${count}" class="styled-input">
+                            <option value="表单" ${node.taskMaterial === '表单' ? 'selected' : ''}>表单</option>
+                            <option value="表单2" ${node.taskMaterial === '表单2' ? 'selected' : ''}>表单2</option>
+                        </select>
+                        <p></p><div id="rwdzform${count}" class="myDivrwdz">
+                        <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>使用表单&nbsp;
+                        <select name="useForm" id="2-${count}" class="styled-input">
+                            <option value="">请选择</option>
+                            <option value="单任务表单" ${node.useForm === '单任务表单' ? 'selected' : ''}>单任务表单</option>
+                            <option value="随访任务表单" ${node.useForm === '随访任务表单' ? 'selected' : ''}>随访任务表单</option>
+                            <option value="脱落召回随访表单" ${node.useForm === '脱落召回随访表单' ? 'selected' : ''}>脱落召回随访表单</option>
+                        </select>
+                        </div><p></p><div id="rwdzID${count}" class="myDivrwdz">
+                        <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;&nbsp;</strong>短信ID&emsp;&nbsp;
+                        <input type="text" name="smsId"  class="styled-input" placeholder="请输入短信ID" value="${node.smsId}">
+                        </div><p></p>
+                        <strong>&emsp;&emsp;&emsp;&emsp;&nbsp;</strong>下发渠道&nbsp;
+                         <select name="deliveryChannel" id="xfqd${count}" class="styled-input">
+                            <option value="">请选择下发渠道</option>
+                            <option value="短信" ${node.deliveryChannel === '短信' ? 'selected' : ''}>短信</option>
+                            <option value="药师工作台" ${node.deliveryChannel === '药师工作台' ? 'selected' : ''}>药师工作台</option>
+                        </select>
+                    </div>
                 </div>
-            </div>
-        `;
-            // 添加到容器
-            var NodeSelect = `
-            <li id="li-${count}" class="${c}">
-                <a data-toggle="tab" href="#tab-${count}" aria-expanded="${t}">
-                    <span class="your-class-for-nodes" id="jd${count}">
-                        节点${count}
-                    </span>
-                    <span class="close-tab" onclick="deleteNode('${count}')">
-                        <i class="fa fa-times"></i>
-                    </span>
-                </a>
-            </li>
-        `;
+            `;
+                // 添加到容器
+                var NodeSelect = `
+                <li id="li-${count}" class="${c}">
+                    <a data-toggle="tab" href="#tab-${count}" aria-expanded="${t}">
+                        <span class="your-class-for-nodes" id="jd${count}">
+                            节点${count}
+                        </span>
+                        <span class="close-tab" onclick="deleteNode('${count}')">
+                            <i class="fa fa-times"></i>
+                        </span>
+                    </a>
+                </li>
+            `;
             $('#addNode').append(addNodeHtml);
             $('#addNodeSelect').append(NodeSelect);
 
+            updateTaskCreationUI(count,columnsData);
+            duanxin(count);
             // 主动重新绑定事件
             bindTabEvents(count);
+            // 动态加载过滤条件
+            loadFilterConditions(count, columnsData.filterCondition);
+        });
+
+        // 绑定 onchange 事件监听器以响应用户交互
+        for (var i = 1; i <= count; i++) {
+            document.getElementById('ts' + i).addEventListener('change', function() {
+                updateTaskCreationUI(this.id.replace('ts', ''), getNodeData(this.id.replace('ts', '')));
+            });
+            document.getElementById('scrw' + i).addEventListener('change', function() {
+                updateTaskCreationUI(this.id.replace('scrw', ''), getNodeData(this.id.replace('scrw', '')));
+            });
+        }
 
 
-            // ...(之前构建节点HTML片段的代码)
-            // 尝试处理 filterCondition BLOB 数据
-            let parsedFilterConditions = null;
-            try {
-                debugger;
-                if (typeof node.filterCondition === 'object' && node.filterCondition instanceof Blob) {
-                    // 创建一个 FileReader 来读取 BLOB 数据
-                    const reader = new FileReader();
-                    reader.onload = function(e) {
-                        try {
-                            // 假设 BLOB 内容是 UTF-8 编码的 JSON 字符串
-                            parsedFilterConditions = JSON.parse(e.target.result);
-
-                            // 回显过滤条件
-                            if (parsedFilterConditions && parsedFilterConditions.length > 0) {
-                                parsedFilterConditions.forEach((condition) => {
-                                    toTask2(count, [condition]); // 注意:每次传递单个条件对象
-                                });
-                            }
-                        } catch (e) {
-                            console.error("解析 filterCondition 失败: ", e);
-                            parsedFilterConditions = [];
-                        }
-                    };
-                    reader.readAsText(node.filterCondition, 'UTF-8'); // 指定编码方式为 UTF-8
-                } else if (typeof node.filterCondition === 'string') {
-                    // 如果已经是字符串,则直接解析
-                    parsedFilterConditions = JSON.parse(node.filterCondition);
-
-                    // 回显过滤条件
-                    if (parsedFilterConditions && parsedFilterConditions.length > 0) {
-                        parsedFilterConditions.forEach((condition) => {
-                            toTask2(count, [condition]); // 注意:每次传递单个条件对象
-                        });
-                    }
-                } else if (Array.isArray(node.filterCondition)) {
-                    parsedFilterConditions = node.filterCondition;
-
-                    // 回显过滤条件
-                    if (parsedFilterConditions && parsedFilterConditions.length > 0) {
-                        parsedFilterConditions.forEach((condition) => {
-                            toTask2(count, [condition]); // 注意:每次传递单个条件对象
-                        });
-                    }
-                }
-            } catch (e) {
-                console.error("处理 filterCondition BLOB 数据失败: ", e);
-                parsedFilterConditions = [];
+    }
+    function updateTaskCreationUI(count, node) {
+        var activateNodeRule = node.activateNodeRule;
+        var createTaskStructures = node.createTaskStructures;
+        var spanElement = document.getElementById('span' + count);
+
+        if (activateNodeRule === '周期节点') {
+            if (createTaskStructures === '时间条件') {
+                spanElement.innerHTML = `
+                每
+                <input type="number" name="createTaskEvery" placeholder="请输入" class="styled-input" value="${node.createTaskEvery || ''}">
+                天生成任务,共执行
+                <input type="number" name="createTaskExecutionTimes" placeholder="请输入" class="styled-input" value="${node.createTaskExecutionTimes || ''}">
+                次
+            `;
+            } else if (createTaskStructures === '事件条件') {
+                spanElement.innerHTML = `
+                当
+                <select name="createTaskWhen" id="scrw-t${count}" class="styled-input">
+                    <option value="">请选择</option>
+                    <option value="最近订单D值" ${node.createTaskWhen === '最近订单D值' ? 'selected' : ''}>最近订单D值(剩余用药天数)</option>
+                    <option value="其他值" ${node.createTaskWhen === '其他值' ? 'selected' : ''}>其他值</option>
+                </select>
+                为
+                <input type="number" name="createTaskTriggerValue" placeholder="请输入" class="styled-input" value="${node.createTaskTriggerValue || ''}">
+                触发动作 &nbsp; &nbsp;
+                共执行
+                <input type="number" name="createTaskExecutionTimes" placeholder="请输入" class="styled-input" value="${node.createTaskExecutionTimes || ''}">
+                次
+            `;
             }
+        } else if (activateNodeRule === '单次节点') {
+            spanElement.innerHTML = `
+            第
+            <input type="number" id="createTaskDi${count}" name="createTaskDi" placeholder="请输入" class="styled-input" value="${node.createTaskDi || ''}">
+            天生成任务
+        `;
+        }
+    }
+
+    // 获取节点数据的辅助函数
+    function getNodeData(count) {
+        return {
+            activateNodeRule: document.getElementById('ts' + count).value,
+            createTaskStructures: document.getElementById('scrw' + count).value,
+            createTaskEvery: document.querySelector(`#span${count} input[name="createTaskEvery"]`)?.value,
+            createTaskExecutionTimes: document.querySelector(`#span${count} input[name="createTaskExecutionTimes"]`)?.value,
+            createTaskWhen: document.querySelector(`#span${count} select[name="createTaskWhen"]`)?.value,
+            createTaskTriggerValue: document.querySelector(`#span${count} input[name="createTaskTriggerValue"]`)?.value,
+            createTaskDi: document.querySelector(`#span${count} input[name="createTaskDi"]`)?.value
+        };
+    }
+    //动态加载过滤条件
+    function loadFilterConditions(count, filterConditions) {
+        var filtersContainer = document.getElementById('filtersContainer' + count);
+
+        // 确保 filterConditions 是一个数组
+        if (!Array.isArray(filterConditions)) {
+            console.warn('filterConditions is not an array:', filterConditions);
+            filterConditions = [];
+        }
+
+        // 打印调试信息
+        console.log('Loading filter conditions:', filterConditions);
+
+        filterConditions.forEach(condition => {
+             selectCount = condition.rowIndex || Date.now(); // 使用 rowIndex 或当前时间戳作为 selectCount 的值
+
+            var filterRow = document.createElement('div');
+            filterRow.className = 'filter-row';
+
+            // 创建并初始化一级下拉列表 特征
+            var levelOneSelect = document.createElement('select');
+            levelOneSelect.id = 'level-one' + selectCount;
+            levelOneSelect.name = 'trait';
+            levelOneSelect.className = 'styled-input';
+            levelOneSelect.innerHTML = `
+        <option value="" disabled ${condition.traits ? '' : 'selected'}>请选择一级分类</option>
+        <option value="patient-feature" ${condition.traits === 'patient-feature' ? 'selected' : ''}>患者特征</option>
+        <option value="patient-did-feature" ${condition.traits === 'patient-did-feature' ? 'selected' : ''}>患者Did特征</option>
+    `;
+            filterRow.appendChild(levelOneSelect);
+           // filtersContainer.appendChild(filterRow);
+
+            // 创建并初始化二级下拉列表
+            var levelTwoContainer = document.createElement('div');
+            levelTwoContainer.className = 'styled-input';
+
+            var levelTwoSelect = document.createElement('select');
+            levelTwoSelect.id = 'level-two' + selectCount;
+            levelTwoSelect.name = 'traitValue';
+            levelTwoSelect.className = 'styled-input';
+            levelTwoSelect.innerHTML = generateLevelTwoOptions(condition.traitValue); // 设置默认值
+
+            filterRow.appendChild(levelTwoSelect);
+           // filtersContainer.appendChild(levelTwoContainer);
+
+            // 创建并初始化三级下拉列表
+            var levelThreeContainer = document.createElement('div');
+            levelThreeContainer.id = 'level-three-container' + selectCount;
+            levelThreeContainer.className = 'styled-input';
+            levelThreeContainer.style.display = 'none';
+
+            var levelThreeSelect = document.createElement('select');
+            levelThreeSelect.id = 'level-three' + selectCount;
+            levelThreeSelect.name = 'judgingCondition';
+            levelThreeSelect.className = 'styled-input';
+            levelThreeSelect.innerHTML = `
+            <option value="" disabled ${condition.judgingCondition ? '' : 'selected'}>请选择判断条件</option>
+            <option value="等于" ${condition.judgingCondition === '等于' ? 'selected' : ''}>等于</option>
+            <option value="不等于" ${condition.judgingCondition === '不等于' ? 'selected' : ''}>不等于</option>
+            <!-- 添加更多判断条件选项 -->
+        `;
+            filterRow.appendChild(levelThreeSelect);
+            debugger;
+            // 创建并初始化四级输入框只输入数字
+            if (condition.judgingCondition === '等于' || condition.judgingCondition === '不等于') {
+                var levelFourInput = document.createElement('input');
+                levelFourInput.id = 'level-four-inputNumber' + selectCount;
+                levelFourInput.name = 'judgmentInputValue';
+                levelFourInput.className = 'styled-input';
+               // levelFourInput.type = 'number';
+                levelFourInput.type = 'text'; // 明确指定类型,即使默认是 text
+                levelFourInput.value = condition.judgmentValue;
+
+                filterRow.appendChild(levelFourInput);
+              // $('#level-four-inputNumber'+selectCount).val(condition.judgmentValue);
+                // 使用 setAttribute 方法赋值
+                levelFourInput.setAttribute('value', condition.judgmentValue); // 使用 setAttribute 方法赋值
+            } else {
+                var levelFourSelect = document.createElement('select');
+                levelFourSelect.id = 'level-four-input' + selectCount;
+                levelFourSelect.name = 'judgmentSelectValue';
+                levelFourSelect.className = 'styled-input';
+                levelFourSelect.innerHTML = generateLevelFourOptions(condition.judgmentValue); // 假设有一个函数生成四级下拉选项
+                filterRow.appendChild(levelFourSelect);
+
+            }
+
+            // 创建移除按钮
+            var removeButton = document.createElement('button');
+            removeButton.textContent = '删除';
+            removeButton.className = 'remove-buttonx';
+            removeButton.onclick = () => {
+                filtersContainer.removeChild(filterRow);
+
+            };
+
+            filterRow.innerHTML+= "<p class='grey-text'>如满足左侧设定逻辑,则不会执行任务动作</p>";
+            filterRow.appendChild(removeButton);
+            // 将新创建的 filterRow 添加到 filtersContainer 中
+            filtersContainer.appendChild(filterRow);
+
         });
     }
 
 
+    // 创建过滤条件行
+    function createFilterRow(selectCount, condition) {
+        var filterRow = document.createElement('div');
+        filterRow.className = 'filter-row';
 
+        // 创建并初始化一级下拉列表 特征
+        var levelOneSelect = document.createElement('select');
+        levelOneSelect.id = 'level-one' + selectCount;
+        levelOneSelect.name = 'trait';
+        levelOneSelect.className = 'styled-input';
+        levelOneSelect.innerHTML = `
+        <option value="" disabled ${condition.traits ? '' : 'selected'}>请选择一级分类</option>
+        <option value="patient-feature" ${condition.traits === 'patient-feature' ? 'selected' : ''}>患者特征</option>
+        <option value="patient-did-feature" ${condition.traits === 'patient-did-feature' ? 'selected' : ''}>患者Did特征</option>
+    `;
+        filterRow.appendChild(levelOneSelect);
 
+        // 创建二级、三级、四级的容器和相关元素,但初始时不显示它们 特征值
+        var levelTwoContainer = document.createElement('div');
+        levelTwoContainer.id = 'level-two-container' + selectCount;
+        levelTwoContainer.className = 'styled-input';
+        levelTwoContainer.style.display = 'none';
 
+        // 创建并初始化二级下拉列表
+        var levelTwoSelect = document.createElement('select');
+        levelTwoSelect.id = 'level-two' + selectCount;
+        levelTwoSelect.name = 'traitValue';
+        levelTwoSelect.className = 'styled-input';
+        levelTwoSelect.innerHTML = generateLevelTwoOptions(condition.traitValue);
+        levelTwoContainer.appendChild(levelTwoSelect);
+        filterRow.appendChild(levelTwoContainer);
+
+        // 创建并初始化三级下拉列表
+        var levelThreeContainer = document.createElement('div');
+        levelThreeContainer.id = 'level-three-container' + selectCount;
+        levelThreeContainer.className = 'styled-input';
+        levelThreeContainer.style.display = 'none';
+
+        var levelThreeSelect = document.createElement('select');
+        levelThreeSelect.id = 'level-three' + selectCount;
+        levelThreeSelect.name = 'judgingCondition';
+        levelThreeSelect.className = 'styled-input';
+        levelThreeSelect.innerHTML = `
+        <option value="" disabled ${condition.judgingCondition ? '' : 'selected'}>请选择判断条件</option>
+        <option value="等于" ${condition.judgingCondition === '等于' ? 'selected' : ''}>等于</option>
+        <option value="不等于" ${condition.judgingCondition === '不等于' ? 'selected' : ''}>不等于</option>
+        <!-- 添加更多判断条件选项 -->
+    `;
+        levelThreeContainer.appendChild(levelThreeSelect);
+        filterRow.appendChild(levelThreeContainer);
+
+        // 创建并初始化四级输入框或下拉框
+        var levelFourContainer = document.createElement('div');
+        levelFourContainer.id = 'level-four-container' + selectCount;
+        levelFourContainer.className = 'styled-input';
+        levelFourContainer.style.display = 'none';
+
+        if (condition.judgingCondition === '等于' || condition.judgingCondition === '不等于') {
+            var levelFourInput = document.createElement('input');
+            levelFourInput.id = 'level-four-inputNumber' + selectCount;
+            levelFourInput.name = 'judgmentInputValue';
+            levelFourInput.className = 'styled-input';
+            levelFourInput.type = 'number';
+            levelFourInput.value = condition.judgmentValue || '';
+            levelFourContainer.appendChild(levelFourInput);
+        } else {
+            var levelFourSelect = document.createElement('select');
+            levelFourSelect.id = 'level-four-input' + selectCount;
+            levelFourSelect.name = 'judgmentSelectValue';
+            levelFourSelect.className = 'styled-input';
+            levelFourSelect.innerHTML = generateLevelFourOptions(condition.judgmentValue); // 假设有一个函数生成四级下拉选项
+            levelFourContainer.appendChild(levelFourSelect);
+        }
 
+        filterRow.appendChild(levelFourContainer);
+
+        // 创建移除按钮
+        var removeButton = document.createElement('button');
+        removeButton.textContent = '删除';
+        removeButton.className = 'remove-buttonx';
+        removeButton.onclick = () => {
+            filterRow.parentNode.removeChild(filterRow);
+        };
+        filterRow.innerHTML += "<p class='grey-text'>如满足左侧设定逻辑,则不会执行任务动作</p>";
+        filterRow.appendChild(removeButton);
 
+        return filterRow;
+    }
 
+    // 生成二级下拉列表选项
+    function generateLevelTwoOptions(selectedValue) {
+        return `
+        <option value="" disabled ${selectedValue ? '' : 'selected'}>请选择特征值</option>
+        <option value="最近订单距今天数" ${selectedValue === '最近订单距今天数' ? 'selected' : ''}>最近订单距今天数</option>
+        <option value="永久停止随访(常规随访)" ${selectedValue === '永久停止随访(常规随访)' ? 'selected' : ''}>永久停止随访(常规随访)</option>
+        <option value="永久停止随访(脱落召回)" ${selectedValue === '永久停止随访(脱落召回)' ? 'selected' : ''}>永久停止随访(脱落召回)</option>
+        <!-- 添加更多特征值选项 -->
+    `;
+    }
 
+    // 生成四级下拉列表选项(假设)
+    function generateLevelFourOptions(selectedValue) {
+        return `
+        <option value="" disabled ${selectedValue ? '' : 'selected'}>请选择判断值</option>
+        <option value="1" ${selectedValue === '1' ? 'selected' : ''}>是</option>
+        <option value="0" ${selectedValue === '0' ? 'selected' : ''}>否</option>
+        <!-- 根据实际需求添加更多选项 -->
+    `;
+    }
 </script>
 <style>
     .myDivrwdz {

+ 4 - 0
health-common/src/main/java/com/bzd/common/utils/uuid/IdUtils.java

@@ -40,6 +40,10 @@ public class IdUtils
     {
         return UUID.get10randomNumber();
     }
+    public static int get7randomNumber()
+    {
+        return UUID.get7randomNumber();
+    }
     /**
      * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID
      *

+ 11 - 1
health-common/src/main/java/com/bzd/common/utils/uuid/UUID.java

@@ -501,9 +501,19 @@ public final class UUID implements java.io.Serializable, Comparable<UUID>
     { // 创建一个SecureRandom对象
         SecureRandom secureRandom = new SecureRandom();
 
-        // 生成一个5位数的随机数
+        // 生成一个10位数的随机数
         int randomNumber = 1000000000 + secureRandom.nextInt(90000);
 
         return randomNumber;
     }
+    public static int get7randomNumber()
+    { // 创建一个SecureRandom对象
+        SecureRandom secureRandom = new SecureRandom();
+
+        // 生成一个7位数的随机数
+        int randomNumber = 1000000 + secureRandom.nextInt(90000);
+
+        return randomNumber;
+    }
+
 }

+ 156 - 2
health-system/src/main/java/com/bzd/system/service/dtp/SDtpYypzFollowUpSopService.java

@@ -5,6 +5,7 @@ import com.bzd.common.config.dao.DaoSupport;
 import com.bzd.common.config.dao.PageData;
 import com.bzd.common.utils.DateUtils;
 import com.bzd.common.utils.StringUtils;
+import com.bzd.common.utils.uuid.IdUtils;
 import com.bzd.common.utils.uuid.SnowflakeIdGenerator;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.io.IOUtils;
@@ -42,7 +43,8 @@ public class SDtpYypzFollowUpSopService {
     private DaoSupport daoSupport;
     @Transactional(rollbackFor = Exception.class)
     public Integer addSDtpYypzFollowUpSop(PageData pd) throws Exception {
-        Long templateId = SnowflakeIdGenerator.newId();
+        //Long templateId = SnowflakeIdGenerator.newId();弃用
+        Integer templateId = IdUtils.get7randomNumber();//生成7位随机数
         Object nodesDataList = pd.get("nodesData");
         List<PageData> nodeList = new ArrayList<>();
         List<PageData> addList = new ArrayList<>();
@@ -199,8 +201,160 @@ public class SDtpYypzFollowUpSopService {
     }
 
     public Integer updateSDtpYypzFollowUpSop(PageData pd)throws Exception {
-        return daoSupport.update("SDtpYypzFollowUpSopMapper.updateSDtpYypzFollowUpSop", pd);
+        PageData pda =new PageData();
+        Integer statusFla=null;
+        String switchFlag = (String) pd.get("switchFlag");
+        if(StringUtils.isNotEmpty(switchFlag)){
+            if(switchFlag.equals("已创建")){
+                statusFla=0;
+            }
+            if(switchFlag.equals("启用中")){
+                statusFla=1;
+            }
+            if(switchFlag.equals("禁用中")){
+                statusFla=2;
+            }
+        }
+        Object nodesDataList = pd.get("nodesData");
+        String templateId = (String) pd.get("templateId");
+        if (StringUtils.isNotNull(templateId)) {
+            pda.put("templateId", templateId);
+        }else {
+            throw new RuntimeException("模板ID不能为空");
+        }
+        List<PageData> nodeList = new ArrayList<>();
+        List<PageData> addList = new ArrayList<>();
+        Object drugList = pd.get("applicableDrug");//获取药品信息列表
+        try {
+            //更新药品信息
+        if (StringUtils.isNotNull(drugList)) {
+            List<PageData> ylist= (List<PageData>) daoSupport.findForList("SDtpYypzFollowUpSopMapper.selectDrugsByTemplateId", pda);
+            if (ylist.size() > 0) {
+                int a=  daoSupport.update("SDtpYypzFollowUpSopMapper.deleteTemplateDrugByTemplateId", pda);
+                if (a <= 0) {
+                    throw new RuntimeException("药品更新删除失败");
+                }
+             }
+                // 将 JSON 字符串转换为 List<Map<String, Object>>
+                ObjectMapper objectMapper = new ObjectMapper();
+                List<Map<String, Object>> rowsdrugList = objectMapper.readValue(drugList.toString(), List.class);
+                // 遍历列表并调用插入数据接口
+                if (rowsdrugList.size() > 0) {
+                    for (Map<String, Object> lxr : rowsdrugList) {
+                        PageData pageData = new PageData();
+                        pageData.put("storeId", getSysUser().getDeptId());
+                        pageData.put("createTime", DateUtils.getTime());
+                        pageData.put("productName", lxr.get("productName"));
+                        pageData.put("productCode", lxr.get("productCode"));
+                        pageData.put("specification", lxr.get("specification"));
+                        pageData.put("templateId", templateId);
+                        pageData.put("templateName", pd.get("templateName"));
+                        addList.add(pageData);
+                    }
+                    final HashMap<String, Object> addMap = new HashMap<String, Object>();
+                    addMap.put("dataList", addList);
+                    int resultDrug= dao.executeBatch("SDtpYypzFollowUpSopMapper.batchAddTemplateDrugDynamic", addMap);
+                    if (resultDrug <= 0) {
+                        throw new RuntimeException("药品信息插入失败");
+                    }
+                }
+
+        }
+            //修改节点信息
+        if (StringUtils.isNotNull(nodesDataList)) {
+                List<PageData> ylist= (List<PageData>) daoSupport.findForList("SDtpYypzFollowUpSopMapper.selectNodeConfigByTemplateId", pda);
+                if (ylist.size() > 0) {
+                    int b=  daoSupport.update("SDtpYypzFollowUpSopMapper.deleteNodeConfigByTemplateId", pda);
+                    if (b <= 0) {
+                        throw new RuntimeException("节点信息更新删除失败");
+                    }
+                }
+                // 将 JSON 字符串转换为 List<Map<String, Object>>
+                ObjectMapper objectMapper = new ObjectMapper();
+                List<Map<String, Object>> nodesList = objectMapper.readValue(nodesDataList.toString(), List.class);
+                // 遍历列表并调用插入数据接口
+                if (nodesList.size() > 0) {
+                    for (int i = 0; i < nodesList.size(); i++) {
+                        Map<String, Object> lxr = nodesList.get(i);
+                        PageData pageData = new PageData();
+
+                        // 自动生成节点名称和编码
+                        String nodeName = "节点" + (i + 1); // 节点名称从节点1开始
+                        String nodeCode = String.valueOf(i + 1); // 编码从1开始
+                        pageData.put("nodeName", nodeName);
+                        pageData.put("nodeCode", nodeCode);
+                        pageData.put("templateId", templateId);
+                        pageData.put("activateStructures", lxr.get("activateStructures"));
+                        pageData.put("activateWhichDay", lxr.get("activateWhichDay"));
+                        pageData.put("activateNodeRule", lxr.get("activateNodeRule"));
+                        pageData.put("createTaskStructures", lxr.get("createTaskStructures"));
+                        pageData.put("createTaskWhen", lxr.get("createTaskWhen"));
+                        pageData.put("createTaskEvery", lxr.get("createTaskEvery"));
+                        pageData.put("createTaskDi", lxr.get("createTaskDi"));
+                        pageData.put("createTaskTriggerValue", lxr.get("createTaskTriggerValue"));
+                        pageData.put("createTaskExecutionTimes", lxr.get("createTaskExecutionTimes"));
+                        pageData.put("taskActionMode", lxr.get("taskActionMode"));
+                        pageData.put("taskActionTaskType", lxr.get("taskActionTaskType"));
+                        pageData.put("taskActionRole", lxr.get("taskActionRole"));
+                        pageData.put("generationDaysAfter", lxr.get("generationDaysAfter"));
+                        pageData.put("generationHMS", lxr.get("generationHMS"));
+                        pageData.put("followUpSubject", lxr.get("followUpSubject"));
+                        pageData.put("taskValidity", lxr.get("taskValidity"));
+                        pageData.put("taskMaterial", lxr.get("taskMaterial"));
+                        pageData.put("deliveryChannel", lxr.get("deliveryChannel"));
+                        pageData.put("smsId",lxr.get("smsId"));
+                        pageData.put("useForm",lxr.get("useForm"));
+                        if(StringUtils.isNotEmpty(switchFlag)){
+                            pageData.put("status",statusFla);//状态: 0已创建 1启用,2禁用 默认为已创建0
+                        }else{
+                            pageData.put("status",0);//状态: 0已创建 1启用,2禁用 默认为已创建0
+                        }
+
+                        // 处理 过滤条件 filtersData
+                        @SuppressWarnings("unchecked")
+                        List<Map<String, Object>> filtersData = (List<Map<String, Object>>) lxr.get("filtersData");
+                        if (filtersData != null && !filtersData.isEmpty()) {
+                            String filtersDataJson = objectMapper.writeValueAsString(filtersData);
+                            pageData.put("filterCondition", filtersDataJson);
+                        }
+                        System.out.println("pageData:"+pageData);
+                        int node1= dao.executeBatch("SDtpYypzFollowUpSopMapper.insertNodeConfig", pageData);
+                        nodeList.add(pageData);
+                        if (node1 <= 0) {
+                            throw new RuntimeException("节点配置插入失败");
+                        }
+                    }
+                    //                final HashMap<String, Object> addMap = new HashMap<String, Object>();
+                    //                addMap.put("dataList", nodeList);
+                    //批量插入暂时不用
+                    //                int node= dao.executeBatch("SDtpYypzFollowUpSopMapper.batchAddNodeConfig", addMap);
+                    //                if (node <= 0) {
+                    //                    throw new RuntimeException("节点配置插入失败");
+                    //                }
+                }
+
+        }
+
+        } catch (Exception e) {
+        e.printStackTrace();
+    }   //修改模版信息
+        pd.put("updatedBy",getSysUser().getLoginName());
+        pd.put("updatedTime",DateUtils.getTime());
+        pd.put("storeId",getSysUser().getDeptId().toString());//门店id
+        pd.put("storeName",getSysUser().getDept().getDeptName());//门店名称
+        if(StringUtils.isNotEmpty(switchFlag)){
+            pd.put("status",statusFla);//状态: 0已创建 1启用,2禁用 默认为已创建0
+        }else{
+            pd.put("status",0);//状态: 0已创建 1启用,2禁用 默认为已创建0
+        }
+        int result =  daoSupport.update("SDtpYypzFollowUpSopMapper.updateSDtpYypzFollowUpSop", pd);
+        if (result <= 0) {
+            throw new RuntimeException("模版修改失败");
+        }
+        return result;
+
     }
+
     public Integer updateSopStatusByTemplateId(PageData pd)throws Exception {
         pd.put("updatedBy",getSysUser().getLoginName());
         pd.put("updatedTime",DateUtils.getTime());

+ 4 - 1
health-system/src/main/resources/mapper/dtp/SDtpYypzFollowUpSopMapper.xml

@@ -53,7 +53,6 @@
         SELECT * FROM s_dtp_yypz_nodeconfig WHERE templateId = #{templateId}
     </select>
 
-
     <update id="updateNodeconfigStatusByTemplateId" parameterType="pd" >
         update s_dtp_yypz_nodeconfig
         <trim prefix=" SET " suffix="" prefixOverrides="," suffixOverrides=",">
@@ -326,6 +325,10 @@
             #{id}
         </foreach>
     </delete>
+
+    <delete id="deleteNodeConfigByTemplateId" parameterType="pd">
+        delete from s_dtp_yypz_nodeconfig WHERE templateId = #{templateId}
+    </delete>
     <select id="selectNodeConfigById" parameterType="pd" resultType="pd">
         SELECT * FROM s_dtp_yypz_nodeconfig WHERE id = #{id}
     </select>