taskProperties.jsp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@include file="/context/mytags.jsp"%>
  4. <script type="text/javascript">
  5. <!--
  6. var task = workflow.getFigure(nodeid);//当前节点对象
  7. //属性表格定义
  8. rows = [
  9. { "name": "ID", "group": "<t:mutiLang langKey='bpm.designer.page.servertask.name'/>", "value": task.taskId,"field": "taskId", "editor": "text" },
  10. { "name": "<t:mutiLang langKey='bpm.designer.page.servertask.doc'/>", "group": "<t:mutiLang langKey='bpm.designer.page.task.properties'/>", "value": task.taskName, "field": "taskName", "editor": "text" },
  11. { "name": "<t:mutiLang langKey='bpm.designer.page.task.properties'/>", "group": "<t:mutiLang langKey='bpm.designer.page.task.properties'/>", "value": task.documentation, "field": "documentation", "editor": "text" },
  12. { "name": "<t:mutiLang langKey='bpm.designer.page.form.key'/>", "group": "<t:mutiLang langKey='bpm.designer.page.form.properties'/>", "value": task.formKey, "field": "formKey", "editor": "text" }
  13. ];
  14. $(function(){
  15. $('#task_extend').val(task.task_extend);
  16. $('#isSequential').val(task.isSequential);
  17. $('#loopCardinality').val(task.loopCardinality);
  18. $('#collection').val(task.collection);
  19. $('#elementVariable').val(task.elementVariable);
  20. $('#completionCondition').val(task.completionCondition);
  21. $('#performerType').combobox({
  22. editable:false,
  23. onChange:function(newValue, oldValue){
  24. $('#expression').val('');
  25. switchTaskCandidatesList(newValue);
  26. }
  27. });
  28. task_candidate_panel=$('#task-candidate-panel').panel({
  29. border:false
  30. //minimized:true,
  31. });
  32. var ptype='';
  33. if($('#performerType').combobox('getValue')!=''){
  34. ptype=$('#performerType').combobox('getValue');
  35. }
  36. $('#performerType').combobox('setValue',ptype);
  37. switchTaskCandidatesList(ptype);
  38. });
  39. function switchTaskCandidatesList(performerType){
  40. <!-- update-begin--Author:scott Date:20170703 for:重构变更control请求地址 -->
  41. if(performerType == 'candidateUsers'){
  42. task_candidate_panel.panel("refresh","designerController.do?processProperties&turn=candidateUsersConfig&checkbox=true");
  43. }else if(performerType == 'candidateGroups'){
  44. task_candidate_panel.panel("refresh","designerController.do?processProperties&turn=candidateGroupsConfig&checkbox=true");
  45. }else if(performerType == 'assignee'){
  46. task_candidate_panel.panel("refresh","designerController.do?processProperties&turn=candidateUsersConfig&checkbox=false");
  47. }
  48. <!-- update-end--Author:scott Date:20170703 for:重构变更control请求地址 -->
  49. }
  50. //保存
  51. function saveTaskProperties(){
  52. task.taskId=$.trim(rows[0].value);
  53. task.taskName=rows[1].value;
  54. task.formKey=rows[3].value;
  55. task.documentation=rows[2].value;
  56. task.setId($.trim(rows[0].value));
  57. task.setContent($.trim(rows[1].value));
  58. task.performerType=$('#performerType').combobox('getValue');
  59. task.expression=$.trim($('#expression').val());
  60. task.isUseExpression=true;
  61. task.task_extend=$.trim($('#task_extend').val());
  62. task.loopCardinality=$.trim($('#loopCardinality').val());
  63. task.isSequential=$.trim($('#isSequential').val());
  64. task.loopCardinality=$.trim($('#loopCardinality').val());
  65. task.collection=$.trim($('#collection').val());
  66. task.elementVariable=$.trim($('#elementVariable').val());
  67. task.completionCondition=$.trim($('#completionCondition').val());
  68. }
  69. //加载变量
  70. function populateTaskProperites(){
  71. $('#performerType').combobox('setValue',task.performerType);
  72. $('#expression').val(task.expression);
  73. rows[0].value=task.taskId;
  74. rows[1].value=task.taskName;
  75. rows[2].value=task.documentation;
  76. rows[3].value=task.formKey;
  77. }
  78. //加载属性表格数据
  79. function propertygrid(){
  80. $('#task-propertygrid').propertygrid('loadData', rows);
  81. populateTaskProperites();
  82. }
  83. //创建属性表格
  84. $('#task-propertygrid').propertygrid({
  85. width: 'auto',
  86. height: 'auto',
  87. showGroup: true,
  88. scrollbarSize: 0,
  89. border:0,
  90. columns: [[
  91. { field: 'name', title: '<t:mutiLang langKey="bpm.designer.page.task.property.name"/>', width: 30, resizable: false },
  92. { field: 'value', title: '<t:mutiLang langKey="bpm.designer.page.task.property.value"/>', width: 100, resizable: false }
  93. ]],
  94. onAfterEdit:function(){
  95. saveTaskProperties();//自动保存
  96. }
  97. });
  98. propertygrid();
  99. //-->
  100. </script>
  101. <script type="text/javascript">
  102. <!--
  103. //获取执行监听器id
  104. function getOldListenerIds(){
  105. var listeners=task.listeners;
  106. var listenersIds=new Array();
  107. for(var i=0;i<listeners.getSize();i++){
  108. var listener = listeners.get(i);
  109. listenersIds.push(listener.getId());
  110. }
  111. return listenersIds.join(",");
  112. }
  113. //添加执行监听器
  114. function addListener(id,event,serviceType,value){
  115. var ls=task.getListener(id);
  116. if(!ls){
  117. var listener = new draw2d.Task.Listener();
  118. listener.id = id;
  119. listener.event = event;
  120. listener.serviceType = serviceType;
  121. listener.serviceClass = value;
  122. listener.serviceExpression = value;
  123. task.addListener(listener);
  124. }
  125. }
  126. //删除执行监听器
  127. function removeListener(id){
  128. task.deleteListener(id);
  129. }
  130. //-->
  131. </script>
  132. <div id="task-properties-layout" class="easyui-layout" fit="true">
  133. <div id="task-properties-toolbar-panel" region="north" border="false" style="height:30px; background: #E1F0F2;">
  134. <a href="##" id="sb2" class="easyui-linkbutton" plain="true" iconCls="icon-save" onclick="saveTaskProperties()"><t:mutiLang langKey="bpm.designer.page.save"/></a>
  135. </div>
  136. <div id="task-properties-panel" region="center" border="true">
  137. <div id="task-properties-accordion" class="easyui-accordion" fit="true" border="false">
  138. <div id="task" title="<t:mutiLang langKey="bpm.designer.page.task.properties"/>" selected="true" class="properties-menu">
  139. <table id="task-propertygrid">
  140. </table>
  141. </div>
  142. <div id="main-config" title="<t:mutiLang langKey="bpm.designer.page.task.userconfig"/>" class="properties-menu">
  143. <div class="datagrid-toolbar" style="height:auto">
  144. <table id="main-properties">
  145. <tr>
  146. <td align="right">
  147. <t:mutiLang langKey="bpm.designer.page.task.userconfig.type"/>:
  148. </td>
  149. <td>
  150. <select id="performerType" name="performerType" style="width:100px;">
  151. <option value="assignee">处理人</option>
  152. <option value="candidateUsers">备选人员
  153. </option>
  154. <option value="candidateGroups">备选角色</option>
  155. </select>
  156. <a href="#" class="easyui-linkbutton" plain="true" iconCls="icon-search" onclick="xuanze();">选择</a>
  157. </td>
  158. </tr>
  159. <tr>
  160. <td align="right">
  161. <t:mutiLang langKey="bpm.designer.page.task.userconfig.expression"/>:
  162. </td>
  163. <td>
  164. <input type="text" id="expression" name="expression" style="width:190px" />
  165. </td>
  166. </tr>
  167. </table>
  168. </div>
  169. <div id="task-candidate-panel" class="easyui-panel" style="overflow: hidden; width: 280px; height: 450px; padding:1px;">
  170. </div>
  171. </div>
  172. <div id="taskHuiQianProperties" title="<t:mutiLang langKey="bpm.designer.page.task.huiqian"/>" selected="true">
  173. <table id="main-properties">
  174. <tr>
  175. <td align="right">
  176. <t:mutiLang langKey="bpm.designer.page.task.huiqian.status"/>:
  177. </td>
  178. <td>
  179. <select id="isSequential" name="isSequential" style="width:160px;">
  180. <option value="">不启动多实例</option>
  181. <option value="true">顺序</option>
  182. <option value="false">并行</option>
  183. </select>
  184. </td>
  185. </tr>
  186. <tr>
  187. <td align="right">
  188. <t:mutiLang langKey="bpm.designer.page.task.huiqian.loopnum"/>:
  189. </td>
  190. <td>
  191. <input type="text" id="loopCardinality" name="loopCardinality" style="width:160px" />
  192. </td>
  193. </tr>
  194. <tr>
  195. <td align="right">
  196. <t:mutiLang langKey="bpm.designer.page.task.huiqian.loopset"/>:
  197. </td>
  198. <td>
  199. <input type="text" id="collection" name="collection" style="width:160px" />
  200. </td>
  201. </tr>
  202. <tr>
  203. <td align="right">
  204. <t:mutiLang langKey="bpm.designer.page.task.huiqian.elementname"/>:
  205. </td>
  206. <td>
  207. <input type="text" id="elementVariable" name="elementVariable" style="width:160px" />
  208. </td>
  209. </tr>
  210. <tr>
  211. <td align="right">
  212. <t:mutiLang langKey="bpm.designer.page.task.huiqian.endcondition"/>:
  213. </td>
  214. <td>
  215. <input type="text" id="completionCondition" name="completionCondition" style="width:160px" />
  216. </td>
  217. </tr>
  218. </table>
  219. <fieldset style="line-height: 21px;">
  220. <legend>说明</legend>
  221. <div>1.\${flowUtil.stringToList(assigneeUserIdList)},将字符串转换成集合,暴露的SpringBean方法</div>
  222. <div>2.多实例任务Activiti默认会创建3个流程变量,nrOfInstances:实例总数,nrOfActiveInstances:当前活跃的,也就是当前还未完成的,对于顺序的多实例,此值总是1,nrOfCompletedInstances:已完成的实例个数。</div>
  223. <div>3.状态:不启动多实例,则只会创建一个任务,默认不启动,不启动多实例,一下配置都无效,true:顺序执行,fasle:并行,同时执行。</div>
  224. <div>4.循环数量:指定创建多任务的数量。可使用表达式从流程变量获取。</div>
  225. <div>5.循环集合:流程变量中一个集合类型变量的变量名称。根据集合元素多少创建任务数量。可使用表达式。例:流程变量:assigneeUserIdList=[user1,user2],可用assigneeUserIdList。</div>
  226. <div>6.集合元素:集合中每个元素的变量名称,可在每个任务中获取,可使用表达式。例:集合为当定义集合元素名称为:assigneeUserId,可在任务直接指派人员用表达式\${assigneeUserId}获取,用于动态会签。</div>
  227. <div>7.结束条件:多实例活动结束的条件,默认为完成多全部实例,当表达式返回true时结束多实例活动。例:\${nrOfCompletedInstances/nrOfInstances>=0.6} 说明当有60%的任务完成时,会完成此多实例,删除其他未完成的,继续下面的流程。</div>
  228. </fieldset>
  229. </div>
  230. <!-- author:zhangdaihao date:20140801 for:因为报错暂时注释掉
  231. <div id="taskExtendProperties" title="扩展属性" selected="true" style="overflow: hidden;padding:1px;">
  232. <textarea style="margin: 2px; width: 257px; height: 189px;" name="task_extend" id="task_extend"></textarea>
  233. </div>
  234. <div id="variableProperties" title="流程变量" style="overflow: hidden;padding:1px;">
  235. <t:datagrid name="variableList" actionUrl="processController.do?getVariables&processNode=${id}&processId=${processId}" idField="processproid" pagination="false">
  236. <t:dgCol title="Id" hidden="true" field="processproid"></t:dgCol>
  237. <t:dgCol title="ID" field="processprokey" width="40"></t:dgCol>
  238. <t:dgCol title="名称" field="processproname" width="40"></t:dgCol>
  239. <t:dgCol title="值" field="processproval" width="40"></t:dgCol>
  240. <t:dgCol title="操作" field="opt"></t:dgCol>
  241. <t:dgDelOpt url="processController.do?deleteVariable&variableId={processproid}" title="删除"></t:dgDelOpt>
  242. </t:datagrid>
  243. <div id="variableListtb" style="padding:3px; height: 25px">
  244. <div style="float: left;">
  245. <a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" operationCode="add" onclick="add('添加','processController.do?addOrupdateVariable&processNode=${id }&processId=${processId}&processDefinitionId=${processDefinitionId}')">添加</a>
  246. <a href="#" class="easyui-linkbutton" plain="true" icon="icon-add" operationCode="add" onclick="update('编辑','processController.do?addOrupdateVariable&processNode=${id }&processId=${processId}&processDefinitionId=${processDefinitionId}','processproid')">编辑</a>
  247. </div>
  248. </div>
  249. </div>
  250. -->
  251. <div id="listeners" title="<t:mutiLang langKey="bpm.designer.page.task.listener"/>" style="overflow: hidden;padding:1px;">
  252. <t:datagrid title="bpm.designer.page.listener.tipmsg" name="listenerList" actionUrl="processController.do?listenerGridYouXiao" pagination="false" extendParams="queryParams:{ids:getOldListenerIds()}," idField="id">
  253. <t:dgCol title="id" hidden="true" field="id"></t:dgCol>
  254. <t:dgCol title="bpm.designer.page.listener.name" field="listenername" width="30"></t:dgCol>
  255. <t:dgCol title="bpm.designer.page.listener.even" field="listenereven" width="30"></t:dgCol>
  256. <t:dgCol title="bpm.designer.page.listener.type" field="listenertype" width="30" dictionary="listenertype"></t:dgCol>
  257. <t:dgCol title="bpm.designer.page.listener.value" field="listenervalue" width="50"></t:dgCol>
  258. <t:dgCol title="bpm.designer.page.listener.opt" field="opt" width="30"></t:dgCol>
  259. <t:dgFunOpt funname="delRow(id)" title="bpm.designer.page.listener.del"></t:dgFunOpt>
  260. </t:datagrid>
  261. <div id="listenerListtb" style="padding:3px; height: 25px">
  262. <div style="float: left;">
  263. <div class="form">
  264. <input name="listenerid" type="hidden" id="listenerid">
  265. <input name="listenername" type="hidden" id="listenername">
  266. <input name="listenereven" type="hidden" id="listenereven">
  267. <input name="listenertype" type="hidden" id="listenertype">
  268. <input name="listenervalue" type="hidden" id="listenervalue">
  269. <t:choose hiddenName="listenerid" hiddenid="id" fun="saveProcessListener" url="processController.do?chooseListener&typeid=2" textname="listenername,listenereven,listenertype,listenervalue" name="listenerList" icon="icon-add" title="监听列表"></t:choose>
  270. </div>
  271. </div>
  272. </div>
  273. </div>
  274. </div>
  275. </div>
  276. </div>
  277. <script type="text/javascript">
  278. //保存监听
  279. function saveProcessListener() {
  280. var listenerid = $('#listenerid').val();
  281. var listenereven = $('#listenereven').val();
  282. var listenertype = $('#listenertype').val();
  283. var listenervalue = $('#listenervalue').val();
  284. var listenername = $('#listenername').val();
  285. var listenerids = listenerid.split(",");
  286. var listenerevens = listenereven.split(",");
  287. var listenertypes = listenertype.split(",");
  288. var listenervalues = listenervalue.split(",");
  289. var listenernames = listenername.split(",");
  290. for(var i=0;i<listenerids.length;i++){
  291. var ls=task.getListener(listenerids[i]);
  292. addListener(listenerids[i],listenerevens[i],listenertypes[i],listenervalues[i]);
  293. if(!ls){
  294. $('#listenerList').datagrid('appendRow',{
  295. id:listenerids[i],
  296. listenername:listenernames[i],
  297. listenereven:listenerevens[i],
  298. listenertype:listenertypes[i],
  299. listenervalue:listenervalues[i]
  300. });
  301. }
  302. }
  303. }
  304. function setProcessListener(index)
  305. {
  306. var row = $('#listenerList').datagrid('getRows')[index];
  307. $.ajax({
  308. url : "processController.do?setProcessListener",
  309. type : 'POST',
  310. data : {
  311. id :row.id
  312. },
  313. dataType : 'json',
  314. success : function(data) {
  315. if (data.success) {
  316. var listener = new draw2d.Task.Listener();
  317. listener.event=row.TPListerer_listenereven;
  318. listener.id=row.id;
  319. listener.serviceType = row.TPListerer_listenertype;
  320. if(row.TPListerer_listenertype=="javaClass")
  321. {
  322. listener.serviceClass= row.TPListerer_listenervalue;
  323. }
  324. else
  325. {
  326. listener.serviceExpression=row.TPListerer_listenervalue;
  327. }
  328. task.listeners.add(listener);
  329. }
  330. else
  331. {
  332. task.deleteListener(row.id);
  333. }
  334. reloadlistenerList();
  335. }
  336. });
  337. }
  338. //删除流程监听
  339. function delRow(id){
  340. var rows=$('#listenerList').datagrid('getSelections');
  341. for(var i=0;i<rows.length;i++){
  342. var row=rows[i];
  343. var index=$('#listenerList').datagrid('getRowIndex',row);
  344. $('#listenerList').datagrid('deleteRow',index);
  345. removeListener(row.id);
  346. }
  347. }
  348. </script>