package com.norteksoft.mms.form.service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import net.htmlparser.jericho.FormField; import net.htmlparser.jericho.FormFields; import net.htmlparser.jericho.Source; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import com.norteksoft.mms.base.CommonStaticConstant; import com.norteksoft.mms.form.dao.FormViewDao; import com.norteksoft.mms.form.dao.GeneralDao; import com.norteksoft.mms.form.dao.ListViewDao; import com.norteksoft.mms.form.entity.AutomaticallyFilledField; import com.norteksoft.mms.form.entity.DataTable; import com.norteksoft.mms.form.entity.FormControl; import com.norteksoft.mms.form.entity.FormView; import com.norteksoft.mms.form.entity.ListView; import com.norteksoft.mms.form.entity.TableColumn; import com.norteksoft.mms.form.enumeration.DataType; import com.norteksoft.mms.form.jdbc.JdbcSupport; import com.norteksoft.mms.module.dao.ButtonDao; import com.norteksoft.mms.module.dao.MenuDao; import com.norteksoft.mms.module.dao.ModulePageDao; import com.norteksoft.mms.module.entity.Menu; import com.norteksoft.mms.module.entity.ModulePage; import com.norteksoft.mms.module.service.MenuManager; import com.norteksoft.product.enumeration.DataState; import com.norteksoft.product.orm.Page; import com.norteksoft.product.util.ContextUtils; import com.norteksoft.product.util.JsonParser; import com.norteksoft.product.util.MemCachedUtils; import com.norteksoft.product.util.PropUtils; @Service @Transactional(readOnly=true) public class FormViewManager { private FormViewDao formViewDao; private ListViewDao listViewDao; private JdbcSupport jdbcDao; private GeneralDao generalDao; private Log log = LogFactory.getLog(FormViewManager.class); private MenuDao menuDao; private DataTableManager dataTableManager; private ListViewManager listViewManager; private TableColumnManager tableColumnManager; private MenuManager menuManager; @Autowired private ButtonDao buttonDao; @Autowired private ModulePageDao modulePageDao; @Autowired public void setTableColumnManager(TableColumnManager tableColumnManager) { this.tableColumnManager = tableColumnManager; } @Autowired public void setListViewManager(ListViewManager listViewManager) { this.listViewManager = listViewManager; } @Autowired public void setDataTableManager(DataTableManager dataTableManager) { this.dataTableManager = dataTableManager; } @Autowired public void setFormViewDao(FormViewDao formViewDao) { this.formViewDao = formViewDao; } @Autowired public void setJdbcDao(JdbcSupport jdbcDao) { this.jdbcDao = jdbcDao; } @Autowired public void setMenuDao(MenuDao menuDao) { this.menuDao = menuDao; } @Autowired public void setGeneralDao(GeneralDao generalDao) { this.generalDao = generalDao; } @Autowired public void setListViewDao(ListViewDao listViewDao) { this.listViewDao = listViewDao; } @Autowired public void setMenuManager(MenuManager menuManager) { this.menuManager = menuManager; } /** * 保存表单视图 * @param formView */ @Transactional(readOnly=false) public void save(FormView formView){ formViewDao.save(formView); } private FormHtmlParser getFormHtmlParser(){ return new FormHtmlParser(); } /** * 保存表单视图 * @param formView */ @Transactional(readOnly=false) public void saveFormView(FormView srcFormView, Long menuId,String operation,String htmlResult){ if("addVersion".equals(operation)||srcFormView.getId()==null){ FormView formView=null; if("addVersion".equals(operation)&&srcFormView.getId()!=null){//增加版本 formView=new FormView(); formView=srcFormView.clone(); formView.setId(null); }else{//新建时 formView=srcFormView; } formView.setHtml(htmlResult); if(formView.getFormState()==null||"".equals(formView.getFormState())){ formView.setFormState(DataState.DRAFT); }else if(formView.getFormState().equals(DataState.DISABLE)){ formView.setFormState(DataState.DRAFT); } formView.setMenuId(menuId); formView.setCompanyId(ContextUtils.getCompanyId()); formView.setCreatedTime(new Date()); formView.setCreator(ContextUtils.getLoginName()); formView.setCreatorName(ContextUtils.getUserName()); if(formView.getStandard()!=true){ formView.setStandard(false); } formView.setVersion(getVersion(formView.getCode())); if("addVersion".equals(operation)&&srcFormView.getId()!=null){//增加版本时,判断是否增加字段 if(!formView.getStandard()){//如果是自定义表单 changeUpdateFormControl(formView, menuId); } } formViewDao.save(formView); }else {//更新当前版本 if(srcFormView.getFormState()==null||"".equals(srcFormView.getFormState())){ srcFormView.setFormState(DataState.DRAFT); if(srcFormView.getVersion()==0||srcFormView.getVersion()==null){ srcFormView.setVersion(1); } } srcFormView.setHtml(htmlResult); if(!srcFormView.getStandard()){//如果是自定义表单 changeUpdateFormControl(srcFormView, menuId); }else{ //标准表单时,更新当前版本时更新签章字段 if(PropUtils.getProp("project.model")==null||PropUtils.getProp("project.model").equals("product.model")){//默认是产品模式,或配置的是产品模式时 MemCachedUtils.add(srcFormView.getCode()+"~"+srcFormView.getVersion()+"~"+srcFormView.getCompanyId(),getSignatureField(srcFormView)); } } formViewDao.save(srcFormView); } } /** * 获得该编号下视图的新版本号 * @param code * @return 新的版本号 */ protected int getVersion(String code){ List<FormView> views = formViewDao.getViewsByCodeOrderByVersion(code); return views.size()==0?1:views.get(0).getVersion()+1; } /** * 查询表单视图 * @param id 数据id * @return 表单视图 */ public FormView getFormView(Long id){ if(id==null){throw new RuntimeException("查询表单时,表单id不能为null");} return formViewDao.get(id); } /** * 删除表单视图 * @param id 表单视图id */ @Transactional(readOnly=false) public void deleteFormView(Long id){ FormView view = formViewDao.get(id); if(DataState.DRAFT!=view.getFormState()){ // 删除页面 List<ModulePage> pages=modulePageDao.getModulePagesByViewId(id); for(ModulePage mp : pages){ buttonDao.deleteButtonByModulePage(mp.getId()); modulePageDao.delete(mp); } } formViewDao.delete(id); } public List<FormView> getFormViewByDataTable(Long dtId){ return formViewDao.find("from FormView f where f.dataTable.id=?", dtId); } /** * 查询某个数据表下的表单视图 * @param page * @param dataTable */ public void getFormViewPage(Page<FormView> page,DataTable dataTable){ if(dataTable==null){ return; } formViewDao.getFormViewPage(page,dataTable); } /** * 获得某个数据表下的表单视图 * @param dataTableId 数据表id */ public void getFormViewPage(Page<FormView> page,Long dataTableId){ if(dataTableId==null){ return; } formViewDao.getFormViewPage(page,dataTableId); } /** * 获得标准或自定义的表单视图 * @param existedTable 是否存在数据表 */ public void getFormViewPageByMenu(Page<FormView> page,Long menuId){ formViewDao.getFormViewPageByMenu(page,menuId); } /** * 获得某个公司的表单视图 * */ public List<FormView> getFormViewsByCompany(){ return formViewDao.getFormViewsByCompany(); } /** * 获得某个公司的表单视图 * (flex有调用) */ public List<FormView> getFormViewsByCompany(Long companyId){ log.debug("flex getFormViewsByCompany begin:"); log.debug("param["+companyId+"]"); List<FormView> list=formViewDao.getFormViewsByCompany(companyId); log.debug("result["+list+"]"); log.debug("flex getFormViewsByCompany end:"); return list; } /** * 根据表单code和版本查询表单视图 * @param code * @param version */ public FormView getCurrentFormViewByCodeAndVersion(String code,Integer version){ return formViewDao.getFormViewByCodeAndVersion(code,version); } /** * 查询最新版本的启用的表单 * @param code * @return */ public FormView getHighFormViewByCode(String code){ return formViewDao.getHighViewByCode(code); } /** * 根据表单code和版本查询表单视图 * @param code * @param version */ public FormView getFormViewByCodeAndVersion(Long companyId,String code,Integer version){ return formViewDao.getFormViewByCodeAndVersion(code,version,companyId); } /** * 根据表单code和版本查询控件列表(按控件在html代码中出现先后排序) * (flex有调用) */ public List<FormControl> getControlsByCodeAndVersion(Long companyId,String code,Integer version) { FormView formView = this.getFormViewByCodeAndVersion(companyId,code, version); return getFormHtmlParser().getControls(formView.getHtml()); } /** * 根据表单code和版本查询控件列表(按控件在html代码中出现先后排序) * (flex有调用) */ public List<FormControl> getControlsByCodeAndVersion(String code,Integer version) { FormView formView = this.getCurrentFormViewByCodeAndVersion(code, version); return getFormHtmlParser().getControls(formView.getHtml()); } /** * 获得该表单的控件列表(按控件在html代码中出现先后排序) */ public List<FormControl> getControls(FormView formView) { Assert.notNull(formView, "FormView实体不能为null"); List<FormControl> list = getFormHtmlParser().getControls(formView.getHtml()); return list; } /** * 获得该表单的控件列表(按控件在html代码中出现先后排序) */ public List<FormControl> getControls(Long formViewId) { Assert.notNull(formViewId,"获得该表单的控件列表时,FormView表单id不能为null"); return getControls(getFormView(formViewId)); } /** * 校验form表单中是否有重名的控件 * @param formHtml 表单html */ public String validatHtml(String formHtml){ return getFormHtmlParser().validatHtml(formHtml); } /** * 获得表单视图的校验设置 * 返回格式如下: * {"required_fields":[{id:"oneint"},{id:"onttext",type:"TEXT"},{id:"onedouble",type:"AMOUNT"}], * "forbidden_fields":["ontnottext"]}'; * @param formView 表单视图 */ public String getValidateSetting(FormView formView) { StringBuilder validateSetting = new StringBuilder("["); List<FormControl> controls = this.getControls(formView); for(FormControl control :controls){ validateSetting.append("{"); //<input id="column3" title="字段san" name="column3" datatype="TEXT" request="0" format="no" readolny="0" columnid="3" plugintype="TEXT" /> validateSetting.append("request:\"").append(control.getRequest()).append("\","); validateSetting.append("readonly:\"").append(control.getReadOlny()).append("\","); validateSetting.append("controlType:\"").append(control.getControlType().getEnumName()).append("\","); validateSetting.append("format:\"").append(control.getFormat()).append("\","); validateSetting.append("datatype:\"").append(control.getDataType().getEnumName()).append("\","); validateSetting.append("title:\"").append(control.getTitle()).append("\","); validateSetting.append("name:\"").append(control.getName()).append("\","); validateSetting.append("id:\"").append(control.getControlId()).append("\","); validateSetting.append("formatType:\"").append(control.getFormatType()).append("\","); validateSetting.append("formatTip:\"").append(control.getFormatTip()).append("\""); validateSetting.append("},"); } if(controls!=null && controls.size()>0){ validateSetting.delete(validateSetting.length()-1, validateSetting.length()); } validateSetting.append("]"); return validateSetting.toString(); } /** * 根据表名和记录ID查询对应数据,返回Map */ @SuppressWarnings("unchecked") public Map getDataMap(String tableName, Long id) { Map map = jdbcDao.getDataMap(tableName, id); return map; } /** * 根据请求中获得的参数map保存或修改表单内容数据 id为空时保存否则修改 * @param parameterMap parameterMap中key为metaFormId的值时元表单的ID * @throws ParseException */ @Transactional(readOnly=false) public Long saveFormContentToTable(Map<String,String[]> parameterMap,Long formId,Long dataId) { Long id=saveParentFormContentToTable(parameterMap,formId,dataId); saveChildFormToTable(parameterMap,formId,id); return id; } @Transactional(readOnly=false) private Long saveParentFormContentToTable(Map<String,String[]> parameterMap,Long formId,Long dataId){ Long id=null; FormView form =formViewDao.get(formId); List<FormControl> fields = this.getControls(formId); if(dataId!=null){ id = jdbcDao.autoUpdateTable(parameterMap,form,fields,dataId); }else{ id = jdbcDao.insertTable(parameterMap,form,fields); } return id; } /** * 保存自定义表单中子表单的值 * @param parameterMap * @param formId */ @Transactional(readOnly=false) private void saveChildFormToTable(Map<String,String[]> parameterMap,Long formId,Long parentRowId){ FormView parentForm =formViewDao.get(formId); List<FormControl> parentFields = this.getControls(formId); List<Map<String,Object>> result=parseChildFormTable(parameterMap,parentForm.getHtml()); for(Map<String,Object> map:result){ FormView childForm=formViewDao.get(Long.parseLong((String)(map.get(CommonStaticConstant.DATA_SOURCE)))); jdbcDao.insertChildTable(map,parentForm,parentFields,childForm,parentRowId); } } @SuppressWarnings("unchecked") private List<Map<String,Object>> parseChildFormTable(Map<String,String[]> parameterMap,String html){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); List<Map<String,Object>> result=new ArrayList<Map<String,Object>>(); Set<String> keys=parameterMap.keySet(); Iterator<String> it=keys.iterator(); List<String> listControlIds=formHtmlParser.getAllListControlIds(); for(String id:listControlIds){ Map<String,Object> map=new HashMap<String, Object>(); Map fields=new HashMap(); Map fieldValues=new HashMap(); while(it.hasNext()){ String key=it.next(); if(key.startsWith("dataSrc_")){ String source=null; if(key.substring(key.indexOf("_")+1,key.length()).equals(id)){ source=parameterMap.get(key)[0]; map.put(CommonStaticConstant.DATA_SOURCE, source); } }else if(key.startsWith("listControl_")){ String currentId=key.substring(key.indexOf("_")+1,key.lastIndexOf("_")); if(currentId.equals(id)){ String fieldName=key.substring(key.lastIndexOf("_")+1,key.indexOf(":")); String fieldType=key.substring(key.indexOf(":")+1,key.length()); fields.put(fieldName, fieldType); fieldValues.put(fieldName, parameterMap.get(key)); map.put(CommonStaticConstant.DATA_SOURCE_FIELD, fields); map.put(CommonStaticConstant.DATA_SOURCE_FIELD_VALUE, fieldValues); } } } if(map.size()>0){ result.add(map); } } return result; } /** * 给html加初始值 * @param form * @return */ @Transactional(readOnly=false) public String initHtml(FormView form,List<AutomaticallyFilledField> filledField,String html){ FormHtmlParser formHtmlParser=getFormHtmlParser(); List<FormControl> controls = this.getControls(form.getId()); formHtmlParser.setFormHtml(html); List<TableColumn> columns=tableColumnManager.getTableColumnByDataTableId(form.getDataTable().getId()); return formHtmlParser.initHtml(controls,filledField,columns); } public String setDefaultVal(FormView form,String html){ FormHtmlParser formHtmlParser=getFormHtmlParser(); List<FormControl> controls = this.getControls(form.getId()); formHtmlParser.setFormHtml(html); List<TableColumn> columns=tableColumnManager.getTableColumnByDataTableId(form.getDataTable().getId()); return formHtmlParser.setDefaultVal(controls,columns); } @SuppressWarnings("unchecked") public String getFormHtml(FormView form,String formHtml,Long dataId,boolean fieldRight,boolean signatureVisible){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(formHtml); Map<String,List> queryMap=new HashMap<String, List>(); //自定义列表控件 Map<String,Map<String,String>> fields = formHtmlParser.getChildFormFields(); Set keySet=fields.keySet(); Iterator it=keySet.iterator(); while(it.hasNext()){ String source=(String)it.next(); FormView childForm=formViewDao.get(Long.parseLong(source)); Map<String,String> childFields=(Map<String,String>)fields.get(source); Set fieldSet=childFields.keySet(); Iterator fieldIt=fieldSet.iterator(); if(childFields.size()>0 && dataId!=null){ List queryResult=new ArrayList(); StringBuilder sql=new StringBuilder("select "); while(fieldIt.hasNext()){ String field=(String)fieldIt.next(); String dataType=childFields.get(field); if(dataType.equals(DataType.DATE.toString())) { sql.append("to_char(").append(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(field).append(",").append("'yyyy-mm-dd') ").append(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(field).append(","); }else if( dataType.equals(DataType.TIME.toString())){ sql.append("to_char(").append(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(field).append(",").append("'yyyy-mm-dd hh24:mi') ").append(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(field).append(","); }else{ sql.append("t.").append(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(field).append(","); } } sql.replace(sql.length()-1, sql.length(), " "); sql.append("from ").append(childForm.getDataTable().getName()).append(" t") .append(" where ").append("t.").append("fk_").append(form.getDataTable().getName()).append("=").append(dataId) .append(" order by ").append("t.id"); queryResult=jdbcDao.excutionSql(sql.toString()); queryMap.put(source, queryResult); } } return formHtmlParser.getFormHtml(form,formHtml,queryMap,fieldRight,signatureVisible); } public String getFormHtml(FormView form,String formHtml){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(formHtml); return formHtmlParser.getFormHtml(form,formHtml); } /** * 根据公司ID,FORMI,DATAID,FIELDNAME得到字段值 * @param companyId * @param formId * @param dataId * @param fieldName * @return */ @SuppressWarnings("unchecked") public String getFieldValue(Long formId,Long dataId,String fieldName){ Object value = null; FormView form =getFormView(formId); if(form==null){log.debug("getFieldValue中,表单不能为null");throw new RuntimeException("getFieldValue中,表单不能为null");} if(form.isStandardForm()){ //标准表单的处理 //根据表单id获得对应的类 if(form.getDataTable()==null){log.debug("getFieldValue中,表单对应的数据表不能为null");throw new RuntimeException("getFieldValue中,表单对应的数据表不能为null");} String className = form.getDataTable().getEntityName(); //根据表名和id获得实体 if(className==null){log.debug("getFieldValue中,表单对应的数据表的实体类名不能为null");throw new RuntimeException("getFieldValue中,表单对应的数据表的实体类名不能为null");} Object entity = generalDao.getObject(className, dataId); try { value = BeanUtils.getProperty(entity, fieldName); if(value==null) throw new RuntimeException("Field:"+fieldName+" no value."); } catch (Exception e) { throw new RuntimeException(e); } }else if(!form.isStandardForm()){ fieldName = new StringBuilder(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(fieldName).toString().toUpperCase(); Map map = this.getDataMap(form.getDataTable().getName(), dataId); value = map.get(fieldName); } return value==null?null:value.toString(); } /** * 数据选择控件/获取字段集合 * @return */ public List<String[]> getDataProperties(String html,String controlId){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); DataTable dataTable=dataTableManager.getDataTableByTableName(formHtmlParser.getDataSource(controlId)); return formHtmlParser.getDataProperties(controlId,dataTable); } /** * 数据选择控件/查询所有数据 * @return */ @SuppressWarnings("unchecked") public List getDataExcutionSql(String html,String controlId){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); DataTable dataTable=dataTableManager.getDataTableByTableName(formHtmlParser.getDataSource(controlId)); String sql=formHtmlParser.getDataSqlCondition(controlId, dataTable); return jdbcDao.excutionSql(sql); } public Page<Object> getDataExcutionSql(Page<Object> page,String html,String controlId,Map<String, String[]> parameterMap,List<String[]> properties){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); DataTable dataTable=dataTableManager.getDataTableByTableName(formHtmlParser.getDataSource(controlId)); Object[] conditions=getConditionSql(dataTable,parameterMap); String conditionSql =(String)conditions[0]; if(StringUtils.isNotEmpty(conditionSql.trim())){ generalDao.findPageBySql(getExecutionSql(dataTable,conditionSql,properties),page, conditions[1]); }else{ generalDao.findPageBySql(getExecutionSql(dataTable,conditionSql,properties),page); } // page = jdbcDao.excutionSql(page,result,conditionSql); return page; } private String getExecutionSql(DataTable dataTable,String conditionSql,List<String[]> properties){ StringBuilder sql = new StringBuilder(" "); sql.append("select "); for(String[] strs:properties){ sql.append(strs[0]).append(","); } if(sql.toString().contains(",")){ sql.replace(sql.toString().length()-1, sql.toString().length(), ""); } sql.append(" from ").append(dataTable.getName()).append(" "); if(StringUtils.isNotEmpty(conditionSql.trim())){ sql.append("where ").append(conditionSql); } return sql.toString(); } /** * 获得查询条件 * @param form * @param parameterMap * @return */ private Object[] getConditionSql(DataTable dataTable,Map<String, String[]> parameterMap){ List<TableColumn> tableColumns=tableColumnManager.getTableColumnByDataTableId(dataTable.getId()); StringBuilder conditionSql = new StringBuilder(" "); String key; String[] value = null; Object[] objs=new Object[tableColumns.size()]; Object[] result=new Object[2]; try{ for(int i=0;i<tableColumns.size()-1;i++){ TableColumn field=tableColumns.get(i); if(StringUtils.isEmpty(dataTable.getEntityName())){ key = JdbcSupport.FORM_FIELD_PREFIX_STRING+field.getName(); }else{ key = field.getDbColumnName(); } value = parameterMap.get(key); if(value!=null&&value.length>0&&StringUtils.isNotEmpty(value[0])){ if(!conditionSql.toString().equals(" ")) conditionSql.append(" and "); if(field.getDataType().equals(DataType.TEXT) ||field.getDataType().equals(DataType. CLOB) ){ objs[i]="%"+value[0]+"%"; conditionSql.append(key).append(" like ").append("? "); }else{ if(field.getDataType().equals(DataType.DATE)){ SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); objs[i]=df.parse(value[0]); }else if(field.getDataType().equals(DataType.TIME)){ SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); objs[i]=df.parse(value[0]); }else if(field.getDataType().equals(DataType.DOUBLE)||field.getDataType().equals(DataType.AMOUNT)){ objs[i]=Double.parseDouble(value[0]); }else if(field.getDataType().equals(DataType.FLOAT)){ objs[i]=Float.parseFloat(value[0]); }else if(field.getDataType().equals(DataType.INTEGER)||field.getDataType().equals(DataType.NUMBER)){ objs[i]=Integer.parseInt(value[0]); }else if(field.getDataType().equals(DataType.LONG)){ objs[i]=Long.parseLong(value[0]); }else if(field.getDataType().equals(DataType.ENUM)){ //TODO 数据表字段没有地方设枚举类名 // ParseJsonUtil.getEnum(value[0], field.getClassName()); }else if(field.getDataType().equals(DataType.BOOLEAN)){ if(value[0].equals("1")){ objs[i]=true; }else if(value[0].equals("0")){ objs[i]=false; } } conditionSql.append(key).append("=?").append(" "); } } } }catch (Exception e) { } result[0]=conditionSql.toString(); result[1]=objs; return result; } /** * 数据选择控件/查询所有数据 * @return */ public DataTable getDataSource(String html,String controlId){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); return dataTableManager.getDataTableByTableName(formHtmlParser.getDataSource(controlId)); } /** * 数据获取控件 * 查询指定数据结果,并将结果封装为json数据格式 * @return */ @SuppressWarnings("unchecked") public String getDataAcquisitionResult(String html,String controlId,String referenceControlValue){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); DataTable dataTable=dataTableManager.getDataTableByTableName(formHtmlParser.getDataSource(controlId)); List<TableColumn> tableColumns=tableColumnManager.getTableColumnByDataTableId(dataTable.getId()); //获得查询语句 String result=formHtmlParser.getDataAcqSqlCondition(controlId, dataTable, referenceControlValue, tableColumns); String json = ""; if(StringUtils.isNotEmpty(dataTable.getEntityName())){ List list = generalDao.getObject(result, referenceControlValue);//referenceControlValue); if(list.size()>0){ StringBuilder jsonHql=new StringBuilder("{"); List<String[]> pros=formHtmlParser.getDataProperties(controlId,dataTable); Object obj=list.get(0); Object[] objs=null; if(obj instanceof Object[]){ objs=(Object[])obj; } if(objs!=null){ for(int i=0;i<objs.length;i++){ jsonHql.append(pros.get(i)[0]).append(":").append('"').append(objs[i]==null?"":objs[i].toString()).append('"').append(','); } }else{ jsonHql.append(pros.get(0)[0]).append(":").append('"').append(obj==null?"":obj.toString()).append('"').append(','); } if(jsonHql.indexOf(",")>=0){ jsonHql=new StringBuilder(jsonHql.substring(0, jsonHql.lastIndexOf(","))); } jsonHql.append("}"); json=jsonHql.toString(); } }else{ List list = jdbcDao.excutionSql(result); if(list.size()>0){ json = JsonParser.object2Json(list.get(0)); } } return json; } public ListView getListViewByFormId(Long formId){ FormView formView=formViewDao.get(formId); return listViewDao.getDefaultDisplayListViewByTabelId(formView.getDataTable().getId()); } //复制表单 @Transactional(readOnly=false) public void savecopy(Long formId,Long menuId,FormView fv){ FormView getFormView = formViewDao.get(formId); DataTable dt=null; if(getFormView.getDataTable()!=null){ dt=dataTableManager.getDataTable(getFormView.getDataTable().getId()); } fv.setId(null); fv.setMenuId(menuId); fv.setVersion(1); fv.setCompanyId(getFormView.getCompanyId()); fv.setCreatedTime(new Date()); fv.setCreator(ContextUtils.getLoginName()); fv.setCreatorName(ContextUtils.getUserName()); fv.setRemark(getFormView.getRemark()); fv.setDataTable(dt); fv.setHtml(getFormView.getHtml()); fv.setStandard(getFormView.getStandard()); fv.setFormState(DataState.DRAFT); formViewDao.save(fv); } //改变form表单状态 @Transactional(readOnly = false) public String changeFormState(List<Long> formIds, Long menuId){ int draftToEn=0,enToDis=0,disToEn=0; StringBuilder sbu=new StringBuilder(""); for(Long formId:formIds){ FormView formView = getFormView(formId); if (formView.getFormState().equals(DataState.DRAFT)) {// 草稿->启用 List<FormView> formVies = formViewDao.getViewsByCodeOrderByVersion(formView.getCode()); Boolean sign = true; for(FormView formVie : formVies){ if(DataState.DISABLE.equals(formVie.getFormState())||DataState.ENABLE.equals(formVie.getFormState())){ sign = false; } } if(!formView.getStandard() && sign){//非标准表单 并且 其他版本都为草稿的生成数据表 dataTableManager.createTable(formView); } log.debug("form state has change to " + DataState.ENABLE.toString()); formView.setFormState(DataState.ENABLE); draftToEn++; log.debug("begin to create defaultView"); if(!formView.getStandard()){ createDefaultView(formView, menuId); }else{ //标准表单时,启用表单时更新签章字段 if(PropUtils.getProp("project.model")==null||PropUtils.getProp("project.model").equals("product.model")){//默认是产品模式,或配置的是产品模式时 MemCachedUtils.add(formView.getCode()+"~"+formView.getVersion()+"~"+formView.getCompanyId(),getSignatureField(formView)); } } } else if (formView.getFormState().equals(DataState.ENABLE)) {// 启用->禁用 log.debug("form state has change to " + DataState.DISABLE.toString()); formView.setFormState(DataState.DISABLE); enToDis++; } else if (formView.getFormState().equals(DataState.DISABLE)) {// 禁用->启用 log.debug("form state has change to " + DataState.ENABLE.toString()); formView.setFormState(DataState.ENABLE); disToEn++; } saveFormView(formView, menuId,null,formView.getHtml()); } sbu.append(draftToEn).append("个草稿->启用,") .append(enToDis).append("个启用->禁用,") .append(disToEn).append("个禁用->启用"); return sbu.toString(); } /** * 生成默认视图 * * @param formView */ @Transactional(readOnly = false) public void createDefaultView(FormView formView, Long menuId) { String name = formView.getName(); String code = formView.getCode(); String remark = formView.getRemark(); DataTable dataTable = dataTableManager.getDataTableByTableName("mms_"+code); if(dataTable==null){ //创建默认的数据表视图以及字段 dataTable = createDefaultTableView(formView, menuId); } //创建默认的列表视图 int versionForViewCode; if(formView.getVersion().intValue()==0){ versionForViewCode = 1; }else{ versionForViewCode = formView.getVersion(); } ListView view = listViewManager.getListViewByCode(code+"_"+versionForViewCode); if(view==null){ listViewManager.createDefaultListView(dataTable,code+"_"+versionForViewCode,name,remark,menuId, formView.getStandard()); } } /** * 更新表单控件 * * @param formView */ @Transactional(readOnly=false) public void changeUpdateFormControl(FormView formView,Long menuId){ FormHtmlParser formHtmlParser=getFormHtmlParser(); //更新控件和更新新增控件 List<FormControl> controls=formHtmlParser.getControls(formView.getHtml()); DataTable dataTable = formView.getDataTable(); Menu menu = menuDao.get(menuId); if(dataTable!=null){ List<TableColumn> tableColumns=tableColumnManager.getTableColumnByDataTableId(dataTable.getId()); int i=0; for(FormControl control : controls){ Boolean sign = true; for(TableColumn tableColumn : tableColumns){ if(control.getName().equals(tableColumn.getName())){ sign = false; ++i; tableColumn.setName(control.getName()); tableColumn.setAlias(control.getTitle()); tableColumn.setDataType(control.getDataType()); tableColumn.setDefaultValue(control.getControlValue()); tableColumn.setMaxLength(control.getMaxLength()); tableColumn.setDisplayOrder(i); tableColumn.setDataTableId(dataTable.getId()); tableColumn.setCompanyId(menu.getCompanyId()); tableColumn.setDeleted(false); tableColumnManager.saveColumn(tableColumn, true); } } if(sign){ ++i; TableColumn tableCo = new TableColumn(); tableCo.setName(control.getName()); tableCo.setAlias(control.getTitle()); String tableListName = JdbcSupport.FORM_FIELD_PREFIX_STRING + control.getName(); tableCo.setDbColumnName(tableListName); tableCo.setDataType(control.getDataType()); tableCo.setDefaultValue(control.getControlValue()); tableCo.setMaxLength(control.getMaxLength()); tableCo.setDisplayOrder(i); tableCo.setDataTableId(dataTable.getId()); tableCo.setCompanyId(menu.getCompanyId()); tableCo.setDeleted(false); tableColumnManager.saveColumn(tableCo, true); tableColumns.add(tableCo); String tableName ="mms_"+formView.getCode(); String columnName = control.getName(); List<TableColumn> columns = tableColumnManager.getDeleteColumnByColumnName(columnName,dataTable.getId()); if(formView.getFormState()!=DataState.DRAFT && columns.size()<1){ jdbcDao.addDataBaseColumn(tableName, columnName, tableCo); } } } for(TableColumn tableColumn : tableColumns){ if(!FormHtmlParser.isDefaultField(tableColumn.getName())){//是默认生成的字段不设置删除标识 Boolean sign = true; for(FormControl control : controls){ if(tableColumn.getName().equals(control.getName())||tableColumn.getDisplayOrder()==0){ sign = false; } } if(sign){ tableColumn.setDeleted(true); } } } dataTableManager.saveDataTable(dataTable); formView.setDataTable(dataTable); } } /** * 验证表单编号的唯一 * * @param */ public Boolean isFormCodeExist(String code, Long formId){ String finalCode = code.toLowerCase().trim(); List<FormView> formViews = formViewDao.getFormViewByCode(finalCode, formId); return formViews.size()>0?true:false; } /** * 通过系统id获得表单视图 * @param */ public List<FormView> getFormViewsBySystem(Long menuId){ Menu menu = menuManager.getRootMenu(menuId); return formViewDao.getFormViewsByMenu(menu.getId()); } /** * 通过系统id获得表单视图 * @param */ public List<FormView> getFormViewsByMenu(Long menuId){ return formViewDao.getFormViewsByMenu(menuId); } public List<FormView> getUnCompanyFormViewsBySystem(Long menuId){ Menu menu = menuManager.getRootMenu(menuId); return formViewDao.getUnCompanyFormViewsBySystem(menu.getId()); } /** * 创建默认的数据表视图 * @param */ @Transactional(readOnly = false) public DataTable createDefaultTableView(FormView formView, Long menuId){ String name = formView.getName(); String code = formView.getCode(); Menu menu = menuDao.get(menuId); //创建默认的数据表视图 DataTable dataTable = new DataTable(); dataTable.setName("mms_"+code); dataTable.setAlias(name); dataTable.setTableState(DataState.ENABLE); dataTable.setMenuId(menuId); dataTableManager.saveDataTable(dataTable); //创建默认数据表视图的字段 FormHtmlParser formHtmlParser=getFormHtmlParser(); List<FormControl> controls=formHtmlParser.getControls(formView.getHtml()); int j=0; TableColumn tableColumn; List<TableColumn> columns = new ArrayList<TableColumn>(); for(FormControl control : controls){ ++j; tableColumn = new TableColumn(); tableColumn.setName(control.getName()); // if(columns.contains(tableColumn)){//如果包含该数据表字段则不再保存。考虑到复选框和单选框问题 // continue; // } tableColumn.setAlias(control.getTitle()); String tableListName = JdbcSupport.FORM_FIELD_PREFIX_STRING + control.getName(); tableColumn.setDbColumnName(tableListName); tableColumn.setDataType(control.getDataType()); tableColumn.setDefaultValue(control.getControlValue()); tableColumn.setMaxLength(control.getMaxLength()); tableColumn.setDisplayOrder(j); tableColumn.setCompanyId(menu.getCompanyId()); tableColumn.setDeleted(false); tableColumn.setDataTableId(dataTable.getId()); tableColumnManager.saveColumn(tableColumn, false); columns.add(tableColumn); } //id saveDefaultTableColumn("id",DataType.LONG,dataTable.getId(),menu.getCompanyId(),"实体id",++j); //生成默认instance_id saveDefaultTableColumn("instance_id",DataType.TEXT,dataTable.getId(),menu.getCompanyId(),"实例id",++j); //生成默认first_task_id saveDefaultTableColumn("first_task_id",DataType.LONG,dataTable.getId(),menu.getCompanyId(),"第一环节任务id",++j); //生成默认form_id saveDefaultTableColumn("form_id",DataType.LONG,dataTable.getId(),menu.getCompanyId(),"表单id",++j); //生成默认create_date saveDefaultTableColumn("create_date",DataType.DATE,dataTable.getId(),menu.getCompanyId(),"创建时间",++j); //生成默认creator_department saveDefaultTableColumn("creator_department",DataType.TEXT,dataTable.getId(),menu.getCompanyId(),"创建人部门",++j); formView.setDataTable(dataTable); return dataTable; } private void saveDefaultTableColumn(String name,DataType dataType,Long dataTableId,Long companyId,String alias,Integer displayOrder){ TableColumn tableColumn = new TableColumn(); tableColumn.setName(name); tableColumn.setDataTableId(dataTableId); tableColumn.setDataType(dataType); tableColumn.setAlias(alias); tableColumn.setCompanyId(companyId); tableColumn.setDeleted(false); tableColumn.setDisplayOrder(displayOrder); tableColumn.setDbColumnName(name); tableColumnManager.saveColumn(tableColumn, false); } /** * 给form表单赋值:主表单和子表同时赋 * @param form * @param html * @param dataId * @param fieldRight * @return 返回赋了值之后的html */ @SuppressWarnings("unchecked") public String getHtml(FormView form,String html,Long dataId,boolean fieldRight,boolean signatureVisible){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); if(dataId!=null){ Map map=jdbcDao.getDataMap(form.getDataTable().getName(), dataId); //主表单赋值 html = formHtmlParser.setFieldValue(map); } //子表赋值 html=getFormHtml(form, html, dataId, fieldRight,signatureVisible); return html; } /** * 给form表单赋值:主表单和子表同时赋 * @param form * @param html * @param dataId * @param fieldRight * @param signatureVisible * @return 返回赋了值之后的html */ @SuppressWarnings("unchecked") public String getHtml(FormView form,String html,Long dataId,boolean fieldRight,Object entity,Collection collection, boolean signatureVisible){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); boolean hasFill=false; //处理自定义表单中填写前自动填写字段 if(entity!=null){ if(!form.getStandard()){ if(entity instanceof Map){ html = formHtmlParser.setFieldValue((Map) entity); hasFill=true; } } } if(!hasFill){ if(dataId!=null){ //主表单赋值 if(form.getStandard()){ html = formHtmlParser.setStandardFieldValue(entity); }else{ Map map=jdbcDao.getDataMap(form.getDataTable().getName(), dataId); html = formHtmlParser.setFieldValue(map); } } } //子表赋值 if(form.getStandard()){ html=formHtmlParser.getStandardFormHtml(form, html,entity,collection,signatureVisible); }else{ html=getFormHtml(form, html, dataId, fieldRight,signatureVisible); } String validateSetting = getValidateSetting(form); html+="<script>$().ready(function(){addFormValidate('"+validateSetting+"');});</script>"; return html; } public FormView getUnCompanyFormViewByCodeAndVersion(String code, Integer version) { return formViewDao.getUnCompanyFormViewByCodeAndVersion(code, version); } /** * 将所有标准表单的签章字段存入缓存 */ public void getAllSignatureFields(){ if(PropUtils.getProp("project.model")==null||PropUtils.getProp("project.model").equals("product.model")){//默认是产品模式,或配置的是产品模式时 int i=0; List<FormView> views=formViewDao.getAllStandardFormView(); for (FormView formView : views) { System.out.println(i+"=正在加载表单【"+formView.getName()+":"+formView.getVersion()+":"+formView.getCompanyId()+"】......"); MemCachedUtils.add(formView.getCode()+"~"+formView.getVersion()+"~"+formView.getCompanyId(),getSignatureField(formView)); i++; } } } /** * 根据表单编号和版本号取得此表单中签章id的list * @param code * @param version * @return */ public List<String> getSignatureField(FormView view){ List<String> signatureFields = new ArrayList<String>(); if(view!=null){ Source source = new Source(view.getHtml()); FormFields formFields=source.getFormFields(); Iterator<FormField> it = formFields.iterator(); FormField formField = null; while(it.hasNext()){ formField = it.next(); if("TEXT".equals(formField.getFormControl().getElement().getAttributeValue("pluginType"))){ if("true".equals(formField.getFormControl().getElement().getAttributeValue("signaturevisible"))){//签章 signatureFields.add(formField.getFormControl().getElement().getAttributeValue("id")) ; } } } } return signatureFields; } /** * 给form的打印表单赋值 * @param form * @param html * @param dataId * @param fieldRight * @return 返回赋了值之后的html */ @SuppressWarnings("unchecked") public String getPrintHtml(FormView form,String html,Long dataId,boolean fieldRight,Object entity){ FormHtmlParser formHtmlParser=getFormHtmlParser(); formHtmlParser.setFormHtml(html); boolean hasFill=false; //处理自定义表单中填写前自动填写字段 if(entity!=null){ if(!form.getStandard()){ if(entity instanceof Map){ html = formHtmlParser.setFieldValue((Map) entity); hasFill=true; } } } if(!hasFill){ if(dataId!=null){ //主表单赋值 if(form.getStandard()){ html = formHtmlParser.setStandardFieldValue(entity); }else{ Map map=jdbcDao.getDataMap(form.getDataTable().getName(), dataId); html = formHtmlParser.setFieldValue(map); } } } html=formHtmlParser.getPrintFormHtml(form, html, dataId, fieldRight); //添加脚本隐藏控件 html+="<script type='text/javascript'>formPrintHideControl();</script>"; return html; } }