## 1. 明细表日期设置可选范围 ``` ``` ## 2. 明细表日期根据主表日期设置可选范围 ``` ``` ## 3. 重写window.alert系统弹窗:文字过多自动换行,窗口右侧实现滑动精度条,倒计时弹窗确认关闭窗口 ``` ``` ## 4.流程移动端(H5)alert/confirm提示信息去除网址(URL) ``` ``` ## 5.建模查询自定义按钮验证行数据 ``` function onUrl(){ var ids = ModeList.getCheckedID(); var json = ModeList.getTableDatas(); var obj = eval( json); for(var i = 0;i400){ alert("第"+j+"行商品数据异常"); }else{ alert("第"+j+"行商品数据正常"); } } } } } ``` ## 6. 建模查询页面扩展批量操作新建流程带入查询列表字段数据 ``` ``` ## 7.任意页面获取登录用户信息 ``` <%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%> <%@ page import="net.sf.json.*"%> <%@ page import="java.util.*" %> <%@ page import="weaver.general.*" %> <%@ page import="weaver.hrm.HrmUserVarify"%> <%@ page import="weaver.hrm.User"%> <% response.setContentType("application/json;charset=UTF-8"); BaseBean log = new BaseBean(); User user = HrmUserVarify.getUser(request, response); if (user == null) { response.sendRedirect("/login/Login.jsp"); return; } String userloginid=user.getLoginid(); String userlastname=user.getLastname(); int userid=user.getUID(); out.println("登录名:"+userloginid); out.println("用户名:"+userloginid); out.println("用户ID:"+userid); %> ``` ## 8.dosql()特殊处理流程字段数组ID ``` ``` –sql查询条件:where 字段 in (‘m a i n . 字 段 1 main.字段1main.字段1’) 字段1:field5819 ## 9.流程action方法汇总 ``` package weaver.interfaces.workflow.action.javacode; //导入包 import java.util.*; import net.sf.json.*; import weaver.general.*; import weaver.soa.workflow.*; import weaver.soa.workflow.request.*; import weaver.conn.RecordSet; import weaver.conn.RecordSet.*; import weaver.hrm.*; import weaver.interfaces.workflow.action.Action; //在线自定义action接口 public class Action20220706020703 extends BaseBean implements Action{ //流程自定义接口代码示例 public String execute(RequestInfo request) { //日志 writeLog("in my online edited action"); //获取表名称,流程id String requestId = request.getRequestid();//请求ID String requestlevel = request.getRequestlevel();//请求紧急程度 String workflowid = request.getWorkflowid();//流程ID String tablename = request.getRequestManager().getBillTableName();//表单名称 int billid = request.getRequestManager().getBillid();//表单数据ID String requestname = request.getRequestManager().getRequestname();//请求标题 String remark = request.getRequestManager().getRemark();//当前用户提交时的签字意见 int formid = request.getRequestManager().getFormid();//表单ID int isbill = request.getRequestManager().getIsbill();//是否是自定义表单 //取主表数据 Map mainTableDataMap = new HashMap(); Property[] properties = request.getMainTableInfo().getProperty();// 获取表单主字段信息 for (int i = 0; i < properties.length; i++) { String fieldname = properties[i].getName().toLowerCase();// 主字段名称,字段名转换为小写 String fieldval = Util.null2String(properties[i].getValue());// 主字段对应的值 mainTableDataMap.put(fieldname, fieldval);// 存为数组 System.out.println(fieldname + " " + fieldval); } //取明细数据 DetailTable[] detailtable = request.getDetailTableInfo().getDetailTable();// 获取所有明细表 if (detailtable.length > 0) { for (int i = 0; i < detailtable.length; i++) { DetailTable dt = detailtable[i];// 指定明细表 Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储 for (int j = 0; j < s.length; j++) { Row r = s[j];// 指定行 Cell c[] = r.getCell();// 每行数据再按列存储 for (int k = 0; k < c.length; k++) { Cell c1 = c[k];// 指定列 String name = c1.getName();// 明细字段名称 String value = c1.getValue();// 明细字段的值 System.out.println(name + " " + value); } } } } /* //方法1:修改表单字段值 Property[] mainProps = request.getMainTableInfo().getProperty(); // 要修改的主表字段 String mainField = "field101"; // 该主表字段修改后的值 String mainFieldValue = "value101"; for(int i=0; i< mainProps.length; i++){ if(mainProps[i].getName().equals(mainField)){ //主表中存在此字段 prop = mainProps[i]; prop.setValue(mainFieldValue); request.getMainTableInfo().setProperty(i,prop); } } // 调用 BaseBean 的写日志方法 // 会将日志写入泛微 E8 根目录的 /log/ecology 文件中 this.writeLog("已完成修改,仅用于 Java 缓存读取,不可用于全流程"); // 返回 SUCCESS 则依次进入: 当前环节的其他【节点后操作】、系统的出口条件判断、下一环节的【节点前操作】 // 返回 FAILURE_AND_PASS 则会停留在当前环节的界面,提交不成功 return Action.SUCCESS; */ /* //方法2:修改表单字段值 Property[] mainProps = request.getMainTableInfo().getProperty(); // 要修改的主表名称 String mainTableName = request.getRequestManager().getBillTableName(); // 要修改的对应记录行号 String requestId = request.getRequestid(); // 要修改的主表字段 String mainField = "field101"; // 该主表字段修改后的值 String mainFieldValue = "value102"; RecordSet rs = new RecordSet(); //直接更新数据库内容,控制流程走向 String sql = "update "+ mainTableName +" set "+mainField+"= '"+mainFieldValue+"' where requestid ="+requestId; rs.execute(sql); // 调用 BaseBean 的写日志方法 // 会将日志写入泛微 E8 根目录的 /log/ecology 文件中 this.writeLog("已完成修改,可用于全流程"); // 返回 SUCCESS 则依次进入: 当前环节的其他【节点后操作】、系统的出口条件判断、下一环节的【节点前操作】 // 返回 FAILURE_AND_PASS 则会停留在当前环节的界面,提交不成功 return Action.SUCCESS; */ RecordSet rs = new RecordSet(); rs.execute("select * from "+tablename+" where requestid = "+requestId); rs.next(); //获取表字段值 String mainid = rs.getString("id"); String wenben = rs.getString("wenben"); //查询字段值,存为json数组 List> list = new ArrayList>(); String cxsql = "select id,workflowname from workflow_base "; rs.executeSql(cxsql); while(rs.next()){ Map result = new HashMap(); result.put("id",rs.getString("id")); result.put("workflowname",rs.getString("workflowname")); list.add(result); } JSONArray jo = JSONArray.fromObject(list); //禁止提交 if(1==1){ request.getRequestManager().setMessageid("90001"); request.getRequestManager().setMessagecontent("系统异常终止流程提交!"+"\n"+"流程ID:"+requestId+"\n"+"主表数据:"+mainTableDataMap+"\n"+"数据库查询JSON:"+jo); return Action.FAILURE_AND_CONTINUE; }else{ //允许提交 return Action.SUCCESS; } } } ``` ## 10.建模查询字段显示转换 ``` $sqrq$ ``` ## 11.显示模板函数公式 | 函数 | 含义 |示例 | | --- | --- | --- | | ABS | 求数值绝对值 | ABS(数值) | | AVERAGE | 返回一组数值中的平均值 | AVERAGE(数值1,数值2…) | | COS | 返回给定角度的余弦值 | COS(数值) | | EXP | 返回e的n次冥。常数e等于2.71828182845904,是自然对数的底 | EXP(数值) | | INT | 返回舍入实数后的整数值 | INT(数值) | | LN | 返回基底为自然数e的一个数的对数 | LN(正实数) | | LOG10 | 返回以10为底的对数 | LOG10(正实数) | | MAX | 返回一组值中的最大值 | MAX(数值1,数值2…) | | MIN | 返回一组值中的最小值 | MIN(数值1,数值2…) | | MOD | 返回两数相除的余数 | MOD(被除数,除数) | | PI | 返回数字3.14159265358979 | PI() | | ROUND | 四舍五入 | ROUND(数值,小数位数) | | SIN | 返回给定角度的正弦值 | SIN(数值) | | SQRT | 返回数值正平方根 | SQRT(正实数) | | SUM | 求和,返回参数列表中所有数值之和 | SUM(数值1,数值2…) | | SUM_USERVAL | 对单元区域中用户自定义数值相同的单元进行求和 | SUM_USERVAL(单元区域,用户自定义数值) | | SUM_USERVAL_DOWN | 从上到下对单元区域中的单元用户自定义数值相同的单元进行求和,用户自定义数值不相同后不再计算 | SUM_USERVAL_DOWN(单元区域,用户自定义数值) | | SUM_USERVAL_UP | 从下到上对单元区域中的单元用户自定义数值相同的单元进行求和,用户自定义数值不相同后不再计算 | SUM_USERVAL_UP(单元区域,用户自定义数值) | | SUMD | 对单元区域中没有公式的单元进行求和 |SUMD(单元区域1,单元区域2…) | SUMF | 对单元区域中有公式的单元进行求和 | SUMF(单元区域1,单元区域2…) | | TAN | 返回给定角度的正切值 | TAN(数值) | | TRUNC | 将数字截止定位小数的整数 | TRUNC(数值,小数位) | ## 12.根据明细表1中的字段rkck(字段类型为浏览按钮)的值来设置明细表1字段cfdd(字段类型为文本)的必填属性。当rkck值为2时,cfdd必填,否则不改变属性。 我的需求是:根据明细表1中的字段rkck(字段类型为浏览按钮)的值来设置明细表1字段cfdd(字段类型为文本)的必填属性。当rkck值为2时,cfdd必填,否则不改变属性。字段信息 字段ID : field12115 数据库字段名称 : rkck 字段信息 字段ID : field12116 数据库字段名称 : cfdd ChatGPT 根据你的需求,你想根据明细表1中的字段 `rkck` 的值来设置明细表1中的字段 `cfdd` 的必填属性。根据提供的文档,我将为你详细解释如何实现这一功能。 ### 步骤概述 1. **绑定明细字段值变化触发事件**:使用 `bindDetailFieldChangeEvent` 方法监控 `rkck` 字段的值变化。 2. **根据条件改变字段属性**:在值变化的回调函数中,根据 `rkck` 的值决定是否将 `cfdd` 字段设置为必填。 ### 具体实现 首先,根据你提供的字段信息,假设 `rkck` 的字段ID 为 `field12115`,`cfdd` 的字段ID 为 `field12116`。 #### 1. 绑定字段值变化触发事件 使用 `bindDetailFieldChangeEvent` 方法,监听 `rkck` 字段值的变化: ```javascript jQuery(document).ready(function(){ WfForm.bindDetailFieldChangeEvent("field12115", function(fieldId, rowIndex, value){ // 监听 rkck 字段值变化 if (value === '2') { // 当 rkck 的值为 '2' 时,设置 cfdd 字段为必填 WfForm.changeFieldAttr("field12116_" + rowIndex, 3); // 3 表示必填 } else { // 当 rkck 的值不为 '2' 时,设置 cfdd 字段为可编辑(或其他状态) WfForm.changeFieldAttr("field12116_" + rowIndex, 2); // 2 表示可编辑 } }); }); ``` #### 2. 解释代码 * `WfForm.bindDetailFieldChangeEvent("field12115", function(fieldId, rowIndex, value){ ... });`:绑定了 `rkck` 字段的值变化事件。当 `rkck` 字段的值发生变化时,回调函数中的 `value` 参数将获取到 `rkck` 字段当前的值。 * `WfForm.changeFieldAttr("field12116_" + rowIndex, 3);`:根据 `rkck` 字段的值设置 `cfdd` 字段的属性。在这里,如果 `rkck` 的值为 '2',则将 `cfdd` 字段设置为必填 (`3` 表示必填状态),否则可以根据需求设置为可编辑或其他状态。 ### 注意事项 * 请确保在页面加载完成后再执行绑定事件的代码,即 `jQuery(document).ready(function(){ ... });`。 * 参数 `rowIndex` 表示明细行的序号,用于标识明细表中的每一行,确保在设置字段属性时使用正确的行号。 通过这样的实现,当明细表1中的 `rkck` 字段的值发生变化时,系统将自动根据条件设置 `cfdd` 字段的必填属性,实现了根据字段值动态改变字段显示属性的功能。 ## 13.待更新 Loading... ## 1. 明细表日期设置可选范围 ``` <script> // jQuery 文档准备好之后执行的函数 jQuery(document).ready(function() { // 设置已存在行的日期范围 // 获取明细行"detail_1"的行数 var rowCount = WfForm.getDetailRowCount("detail_1"); // 遍历每一行 for (var i = 0; i < rowCount; i++) { // 将字段名称"zdrq"转换为字段ID,附加行号 var m_zdrq_fieldid = WfForm.convertFieldNameToId("zdrq", "detail_1") + "_" + i; // 对应字段控制日期范围,-3表示最早日期为当前日期前三天,undefined 表示最晚日期不限制 WfForm.controlDateRange(m_zdrq_fieldid, -3, undefined); } // 注册添加新行的操作 // ACTION_ADDROW + "1" 表示添加明细行1的动作 WfForm.registerAction(WfForm.ACTION_ADDROW + "1", function(rowId) { // 使用setTimeout来等待新行被完全添加 setTimeout(function() { // 重新获取明细行的行数 var rowCount = WfForm.getDetailRowCount("detail_1"); // 遍历每一行 for (var i = 0; i < rowCount; i++) { // 将字段名称"zdrq"转换为字段ID,附加行号 var m_zdrq_fieldid = WfForm.convertFieldNameToId("zdrq", "detail_1") + "_" + i; // 对应字段控制日期范围,-3表示最早日期为当前日期前三天,undefined 表示最晚日期不限制 WfForm.controlDateRange(m_zdrq_fieldid, -3, undefined); } }, 0); }); }); </script> ``` ## 2. 明细表日期根据主表日期设置可选范围 ``` <script> // jQuery 文档准备好之后执行的函数 jQuery(document).ready(function() { // 设置已存在行的日期范围 // 获取明细行"detail_1"的行数 var rowCount = WfForm.getDetailRowCount("detail_1"); // 遍历每一行 for (var i = 0; i < rowCount; i++) { // 将字段名称"zdrq"转换为字段ID,附加行号 var m_zdrq_fieldid = WfForm.convertFieldNameToId("yjghrq", "detail_1") + "_" + i; // 获取"sqrq"字段的值 var sqrqValue = WfForm.getFieldValue("field12154"); // 替换成实际的"sqrq"字段的ID // 计算最早日期 var earliestDate = new Date(sqrqValue); earliestDate.setMonth(earliestDate.getMonth() + 3); // 获取当前日期 var currentDate = new Date(); // 对应字段控制日期范围,最早日期为当天,最晚日期为"sqrq"字段的后三个月 WfForm.controlDateRange(m_zdrq_fieldid, currentDate, earliestDate); } // 注册添加新行的操作 // ACTION_ADDROW + "1" 表示添加明细行1的动作 WfForm.registerAction(WfForm.ACTION_ADDROW + "1", function(rowId) { // 使用setTimeout来等待新行被完全添加 setTimeout(function() { // 重新获取明细行的行数 var rowCount = WfForm.getDetailRowCount("detail_1"); // 遍历每一行 for (var i = 0; i < rowCount; i++) { // 将字段名称"zdrq"转换为字段ID,附加行号 var m_zdrq_fieldid = WfForm.convertFieldNameToId("yjghrq", "detail_1") + "_" + i; // 获取"sqrq"字段的值 var sqrqValue = WfForm.getFieldValue("field12154"); // 替换成实际的"sqrq"字段的ID // 计算最早日期 var earliestDate = new Date(sqrqValue); earliestDate.setMonth(earliestDate.getMonth() + 3); // 获取当前日期 var currentDate = new Date(); // 对应字段控制日期范围,最早日期为当天,最晚日期为"sqrq"字段的后三个月 WfForm.controlDateRange(m_zdrq_fieldid, currentDate, earliestDate); } }, 0); }); }); </script> ``` ## 3. 重写window.alert系统弹窗:文字过多自动换行,窗口右侧实现滑动精度条,倒计时弹窗确认关闭窗口 ``` <script> // 重写 window.alert 函数 window.alert = function(data, callback) { // 创建遮罩层元素 var alert_bg = document.createElement('div'); // 创建提示框容器元素 var alert_box = document.createElement('div'); // 创建提示框标题栏元素 var alert_title = document.createElement('div'); // 创建提示框文字内容元素 var alert_text = document.createElement('div'); // 创建确认按钮元素 var alert_btn = document.createElement('button'); // 创建滚动条容器元素 var alert_scroll = document.createElement('div'); // 创建倒计时显示元素 var alert_countdown = document.createElement('div'); // 创建文字节点 var textNode = document.createTextNode(data ? data : ''); // 创建标题节点 var titleNode = document.createTextNode('这是一个流程提示'); // 标题文字 // 创建按钮文字节点 var btnText = document.createTextNode('确 定'); // 设置倒计时时间 var countdown = 8; // 设置遮罩层样式 css(alert_bg, { 'position': 'fixed', 'top': '0', 'left': '0', 'right': '0', 'bottom': '0', 'background-color': 'rgba(0, 0, 0, 0.5)', // 修改背景颜色为半透明黑色 'z-index': '999999999' }); // 设置提示框容器样式 css(alert_box, { 'width': '570px',// 修改此处可调整提示框的宽度 'max-width': '90%', // 修改此处可调整提示框的最大宽度 'font-size': '16px', 'text-align': 'center', 'background-color': '#fff', 'border-radius': '15px', 'position': 'absolute', 'top': '50%', 'left': '50%', 'transform': 'translate(-50%, -50%)', 'display': 'flex', 'flex-direction': 'column', 'align-items': 'center', 'justify-content': 'center' }); // 设置标题栏样式 css(alert_title, { 'background-color': '#81d8d0', // 修改此处可调整标题栏的颜色 'color': '#fff', 'padding': '10px', 'border-top-left-radius': '15px', 'border-top-right-radius': '15px', 'width': '100%', 'box-sizing': 'border-box' }); // 设置文字内容样式 css(alert_text, { 'padding': '15px 15px', // 修改此处可调整文字上下左右间距 'color': 'red', 'border-bottom': '1px solid #ddd', 'overflow': 'hidden', 'max-height': '350px',// 修改此处可调整提示框的高度 'line-height': '1.5', 'word-wrap': 'break-word', 'word-break': 'break-all', 'display': '-webkit-box', '-webkit-box-orient': 'vertical', '-webkit-line-clamp': '8', 'overflow-y': 'auto' }); // 设置滚动条容器样式 css(alert_scroll, { 'height': '100%', 'width': '5px', 'position': 'absolute', 'top': '0', 'right': '0', 'background': 'rgba(0, 0, 0, 0.1)' }); // 设置确认按钮样式 css(alert_btn, { 'padding': '10px 0', 'color': '#007aff', 'font-weight': '600', 'cursor': 'pointer', 'border': 'none', 'background': 'none', 'font-size': '16px', 'display': 'none' }); // 设置倒计时显示样式 css(alert_countdown, { 'margin-top': '10px', 'font-size': '14px', 'color': '#888' }); // 更新倒计时显示 function updateCountdown() { if (countdown > 0) { alert_countdown.textContent = '等待 ' + countdown + ' 秒...'; countdown--; } else { clearInterval(countdownInterval); css(alert_btn, { 'display': 'block', 'pointer-events': 'auto', 'opacity': '1' }); alert_countdown.textContent = ''; } } // 启动倒计时 var countdownInterval = setInterval(updateCountdown, 1000); // 构建提示框结构 alert_title.appendChild(titleNode); alert_text.appendChild(textNode); alert_btn.appendChild(btnText); alert_box.appendChild(alert_title); // 添加标题栏 alert_box.appendChild(alert_text); alert_box.appendChild(alert_scroll); alert_box.appendChild(alert_btn); alert_box.appendChild(alert_countdown); alert_bg.appendChild(alert_box); // 将提示框添加到页面 document.getElementsByTagName('body')[0].appendChild(alert_bg); // 确认按钮点击事件 alert_btn.onclick = function() { alert_bg.parentNode.removeChild(alert_bg); clearInterval(countdownInterval); if (typeof callback === 'function') { callback(); } }; } // 设置元素样式的工具函数 function css(targetObj, cssObj) { var str = targetObj.getAttribute("style") ? targetObj.getAttribute('style') : ''; for (var i in cssObj) { str += i + ':' + cssObj[i] + ';'; } targetObj.style.cssText = str; } // 调用重写的 alert 函数 alert('元戎启行是一家L4级自动驾驶全栈解决方案提供商,专注于模型训练、高精地图测绘等,以支持量产百辆以上的车队运营。公司与国内国际厂商合作,共同设计、研发针对无人驾驶出行服务的量产车辆;打造无人专车运营服务,进行技术输出和服务。自主研发仿真模拟平台,可以对多种类型的场景进行真实的模拟和复现。') </script> ``` ## 4.流程移动端(H5)alert/confirm提示信息去除网址(URL) ``` <script type="text/javascript"> window.alert = function(name){ var iframe = document.createElement("IFRAME"); iframe.style.display="none"; iframe.setAttribute("src", 'data:text/plain,'); document.documentElement.appendChild(iframe); window.frames[0].window.alert(name); iframe.parentNode.removeChild(iframe); }; </script> ``` ## 5.建模查询自定义按钮验证行数据 ``` function onUrl(){ var ids = ModeList.getCheckedID(); var json = ModeList.getTableDatas(); var obj = eval( json); for(var i = 0;i<ids.length;i++){ for(var j = 0;j<obj.length;j++){ if(ids[i] == obj[j].id){ //alert(obj[j].id); if(obj[j].spsl>400){ alert("第"+j+"行商品数据异常"); }else{ alert("第"+j+"行商品数据正常"); } } } } } ``` ## 6. 建模查询页面扩展批量操作新建流程带入查询列表字段数据 ``` <script> function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window.location.href.substr(1).match(reg); if(r!=null)return decodeURI(r[2]); return null; } //模块:页面扩展批量操作菜单按钮 /* (function(){ var ids = ModeList.getCheckedID(); if(ids==""){ModeList.showMessage("至少勾选一条",2,1);return;} var url = '/spa/workflow/static4form/index.html?_rdm=1634001315677#/main/workflow/req?iscreate=1&workflowid=2&certs='+ids; window.open(url); })() */ //获取建模查询自定义按钮传递的参数的值,并且赋值明细表字段:参数certs,bh jQuery(document).ready(function(){ var certs =GetQueryString("certs"); var bh =GetQueryString("bh"); //alert(certs); var certarr=certs.split(","); //alert(certarr); //WfForm.changeFieldValue("field9599", {value:certs}); for(var i =0;i<certarr.length;i++){ WfForm.addDetailRow("detail_1",{field9933:{ value:certarr[i] }}) } }) </script> <style> select { line-height: 22px; height: 22px; background: none; border: none; min-width: 95%; } /* 样式-下拉框长度 */ .wea-select{ width: 95% } /*选择框宽度*/ .wea-select ,.ant-select-selection{ width: 95%; border-style: none; } /*浏览框去边框,调整宽度*/ .wea-associative-search { border-style: none; min-width: 95% !important; } /* e9样式结束*/ /*通用圆角样式*/ .ysyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-top-right-radius:9px; } .zxyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-bottom-left-radius:9px; } .yxyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-bottom-right-radius:9px; } .zsyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-top-left-radius:9px; } /* 修复 input 框 Chrome 自动填充屎黄色背景 */ input:-webkit-autofill,.excelMainTable input:-webkit-autofill:hover,.excelMainTable input:-webkit-autofill:focus,.excelMainTable input:-webkit-autofill:active { -webkit-transition-delay: 99999s; -webkit-transition: color 99999s ease-out, background-color 99999s ease-out; } </style> <style> select { line-height: 22px; height: 22px; background: none; border: none; min-width: 95%; } /* 样式-下拉框长度 */ .wea-select{ width: 95% } /*选择框宽度*/ .wea-select ,.ant-select-selection{ width: 95%; border-style: none; } /*浏览框去边框,调整宽度*/ .wea-associative-search { border-style: none; min-width: 95% !important; } /* e9样式结束*/ /*通用圆角样式*/ .ysyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-top-right-radius:9px; } .zxyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-bottom-left-radius:9px; } .yxyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-bottom-right-radius:9px; } .zsyj{ height:15px; width:100%; background:#ffffff!important; border: 1px solid #ffffff!important; border-top-left-radius:9px; } /*单行文本去背景*/ input.InputStyle, input.Inputstyle, input.inputStyle, input.inputstyle, .excelMainTable input[type="text"], .excelMainTable input[type="password"], .e8_innerShowContent, .excelMainTable textarea, .sbHolder { /*border: 1px solid #F2F2F2 !important;*/ border: none; background: none; } /* 修复 input 框 Chrome 自动填充屎黄色背景 */ input:-webkit-autofill,.excelMainTable input:-webkit-autofill:hover,.excelMainTable input:-webkit-autofill:focus,.excelMainTable input:-webkit-autofill:active { -webkit-transition-delay: 99999s; -webkit-transition: color 99999s ease-out, background-color 99999s ease-out; } </style> ``` ## 7.任意页面获取登录用户信息 ``` <%@ page language="java" contentType="application/json" pageEncoding="UTF-8"%> <%@ page import="net.sf.json.*"%> <%@ page import="java.util.*" %> <%@ page import="weaver.general.*" %> <%@ page import="weaver.hrm.HrmUserVarify"%> <%@ page import="weaver.hrm.User"%> <jsp:useBean id="rs" class="weaver.conn.RecordSet" scope="page" /> <% response.setContentType("application/json;charset=UTF-8"); BaseBean log = new BaseBean(); User user = HrmUserVarify.getUser(request, response); if (user == null) { response.sendRedirect("/login/Login.jsp"); return; } String userloginid=user.getLoginid(); String userlastname=user.getLastname(); int userid=user.getUID(); out.println("登录名:"+userloginid); out.println("用户名:"+userloginid); out.println("用户ID:"+userid); %> ``` ## 8.dosql()特殊处理流程字段数组ID ``` <script> WfForm.bindFieldChangeEvent("field5818", function(obj,id,value){ //多选字段变化 var arr = WfForm.getFieldValue("field5818").split(',');//转换成数组 var strArr = arr.join("','");//数组元素转字符串 WfForm.changeFieldValue("field5819", {value:strArr});//赋值给辅助文本字段 }); </script> ``` –sql查询条件:where 字段 in (‘m a i n . 字 段 1 main.字段1main.字段1’) 字段1:field5819 ## 9.流程action方法汇总 ``` package weaver.interfaces.workflow.action.javacode; //导入包 import java.util.*; import net.sf.json.*; import weaver.general.*; import weaver.soa.workflow.*; import weaver.soa.workflow.request.*; import weaver.conn.RecordSet; import weaver.conn.RecordSet.*; import weaver.hrm.*; import weaver.interfaces.workflow.action.Action; //在线自定义action接口 public class Action20220706020703 extends BaseBean implements Action{ //流程自定义接口代码示例 public String execute(RequestInfo request) { //日志 writeLog("in my online edited action"); //获取表名称,流程id String requestId = request.getRequestid();//请求ID String requestlevel = request.getRequestlevel();//请求紧急程度 String workflowid = request.getWorkflowid();//流程ID String tablename = request.getRequestManager().getBillTableName();//表单名称 int billid = request.getRequestManager().getBillid();//表单数据ID String requestname = request.getRequestManager().getRequestname();//请求标题 String remark = request.getRequestManager().getRemark();//当前用户提交时的签字意见 int formid = request.getRequestManager().getFormid();//表单ID int isbill = request.getRequestManager().getIsbill();//是否是自定义表单 //取主表数据 Map<String, String> mainTableDataMap = new HashMap<String, String>(); Property[] properties = request.getMainTableInfo().getProperty();// 获取表单主字段信息 for (int i = 0; i < properties.length; i++) { String fieldname = properties[i].getName().toLowerCase();// 主字段名称,字段名转换为小写 String fieldval = Util.null2String(properties[i].getValue());// 主字段对应的值 mainTableDataMap.put(fieldname, fieldval);// 存为数组 System.out.println(fieldname + " " + fieldval); } //取明细数据 DetailTable[] detailtable = request.getDetailTableInfo().getDetailTable();// 获取所有明细表 if (detailtable.length > 0) { for (int i = 0; i < detailtable.length; i++) { DetailTable dt = detailtable[i];// 指定明细表 Row[] s = dt.getRow();// 当前明细表的所有数据,按行存储 for (int j = 0; j < s.length; j++) { Row r = s[j];// 指定行 Cell c[] = r.getCell();// 每行数据再按列存储 for (int k = 0; k < c.length; k++) { Cell c1 = c[k];// 指定列 String name = c1.getName();// 明细字段名称 String value = c1.getValue();// 明细字段的值 System.out.println(name + " " + value); } } } } /* //方法1:修改表单字段值 Property[] mainProps = request.getMainTableInfo().getProperty(); // 要修改的主表字段 String mainField = "field101"; // 该主表字段修改后的值 String mainFieldValue = "value101"; for(int i=0; i< mainProps.length; i++){ if(mainProps[i].getName().equals(mainField)){ //主表中存在此字段 prop = mainProps[i]; prop.setValue(mainFieldValue); request.getMainTableInfo().setProperty(i,prop); } } // 调用 BaseBean 的写日志方法 // 会将日志写入泛微 E8 根目录的 /log/ecology 文件中 this.writeLog("已完成修改,仅用于 Java 缓存读取,不可用于全流程"); // 返回 SUCCESS 则依次进入: 当前环节的其他【节点后操作】、系统的出口条件判断、下一环节的【节点前操作】 // 返回 FAILURE_AND_PASS 则会停留在当前环节的界面,提交不成功 return Action.SUCCESS; */ /* //方法2:修改表单字段值 Property[] mainProps = request.getMainTableInfo().getProperty(); // 要修改的主表名称 String mainTableName = request.getRequestManager().getBillTableName(); // 要修改的对应记录行号 String requestId = request.getRequestid(); // 要修改的主表字段 String mainField = "field101"; // 该主表字段修改后的值 String mainFieldValue = "value102"; RecordSet rs = new RecordSet(); //直接更新数据库内容,控制流程走向 String sql = "update "+ mainTableName +" set "+mainField+"= '"+mainFieldValue+"' where requestid ="+requestId; rs.execute(sql); // 调用 BaseBean 的写日志方法 // 会将日志写入泛微 E8 根目录的 /log/ecology 文件中 this.writeLog("已完成修改,可用于全流程"); // 返回 SUCCESS 则依次进入: 当前环节的其他【节点后操作】、系统的出口条件判断、下一环节的【节点前操作】 // 返回 FAILURE_AND_PASS 则会停留在当前环节的界面,提交不成功 return Action.SUCCESS; */ RecordSet rs = new RecordSet(); rs.execute("select * from "+tablename+" where requestid = "+requestId); rs.next(); //获取表字段值 String mainid = rs.getString("id"); String wenben = rs.getString("wenben"); //查询字段值,存为json数组 List<Map<String, String>> list = new ArrayList<Map<String, String>>(); String cxsql = "select id,workflowname from workflow_base "; rs.executeSql(cxsql); while(rs.next()){ Map<String, String> result = new HashMap<String, String>(); result.put("id",rs.getString("id")); result.put("workflowname",rs.getString("workflowname")); list.add(result); } JSONArray jo = JSONArray.fromObject(list); //禁止提交 if(1==1){ request.getRequestManager().setMessageid("90001"); request.getRequestManager().setMessagecontent("系统异常终止流程提交!"+"\n"+"流程ID:"+requestId+"\n"+"主表数据:"+mainTableDataMap+"\n"+"数据库查询JSON:"+jo); return Action.FAILURE_AND_CONTINUE; }else{ //允许提交 return Action.SUCCESS; } } } ``` ## 10.建模查询字段显示转换 ``` <div style="background:pink; background-repeat:repeat; background-position:center center; background-image:url(images/l.jpg); background-position:center top; background-attachment:fixed; color:#00FF00; font-size:20px; background-repeat; text-align:center; text-decoration:none; text-overflow:ellipsis; white-space:normal; border-radius;" >$sqrq$ </div> ``` ## 11.显示模板函数公式 | 函数 | 含义 |示例 | | --- | --- | --- | | ABS | 求数值绝对值 | ABS(数值) | | AVERAGE | 返回一组数值中的平均值 | AVERAGE(数值1,数值2…) | | COS | 返回给定角度的余弦值 | COS(数值) | | EXP | 返回e的n次冥。常数e等于2.71828182845904,是自然对数的底 | EXP(数值) | | INT | 返回舍入实数后的整数值 | INT(数值) | | LN | 返回基底为自然数e的一个数的对数 | LN(正实数) | | LOG10 | 返回以10为底的对数 | LOG10(正实数) | | MAX | 返回一组值中的最大值 | MAX(数值1,数值2…) | | MIN | 返回一组值中的最小值 | MIN(数值1,数值2…) | | MOD | 返回两数相除的余数 | MOD(被除数,除数) | | PI | 返回数字3.14159265358979 | PI() | | ROUND | 四舍五入 | ROUND(数值,小数位数) | | SIN | 返回给定角度的正弦值 | SIN(数值) | | SQRT | 返回数值正平方根 | SQRT(正实数) | | SUM | 求和,返回参数列表中所有数值之和 | SUM(数值1,数值2…) | | SUM_USERVAL | 对单元区域中用户自定义数值相同的单元进行求和 | SUM_USERVAL(单元区域,用户自定义数值) | | SUM_USERVAL_DOWN | 从上到下对单元区域中的单元用户自定义数值相同的单元进行求和,用户自定义数值不相同后不再计算 | SUM_USERVAL_DOWN(单元区域,用户自定义数值) | | SUM_USERVAL_UP | 从下到上对单元区域中的单元用户自定义数值相同的单元进行求和,用户自定义数值不相同后不再计算 | SUM_USERVAL_UP(单元区域,用户自定义数值) | | SUMD | 对单元区域中没有公式的单元进行求和 |SUMD(单元区域1,单元区域2…) | SUMF | 对单元区域中有公式的单元进行求和 | SUMF(单元区域1,单元区域2…) | | TAN | 返回给定角度的正切值 | TAN(数值) | | TRUNC | 将数字截止定位小数的整数 | TRUNC(数值,小数位) | ## 12.根据明细表1中的字段rkck(字段类型为浏览按钮)的值来设置明细表1字段cfdd(字段类型为文本)的必填属性。当rkck值为2时,cfdd必填,否则不改变属性。 我的需求是:根据明细表1中的字段rkck(字段类型为浏览按钮)的值来设置明细表1字段cfdd(字段类型为文本)的必填属性。当rkck值为2时,cfdd必填,否则不改变属性。字段信息 字段ID : field12115 数据库字段名称 : rkck 字段信息 字段ID : field12116 数据库字段名称 : cfdd ChatGPT 根据你的需求,你想根据明细表1中的字段 `rkck` 的值来设置明细表1中的字段 `cfdd` 的必填属性。根据提供的文档,我将为你详细解释如何实现这一功能。 ### 步骤概述 1. **绑定明细字段值变化触发事件**:使用 `bindDetailFieldChangeEvent` 方法监控 `rkck` 字段的值变化。 2. **根据条件改变字段属性**:在值变化的回调函数中,根据 `rkck` 的值决定是否将 `cfdd` 字段设置为必填。 ### 具体实现 首先,根据你提供的字段信息,假设 `rkck` 的字段ID 为 `field12115`,`cfdd` 的字段ID 为 `field12116`。 #### 1. 绑定字段值变化触发事件 使用 `bindDetailFieldChangeEvent` 方法,监听 `rkck` 字段值的变化: ```javascript jQuery(document).ready(function(){ WfForm.bindDetailFieldChangeEvent("field12115", function(fieldId, rowIndex, value){ // 监听 rkck 字段值变化 if (value === '2') { // 当 rkck 的值为 '2' 时,设置 cfdd 字段为必填 WfForm.changeFieldAttr("field12116_" + rowIndex, 3); // 3 表示必填 } else { // 当 rkck 的值不为 '2' 时,设置 cfdd 字段为可编辑(或其他状态) WfForm.changeFieldAttr("field12116_" + rowIndex, 2); // 2 表示可编辑 } }); }); ``` #### 2. 解释代码 * `WfForm.bindDetailFieldChangeEvent("field12115", function(fieldId, rowIndex, value){ ... });`:绑定了 `rkck` 字段的值变化事件。当 `rkck` 字段的值发生变化时,回调函数中的 `value` 参数将获取到 `rkck` 字段当前的值。 * `WfForm.changeFieldAttr("field12116_" + rowIndex, 3);`:根据 `rkck` 字段的值设置 `cfdd` 字段的属性。在这里,如果 `rkck` 的值为 '2',则将 `cfdd` 字段设置为必填 (`3` 表示必填状态),否则可以根据需求设置为可编辑或其他状态。 ### 注意事项 * 请确保在页面加载完成后再执行绑定事件的代码,即 `jQuery(document).ready(function(){ ... });`。 * 参数 `rowIndex` 表示明细行的序号,用于标识明细表中的每一行,确保在设置字段属性时使用正确的行号。 通过这样的实现,当明细表1中的 `rkck` 字段的值发生变化时,系统将自动根据条件设置 `cfdd` 字段的必填属性,实现了根据字段值动态改变字段显示属性的功能。 ## 13.待更新 Last modification:July 19, 2024 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 1 如果觉得我的文章对你有用,请随意赞赏