Index: ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/formdefinition/service/FormDefinitionManagerImpl.java =================================================================== diff -u -r16080 -r16133 --- ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/formdefinition/service/FormDefinitionManagerImpl.java (.../FormDefinitionManagerImpl.java) (revision 16080) +++ ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/formdefinition/service/FormDefinitionManagerImpl.java (.../FormDefinitionManagerImpl.java) (revision 16133) @@ -11,6 +11,7 @@ import org.apache.commons.lang.StringUtils; +import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.vo.LoginUserData; import com.forgon.disinfectsystem.entity.customform.formdefinition.FormDefinition; @@ -113,9 +114,9 @@ @Override - public void saveFormDefinition(FormDefinition formDefinitionVo, JSONArray params) { + public FormDefinition saveFormDefinition(FormDefinition formDefinitionVo, JSONArray params) { if(formDefinitionVo == null){ - return; + return null; } FormDefinition formDefiniton = getFormDefinition(formDefinitionVo); @@ -132,6 +133,7 @@ } setFormDefinitionItemsAndOptions(formDefiniton, params,FormDefinition.ACTION_SAVE); objectDao.saveOrUpdate(formDefiniton); + return formDefiniton; } private FormDefinition getFormDefinition(FormDefinition definition) { @@ -148,9 +150,9 @@ } @Override - public void deployFormDefinition(FormDefinition formDefinitionVo,JSONArray params) { + public FormDefinition deployFormDefinition(FormDefinition formDefinitionVo,JSONArray params) { if(formDefinitionVo == null){ - return; + return null; } if(params == null || params.size() == 0){ throw new RuntimeException("表单元素不能为空!"); @@ -177,6 +179,7 @@ setFormDefinitionItemsAndOptions(definition, params,FormDefinition.ACTION_DEPLOY); objectDao.saveOrUpdate(definition); + return definition; } private void copyFormDefinitionProperty(FormDefinition formDefinitionVo, @@ -199,6 +202,10 @@ String type = item.optString("type"); String requirement = item.optString("requirement"); Integer orderNumber = item.optInt("orderNumber"); + String isReportDisplay = item.optString("isReportDisplay"); + if(StringUtils.isBlank(isReportDisplay)){ + isReportDisplay = Constants.STR_YES; + } if(StringUtils.isBlank(name) || StringUtils.isBlank(type) || StringUtils.isBlank(requirement)){ throw new RuntimeException("参数错误!"); } @@ -227,6 +234,7 @@ String optionName = optionItem.optString("name"); String isStatisticsItem = optionItem.optString("isStatisticsItem"); Integer optionOrderNumber = optionItem.optInt("orderNumber"); + String valueTriggerItemNames = optionItem.optString("valueTriggerItemNames"); FormDefinitionItemOption option = null; if(DatabaseUtil.isPoIdValid(optionId) && FormDefinition.ACTION_SAVE.equals(actionType)){ option = getFormDefintionItemOption(optionId); @@ -240,6 +248,7 @@ option.setValue(optionName); option.setIsStatisticsItem(isStatisticsItem); option.setOrderNumber(optionOrderNumber); + option.setValueTriggerItemNames(valueTriggerItemNames); options.add(option); } if(toDeleteOptions.size() > 0){ @@ -251,6 +260,8 @@ formDefinitionItem.setRequirement(requirement); formDefinitionItem.setOptions(options); formDefinitionItem.setOrderNumber(orderNumber); + formDefinitionItem.setIsReportDisplay(isReportDisplay); + objectDao.saveOrUpdate(formDefinitionItem); addList.add(formDefinitionItem); } formDefinition.setItems(addList); Index: ssts-web/src/main/webapp/disinfectsystem/routineMonitoring/routineMonitoringView.js =================================================================== diff -u -r16080 -r16133 --- ssts-web/src/main/webapp/disinfectsystem/routineMonitoring/routineMonitoringView.js (.../routineMonitoringView.js) (revision 16080) +++ ssts-web/src/main/webapp/disinfectsystem/routineMonitoring/routineMonitoringView.js (.../routineMonitoringView.js) (revision 16133) @@ -54,16 +54,58 @@ } } -function createQualityMonitoringItemElement(type,id,name,allowBlank,options,value){ +function triggerItemAction(valueTriggerItemIds,action){ + if(valueTriggerItemIds != null && valueTriggerItemIds != ""){ + var itemIdArray = valueTriggerItemIds.split(","); + if(itemIdArray.length > 0){ + for(var n = 0 ; n < itemIdArray.length ; n++){ + var triggerItemId = itemIdArray[n]; + if(triggerItemId != null && triggerItemId != ""){ + if("show" == action){ + top.Ext.getCmp("hideElement" + triggerItemId).show(); + }else{ + var xtype = top.Ext.getCmp("hideElement" + triggerItemId).getXType(); + if(xtype == 'fieldset'){ + var length = top.Ext.getCmp("hideElement" + triggerItemId).items.each(function(fsItem){ + var itemType = fsItem.getXType(); + if(itemType == "panel"){ + fsItem.items.each(function(item,index,length){ + item.setValue(false); + }); + }else if(itemType == "hidden"){ + fsItem.setValue(""); + } + }); + }else if(xtype == 'panel'){ + var panel = top.Ext.getCmp("hideElement" + triggerItemId); + panel.items.each(function(item,index,length){ + item.setValue(""); + }); + } + top.Ext.getCmp("hideElement" + triggerItemId).hide(); + } + } + } + } + } +} + +function createQualityMonitoringItemElement(type,id,name,allowBlank,options,value,isTriggerItem){ + var hideElement = false; + if('是' == isTriggerItem && (value == null || value == "")){ + hideElement = true; + } if(type == '文本'){ return { columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'textfield', fieldLabel : name, - maxLength : '16', + maxLength : '30', id : 'configItemOption'+id, name : 'configItemOption'+id, allowBlank : allowBlank, @@ -76,6 +118,8 @@ columnWidth : .9, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'textarea', fieldLabel : name, @@ -93,6 +137,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'numberfield', fieldLabel : name, @@ -109,6 +155,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'datefieldWithMin', fieldLabel : name, @@ -130,6 +178,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'textfield', fieldLabel : name, @@ -148,6 +198,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'datefieldWithMin', fieldLabel : name, @@ -165,18 +217,30 @@ var optionsArrays = new Array(); if(options != ""){ var optionsJson = JSON.parse(options); + var hideTriggerItemIdsValue = ""; for(var j = 0 ; j < optionsJson.length ; j++){ var optionsArray = new Array(); optionsArray.push(optionsJson[j].name); + optionsArray.push(optionsJson[j].valueTriggerItemIds); optionsArrays.push(optionsArray); + if(value == optionsJson[j].name){ + hideTriggerItemIdsValue = optionsJson[j].valueTriggerItemIds; + } } } return { columnWidth : .5, layout : 'form', labelWidth : 90, style:'margin-top:10px', + hidden:hideElement, + id:'hideElement'+id, items : [{ + xtype:'hidden', + id:'triggerItemIds' + id, + name:'triggerItemIds' + id, + value : hideTriggerItemIdsValue + },{ xtype : 'combo', fieldLabel : name, id : 'configItemOption'+id, @@ -186,18 +250,26 @@ allowBlank : allowBlank, editable : false, store : new Ext.data.SimpleStore({ - fields : [ 'value' ], + fields : [ 'value', 'valueTriggerItemIds'], data : optionsArrays }), forceSelection : true, value : value, mode : 'local', triggerAction : 'all', - anchor : '100%' + anchor : '100%', + listeners:{ + select : function(combo, record, index) { + var valueTriggerItemIds = record.get("valueTriggerItemIds"); + var oldTriggerItemIds = top.Ext.getCmp("triggerItemIds" + id).getValue(); + triggerItemAction(oldTriggerItemIds,"hide"); + triggerItemAction(valueTriggerItemIds,"show"); + top.Ext.getCmp("triggerItemIds" + id).setValue(valueTriggerItemIds); + } + } }] }; }else if(type == '多选'){ - if(value == null || value == ''){ value = ''; } @@ -232,18 +304,27 @@ check : function(thiz, checked){ var elementId = thiz.getName().substring(1); var elementObj = top.Ext.getCmp(elementId); - if(elementObj != undefined && elementObj != null){ var oldElementValue = elementObj.getValue(); + var checkedValue = JSON.parse(thiz.getRawValue()); if(checked){ if(oldElementValue.indexOf(thiz.getRawValue()) == -1){ oldElementValue += ","; oldElementValue += thiz.getRawValue() elementObj.setValue(oldElementValue); } + if(checkedValue != null){ + var valueTriggerItemIds = checkedValue.valueTriggerItemIds; + triggerItemAction(valueTriggerItemIds,"show"); + } }else{ var newValue = oldElementValue.replace("," + thiz.getRawValue(),''); elementObj.setValue(newValue); + + if(checkedValue != null){ + var valueTriggerItemIds = checkedValue.valueTriggerItemIds; + triggerItemAction(valueTriggerItemIds,"hide"); + } } } } @@ -256,7 +337,9 @@ columnWidth : 1, xtype : "fieldset", title: name, + id:'hideElement'+id, layout : 'column', + hidden:hideElement, autoHeight : true, items : optionsArray }; @@ -408,7 +491,7 @@ top.Ext.getCmp('optionAmount2').setValue(top.Ext.getCmp('optionAmount2').getValue()+';'+item.id); } var allowBlank = result.data.items[i].requirement == '必填'?false:true; - items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,null)); + items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,null,item.isTriggerItem)); if(result.data.items[i].type == '多选'){ items.push({ columnWidth : 1, @@ -804,7 +887,7 @@ top.Ext.getCmp('optionAmount2').setValue(top.Ext.getCmp('optionAmount2').getValue()+';'+item.id); } var allowBlank = item.requirement == '必填'?false:true; - items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,result.data.items[i].showAnswer)); + items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,result.data.items[i].showAnswer,item.isTriggerItem)); if(item.type == '多选'){ items.push({ columnWidth : 1, @@ -906,7 +989,7 @@ top.Ext.getCmp('optionAmount').setValue(top.Ext.getCmp('optionAmount').getValue()+';'+item.id); } var allowBlank = result.data.items[i].requirement == '必填'?false:true; - items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,null)); + items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,null,item.isTriggerItem)); if(result.data.items[i].type == '多选'){ items.push({ columnWidth : 1, @@ -1368,7 +1451,7 @@ top.Ext.getCmp('optionAmount').setValue(top.Ext.getCmp('optionAmount').getValue()+';'+item.id); } var allowBlank = item.requirement == '必填' ? false:true; - items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,result.data.items[i].showAnswer)); + items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,result.data.items[i].showAnswer,item.isTriggerItem)); if(item.type == '多选'){ items.push({ columnWidth : 1, @@ -1770,7 +1853,6 @@ // 删除 function deleteQualityMonitoring(number) { - alert(number); top.Ext.getCmp('qualityMonitoringsColumn').remove('monitorings'+number); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/formdefinition/FormDefinitionItem.java =================================================================== diff -u -r16052 -r16133 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/formdefinition/FormDefinitionItem.java (.../FormDefinitionItem.java) (revision 16052) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/formdefinition/FormDefinitionItem.java (.../FormDefinitionItem.java) (revision 16133) @@ -20,6 +20,8 @@ import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Cascade; +import com.forgon.Constants; + @Entity @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class FormDefinitionItem implements Comparable { @@ -44,11 +46,26 @@ private Integer orderNumber; // 顺序 /** + * 是否触发项:选择了某个参数值后触发该项显示 + */ + private String isTriggerItem; + + /** + * 是否在报表中展现 + */ + private String isReportDisplay = Constants.STR_YES; + + /** * 参数值 */ private List options = new ArrayList(); + /** + * 质量监测 触发的元素项,逻辑运算时用到,不持久化到数据库 + */ + private List triggerItems = new ArrayList(); + @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { @@ -123,6 +140,8 @@ obj.put("name", option.getValue()); obj.put("isStatisticsItem", option.getIsStatisticsItem()); obj.put("orderNumber", option.getOrderNumber()); + obj.put("valueTriggerItemIds", option.getValueTriggerItemIds()); + obj.put("valueTriggerItemNames", option.getValueTriggerItemNames()); array.add(obj); } return array.toString(); @@ -143,5 +162,33 @@ } return optionsStr; } + + public String getIsTriggerItem() { + return isTriggerItem; + } + + public void setIsTriggerItem(String isTriggerItem) { + this.isTriggerItem = isTriggerItem; + } + + public String getIsReportDisplay() { + return isReportDisplay; + } + + public void setIsReportDisplay(String isReportDisplay) { + this.isReportDisplay = isReportDisplay; + } + + /** + * 质量监测项包含的触发项 + */ + @Transient + public List getTriggerItems() { + return triggerItems; + } + + public void setTriggerItems(List triggerItems) { + this.triggerItems = triggerItems; + } } Index: ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/forminstance/service/FormInstanceManagerImpl.java =================================================================== diff -u -r16052 -r16133 --- ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/forminstance/service/FormInstanceManagerImpl.java (.../FormInstanceManagerImpl.java) (revision 16052) +++ ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/forminstance/service/FormInstanceManagerImpl.java (.../FormInstanceManagerImpl.java) (revision 16133) @@ -133,6 +133,8 @@ itemAnswer += definitionOption.getValue() + ";"; } instanceItem.setAnswer(itemAnswer); + }else{ + instanceItem.setAnswer(""); } }else if(FormDefinitionItem.TYPE_RADIO.equals(item.getType())){ List definitionOptions = item.getOptions(); Index: ssts-qualitymon/src/main/java/com/forgon/disinfectsystem/qualitymonitoring/definition/action/QualityMonitoringDefinitionAction.java =================================================================== diff -u -r16052 -r16133 --- ssts-qualitymon/src/main/java/com/forgon/disinfectsystem/qualitymonitoring/definition/action/QualityMonitoringDefinitionAction.java (.../QualityMonitoringDefinitionAction.java) (revision 16052) +++ ssts-qualitymon/src/main/java/com/forgon/disinfectsystem/qualitymonitoring/definition/action/QualityMonitoringDefinitionAction.java (.../QualityMonitoringDefinitionAction.java) (revision 16133) @@ -83,22 +83,6 @@ StrutsResponseUtils.output(result); } - public void deleteQualityMonitoringDefinition() { - String idStr = StrutsParamUtils.getPraramValue("ids", ""); - String message = ""; - try { - if (StringUtils.isNotBlank(idStr)) { - String[] str = idStr.split(";"); - for (String id : str) { - - } - } - } catch (Exception e) { - message = "{success:false}"; - e.printStackTrace(); - } - } - public void loadQualityMonitoringDefinition() { StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); Map map = new HashMap(); @@ -138,10 +122,6 @@ StrutsResponseUtils.output(result); } - public void loadQualityMonitoringItem() { - - } - public QualityMonitoringDefinition getQualityMonitoringDefinition() { return qmDefinition; } @@ -185,14 +165,6 @@ .getResponsibilityPart(); // 责任人的抓取取决于配置项的配置,如果是装配管理,则拿取装配员,如果是审核打包则拿审核人,如果是灭菌管理则拿灭菌员 if (StringUtils.isNotBlank(responsibilityPart)) { - // 清洗消毒;装配管理;审核打包;灭菌管理 - /* - * 暂时不处理 清洗消毒 责任人 - * if(responsibilityPart.indexOf(QualityMonitoring - * .QUALITYMONITORING_MODULE_NAME_WASH)!= -1 ){ - * - * } - */ // 装配管理 if (responsibilityPart .indexOf(QualityMonitoringDefinition.QUALITYMONITORING_MODULE_NAME_PACKING) != -1) { @@ -270,13 +242,4 @@ return sourceStr; } - /*public void prepare() throws Exception { - String id = StrutsParamUtils.getPraramValue("id", ""); - if (StringUtils.isNotBlank(id) && !id.equals("0")) { - qualityMonitoringDefinition = qualityMonitoringDefinitionManager - .getQualityMonitoringDefinitionById(id); - } else { - qualityMonitoringDefinition = new QualityMonitoringDefinition(); - } - }*/ } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/formdefinition/FormDefinitionItemOption.java =================================================================== diff -u -r16052 -r16133 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/formdefinition/FormDefinitionItemOption.java (.../FormDefinitionItemOption.java) (revision 16052) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/formdefinition/FormDefinitionItemOption.java (.../FormDefinitionItemOption.java) (revision 16133) @@ -32,6 +32,15 @@ */ private String isStatisticsItem; + /** + * 参数值触发项Ids,用逗号分隔 + */ + private String valueTriggerItemIds; + + /** + * 参数值触发项names,用逗号分隔 + */ + private String valueTriggerItemNames; @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -66,5 +75,21 @@ public void setIsStatisticsItem(String isStatisticsItem) { this.isStatisticsItem = isStatisticsItem; } + + public String getValueTriggerItemIds() { + return valueTriggerItemIds; + } + + public void setValueTriggerItemIds(String valueTriggerItemIds) { + this.valueTriggerItemIds = valueTriggerItemIds; + } + + public String getValueTriggerItemNames() { + return valueTriggerItemNames; + } + + public void setValueTriggerItemNames(String valueTriggerItemNames) { + this.valueTriggerItemNames = valueTriggerItemNames; + } } Index: ssts-web/src/main/webapp/disinfectsystem/qualitymonitoring/qualitymonitoringInstanceForm.js =================================================================== diff -u -r16080 -r16133 --- ssts-web/src/main/webapp/disinfectsystem/qualitymonitoring/qualitymonitoringInstanceForm.js (.../qualitymonitoringInstanceForm.js) (revision 16080) +++ ssts-web/src/main/webapp/disinfectsystem/qualitymonitoring/qualitymonitoringInstanceForm.js (.../qualitymonitoringInstanceForm.js) (revision 16133) @@ -13,12 +13,54 @@ function cancelQualityMonitoring() { qualityMonitoringWin.close(); } -function createQualityMonitoringItemElement(type,id,name,allowBlank,options,value){ + +function triggerItemAction(valueTriggerItemIds,action){ + if(valueTriggerItemIds != null && valueTriggerItemIds != ""){ + var itemIdArray = valueTriggerItemIds.split(","); + if(itemIdArray.length > 0){ + for(var n = 0 ; n < itemIdArray.length ; n++){ + var triggerItemId = itemIdArray[n]; + if(triggerItemId != null && triggerItemId != ""){ + if("show" == action){ + top.Ext.getCmp("hideElement" + triggerItemId).show(); + }else{ + var xtype = top.Ext.getCmp("hideElement" + triggerItemId).getXType(); + if(xtype == 'fieldset'){ + var length = top.Ext.getCmp("hideElement" + triggerItemId).items.each(function(fsItem){ + var itemType = fsItem.getXType(); + if(itemType == "panel"){ + fsItem.items.each(function(item,index,length){ + item.setValue(false); + }); + }else if(itemType == "hidden"){ + fsItem.setValue(""); + } + }); + }else if(xtype == 'panel'){ + var panel = top.Ext.getCmp("hideElement" + triggerItemId); + panel.items.each(function(item,index,length){ + item.setValue(""); + }); + } + top.Ext.getCmp("hideElement" + triggerItemId).hide(); + } + } + } + } + } +} +function createQualityMonitoringItemElement(type,id,name,allowBlank,options,value,isTriggerItem){ + var hideElement = false; + if('是' == isTriggerItem && (value == null || value == "")){ + hideElement = true; + } if(type == '文本'){ return { columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'textfield', fieldLabel : name, @@ -35,6 +77,8 @@ columnWidth : .9, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'textarea', fieldLabel : name, @@ -52,6 +96,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'numberfield', fieldLabel : name, @@ -68,6 +114,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'datefieldWithMin', fieldLabel : name, @@ -89,6 +137,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'textfield', fieldLabel : name, @@ -107,6 +157,8 @@ columnWidth : .5, layout : 'form', labelWidth : 90, + hidden:hideElement, + id:'hideElement'+id, items : [{ xtype : 'datefieldWithMin', fieldLabel : name, @@ -124,18 +176,30 @@ var optionsArrays = new Array(); if(options != ""){ var optionsJson = JSON.parse(options); + var hideTriggerItemIdsValue = ""; for(var j = 0 ; j < optionsJson.length ; j++){ var optionsArray = new Array(); optionsArray.push(optionsJson[j].name); + optionsArray.push(optionsJson[j].valueTriggerItemIds); optionsArrays.push(optionsArray); + if(value == optionsJson[j].name){ + hideTriggerItemIdsValue = optionsJson[j].valueTriggerItemIds; + } } } return { columnWidth : .5, layout : 'form', labelWidth : 90, style:'margin-top:10px', + hidden:hideElement, + id:'hideElement'+id, items : [{ + xtype:'hidden', + id:'triggerItemIds' + id, + name:'triggerItemIds' + id, + value : hideTriggerItemIdsValue + },{ xtype : 'combo', fieldLabel : name, id : 'configItemOption'+id, @@ -145,14 +209,23 @@ allowBlank : allowBlank, editable : false, store : new Ext.data.SimpleStore({ - fields : [ 'value' ], + fields : [ 'value', 'valueTriggerItemIds'], data : optionsArrays }), forceSelection : true, value : value, mode : 'local', triggerAction : 'all', - anchor : '100%' + anchor : '100%', + listeners:{ + select : function(combo, record, index) { + var valueTriggerItemIds = record.get("valueTriggerItemIds"); + var oldTriggerItemIds = top.Ext.getCmp("triggerItemIds" + id).getValue(); + triggerItemAction(oldTriggerItemIds,"hide"); + triggerItemAction(valueTriggerItemIds,"show"); + top.Ext.getCmp("triggerItemIds" + id).setValue(valueTriggerItemIds); + } + } }] }; }else if(type == '多选'){ @@ -190,18 +263,27 @@ check : function(thiz, checked){ var elementId = thiz.getName().substring(1); var elementObj = top.Ext.getCmp(elementId); - if(elementObj != undefined && elementObj != null){ var oldElementValue = elementObj.getValue(); + var checkedValue = JSON.parse(thiz.getRawValue()); if(checked){ if(oldElementValue.indexOf(thiz.getRawValue()) == -1){ oldElementValue += ","; oldElementValue += thiz.getRawValue() elementObj.setValue(oldElementValue); } + if(checkedValue != null){ + var valueTriggerItemIds = checkedValue.valueTriggerItemIds; + triggerItemAction(valueTriggerItemIds,"show"); + } }else{ var newValue = oldElementValue.replace("," + thiz.getRawValue(),''); elementObj.setValue(newValue); + + if(checkedValue != null){ + var valueTriggerItemIds = checkedValue.valueTriggerItemIds; + triggerItemAction(valueTriggerItemIds,"hide"); + } } } } @@ -214,7 +296,9 @@ columnWidth : 1, xtype : "fieldset", title: name, + id:'hideElement'+id, layout : 'column', + hidden:hideElement, autoHeight : true, items : optionsArray }; @@ -358,7 +442,7 @@ top.Ext.getCmp('optionAmount').setValue(top.Ext.getCmp('optionAmount').getValue()+';'+item.id); } var allowBlank = result.data.items[i].requirement == '必填'?false:true; - items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,null)); + items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,null,item.isTriggerItem)); if(result.data.items[i].type == '多选'){ items.push({ columnWidth : 1, @@ -1583,7 +1667,7 @@ top.Ext.getCmp('optionAmount').setValue(top.Ext.getCmp('optionAmount').getValue()+';'+item.id); } var allowBlank = item.requirement == '必填' ? false:true; - items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,result.data.items[i].showAnswer)); + items.push(createQualityMonitoringItemElement(item.type,item.id,item.name,allowBlank,item.optionsJson,result.data.items[i].showAnswer,item.isTriggerItem)); if(item.type == '多选'){ items.push({ columnWidth : 1, Index: ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/formdefinition/service/FormDefinitionManager.java =================================================================== diff -u -r16080 -r16133 --- ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/formdefinition/service/FormDefinitionManager.java (.../FormDefinitionManager.java) (revision 16080) +++ ssts-customform/src/main/java/com/forgon/disinfectsystem/customform/formdefinition/service/FormDefinitionManager.java (.../FormDefinitionManager.java) (revision 16133) @@ -48,13 +48,13 @@ * @param actionType * @param params */ - public void saveFormDefinition(FormDefinition formDefinitionVo, JSONArray params); + public FormDefinition saveFormDefinition(FormDefinition formDefinitionVo, JSONArray params); /** * 部署表单定义 * @param formDefinition * @param actionType * @param params */ - public void deployFormDefinition(FormDefinition formDefinitionVo, JSONArray params); + public FormDefinition deployFormDefinition(FormDefinition formDefinitionVo, JSONArray params); } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/forminstance/FormInstanceItem.java =================================================================== diff -u -r16116 -r16133 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/forminstance/FormInstanceItem.java (.../FormInstanceItem.java) (revision 16116) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/customform/forminstance/FormInstanceItem.java (.../FormInstanceItem.java) (revision 16133) @@ -95,6 +95,8 @@ obj.put("name", option.getValue()); obj.put("isStatisticsItem", option.getIsStatisticsItem()); obj.put("orderNumber", option.getOrderNumber()); + obj.put("valueTriggerItemIds", option.getValueTriggerItemIds()); + obj.put("valueTriggerItemNames", option.getValueTriggerItemNames()); showAnswer += "," + obj.toString(); } } Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/qualitymonitoringConfig/qualityMonitoringDefinitionView.js =================================================================== diff -u -r16052 -r16133 --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/qualitymonitoringConfig/qualityMonitoringDefinitionView.js (.../qualityMonitoringDefinitionView.js) (revision 16052) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/qualitymonitoringConfig/qualityMonitoringDefinitionView.js (.../qualityMonitoringDefinitionView.js) (revision 16133) @@ -79,7 +79,8 @@ {name : 'type'}, {name : 'requirement'}, {name : 'options'}, - {name : 'optionsJson'} + {name : 'optionsJson'}, + {name : 'isReportDisplay'} ]); function removeItem(gridId){ @@ -134,14 +135,119 @@ record.set("optionsJson",hideValue); record.set("options",options); } +//-------------设置触发项---------------- +function triggerItemWin(rowIndex){ + + var triggerItemStore = new Ext.data.Store({ + proxy : new Ext.data.MemoryProxy([]), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'name'} + ] + }) + }); + + var elementRecord = Ext.data.Record.create([ + {name : 'name'} + ]); + + var elementStore = top.Ext.getCmp("formDefinitionItemConfigPanel").getStore(); + for(var i = 0 ; i < elementStore.getCount() ; i++){ + var record = elementStore.getAt(i); + var newRecord = new elementRecord({ + name : record.get('name') + }); + triggerItemStore.add(newRecord); + } + + var selectModel = new top.Ext.grid.CheckboxSelectionModel({handleMouseDown:Ext.emptyFn}); + var cm = new top.Ext.grid.ColumnModel([selectModel,{ + header : "名称", + width:240, + dataIndex : 'name' + }]); + + var formObj2 = new top.Ext.FormPanel({ + frame : true, + labelAlign:'right', + labelSeparator : ':', + bodyStyle : 'padding:5px 5px 0px 5px', + autoWidth : true, + autoHeight : true, + autoScroll : true, + items:[{ + layout : 'column', + items : [{ + columnWidth : 1, + layout: 'form', + items : [ + new top.Ext.grid.GridPanel({ + id:'triggerItemPanel', + store : triggerItemStore, + cm : cm, + sm : selectModel, + width : 240, + height: 240, + frame : false, + viewConfig: { + forceFit:true + }, + bodyStyle : 'border:1px solid #afd7af', + anchor : '100%', + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }) + }) + ] + }] + }], + buttons : [{ + text : '确定', + handler : function(){ + var optionsStr = ""; + var records = top.Ext.getCmp("triggerItemPanel").getSelectionModel().getSelections(); + for ( var i = 0, len = records.length; i < len; i++) { + if (optionsStr != "") { + optionsStr += ","; + } + optionsStr += records[i].data['name']; + } + var store = top.Ext.getCmp('itemOptionsGrid').getStore(); + var record = store.getAt(rowIndex); + record.set("valueTriggerItemNames",optionsStr) + top.Ext.getCmp("triggerItemWindow").close(); + } + },{ + text : '取消', + handler : function() { + top.Ext.getCmp("triggerItemWindow").close(); + } + }] + }); + + var triggerItemWindow = new top.Ext.Window( { + id : 'triggerItemWindow', + layout : 'fit', + title : '参数触发项选择', + width : 500, + modal : true, + autoHeight : true, + border : false, + plain : true, + items : [formObj2] + }); + triggerItemWindow.show(); +} +//-------------设置参数值---------------- function setFormDefinitionOptionsWin(params,rowIndex){ var goodsRecord = Ext.data.Record.create([ {name : 'id'}, {name : 'name'}, {name : 'isStatisticsItem'}, - {name : 'orderNumber'} + {name : 'orderNumber'}, + {name : 'valueTriggerItemNames'} ]); var optionStore = new Ext.data.Store({ @@ -151,7 +257,8 @@ {name : 'id'}, {name : 'name'}, {name : 'isStatisticsItem'}, - {name : 'orderNumber'} + {name : 'orderNumber'}, + {name : 'valueTriggerItemNames'} ] }) }); @@ -163,12 +270,35 @@ id : optionsJson[i].id, name : optionsJson[i].name, isStatisticsItem : optionsJson[i].isStatisticsItem, - orderNumber : optionsJson[i].orderNumber + orderNumber : optionsJson[i].orderNumber, + valueTriggerItemNames : optionsJson[i].valueTriggerItemNames }); optionStore.add(record); } } + var triggerItemRecord = Ext.data.Record.create([ + {name : 'value'} + ]); + var triggerItemStore = new Ext.data.Store({ + proxy : new Ext.data.MemoryProxy([]), + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'value'} + ] + }) + }); + + var store = top.Ext.getCmp('formDefinitionItemConfigPanel').getStore(); + for ( var i = 0; i < store.getCount(); i++) { + var record = store.getAt(i); + var name = record.get('name'); + var record = new triggerItemRecord({ + value : name + }); + triggerItemStore.add(record); + } + var cm = new top.Ext.grid.ColumnModel([{ id:'id', name:'id', @@ -177,7 +307,7 @@ },{ id : 'name', header : "名称", - width:270, + width:240, dataIndex : 'name' },{ header : "是否统计项", @@ -186,7 +316,6 @@ editor: new top.Ext.form.ComboBox({ valueField : 'value', displayField : 'value', - allowBlank : false, width:80, editable : false, store : new top.Ext.data.SimpleStore({ @@ -199,8 +328,12 @@ triggerAction : 'all' }) },{ - header : "操作", + header : "触发项", width:150, + dataIndex : 'valueTriggerItemNames' + },{ + header : "操作", + width:80, renderer : optionsMoveUpDown, dataIndex : 'orderNumber' },{ @@ -229,7 +362,8 @@ id : 0, name : goodsName, isStatisticsItem : "", - orderNumber : 0 + orderNumber : 0, + valueTriggerItemNames : '' }); optionStore.add(record); top.Ext.getCmp('optionName').setValue(''); @@ -298,7 +432,14 @@ anchor : '100%', selModel : new top.Ext.grid.RowSelectionModel({ singleSelect : false - }) + }), + listeners: { + cellclick:function(thiz,rowIndex,columnIndex,e){ + if(columnIndex == 3){ + triggerItemWin(rowIndex); + } + } + } }) ] }] @@ -315,7 +456,8 @@ id : record.get("id"), name : record.get("name"), isStatisticsItem : record.get("isStatisticsItem"), - orderNumber : (i+1) + orderNumber : (i+1), + valueTriggerItemNames:record.get("valueTriggerItemNames") }); if(optionsStr != ""){ optionsStr += ", "; @@ -621,7 +763,8 @@ type : type, requirement : requirement, options : '', - optionsJson : "" + optionsJson : "", + isReportDisplay : '是' }); formConfigStore.add(itemRecord); } @@ -667,18 +810,19 @@ {name : 'type'}, {name : 'requirement'}, {name : 'optionsJson'}, - {name : 'options'} + {name : 'options'}, + {name : 'isReportDisplay'} ] }) }), - cm : new top.Ext.grid.ColumnModel([new top.Ext.grid.RowNumberer({header:"序号",width:40}), - {header : "元素名称",dataIndex : 'name',width : 170, + cm : new top.Ext.grid.ColumnModel([new top.Ext.grid.RowNumberer({header:"序号",width:35}), + {header : "元素名称",dataIndex : 'name',width : 150, editor: new top.Ext.form.TextField({ allowBlank: false }) }, - {header : "元素类型",width : 80,dataIndex : 'type'}, - {header : "必要性",width : 80,dataIndex : 'requirement', + {header : "元素类型",width : 70,dataIndex : 'type'}, + {header : "必要性",width : 60,dataIndex : 'requirement', editor: new top.Ext.form.ComboBox({ valueField : 'value', displayField : 'value', @@ -696,8 +840,23 @@ }) }, {header : "参数值",width : 150,dataIndex : 'options'}, - {header: "排序", width: 80, dataIndex: 'id', renderer : moveUpDown, sortable: false, menuDisabled: true}, - {id : 'aotuColumnId',header : "删除",dataIndex : 'name',width : 100, + {header : "报表展现",width : 65,dataIndex : 'isReportDisplay',editor: new top.Ext.form.ComboBox({ + valueField : 'value', + displayField : 'value', + allowBlank : false, + editable : false, + store : new top.Ext.data.SimpleStore({ + fields : [ 'value' ], + data : [['是'],['否']] + } + ), + forceSelection : true, + mode : 'local', + triggerAction : 'all' + }) + }, + {header: "排序", width: 70, dataIndex: 'id', renderer : moveUpDown, sortable: false, menuDisabled: true}, + {id : 'aotuColumnId',header : "删除",dataIndex : 'name',width : 60, renderer : function(v,p,record,index){ var str = " <%@ include file="/common/includeExtJsAndCss.jsp"%> - Index: ssts-qualitymon/src/main/java/com/forgon/disinfectsystem/qualitymonitoring/definition/service/QualityMonitoringDefinitionManagerImpl.java =================================================================== diff -u -r16080 -r16133 --- ssts-qualitymon/src/main/java/com/forgon/disinfectsystem/qualitymonitoring/definition/service/QualityMonitoringDefinitionManagerImpl.java (.../QualityMonitoringDefinitionManagerImpl.java) (revision 16080) +++ ssts-qualitymon/src/main/java/com/forgon/disinfectsystem/qualitymonitoring/definition/service/QualityMonitoringDefinitionManagerImpl.java (.../QualityMonitoringDefinitionManagerImpl.java) (revision 16133) @@ -1,13 +1,19 @@ package com.forgon.disinfectsystem.qualitymonitoring.definition.service; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.lang.StringUtils; import net.sf.json.JSONArray; +import com.forgon.Constants; import com.forgon.disinfectsystem.customform.formdefinition.service.FormDefinitionManager; import com.forgon.disinfectsystem.entity.customform.formdefinition.FormDefinition; +import com.forgon.disinfectsystem.entity.customform.formdefinition.FormDefinitionItem; +import com.forgon.disinfectsystem.entity.customform.formdefinition.FormDefinitionItemOption; import com.forgon.disinfectsystem.entity.qualitymonitoringmanager.qualitymonitoringconfig.QualityMonitoringDefinition; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; @@ -34,15 +40,85 @@ @Override public void saveOrUpdate(QualityMonitoringDefinition qulityMonitoringDefinitionVo, JSONArray params,String actionType) { + FormDefinition savedDefintion = null; if(FormDefinition.ACTION_DEPLOY.equals(actionType)){ - formDefinitionManager.deployFormDefinition(qulityMonitoringDefinitionVo, params); + savedDefintion = formDefinitionManager.deployFormDefinition(qulityMonitoringDefinitionVo, params); }else if(FormDefinition.ACTION_SAVE.equals(actionType)){ - formDefinitionManager.saveFormDefinition(qulityMonitoringDefinitionVo, params); + savedDefintion = formDefinitionManager.saveFormDefinition(qulityMonitoringDefinitionVo, params); }else { throw new RuntimeException("参数错误!"); } + //验证触发项是否死循环以及设置触发项值 + if(savedDefintion != null){ + checkAndSetOptionValueTriggerItemIds(savedDefintion); + } } + private void checkAndSetOptionValueTriggerItemIds( + FormDefinition savedDefintion) { + List items = savedDefintion.getItems(); + if(items != null){ + Map itemNameToIdMap = new HashMap(); + for (FormDefinitionItem formDefinitionItem : items) { + itemNameToIdMap.put(formDefinitionItem.getName(), formDefinitionItem); + } + //设置触发项id + for (FormDefinitionItem formDefinitionItem : items) { + List options = formDefinitionItem.getOptions(); + if(options != null){ + for (FormDefinitionItemOption option : options) { + String triggerItemNames = option.getValueTriggerItemNames(); + if(StringUtils.isNotBlank(triggerItemNames)){ + String [] nameArray = triggerItemNames.split(","); + String ids = ""; + for (String name : nameArray) { + FormDefinitionItem fdItem = itemNameToIdMap.get(name); + if(fdItem == null){ + throw new RuntimeException(option.getValue() + ",关联的触发项[" + name + "]已不存在!"); + } + if(ids != ""){ + ids += ","; + } + ids += fdItem.getId(); + fdItem.setIsTriggerItem(Constants.STR_YES); + fdItem.setRequirement("可选"); + List triggerItems = formDefinitionItem.getTriggerItems(); + if(triggerItems == null){ + triggerItems = new ArrayList(); + } + triggerItems.add(fdItem); + } + option.setValueTriggerItemIds(ids); + } + } + } + } + //验证触发项是否死循环 + for (FormDefinitionItem item : items) { + List triggerItems = item.getTriggerItems(); + if(triggerItems != null && triggerItems.size() > 0){ + checkIsCeaselessForeach(triggerItems,item,item); + } + } + } + } + + private void checkIsCeaselessForeach(List items,FormDefinitionItem parentDefinition,FormDefinitionItem rootDefinitionItem){ + if(items != null){ + for (FormDefinitionItem formDefinitionItem : items) { + //父节点跟子节点是否双向关联(当验证B根节点时,C根节点和C根节点的子节点是否双向关联,这种情况不考虑这个递归调用会死循环下去) + if(StringUtils.equals("" + formDefinitionItem.getId(), "" + parentDefinition.getId())){ + throw new RuntimeException("触发项配置不能双向关联!"); + } + //根节点与叶子节点是否双向关联 + if(StringUtils.equals("" + formDefinitionItem.getId(), "" + rootDefinitionItem.getId())){ + throw new RuntimeException("触发项配置不能双向关联!"); + } + checkIsCeaselessForeach(formDefinitionItem.getTriggerItems(),formDefinitionItem,rootDefinitionItem); + } + } + } + @Override public QualityMonitoringDefinition getQualityMonitoringDefinitionById( String id) {