package com.norteksoft.mms.form.service;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
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.Locale;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.FormField;
import net.htmlparser.jericho.FormFields;
import net.htmlparser.jericho.OutputDocument;
import net.htmlparser.jericho.Source;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.norteksoft.acs.entity.authorization.BusinessSystem;
import com.norteksoft.acs.entity.authorization.Role;
import com.norteksoft.acs.entity.organization.Department;
import com.norteksoft.acs.service.AcsUtils;
import com.norteksoft.acs.service.authorization.BusinessSystemManager;
import com.norteksoft.bs.options.entity.Option;
import com.norteksoft.bs.options.entity.OptionGroup;
import com.norteksoft.mms.base.CommonStaticConstant;
import com.norteksoft.mms.base.utils.view.ComboxValues;
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.ListColumn;
import com.norteksoft.mms.form.entity.ListView;
import com.norteksoft.mms.form.entity.TableColumn;
import com.norteksoft.mms.form.enumeration.ControlType;
import com.norteksoft.mms.form.enumeration.DataType;
import com.norteksoft.mms.form.enumeration.DefaultValue;
import com.norteksoft.mms.form.format.FormatSetting;
import com.norteksoft.mms.form.format.FormatSettingFactory;
import com.norteksoft.mms.form.jdbc.JdbcSupport;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.PageUtils;
import com.norteksoft.product.util.PropUtils;
import com.norteksoft.product.util.SystemUrls;
import com.norteksoft.product.web.struts2.Struts2Utils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.TextProvider;
import com.opensymphony.xwork2.TextProviderFactory;
/**
* 表单html解析类
* @author wurong
*
*/
@Service
public class FormHtmlParser {
/**
* templatePath 模板的路径 templateContent 模板的内容
*/
private Source source;
private OutputDocument outputDocument;
private static final String TYPE="type";
private static final String DATATYPE = "datatype";
private static final String NAME = "name";
private static final String DATEFORMAT = "format";
private static final String BEANNAME="beanname";
private static final String CLASSNAME="classname";
private static final String ENUMNAME="enumname";
public FormHtmlParser() {
}
private final transient TextProvider textProvider =
new TextProviderFactory().createInstance(getClass(), new LocaleProvider(){
public Locale getLocale() {
ActionContext ctx = ActionContext.getContext();
if (ctx != null) {
return ctx.getLocale();
} else {
return null;
}
}});
/**
* 同表单代码构造一个解析对象
* @param formHtml
*/
public FormHtmlParser(String formHtml) {
this.source = new Source(formHtml);
this.outputDocument = new OutputDocument(source);
}
/**
* 设置要解析的表单代码
* @param formHtml
*/
public void setFormHtml(String formHtml){
this.source = new Source(formHtml);
this.outputDocument = new OutputDocument(source);
}
/**
* 验证html 主要验证重名
*/
public String validatHtml(String formHtml){
this.setFormHtml(formHtml);
final String doubleFieldName = "请检查,有重复的字段名:";
final String doubleControlIdName = "请检查,有重复的控件id:";
FormFields formFields=source.getFormFields();
List<FormControl> controls=getControls(formHtml);
for (FormField formField : formFields) {
Element element= formField.getFormControl().getElement();
if(element.toString().toLowerCase().indexOf("type=\"radio\"")<=-1 && element.toString().toLowerCase().indexOf("type=\"checkbox\"")<=-1 && formField.getFormControls().size()>1)return doubleFieldName+formField.getFormControls().iterator().next().getName();
for(FormControl formControl:controls){
if(element.getAttributeValue("id")==null ||(formControl.getName()!=null &&formControl.getName().equals(element.getAttributeValue("name"))))continue;
if(element.getAttributeValue("id").equals(formControl.getControlId())) return doubleControlIdName+formControl.getControlId();
}
}
return "ok";
}
//得到所有的字段
public List<FormControl> getControls(String formHtml){
this.setFormHtml(formHtml);
FormFields formFields=source.getFormFields();
List<FormControl> list = new ArrayList<FormControl>();
for (FormField formField : formFields) {
Element element= formField.getFormControl().getElement();
FormControl control=new FormControl();
//<input id="column3" title="字段san" name="column3" datatype="TEXT" request="0" format="no" readolny="0" columnid="3" plugintype="TEXT" />
control.setTitle(StringUtils.trim(element.getAttributeValue("title")));
control.setName(StringUtils.trim(element.getAttributeValue("name")));
control.setControlId(StringUtils.trim(element.getAttributeValue("id")));
control.setFormat(StringUtils.trim(element.getAttributeValue("format")));
control.setFormatTip(StringUtils.trim(element.getAttributeValue("formatTip")));
control.setControlValue(StringUtils.trim(element.getAttributeValue("value")));
control.setFormatType(StringUtils.trim(element.getAttributeValue("formatType")));
if(StringUtils.isNotEmpty(StringUtils.trim(element.getAttributeValue("readolny"))))control.setReadOlny( new Boolean(StringUtils.trim(element.getAttributeValue("readolny"))));
if(StringUtils.isNotEmpty(StringUtils.trim(element.getAttributeValue("request"))))control.setRequest(new Boolean(StringUtils.trim(element.getAttributeValue("request"))));
if(StringUtils.isNotEmpty(StringUtils.trim(element.getAttributeValue("datatype"))))control.setDataType(DataType.valueOf(StringUtils.trim(element.getAttributeValue("datatype"))));
// if(StringUtils.isNotEmpty(StringUtils.trim(element.getAttributeValue("columnid"))))control.setTableColumnId(Long.valueOf(StringUtils.trim(element.getAttributeValue("columnid"))));
if(StringUtils.isNotEmpty(StringUtils.trim(element.getAttributeValue("dbName"))))control.setDbName(StringUtils.trim(element.getAttributeValue("dbName")));
if(element.toString().toLowerCase().indexOf("<textarea")>-1){
control.setControlType(ControlType.valueOf("TEXTAREA"));
}else if(element.toString().toLowerCase().indexOf("<select")>-1){
control.setControlType(ControlType.valueOf("SELECT"));
}else if(element.toString().toLowerCase().indexOf("type=\"radio\"")>-1){
control.setControlType(ControlType.valueOf("RADIO"));
}else if(element.toString().toLowerCase().indexOf("type=\"checkbox\"")>-1){
control.setControlType(ControlType.valueOf("CHECKBOX"));
}else if(element.toString().toLowerCase().indexOf("type=\"password\"")>-1){
control.setControlType(ControlType.valueOf("PASSWORD"));
}else if(element.toString().toLowerCase().indexOf("type=\"hidden\"")>-1){
control.setControlType(ControlType.valueOf("HIDDEN"));
}else if(element.toString().toLowerCase().indexOf("type=\"button\"")>-1){
control.setControlType(ControlType.valueOf("BUTTON"));
}else{
control.setControlType(ControlType.valueOf("TEXT"));
}
list.add(control);
}
return list;
}
/**
* 获得所有列表控件的id
* @return
*/
public List<String> getAllListControlIds(){
List<String> result=new ArrayList<String>();
List<Element> lists= source.getAllElements();
for(Element element:lists){
if( "ListControl".equals(element.getAttributeValue("pluginType"))){
result.add(element.getAttributeValue("id"));
}
}
return result;
}
public String setDefaultVal(List<FormControl> fields,List<TableColumn> columns){
FormFields formFields=source.getFormFields();
for(FormControl control:fields){
for(TableColumn col:columns){
if(control.getName().equals(col.getName())){
formFields.setValue(control.getName(),col.getDefaultValue());
break;
}
}
}
//(自定义的标签会有乱码)
outputDocument.replace(formFields);
return outputDocument.toString();
}
//初始化html
public String initHtml(List<FormControl> fields,List<AutomaticallyFilledField> filledField,List<TableColumn> columns){
FormFields formFields=source.getFormFields();
String key,value;
for(AutomaticallyFilledField aff :filledField){
key = aff.getName();
FormField formField = formFields.get(key);
if(formField!=null){
value = getAutoFilledFieldValue(fields,aff,formFields);
formFields.setValue(key,value);
}
}
//(自定义的标签会有乱码)
outputDocument.replace(formFields);
return outputDocument.toString();
}
private String getAutoFilledFieldValue(List<FormControl> fields,AutomaticallyFilledField aff,FormFields formFields){
FormControl field = getFieldbyName(fields,aff.getName() );
String value ;
if(field.getDataType()==DataType.TIME){
value = getFormatCurrentTime(aff,DataType.TIME);
}else if(field.getDataType()==DataType.DATE){
value = getFormatCurrentTime(aff,DataType.DATE);
}else if(field.getDataType()==DataType.TEXT){
value = getValue(aff);
if(aff.getFillType().equals(AutomaticallyFilledField.AUTO_FILLED_FILL_TYPE_ADDITIONAL)){
value = (formFields.getValues(aff.getName()).size()<=0?"":formFields.getValues(aff.getName()).get(0))+value;
}else if(aff.getFillType().equals(AutomaticallyFilledField.AUTO_FILLED_FILL_TYPE_ADDED_TO_THE_BEGINNING)){
value = value + (formFields.getValues(aff.getName()).size()<=0?"":formFields.getValues(aff.getName()).get(0));
}
}else{
value = aff.getValue();
}
return value;
}
/*
* 从List中取出英文名为enName的Field
*/
private FormControl getFieldbyName(List<FormControl> fields , String enName){
for(FormControl field:fields){
if(field.getName().equals(enName)) return field;
}
return null;
}
private String getFormatCurrentTime(AutomaticallyFilledField aff,DataType dataType){
String format ;
switch(dataType){
case TIME: format = "yyyy-MM-dd HH:mm" ;break;
case DATE: format = "yyyy-MM-dd";break;
default: return "";
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
return StringUtils.contains(aff.getValue(), CommonStaticConstant.CURRENTTIME) ? simpleDateFormat.format(new Date()) :"";
}
private String getValue(AutomaticallyFilledField aff){
StringBuilder builder = new StringBuilder();
String[] strs = null;
String condition = aff.getValue();
if(condition.indexOf('+')==-1){
strs = new String[]{condition};
}else{
strs = condition.split("\\+");
}
for(int i=0;i<strs.length;i++){
if(i!=0) builder.append(aff.getSeparate());
if( CommonStaticConstant.CURRENTTRANSACTOR.equals(strs[i])){
builder.append(ContextUtils.getLoginName());
}else if(CommonStaticConstant.CURRENT_TRANSACTOR_NAME.equals(strs[i])){
builder.append(ContextUtils.getUserName());
}else if(CommonStaticConstant.CURRENTTIME.equals(strs[i])){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
builder.append(simpleDateFormat.format(new Date()));
}else{
builder.append(strs[i]);
}
}
return builder.toString();
}
//往 FORM里插入值
@SuppressWarnings("unchecked")
public String setFieldValue(Map<String, Object> map){
FormFields formFields=source.getFormFields();
Iterator it = formFields.iterator();
FormField formField;
Element element;
String type,dataType,key,valueKey;
while(it.hasNext()){
formField = (FormField)it.next();
element = formField.getFormControl().getElement();
type = element.getAttributeValue(TYPE);
dataType = element.getAttributeValue(DATATYPE);
key = element.getAttributeValue(NAME);
if("id".equals(key)||"instance_id".equals(key)){
valueKey=key;
}else{
valueKey=JdbcSupport.FORM_FIELD_PREFIX_STRING+key;
}
type = type==null ? "" : type;
dataType = dataType==null ? "" : dataType;
if(type!=null&&type.equals("radio")){
String value= map.get(valueKey)==null ?"":map.get(valueKey).toString();
formFields.get(key).setValue(value);
}else if(type!=null&&type.equals("checkbox")){
Collection<String> c = new ArrayList<String>();
String value=map.get(valueKey)==null ?"":map.get(valueKey).toString();
String[] values=value.split(",");
for(int i=0;i<values.length;i++){
String myval=values[i].trim();
if(DataType.BOOLEAN.toString().equals(dataType)){
myval="true".equals(myval)?"1":"0";
}
c.add(myval);
}
formFields.get(key).setValues(c);
}else if(dataType.equals(DataType.TIME.toString())){
if(map.get(valueKey)!=null){
Date date = (Date)map.get(valueKey);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
formFields.get(key).setValue(simpleDateFormat.format(date));
}
}else if(dataType.equals(DataType.DATE.toString())){
if(map.get(valueKey)!=null){
Date date = (Date)map.get(valueKey);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
formFields.get(key).setValue(simpleDateFormat.format(date));
}
}else{
if(map.get(valueKey)!=null){
formFields.get(key).setValue(map.get(valueKey).toString());
}
}
}
//(自定义的标签会有乱码)
outputDocument.replace(formFields);
return outputDocument.toString();
}
//往 FORM里插入值
@SuppressWarnings("unchecked")
public String setStandardFieldValue(Object entity){
FormFields formFields=source.getFormFields();
Iterator it = formFields.iterator();
FormField formField;
Element element;
String type,dataType,key,valueKey;
while(it.hasNext()){
formField = (FormField)it.next();
element = formField.getFormControl().getElement();
type = element.getAttributeValue(TYPE);
dataType = element.getAttributeValue(DATATYPE);
key = element.getAttributeValue(NAME);
valueKey=key;
type = type==null ? "" : type;
dataType = dataType==null ? "" : dataType;
try {
Object value = PropertyUtils.getProperty(entity, valueKey);
if(value!=null){
if(dataType.equals(DataType.DATE.toString())){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
formFields.get(key).setValue(simpleDateFormat.format(value));
}else if(dataType.equals(DataType.TIME.toString())){
DateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
formFields.get(key).setValue(simpleDateFormat.format(value));
}else if(type!=null&&type.equals("checkbox")){
Collection<String> c = new ArrayList<String>();
String val=value.toString();
if(val.contains(",")){
String[] values=value.toString().split(",");
for(int i=0;i<values.length;i++){
c.add(values[i].trim());
}
formFields.get(key).setValues(c);
}else{
formFields.get(key).setValue(val);
}
}else{
if(!dataType.equals(DataType.COLLECTION.toString())){//不是集合类型
formFields.get(key).setValue(value.toString());
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//(自定义的标签会有乱码)
outputDocument.replace(formFields);
return outputDocument.toString();
}
/**
* 获得所有列表控件中的子表单的字段
* @return
*/
public Map<String,Map<String,String>> getChildFormFields() {
Map<String,Map<String,String>> result=new HashMap<String, Map<String,String>>();
List<Element> lists= source.getAllElements();
for(Element element:lists){
if( "ListControl".equals(element.getAttributeValue("pluginType"))){
String lvField=element.getAttributeValue("lv_field");
String dataSrc=element.getAttributeValue("data_source");
String[] lvFields=lvField.split(",");
Map<String,String> fields=new HashMap<String,String>();
for(String field:lvFields){
String dataType=field.substring(field.indexOf(":")+1,field.length());
field=field.substring(0,field.indexOf(":"));
fields.put(field, dataType);
}
if(fields.size()>0){
result.put(dataSrc, fields);
}
}
}
return result;
}
@SuppressWarnings("unchecked")
public String getFormHtml(FormView form,String formHtml,Map<String,List> queryMap,boolean fieldRight,boolean signatureVisible){
List<Element> inputs=source.getAllElements("input");
StringBuilder jsHtml=new StringBuilder("");
//如果有计算控件加入以下js代码
if(isHasAnyTag(ControlType.CALCULATE_COMPONENT.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>parse();</script>");
}
if(queryMap==null || queryMap.size()<=0){
if(isHasAnyTag(ControlType.LIST_CONTROL.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>parseListControl(\'"+fieldRight+"\');</script>");
}
}else{
Set keySet=queryMap.keySet();
Iterator it=keySet.iterator();
while(it.hasNext()){
String childSource=(String)it.next();
List queryResult=queryMap.get(childSource);
if(queryResult.size()<=0){
if(isHasAnyTag(ControlType.LIST_CONTROL.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>parseListControl(\'"+fieldRight+"\');</script>");
}
}else{
jsHtml.append("<script type='text/javascript'>initListControl(").append(childSource).append(");").append("</script>");
jsHtml.append(parseListControl(childSource,queryResult,fieldRight));
}
}
}
//如果有下拉菜单控件加入以下js代码
List<Element> selects=source.getAllElements("select");
if(isHasAnySelectTag(ControlType.PULLDOWNMENU.toString(),selects)){
String script=getPullDownMenuScript(selects);
script="<script type='text/javascript'>var ___ignore=true;"+script+"</script>";
jsHtml.append(script);
}
formHtml=preViewHtmlMacro(formHtml,form,jsHtml,signatureVisible);
jsHtml.append("<script type='text/javascript'>__signatureVisible="+signatureVisible+";initSignatureControl("+signatureVisible+");").append("</script>");
jsHtml.append("<script type='text/javascript'>initLabelControl();").append("</script>");
formHtml=formHtml+jsHtml;
return formHtml;
}
/**
* 此方法只有在预览表单时候用
* @param form
* @param formHtml
* @return
*/
public String getFormHtml(FormView form,String formHtml){
List<Element> inputs=source.getAllElements("input");
StringBuilder jsHtml=new StringBuilder("");
//如果有计算控件加入以下js代码
if(isHasAnyTag(ControlType.CALCULATE_COMPONENT.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>parse();</script>");
}
//如果有下拉菜单控件加入以下js代码
List<Element> selects=source.getAllElements("select");
if(isHasAnySelectTag(ControlType.PULLDOWNMENU.toString(),selects)){
String script=getPullDownMenuScript(selects);
script="<script type='text/javascript'>"+script+"</script>";
jsHtml.append(script);
}
jsHtml.append("<script type='text/javascript'>initLabelControl();").append("</script>");
formHtml=preViewHtmlMacro(formHtml,form,jsHtml,false)+jsHtml;
return formHtml;
}
/**
* 预览html
* @return
*/
public String preViewHtmlMacro(String formHtml,FormView form,StringBuilder jsHtml,boolean signatureVisible){
FormFields formFields=source.getFormFields();
Iterator<FormField> it = formFields.iterator();
FormField formField = null;
String signatureFields="";
while(it.hasNext()){
formField = it.next();
net.htmlparser.jericho.FormControl formcontrol = formField.getFormControl();
Element element = formcontrol.getElement();
String pluginType = element.getAttributeValue("pluginType");
if( "MacroComponent".equals(pluginType)){//如果是宏控件
String datafld = element.getAttributeValue("datafld");
if(element.toString().indexOf("<input")>-1){
formField.setValue(parseMacroInputControl( datafld,form));
}else if(element.toString().indexOf("<select")>-1){
addMacroSelectOptions(element,
parseMacroSelectControl(datafld),
outputDocument);
}
}else if("TEXT".equals(pluginType)){
String signaturevisible = element.getAttributeValue("signaturevisible");
if(signatureVisible &&"true".equals(signaturevisible)){//签章
List<Long> signIds=new ArrayList<Long>();
StringBuilder imgs = new StringBuilder();
//获得当前文本框的值,并根据该值获得签章路径,该值一般为用户真名
List<String> values = formField.getValues();
String url = SystemUrls.getSystemUrl("mms");
if(values.size()>0){
if(StringUtils.isNotEmpty(values.get(0))){
String names = values.get(0);
String[] nameArr = names.split(",");//多个人名之间以逗号隔开
for(String name:nameArr){
Long signId = ApiFactory.getSettingService().getSignIdByUserName(name);
if(signId!=null){
signIds.add(signId);
imgs.append("<img src='"+url+"/form/form-view-showPic.htm?signId="+signId+"' style='width:2cm;height:1cm;'></img>").append(",");
}else{
imgs.append(name).append(",");
}
}
}
}
if(signIds.size()>0){//如果签章路径存在
if(StringUtils.isEmpty(signatureFields)){
signatureFields=element.getAttributeValue("name");
}else{
signatureFields=signatureFields+","+element.getAttributeValue("name");
}
}
if(signIds.size()>0){//如果多个人都没有签章时,则不做任何操作;当有的人有签章,有的人没签章时,则执行以下操作
if(StringUtils.isNotEmpty(imgs.toString())){
imgs.replace(imgs.length()-1, imgs.length(), "");
outputDocument.replace(element.getEnd(), element.getEnd(), imgs.toString() );
}
}
}
//给签章字段集合赋值,用于验证和处理签章控件的隐藏 显示
jsHtml.append("<script type='text/javascript'>");
if(StringUtils.isNotEmpty(signatureFields)){
jsHtml.append("__signatureFields='").append(signatureFields).append("';");
}else{
jsHtml.append("__signatureFields='';");
}
jsHtml.append("</script>");
}
}
//(自定义的标签会有乱码)
outputDocument.replace(formFields);
return outputDocument.toString();
}
/*
* 宏控件
* 为select元素添加option选项
* @param element
* @param outputDocument
*/
private void addMacroSelectOptions(Element element,Map<Long,String> options, OutputDocument outputDocument){
String opts = getMacroSelectOptions(options);
outputDocument.replace(element.getBegin(), element.getEnd(),
element.toString().replace("><option value=\"\" selected=\"selected\">{宏控件}</option>", opts));
}
/**
* 用户角色
* @param departmentName
* @return
*/
private Map<Long, String> getUsersByRole(String departmentName){
Map<Long, String> map = new HashMap<Long, String>();
// Set<User> userSet = acsUtils.getUsersByRole(contextService.getSystemId(), contextService.getCompanyId(), CommonStaticConstant.MINISTER);
// for(User user:userSet){
// Set<DepartmentToUser> depat = user.getDepartmentToUser();
// for(DepartmentToUser department:depat){
// String name = department.getDepartment().getDepartmentName();
// if(name.equals(departmentName)){
// map.put(user.getId(), user.getName());
// break;
// }
// }
// }
return map;
}
/*
* 宏控件
* 根据规则获取select的option选项
* @param fieldName
* @return
*/
private String getMacroSelectOptions(Map<Long,String> options){
StringBuilder opts = new StringBuilder(">");
opts.append("<option value=\"\">--请选择--</option>");
for(Entry<Long, String> opt : options.entrySet()){
opts.append("<option value=\"").append(opt.getKey()).append("\">").append(opt.getValue()).append("</option>");
}
return opts.toString();
}
/**宏控件
* 初始化宏控件(Select)
*/
@SuppressWarnings("unchecked")
private Map<Long,String> parseMacroSelectControl(String datafld){
AcsUtils acsUtils = (AcsUtils)ContextUtils.getBean("acsUtils");
Map map=new HashMap<Long, String>();
if("SYS_LIST_ROLE".equals(datafld)){
Set<Role> roles=acsUtils.getRolesByUser(ContextUtils.getUserId(),ContextUtils.getCompanyId());
Iterator ite=roles.iterator();//将hs转换为一个可遍历的对象Iterator
while(ite.hasNext()){
Role role=(Role)ite.next();
map.put(role.getId(), role.getName());
}
}else if("SYS_LIST_MANAGER1".equals(datafld)){
List<Department> list=acsUtils.getDepartmentsByUser(ContextUtils.getCompanyId(), ContextUtils.getUserId());
for(Department dept:list){
map = getUsersByRole(dept.getName());
}
}else if("SYS_LIST_MANAGER2".equals(datafld)){
List<Department> list=acsUtils.getDepartmentsByUser(ContextUtils.getCompanyId(), ContextUtils.getUserId());
for(Department dept:list){
if(dept.getParent()!=null){
map=getUsersByRole(dept.getParent().getName());
}
}
}else if("SYS_LIST_MANAGER3".equals(datafld)){
List<Department> list=acsUtils.getDepartmentsByUser(ContextUtils.getCompanyId(), ContextUtils.getUserId());
for(Department dept:list){
if(dept.getParent()!=null){
map=getUsersByRole(getTopDepts(dept).getParent().getName());
}
}
}
return map;
}
/**
* 获得顶级部门
* @param dept
* @return
*/
private Department getTopDepts(Department dept){
Department department=null;
if(dept.getParent()!=null){
getTopDepts(dept.getParent());
}else{
department=dept;
}
return department;
}
//初始化宏控件(Input)
private String parseMacroInputControl(String datafld,FormView form){
String result = "";
// if("SYS_DATE".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// result = dateFormat.format(new Date());
// }else if("SYS_DATE_CN".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
// result = dateFormat.format(new Date());
// }else if("SYS_DATE_CN_SHORT3".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年");
// result = dateFormat.format(new Date());
// }else if("SYS_DATE_CN_SHORT4".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
// result = dateFormat.format(new Date());
// }else if("SYS_DATE_CN_SHORT1".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月");
// result = dateFormat.format(new Date());
// }else if("SYS_DATE_CN_SHORT2".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("MM月dd日");
// result = dateFormat.format(new Date());
// }else if("SYS_TIME".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
// result = dateFormat.format(new Date());
// }else if("SYS_DATETIME".equals(datafld)){
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// result = dateFormat.format(new Date());
// }else if("SYS_WEEK".equals(datafld)){
// Calendar calendar = Calendar.getInstance();
// result =FormUtil.getWeek(calendar);
// }else if("SYS_USERNAME".equals(datafld)){
// result = contextService.getUserName();
// }else if("SYS_DEPTNAME".equals(datafld)){
// List<Department> list=acsUtils.getDepartmentsByUser(contextService.getCompanyId(), contextService.getUserId());
// for(Department dept:list){
// result = result+dept.getDepartmentName()+",";
// }
// if(!"".equals(result)){
// result=result.substring(0, result.length()-1);
// }
// }else if("SYS_DEPTNAME_SHORT".equals(datafld)){
// List<Department> list=ApiFactory.getAcsService().getDepartmentsByUser(contextService.getCompanyId(), contextService.getUserId());
// for(Department dept:list){
// if(dept.getShortTitle()!=null){
// result = result+dept.getShortTitle()+",";
// }
// }
// if(!"".equals(result)){
// result=result.substring(0, result.length()-1);
// }
// }else if("SYS_USERROLE".equals(datafld)){
// Set<Role> roles=ApiFactory.getAcsService().getRolesByUser(contextService.getCompanyId(), contextService.getLoginName());
// Iterator ite=roles.iterator();//将hs转换为一个可遍历的对象Iterator
// while(ite.hasNext()){
// Role role=(Role)ite.next();
// result = result+role.getRoleName()+",";
// }
// if(!"".equals(result)){
// result=result.substring(0, result.length()-1);
// }
// }else if("SYS_USERNAME_DATE".equals(datafld)){
// result = contextService.getUserName();
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// result = result+" "+dateFormat.format(new Date());
// }else if("SYS_USERNAME_DATETIME".equals(datafld)){
// result = contextService.getUserName();
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// result = result+" "+dateFormat.format(new Date());
// }else if("SYS_FORMNAME".equals(datafld)){
// result = form.getFormName();
// }else if("SYS_MANAGER1".equals(datafld)){
// List<Department> list=acsUtils.getDepartmentsByUser(contextService.getCompanyId(), contextService.getUserId());
// for(Department dept:list){
// result = getResultsUsersByRole(dept.getDepartmentName());
// }
// if(!"".equals(result)){
// result=result.substring(0, result.length()-1);
// }
// }else if("SYS_MANAGER2".equals(datafld)){
// List<Department> list=acsUtils.getDepartmentsByUser(contextService.getCompanyId(), contextService.getUserId());
// for(Department dept:list){
// if(dept.getParentDepartment()!=null){
// result=getResultsUsersByRole(dept.getParentDepartment().getDepartmentName());
// }
// }
// if(!"".equals(result)){
// result=result.substring(0, result.length()-1);
// }
// }else if("SYS_MANAGER3".equals(datafld)){
// List<Department> list=acsUtils.getDepartmentsByUser(contextService.getCompanyId(), contextService.getUserId());
// for(Department dept:list){
// if(dept.getParentDepartment()!=null){
// result=getResultsUsersByRole(getTopDepts(dept).getParentDepartment().getDepartmentName());
// }
// }
// if(!"".equals(result)){
// result=result.substring(0, result.length()-1);
// }
// }
return result;
}
//列表控件的初始化
@SuppressWarnings("unchecked")
private String parseListControl(String childSource,List queryResult,boolean fieldRight){
StringBuilder html=new StringBuilder("");
List<Element> lists= source.getAllElements();
for(Element element:lists){
if( "LIST_CONTROL".equals(element.getAttributeValue("pluginType")) && childSource.equals(element.getAttributeValue("data_source"))){//如果是宏控件
String elementId=element.getAttributeValue("id");
String dataSrc=element.getAttributeValue("data_source");
String lvTitle=element.getAttributeValue("lv_title");
String lvSize=element.getAttributeValue("lv_size");
String lvSum=element.getAttributeValue("lv_sum");
String lvCal=element.getAttributeValue("lv_cal");
String lvField=element.getAttributeValue("lv_field");
String childForm="<input type=hidden name='dataSrc_"+elementId+"' id='dataSrc_"+elementId+"' value='"+dataSrc+"'>";
html.append(childForm);
html.append("<table class='Table changeTR' id='tb_").append(elementId).append("'><thead><tr>");
String[] lvTitles=lvTitle.split(",");
String[] lvSizes=lvSize.split(",");
for(int j=0;j<lvTitles.length;j++){
if(!"".equals(lvTitles[j])){
html.append("<th style='width:").append(lvSizes[j]).append("px;'>").append(lvTitles[j]).append("</th>");
}
}
html.append("<th style='width:100px;'>操作</th>");
html.append("</tr></thead><tbody>")
.append(listControlAddRow(queryResult,"tb_"+elementId,lvSum,lvField,lvCal,fieldRight))
.append("</tbody></table>");
if(fieldRight){
html.append("<input type=button value=\"新增\" onclick=\"listControlAddRow(\'tb_")
.append(elementId).append("\',\'").append(lvSum).append("\',\'").append(lvField)
.append("\',\'").append(lvCal).append("\',\'").append(fieldRight).append("\');\">");
}
}
}
return html.toString();
}
//列表控件的"新增"
@SuppressWarnings("unchecked")
private String listControlAddRow(List queryResult,String tbId,String lvSum,String lvField,String lvCal,boolean fieldRight){
String[] lvFields=lvField.split(",");
// String[] tr_num=$("#"+tb_id+" tbody tr").length>0?$("#"+tb_id+" tbody tr").length-1:0;
String[] lvCals=lvCal.split(",");
StringBuilder html=new StringBuilder("");
for(int i=0;i<queryResult.size();i++){
html.append("<tr id='listControl_tr_").append(tbId).append("_").append(i).append("'>");
for(int j=0;j<lvFields.length;j++){
if(!"".equals(lvFields[j])){
String elementId=tbId.substring(tbId.indexOf("_")+1,tbId.length());
html.append("<td>");
String dataType=lvFields[j].substring(lvFields[j].indexOf(":")+1,lvFields[j].length());
String field=lvFields[j].substring(0,lvFields[j].indexOf(":"));
// onfocus="WdatePicker({dateFmt:'yyyy-MM-dd',el:aa})" //日期控件
String currentId="listControl_"+tbId+"_"+i+"_"+(j+1);
String dateOnFocus="onfocus='WdatePicker({dateFmt:\"yyyy-MM-dd\",el:"+currentId+"})'";
if("DATE".equals(dataType) || "TIME".equals(dataType)){
if("DATE".equals(dataType)){
html.append("<input style='width:95%;' name='listControl_").append(elementId).append("_").append(lvFields[j]).append("' ");
if(fieldRight){
html.append(dateOnFocus);
}
html.append(" id='").append(currentId).append("' readonly");
}else{
html.append("<input style='width:95%;' name='listControl_").append(elementId).append("_").append(lvFields[j]).append("' ");
if(fieldRight){
html.append(dateOnFocus);
}
html.append(" id='").append(currentId).append("' readonly");;
}
}else{
html.append("<input style='width:95%;' name='listControl_").append(elementId).append("_").append(lvFields[j])
.append("' id='listControl_").append(tbId).append("_").append(i).append("_").append(j+1).append("'");
if(!"0".equals(lvCals[j]) || !fieldRight){
html.append(" readonly");
}
}
String value="";
value=((Map)queryResult.get(i)).get("wf_"+field).toString()==null?"":((Map)queryResult.get(i)).get("wf_"+field).toString();
html.append(" value='").append(value).append("'></input></td>") ;
}
}
html.append("<td>");
if(fieldRight){
html.append("<a href=\"#\" onclick=\"listControlDelRow(this,'").append(tbId).append("','").append(lvSum).append("')\">删除</a>");
}
html.append("</td>");
html.append("</tr>");
}
if(isNeedSum(lvSum)){
html.append(listControlAddSumRow(tbId,lvSum));
}
return html.toString();
}
//列表控件增加"合计"行
private String listControlAddSumRow(String tbId,String lvSum){
StringBuilder html=new StringBuilder("");
String[] lvSums=lvSum.split(",");
html.append("<tr id='listControlSum_").append(tbId).append("'>");
for(int i=0;i<lvSums.length;i++){
if("".equals(lvSums[i])){
html.append("<td><input style='width:95%;' readonly " );
String elementId=tbId.substring(tbId.indexOf("_")+1,tbId.length());
if("1".equals(lvSums[i])){
html.append("id='listControlSum_").append(tbId).append("_td_").append(i+1).append("' name='listControlSum_").append(elementId)
.append("_").append(i+1).append("' value='0'");
}
html.append("></input></td>");
}
}
html.append("<td></td></tr>");
return html.toString();
}
//是否需要合计
private boolean isNeedSum(String lvSum){
String[] lvSumS=lvSum.split(",");
for(int i=0;i<lvSumS.length;i++){
if(lvSumS[i]!=""){
if("1".equals(lvSumS[i])){
return true;
}
}
}
return false;
}
/**
* 获得所有列表控件的id
* @return
*/
@SuppressWarnings("unchecked")
public String getPullDownMenuScript(List<Element> lists){
String script="";
// List<Element> lists=source.getAllElements("select");
for (Iterator iterator = lists.iterator(); iterator.hasNext();) {
Element element = (Element) iterator.next();
if( ControlType.PULLDOWNMENU.toString().equals(element.getAttributeValue("pluginType"))){
String txtChild=element.getAttributeValue("child");
if(txtChild!=null){
script+=element.getAttributeValue("scriptContent");
}
}
}
return script;
}
//是否含有计算控件
@SuppressWarnings("unchecked")
public boolean isHasAnyTag(String type,List<Element> inputs){
int num=0;
boolean isHasCalc=false;
for (Iterator iterator = inputs.iterator(); iterator.hasNext();) {
Element input = (Element) iterator.next();
if(type.equals(input.getAttributeValue("pluginType"))){
num++;
if(num>=1){
isHasCalc=true;
break;
}
}
}
return isHasCalc;
}
//是否含有select控件
@SuppressWarnings("unchecked")
public boolean isHasAnySelectTag(String type,List<Element> inputs){
int num=0;
boolean isHasCalc=false;
for (Iterator iterator = inputs.iterator(); iterator.hasNext();) {
Element select = (Element) iterator.next();
if(type.equals(select.getAttributeValue("pluginType"))){
num++;
if(num>=1){
isHasCalc=true;
break;
}
}
}
return isHasCalc;
}
/*
* 数据选择控件/获取数据来源
* @return
*/
public String getDataSource(String controlId){
String dataSrc=null;
List<Element> lists= source.getAllElements();
for(Element element:lists){
if( ControlType.DATA_SELECTION.toString().equals(element.getAttributeValue("pluginType")) || ControlType.DATA_ACQUISITION.toString().equals(element.getAttributeValue("pluginType"))){//如果是宏控件
if(controlId!=null && controlId.equals(element.getAttributeValue("id"))){
dataSrc= element.getAttributeValue("data_table");
break;
}
}
}
return dataSrc;
}
/*
* 数据选择控件/获取字段集合
* @return
*/
public List<String[]> getDataProperties(String controlId,DataTable dataTable){
List<String[]> myProperties=new ArrayList<String[]>();
List<Element> lists= source.getAllElements();
for(Element element:lists){
if(ControlType.DATA_SELECTION.toString().equals(element.getAttributeValue("pluginType"))){//如果是数据选择控件
if(controlId!=null && controlId.equals(element.getAttributeValue("id"))){
String propertyNameStr=element.getAttributeValue("data_fld_name");
String propertyStr=element.getAttributeValue("data_field");
String queryProStr=element.getAttributeValue("data_query");
String[] queryPros=queryProStr.split(",");
String[] properties=propertyStr.split(",");
String[] propertyNames=propertyNameStr.split(",");
for(int i=0;i<properties.length;i++){
if(!"".equals(properties[i])){
// if(StringUtils.isNotEmpty(dataTable.getEntityName())){
// myProperties.add(new String[]{properties[i],propertyNames[i],queryPros[i]});
// }else{
// myProperties.add(new String[]{JdbcSupport.FORM_FIELD_PREFIX_STRING+properties[i],propertyNames[i],queryPros[i]});
// }
myProperties.add(new String[]{properties[i],propertyNames[i],queryPros[i]});
}
}
break;
}
}else if(ControlType.DATA_ACQUISITION.toString().equals(element.getAttributeValue("pluginType"))){
String propertyNameStr=element.getAttributeValue("data_fld_name");
String propertyStr=element.getAttributeValue("data_field");
String[] properties=propertyStr.split(",");
String[] propertyNames=propertyNameStr.split(",");
for(int i=0;i<properties.length;i++){
if(!"".equals(properties[i])){
if(StringUtils.isNotEmpty(dataTable.getEntityName())){
myProperties.add(new String[]{properties[i],propertyNames[i]});
}else{
myProperties.add(new String[]{JdbcSupport.FORM_FIELD_PREFIX_STRING+properties[i],propertyNames[i]});
}
}
}
}
}
return myProperties;
}
/*
* 数据选择控件/获取查询语句
* @return
*/
@SuppressWarnings("unchecked")
public String getDataSqlCondition(String controlId,DataTable dataTable){
StringBuilder result=new StringBuilder("");;
List<Element> lists= source.getAllElements("input");
for (Iterator iterator = lists.iterator(); iterator.hasNext();) {
Element element = (Element) iterator.next();
if( ControlType.DATA_SELECTION.toString().equals(element.getAttributeValue("pluginType"))){//如果是宏控件
if(controlId!=null && controlId.equals(element.getAttributeValue("id"))){
String queryProStr=element.getAttributeValue("data_query");
String propertyStr=element.getAttributeValue("data_field");
String[] queryPros=queryProStr.split(",");
String[] properties=propertyStr.split(",");
if(StringUtils.isNotEmpty(dataTable.getEntityName())){
result.append("select ");
for(int i=0;i<properties.length;i++){
if(!"".equals(properties[i])){
result.append("f.").append(properties[i]).append(",");
}
}
if(result.indexOf(",")>=0){
result=new StringBuilder(result.substring(0,result.length()-1));
}
result.append(" from ").append(dataTable.getName()).append(" f");
}else{
result.append("select ");
for(int i=0;i<properties.length;i++){
if(!"".equals(queryPros[i])){
result.append(JdbcSupport.FORM_FIELD_PREFIX_STRING).append(properties[i]).append(",");
}
}
if(result.indexOf(",")>=0){
result=new StringBuilder(result.substring(0,result.length()-1));
}
result.append(" from ").append(dataTable.getName());
}
break;
}
}
}
return result.toString();
}
/*
* 数据获取控件/获取查询语句
* @return
*/
public String getDataAcqSqlCondition(String controlId,DataTable dataTable,String referenceControlValue,List<TableColumn> tableColumns){
StringBuilder result=new StringBuilder("");
List<Element> lists= source.getAllElements("input");
for(Element element:lists){
if( ControlType.DATA_ACQUISITION.toString() .equals(element.getAttributeValue("pluginType"))){//如果是数据获取控件
if(controlId!=null && controlId.equals(element.getAttributeValue("id"))){
String propertyStr=element.getAttributeValue("data_field");
String[] properties=propertyStr.split(",");
if(StringUtils.isNotEmpty(dataTable.getEntityName())){//是标准表单时
result.append("select ");
for(int i=0;i<properties.length;i++){
if(!"".equals(properties[i])){
result.append("f.").append(properties[i]).append(",");
}
}
if(result.indexOf(",")>=0){
result=new StringBuilder(result.substring(0,result.length()-1));
}
result.append(" from ").append(dataTable.getEntityName()).append(" f");
String query=element.getAttributeValue("query_property");
if(!"".equals(query)){
for(TableColumn field :tableColumns){
if(field.getName().equals(query)){
result.append(" where ").append("f.").append(query).append("=?");
break;
}
}
}
}else{ //是自定义表单时
result.append("select ");
for(int i=0;i<properties.length;i++){
if(!"".equals(properties[i])){
if(properties[i].indexOf(JdbcSupport.FORM_FIELD_PREFIX_STRING)==0){
result.append(properties[i]).append(",");
}else{
result.append(JdbcSupport.FORM_FIELD_PREFIX_STRING+properties[i]).append(",");
}
}
}
if(result.indexOf(",")>=0){
result=new StringBuilder(result.substring(0,result.length()-1));
}
result.append(" from ").append(dataTable.getName());
String query=element.getAttributeValue("query_property");
if(!"".equals(query)){
for(TableColumn field :tableColumns){
if(field.getDbColumnName().equals(query)){
if(DataType.TEXT.equals(field.getDataType()) ||field.getDataType().equals(DataType. CLOB)){
result.append(" where ").append(query).append(" like '%").append(referenceControlValue).append("%'");
}else{
result.append(" where ").append(query).append("=").append(referenceControlValue);
}
break;
}
}
}
}
break;
}
}
}
return result.toString();
}
/**
* 获得标准字段值
* @param entity
* @return
*/
@SuppressWarnings("unchecked")
public Map<String,Collection> getStandardFieldValue(Object entity){
String type,dataType,key,valueKey;
Map<String,Collection> resultMap=new HashMap<String, Collection>();
List<Element> lists= source.getAllElements("input");
for(Element element:lists){
if( ControlType.STANDARD_LIST_CONTROL.toString() .equals(element.getAttributeValue("pluginType"))){
type = element.getAttributeValue(TYPE);
dataType = element.getAttributeValue(DATATYPE);
key = element.getAttributeValue(NAME);
valueKey=key;
type = type==null ? "" : type;
dataType = dataType==null ? "" : dataType;
resultMap=getEntityCollection(valueKey,entity);
}
}
return resultMap;
}
@SuppressWarnings("unchecked")
public Map<String,Collection> getEntityCollection(String valueKey,Object entity){
Map<String,Collection> resultMap=new HashMap<String, Collection>();
try {
String start=StringUtils.upperCase(valueKey.substring(0,1));
String other=valueKey.substring(1,valueKey.length());
Object value = entity.getClass().getMethod("get"+start+other).invoke(entity);
if(value!=null){
if(value instanceof Collection){
resultMap.put(valueKey, (Collection)value);
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return resultMap;
}
/**
* 获得标准表单html
* @param form
* @param formHtml
* @return
*/
@SuppressWarnings("unchecked")
public String getStandardFormHtml(FormView form,String formHtml,Object entity,Collection collection,boolean signatureVisible){
Map<String,Collection> resultMap=new HashMap<String, Collection>();
if(entity!=null&&(collection==null||collection.size()<=0)){
resultMap=getStandardFieldValue(entity);
}
this.setFormHtml(formHtml);
List<Element> inputs=source.getAllElements("input");
StringBuilder jsHtml=new StringBuilder("");
//如果有计算控件加入以下js代码
if(isHasAnyTag(ControlType.CALCULATE_COMPONENT.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>parse();</script>");
}
if(collection!=null&&collection.size()>0){
jsHtml.append("<script type='text/javascript'>0();").append("</script>");
jsHtml.append(parseStandardListControl(collection,entity));
}else if(resultMap==null || resultMap.size()<=0){
if(isHasAnyTag(ControlType.STANDARD_LIST_CONTROL.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>initStandardListControl();</script>");
jsHtml.append(parseStandardListControl(new ArrayList(),entity));
}
}else{
Set keySet=resultMap.keySet();
Iterator it=keySet.iterator();
while(it.hasNext()){
String childSource=(String)it.next();
Collection queryResult=resultMap.get(childSource);
if(queryResult.size()<=0){
if(isHasAnyTag(ControlType.STANDARD_LIST_CONTROL.toString(),inputs)){
jsHtml.append("<script type='text/javascript'>initStandardListControl();</script>");
jsHtml.append(parseStandardListControl(queryResult,entity));
}
}else{
jsHtml.append("<script type='text/javascript'>initStandardListControl();").append("</script>");
jsHtml.append(parseStandardListControl(queryResult,entity));
}
}
}
//如果有下拉菜单控件加入以下js代码
List<Element> selects=source.getAllElements("select");
if(isHasAnySelectTag(ControlType.PULLDOWNMENU.toString(),selects)){
String script=getPullDownMenuScript(selects);
script="<script type='text/javascript'>var ___ignore=true;"+script+"</script>";
jsHtml.append(script);
}
//如果有签章加入js代码
formHtml=preViewHtmlMacro(formHtml,form,jsHtml,signatureVisible);
jsHtml.append("<script type='text/javascript'>__signatureVisible="+signatureVisible+";initSignatureControl("+signatureVisible+");").append("</script>");
jsHtml.append("<script type='text/javascript'>initLabelControl();").append("</script>");
formHtml=formHtml+jsHtml;
return formHtml;
}
//标准列表控件的初始化
@SuppressWarnings("unchecked")
private String parseStandardListControl(Collection queryResult,Object entity){
StringBuilder html=new StringBuilder("");
List<Element> lists= source.getAllElements("input");
for(Element element:lists){
if( "STANDARD_LIST_CONTROL".equals(element.getAttributeValue("pluginType")) ){//如果是宏控件
// String listViewId=element.getAttributeValue("listViewId");
String listViewCode=element.getAttributeValue("listViewCode");
String elementId=element.getAttributeValue("id");
html.append("<table id='tb_")
.append(elementId).append("' newId='1'></table>");
html.append(getJqGridScript("tb_"+elementId,listViewCode,queryResult,entity));
}
}
return html.toString();
}
/**
* 获得子表列表的script脚本
* @return
*/
@SuppressWarnings("unchecked")
private String getJqGridScript(String tableId,String listViewCode,Collection queryResult,Object entity){
ListViewManager listViewManager = (ListViewManager)ContextUtils.getBean("listViewManager");
StringBuilder script=new StringBuilder("");
ListView listView=listViewManager.getListViewByCode(listViewCode);
List<ListColumn> columns=listView.getColumns();
String footerDatas=getFooterDatas(queryResult,columns,listView.getEditable());
String[] colResult=getColNames(columns,listView,entity,null,null);
String data=getJsonData(queryResult,columns);
script.append("<script type='text/javascript'>")
.append("$(document).ready(function(){");
String deleteUrl = listView.getDeleteUrl();
//判断是否是子系统,编辑时删除行时用到
String webCtx = SystemUrls.getSystemUrl(ContextUtils.getSystemCode());
boolean isSubSystem = false;
if(StringUtils.isNotEmpty(deleteUrl)){
// /acs/organization/user!delete.action,当是这种主子系统的情况,则第一个/后的字符串应为子系统编码
String systemCode = deleteUrl.split("/")[1];
BusinessSystemManager businessSystemManager = (BusinessSystemManager)ContextUtils.getBean("businessSystemManager");
BusinessSystem business = businessSystemManager.getSystemBySystemCode(systemCode);
if(business!=null){
if(StringUtils.isNotEmpty(business.getParentCode())){
isSubSystem= true;
webCtx = SystemUrls.getSystemUrl(business.getParentCode());
}
}
}
if(StringUtils.isNotEmpty(deleteUrl)){
script.append("deleteUrl='").append(listView.getDeleteUrl()).append("';");
}else{
script.append("deleteUrl=\"\";");
}
script.append("jQuery('#").append(tableId).append("').jqGrid({")
.append("datatype:'local',")
.append("mtype:'POST',")
.append("rowNum:200,")
.append("colNames:").append(colResult[0]).append(",")
.append("colModel:").append(colResult[1]).append(",");
if(listView.getMultiSelect()!=null&&listView.getMultiSelect()){
script.append("multiselect: true").append(",");
script.append("multiboxonly:").append(listView.getMultiboxSelectOnly()).append(",");
}else {
script.append("multiselect: false").append(",");
}
script.append(getOnSelectRowScript(tableId)).append(",");
script.append("editurl:'clientArray'").append(",");
script.append("data:").append(data).append(",");
script.append("pager: '#").append(tableId).append("pager'");
if(listView.getRowNumbers()){//序号
script.append(",rownumbers:true");
}
if(StringUtils.isNotEmpty(footerDatas)){//合计
script.append(",");
script.append("footerrow : true,")
.append("userDataOnFooter : true,")
.append("altRows : true");
}
if(listView.getEditable()!=null&&listView.getEditable()){//操作
script.append(",");
script.append(getGridCompleteScript(tableId,columns,isSubSystem,webCtx));
}
if(StringUtils.isNotEmpty(listView.getCustomProperty())){//自由扩展属性
script.append(",");
script.append(listView.getCustomProperty());
}
if(StringUtils.isNotEmpty(listView.getOrderFieldName())){//行拖到
script.append(",indexname:'").append(listView.getOrderFieldName()).append("'");
}else{
script.append(",indexname:'false'");
}
script.append(",onCellSelect:$onCellClick");
script.append(",ondblClickRow: function(id){$ondblClick(id);}");
script.append("});");
if(StringUtils.isNotEmpty(listView.getOrderFieldName())){//行拖到
script.append("var _rowId;")
.append("var sortableOptions = {")
.append("items : '.jqgrow:not(.unsortable)',")
.append("start : function(event, ui) {")
.append("_rowId = ui.item.attr('id');")
.append("var originalIndex = jQuery(\"#").append(tableId).append("\").jqGrid(\"getInd\", _rowId);")
.append("$sortableRowsStart(_rowId,originalIndex,'").append(tableId).append("');")
.append("},")
.append("stop : function(event, ui) {")
.append("var newIndex = jQuery(\"#").append(tableId).append("\"").append(").jqGrid(\"getInd\", _rowId);")
.append("$sortableRowsStop(_rowId,newIndex,'").append(tableId).append("');")
.append("}")
.append("};");
script.append("jQuery('#").append(tableId).append("').jqGrid('sortableRows',sortableOptions);");
}
script.append("var mydata=").append(data).append(";")
.append("for(var i=0;i<mydata.length;i++){")
.append("if(mydata[i].id=='new_0'){")
.append("jQuery('#").append(tableId).append("').jqGrid('editRow',mydata[i].id,true,function(){editFun(mydata[i].id);},function(){},'',{},function(){hasEdit=false;$editRowSave(mydata[i].id,'").append(tableId).append("');lastsel=0;},function(){},function(){hasEdit=false;$editRowRestore(mydata[i].id,'").append(tableId).append("');lastsel=0;if(mydata[i].id.indexOf('new_')>=0){jQuery('#").append(tableId).append("').jqGrid('delRowData',mydata[i].id); _add_row('").append(tableId).append("'); }}")
.append(");}")
.append("}");
if(StringUtils.isNotEmpty(footerDatas)){
script.append("jQuery('#").append(tableId).append("').jqGrid('footerData','set',").append(footerDatas).append(");");
}
script.append("});");
script.append(editClick(tableId));
script.append("function editFun(id){");
script.append("lastsel=id;hasEdit=true;");
for(ListColumn col: columns){
if(col.getTableColumn()!=null){
if(StringUtils.isNotEmpty(col.getControlValue())&& !col.getControlValue().equals("CUSTOM")){//如果编辑时控件是”自定义“的,则不要加事件
String tag=getHtmlTag(col);//jquery中不支持$("#ddd.sss"),id中含有点的,只有$(input[id=ddd.sss])才可,所以要得到jsp页面中的标签
if(col.getControlValue().equals("MULTISELECT")){
if(col.getTableColumn()!=null){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("']).multiselect({checkAllText:'全选',uncheckAllText:'清除',noneSelectedText:'请选择',selectedList:4});");
}
}
String columName=getColModelName(col.getTableColumn().getName());//当数据表对应的字段带点时将点去掉,点后的第一个字母大写,如dd.cc-->ddCC
if(col.getTableColumn().getDataType()==DataType.DATE){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".attr('readonly','readonly');");
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".datepicker({")
.append("'dateFormat':'yy-mm-dd',")
.append("changeMonth:true,")
.append("changeYear:true,")
.append("showButtonPanel:'true',")
.append("onSelect:function(dateText, inst){$dateOnSelect({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("',dateText:dateText});},")
.append("onChangeMonthYear:function(){$dateOnChangeMonthYear({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});},")
.append("onClose:function(){$dateOnClose({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});}")
.append("});");
}else if(col.getTableColumn().getDataType()==DataType.TIME){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".attr('readonly','readonly');");
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".datetimepicker({")
.append("'dateFormat':'yy-mm-dd',")
.append("changeMonth:true,")
.append("changeYear:true,")
.append(" showSecond: false,")
.append("showMillisec: false,")
.append("'timeFormat': 'hh:mm',")
.append("onSelect:function(dateText, inst){$dateOnSelect({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("',dateText:dateText});},")
.append("onChangeMonthYear:function(){$dateOnChangeMonthYear({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});},")
.append("onClose:function(){$dateOnClose({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});}")
.append("});");
}else if(StringUtils.isNotEmpty(col.getEventType())){
String[] events=col.getEventType().split(",");
for(String event:events){
if("ONCLICK".equals(event)){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".attr('readonly','readonly');");
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".click(function(){").append(columName).append("Click({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});});");
}else if("ONCHANGE".equals(event)){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".change(function(){").append(columName).append("Change({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});});");
}else if("ONDBLCLICK".equals(event)){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".dblclick(function(){").append(columName).append("Dblclick({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});});");
}else if("BLUR".equals(event)){
script.append("jQuery('").append(tag).append("[id='+").append("id").append("+'_").append(col.getTableColumn().getName()).append("')").append(".blur(function(){").append(columName).append("Blur({rowid:").append("id").append(",currentInputId:").append("id+'_").append(col.getTableColumn().getName()).append("'});});");
}
}
}
}
}
}
script.append("}");
script.append("</script>");
return script.toString();
}
private String editClick(String tableId){
StringBuilder script=new StringBuilder();
script.append("function editClick(id){")
.append("restoreOtherTable('").append(tableId).append("');")
.append("saveRowWhenAdd(lastsel,'").append(tableId).append("');")
.append("if(!hasEdit){")
.append("if(id && id!=lastsel){")
.append("jQuery(\"#").append(tableId).append("\")").append(".jqGrid('restoreRow',lastsel);")
.append("jQuery(\"#").append(tableId).append("\")").append(".jqGrid('editRow',id,true,editFun,function(){},'',{},function(){hasEdit=false;")
.append("$editRowSave(id,'").append(tableId).append("');")
.append("lastsel=0;")
.append("},function(){},")
.append("function(){")
.append("hasEdit=false;")
.append("$editRowRestore(id,'").append(tableId).append("');")
.append("lastsel=0;")
.append("if(id.indexOf(\"new_\")>=0){")
.append("jQuery(\"#").append(tableId).append("\")").append(".jqGrid('delRowData',id);")
.append("_add_row('").append(tableId).append("');")
.append("}")
.append("}")
.append(");")
.append("lastsel=id;")
.append("$editClickCallback(id,'").append(tableId).append("');")
.append("}")
.append("}")
.append("}");
return script.toString();
}
private String getHtmlTag(ListColumn col){
if(col.getControlValue().equals("CHECKBOX")){
return "checkbox";
}else if(col.getControlValue().equals("MULTISELECT")||col.getControlValue().equals("SELECT")){
return "select";
}else if(col.getControlValue().equals("TEXTAREA")){
return "textarea";
}else {
return "input";
}
}
private boolean getEditable(String editable,boolean viewEditable){
if(!"true".equals(editable)&&!"false".equals(editable)&&viewEditable)return true;
if("true".equals(editable))return true;
return false;
}
/**
* 获得colNames,colModel
* @param columns
* @param isCustomGrid 是否是【自定义列表标签】
* @return
* colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes']
* colModel:[
{name:'id',index:'id', width:60, sorttype:"int"},
{name:'invdate',index:'invdate', width:90, sorttype:"date"},
{name:'name',index:'name', width:100},
{name:'amount',index:'amount', width:80, align:"right",sorttype:"float"},
{name:'tax',index:'tax', width:80, align:"right",sorttype:"float"},
{name:'total',index:'total', width:80,align:"right",sorttype:"float"},
{name:'note',index:'note', width:150, sortable:false}
]
*/
public String[] getColNames(List<ListColumn> columns,ListView listView,Object entity,String dataTableName,String editable){
String[] result=new String[2];
StringBuilder cols=new StringBuilder();//列名对象
StringBuilder colModel=new StringBuilder();//列模式对象
cols.append("[");
colModel.append("[");
boolean viewEditable=getEditable(editable,listView.getEditable()==null?false:listView.getEditable());
if(viewEditable){//formGrid标签中editable属性("是否可以操作"的值)不为true和false时,以列表设的为准;否则以editable属性设的为准
cols.append("'")
.append(getLocal("grid.act"))
.append("',");
colModel.append("{name:'act',index:'act',width:");
if(listView.getActWidth()==null){
colModel.append("90");
}else{
colModel.append(listView.getActWidth());
}
colModel.append(",sortable:false,align:'center',frozen:true},");
}
cols.append("'")
.append("id")
.append("',");
if(viewEditable){
colModel.append("{name:'id',index:'id',sortable:false,editable:true,hidden:true,frozen:true},");
}else{
colModel.append("{name:'id',index:'id',sortable:false,editable:false,hidden:true,frozen:true},");
}
for(ListColumn col: columns){
TableColumn column=col.getTableColumn();
boolean colEditable=getEditable(editable,col.getEditable()==null?false:col.getEditable());
String colName=column.getName();
cols.append("'")
.append(getInternation(StringUtils.isNotEmpty(col.getHeaderName())?col.getHeaderName():""))
.append("',");
colModel.append("{")
.append("name:'")
.append(colName)
.append("',")
.append("index:'")
.append(colName)
.append("',");
if(colEditable){
colModel.append("editable:true,");
if(col.getDefaultValue()!=null){
if(col.getDefaultValue()==DefaultValue.CURRENT_DATE){
colModel.append("unformat:unFormatCurrentDate,");
}else if(col.getDefaultValue()==DefaultValue.CURRENT_TIME){
colModel.append("unformat:unFormatCurrentTime,");
}else if(col.getDefaultValue()==DefaultValue.CURRENT_USER_NAME){
colModel.append("unformat:unFormatUserName,");
}else if(col.getDefaultValue()==DefaultValue.CURRENT_LOGIN_NAME){
colModel.append("unformat:unFormatLoginName,");
}
}
}
if(StringUtils.isNotEmpty(col.getHeadStyle())){
colModel.append("width:");
colModel.append(col.getHeadStyle()).append(",");
}
StringBuilder editrules=new StringBuilder();
if(StringUtils.isNotEmpty(col.getEditRules())){
editrules.append(col.getEditRules());
}
if(editrules.toString().contains("required")){//当该字段必填时,再加相应的验证
if(column.getDataType()==DataType.NUMBER||column.getDataType()==DataType.AMOUNT
||column.getDataType()==DataType.DOUBLE||column.getDataType()==DataType.FLOAT){
if(StringUtils.isNotEmpty(editrules.toString())){
editrules.append(",");
}
editrules.append("number:true");
}else if(column.getDataType()==DataType.INTEGER||column.getDataType()==DataType.LONG){
if(StringUtils.isNotEmpty(editrules.toString())){
editrules.append(",");
}
editrules.append("integer:true");
}else if(column.getDataType()==DataType.DATE){
if(StringUtils.isNotEmpty(editrules.toString())){
editrules.append(",");
}
editrules.append("date:true");
}else if(column.getDataType()==DataType.TIME){
if(StringUtils.isNotEmpty(editrules.toString())){
editrules.append(",");
}
editrules.append("time:true");
}
}
if(StringUtils.isNotEmpty(editrules.toString())){
colModel.append("editrules:{").append(editrules).append("},");
}
String valueSet=getValueSet(col,entity,dataTableName);
if(StringUtils.isNotEmpty(valueSet)){
if(column.getDataType()==DataType.BOOLEAN&&(col.getControlValue()!=null&& !col.getControlValue().equals("SELECT"))){//该字段是布尔型,且编辑时控件类型不是下拉框时编辑时均已复选框形式编辑
colModel.append("edittype:'").append("checkbox").append("',");
String op=getCheckboxOption(valueSet);
if(StringUtils.isNotEmpty(op)){
colModel.append("editoptions: {value:'").append(op).append("'},");
}
}else{
colModel.append("edittype:'").append("select").append("',");
colModel.append("formatter:'select',");
if(StringUtils.isNotEmpty(valueSet)){
if("MULTISELECT".equals(col.getControlValue())){
colModel.append("editoptions: {value:{").append(valueSet).append("},multiple:true},");
}else{
colModel.append("editoptions: {value:{").append(valueSet).append("}},");
}
}
}
}else if(col.getControlValue()!=null&&col.getControlValue().equals("CUSTOM")){
String colModelName=getColModelName(colName);
colModel.append("edittype:'").append("custom").append("',");
colModel.append("editoptions:{custom_element: "+colModelName+"Element, custom_value:"+colModelName+"Value},");
}else if(col.getControlValue()!=null&&col.getControlValue().equals("TEXTAREA")){
colModel.append("edittype:'").append("textarea").append("',");
}else{
colModel.append(formatSetting(col));
}
String tempValueset=col.getValueSet();
if(StringUtils.isNotEmpty(tempValueset)){
if(column.getDataType()==DataType.REFERENCE){//beanname:"",classname:""(classname为实体类名,不是bean的名称)
if(StringUtils.isNotEmpty(column.getObjectPath())){
colModel.append("classname:'").append(column.getObjectPath()).append("',");
}else{
if(tempValueset.contains(CLASSNAME)){
String[] vals=tempValueset.split(",");
for(String val:vals){
if(val.contains(CLASSNAME)){
String classname=val.split(":")[1];
colModel.append("classname:'").append(classname).append("',");
}
}
}
}
}else{
String enumname=null;
if(column.getDataType()==DataType.ENUM){
enumname=column.getObjectPath();
}
if(StringUtils.isEmpty(enumname)){
if(tempValueset.contains(ENUMNAME)){
String[] vals=tempValueset.split(",");
for(String val:vals){
if(val.contains(ENUMNAME)){
enumname=val.split(":")[1];
}
}
}
}
colModel.append("classname:'").append(enumname).append("',");
}
}
if(StringUtils.isNotEmpty(valueSet)){
colModel.append("valueset:{").append(valueSet).append("},");
}
colModel.append("mydatatype:\"").append(column.getDataType()).append("\",");
if(column.getDataType()==DataType.BOOLEAN&&col.getControlValue()!=null&& !col.getControlValue().equals("SELECT")){//值设置为空,或该字段是布尔型,且编辑时控件类型不是下拉框时,格式化列表数据
colModel.append("formatter:formatFun,");
}
if(col.getVisible()!=null&&!col.getVisible()){
colModel.append("hidden:true,");
}
if(col.getSortable()!=null&&col.getSortable()){
colModel.append("sortable:true,");
colModel.append("sorttype:\"")
.append(getSortType(column.getDataType()))
.append("\"},");
}else{
colModel.append("sortable:false");
colModel.append("},");
}
}
cols=cols.replace(cols.length()-1,cols.length(), "");
colModel=colModel.replace(colModel.length()-1,colModel.length(), "");
cols.append("]");
colModel.append("]");
result[0]=cols.toString();
result[1]=colModel.toString();
return result;
}
/**
* 表单中的列表标签的“格式设置”处理
* @param col
* @return
*/
private String formatSetting(ListColumn col){
String format=col.getFormat();
StringBuilder colModel=new StringBuilder();
if(StringUtils.isNotEmpty(format)){
FormatSetting formatSetting= FormatSettingFactory.getFormatSetting(format);
String fs=formatSetting.format(format);
if(StringUtils.isNotEmpty(fs))colModel.append(fs).append(",");
}
return colModel.toString();
}
public String getColModelName(String columnName){
if(columnName.contains(".")){//如果数据表字段是"ddd.fff",则columnName改为“dddFff”,将"."后的第一个字母大写
StringBuilder fnNameStart=new StringBuilder();
String[] vals=columnName.split("\\.");
int i=0;
for(String val:vals){
if(i==0){
fnNameStart.append(val);
}
i++;
if(i!=1){
String start=StringUtils.upperCase(val.substring(0, 1));
String other=val.substring(1,val.length());
fnNameStart.append(start).append(other);
}
}
columnName=fnNameStart.toString();
}
return columnName;
}
/**
* 获得值设置
* @param col
* @return
*/
public String getValueSet(ListColumn col,Object entity,String dataTableName ){
DataTableManager dataTableManager = (DataTableManager)ContextUtils.getBean("dataTableManager");
TableColumnManager tableColumnManager = (TableColumnManager)ContextUtils.getBean("tableColumnManager");
String valueSet=col.getValueSet();
TableColumn column = col.getTableColumn();
StringBuilder opitions=new StringBuilder();
if(column!=null &&column.getDataType()!=DataType.BOOLEAN && col.getControlValue()!=null && !col.getControlValue().equals("MULTISELECT")){
opitions.append("'':'")
.append("请选择")
.append("'").append(",");
}
if(StringUtils.isNotEmpty(valueSet)){
if(valueSet.contains(ENUMNAME)){
String[] vals=valueSet.split(",");
for(String val:vals){
if(val.contains(ENUMNAME)){
String enumname=val.split(":")[1];
String enumOptions = getOptionsByEnum(enumname);
if(StringUtils.isNotEmpty(enumOptions)){
opitions.append(enumOptions);
return opitions.toString();
}
}
}
}else if(column.getDataType()==DataType.REFERENCE){
if(StringUtils.isNotEmpty(dataTableName)){//customGrid标签用到
StringBuilder result=new StringBuilder();
result.append("'':'")
.append("请选择")
.append("'").append(",");
DataTable table=dataTableManager.getDataTableByTableName(dataTableName);
List<TableColumn> columns=tableColumnManager.getTableColumnByDataTableId(table.getId());
for(TableColumn mycolumn:columns){
result.append("'").append(mycolumn.getId()).append("':")
.append("'").append(getInternation(mycolumn.getAlias())).append("'").append(",");
}
if(result.charAt(result.length()-1)==','){
result.delete(result.length()-1, result.length());
}
if(StringUtils.isNotEmpty(result.toString())){
return result.toString();
}
}else{
return getOptionsByBeanName(valueSet,column.getName(),entity);
}
}else{
if(valueSet.contains(BEANNAME)){
return getOptionsByBeanName(valueSet,column.getName(),entity);
}else{
if(valueSet.contains(":")){
String[] vals=valueSet.split(",");
int i=0;
for(String val:vals){
i++;
String[] strArr=val.split(":");
if(strArr.length>1){
if( strArr[0].contains("'")||strArr[0].contains("\"")){
opitions.append(strArr[0]).append(":");
}else{
opitions.append("'").append(strArr[0]).append("':");
}
if(strArr[1].contains("'")||strArr[1].contains("\"")){
opitions.append(strArr[1]);
}else{
opitions.append("'").append(strArr[1]).append("'");
}
if(i<vals.length){
opitions.append(",");
}
}
}
if(opitions.charAt(opitions.length()-1)==','){
opitions.delete(opitions.length()-1, opitions.length());
}
return opitions.toString();
}else{
com.norteksoft.product.api.entity.OptionGroup group=ApiFactory.getSettingService().getOptionGroupByCode(valueSet);
if(group!=null){
int i=0;
List<com.norteksoft.product.api.entity.Option> ops=ApiFactory.getSettingService().getOptionsByGroup(group.getId());
for(com.norteksoft.product.api.entity.Option op:ops){
i++;
opitions.append("'").append(op.getValue())
.append("':'")
.append(op.getName())
.append("'");
if(i<ops.size()){
opitions.append(",");
}
}
}
if(opitions.charAt(opitions.length()-1)==','){
opitions.delete(opitions.length()-1, opitions.length());
}
return opitions.toString();
}
}
}
}
if(column!=null&&column.getDataType()==DataType.ENUM){//枚举类型时,获得枚举值选项
if(StringUtils.isNotEmpty(column.getObjectPath())){
String enumOptions = getOptionsByEnum(column.getObjectPath());
if(StringUtils.isNotEmpty(enumOptions)){
opitions.append(enumOptions);
return opitions.toString();
}
}
}
return null;
}
private String getOptionsByEnum(String enumname){
StringBuilder opitions=new StringBuilder();
try {
Object[] objs = Class.forName(enumname).getEnumConstants();
int i=0;
for(Object obj : objs){
i++;
opitions.append("'").append(obj.toString())
.append("':'")
.append(textProvider.getText(BeanUtils.getProperty(obj, "code")))
.append("'");
if(i<objs.length){
opitions.append(",");
}
}
if(opitions.charAt(opitions.length()-1)==','){
opitions.delete(opitions.length()-1, opitions.length());
}
return opitions.toString();
} catch (Exception e) {
}
return opitions.toString();
}
public String getOptionsByBeanName(String valueSet,String colName,Object entity){
if(valueSet.contains(BEANNAME)){
String[] vals=valueSet.split(",");
for(String val:vals){
if(val.contains(BEANNAME)){
String beanname= val.split(":")[1];
Map<String,String> map=null;
ComboxValues bean=(ComboxValues)ContextUtils.getBean(beanname);
map=bean.getValues(entity);
String value=map.get(colName);
if(StringUtils.isNotEmpty(value)){
return value;
}
}
}
}
return "";
}
/**
* 获得checkbox的editOptions值
* 是:否
* @param valueSet
* @return
*/
public String getCheckboxOption(String valueSet){
String[] arr=valueSet.split(",");
StringBuilder sb=new StringBuilder();
int i=0;
for(String str:arr){
i++;
String[] vals=str.split(":");
if(vals.length>1){
String val=vals[1];
if(val.indexOf("'")>=0){
val=val.substring(val.indexOf("'")+1, val.lastIndexOf("'"));
}
sb.append(val);
}
if(i<arr.length)sb.append(":");
}
return sb.toString();
}
/**
* 获得集合数据的json格式
* @param queryResult
* @param columns
* @param isCollection 结果集是否是集合
* @return
* [
{id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"2",invdate:"2007-10-02",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"3",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
{id:"4",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"5",invdate:"2007-10-05",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"6",invdate:"2007-09-06",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"},
{id:"7",invdate:"2007-10-04",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"},
{id:"8",invdate:"2007-10-03",name:"test2",note:"note2",amount:"300.00",tax:"20.00",total:"320.00"},
{id:"9",invdate:"2007-09-01",name:"test3",note:"note3",amount:"400.00",tax:"30.00",total:"430.00"}
]
*/
@SuppressWarnings("unchecked")
public String getJsonData(Collection queryResult,List<ListColumn> columns){
StringBuilder jsonData=new StringBuilder();
jsonData.append("[");
if(queryResult==null||queryResult.size()<=0){
jsonData.append("{\"id\":\"new_0\"}");
}else{
for(Object obj:queryResult){
String str=obj.getClass().getName();
if(str.indexOf("[")==0){
jsonData.append(getScriptArray(obj,columns));
}else{
jsonData.append(getScriptObject(obj,columns));
}
jsonData.append(",");
}
}
if(jsonData.indexOf(",")>=0)jsonData=jsonData.replace(jsonData.length()-1,jsonData.length(), "");
jsonData.append("]");
return PageUtils.disposeSpecialCharacter(jsonData.toString());
}
/**
* 获得某条数据的json格式对象(集合为实体的集合时)
* @param entity
* @param columns
* @return
* {id:"1",invdate:"2007-10-01",name:"test",note:"note",amount:"200.00",tax:"10.00",total:"210.00"}
*/
public String getScriptObject(Object entity,List<ListColumn> columns){
StringBuilder sb=new StringBuilder();
try {
sb.append("{");
if(entity!=null){
Object id=BeanUtils.getProperty(entity, "id");
sb.append("\"")
.append("id")
.append("\"")
.append(":")
.append("\"")
.append(id)
.append("\"")
.append(",");
}
for(ListColumn col: columns){
TableColumn tc=col.getTableColumn();
if(tc!=null&&tc.getDataType()!=DataType.COLLECTION){
String colName=tc.getName();
Object val=null;
if(entity!=null){
if(tc.getDataType()==DataType.BOOLEAN){
val=BeanUtils.getProperty(entity, colName);
}else{
if(!colName.contains("$")){
if(colName.contains(".")){//toPage.code.n...,实体引用中的某个字段或嵌入式的某个字段
String[] refnames=colName.split("\\.");
int n=0;
Object obj=null;
for(String ref:refnames){
if(n==0){
obj=entity.getClass().getMethod(PageUtils.getMethodName(ref)).invoke(entity);
}else{
if(obj!=null){
obj=obj.getClass().getMethod(PageUtils.getMethodName(ref)).invoke(obj);
}
}
if(obj==null){
val=null;
break;
}else{
if(n==refnames.length-1){
val=obj;
}
}
n++;
}
}else{
val= entity.getClass().getMethod(PageUtils.getMethodName(colName)).invoke(entity);
}
}
}
}
if(val!=null){
if(tc.getDataType()==DataType.DATE){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = (Date)val;
val=simpleDateFormat.format(date);
}else if(tc.getDataType()==DataType.TIME){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = (Date)val;
val=simpleDateFormat.format(date);
}else if(tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE||tc.getDataType()==DataType.FLOAT){
NumberFormat nf=new DecimalFormat("#.##");
val=nf.format(val);
}else if(tc.getDataType()==DataType.REFERENCE){
val=BeanUtils.getProperty(entity, colName+".id");
}
}else{
if(tc.getDataType()==DataType.REFERENCE){
if("tableColumn".equals(colName)){
val="_temporary";
}
}else{
val=" ";
}
}
sb.append("\"");
sb.append(colName);
sb.append("\"")
.append(":")
.append("\"");
if(val!=null){
sb.append(val.toString().replaceAll("\"", "_@_#"));//把英文的双引号替换成_@_# 做次替换是为了在页面上显示双引号,该替换会在PageUtils中把符号_@_#再替换为英文的双引号
}else{
sb.append(val);
}
sb.append("\"")
.append(",");
}
}
sb=sb.replace(sb.length()-1,sb.length(), "");
sb.append("}");
} catch (Exception e) {
throw new RuntimeException(e);
}
return sb.toString();
}
/**
* 获得排序类型
* @param dataType
* @return
*/
private String getSortType(DataType dataType){
if(dataType==DataType.DATE){
return "date";
}else if(dataType==DataType.TIME){
return "datetime";
}else if(dataType==DataType.AMOUNT||dataType==DataType.DOUBLE||dataType==DataType.FLOAT){
return "float";
}else if(dataType==DataType.INTEGER||dataType==DataType.NUMBER){
return "integer";
}else{
return "string";
}
}
/**
* 获得gridComplete数据
* @param tableId
* @param columns
* @return
*/
private String getGridCompleteScript(String tableId,List<ListColumn> columns,boolean isSubSystem,String webCtx){
StringBuilder sb=new StringBuilder();
sb.append("gridComplete: function(){")
.append("newId='0';lastsel='0';hasEdit=false;")
.append("var ids = jQuery('#").append(tableId).append("').jqGrid('getDataIDs');")
.append("for(var i=0;i < ids.length;i++){")
.append("var cl = ids[i];")
.append("ae = \"<a href='#' class='small-button-bg' onclick=\\\"myAddRow('1','\"+cl+\"','").append(tableId).append("');\\\"").append("><span class='ui-icon ui-icon-plusthick'></span></a>\"; ")
.append("if(deleteUrl!=''){")
.append("de = \"<a href='#' class='small-button-bg' onclick=\\\"deleteFormTableData('").append(tableId).append("','\"+cl+\"','\"+deleteUrl+\"','").append(isSubSystem).append("','").append(webCtx).append("');\\\"").append("><span class='ui-icon ui-icon-minusthick'></span></a>\"; ")
.append("}else{")
.append("de = \"<a href='#' class='small-button-bg' onclick=\\\"$deleteFormTableData('").append(tableId).append("','\"+cl+\"'").append(");\\\"").append("><span class='ui-icon ui-icon-minusthick'></span></a>\"; ")
.append("}")
.append("edit = \"<a href='#' class='small-button-bg' onclick=\\\"editClick('\"+cl+\"');\\\"").append("><span class='ui-icon ui-icon-pencil'></span></a>\"; ");
sb.append("jQuery('#").append(tableId).append("').jqGrid('setRowData',ids[i],{act:ae+' '+de+' '+edit+_getCustomeButtons('").append(tableId).append("',cl)});");
sb.append("}");
sb.append("$gridComplete();");
sb.append("}");
return sb.toString();
}
/**
* 获得onSelectRow数据
* @param tableId
* @return
*/
private String getOnSelectRowScript(String tableId){
StringBuilder sb=new StringBuilder();
sb.append("onSelectRow: function(id,status){")
.append("if(hasEdit){if(id && id!=lastsel){restoreOtherTable('").append(tableId).append("');saveRowWhenAdd(lastsel,'").append(tableId).append("');lastsel=0;}}")
.append("}");
return sb.toString();
}
/**
* 获得“合计”对象
* {'useType':'0','total':'100','act':'合计'}
* @return
*/
@SuppressWarnings("unchecked")
public String getFooterDatas(Collection queryResult,List<ListColumn> columns,Boolean isOperate){
StringBuilder jsonData=new StringBuilder();
try {
int i=0;
String totalStr=null;
int columnIndex=0;
for(ListColumn col: columns){
if(col.getTotal()){//如果该列需要合计
if(StringUtils.isEmpty(jsonData.toString()))jsonData.append("{");
if(i==0){
totalStr="fail";
}
if(i>0&&StringUtils.isEmpty(totalStr)){
totalStr="\""+columns.get(i-1).getTableColumn().getName()+"\":\""+getLocal("grid.total")+"\"";
}
TableColumn tc=col.getTableColumn();
String colName=tc.getName();
jsonData.append("\"");
jsonData.append(colName);
jsonData.append("\":");
Long totalInt=0l;//整数时的“和”
Double totalFloat=0d;//小数时的"和"
if(tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE||tc.getDataType()==DataType.FLOAT||tc.getDataType()==DataType.INTEGER||tc.getDataType()==DataType.NUMBER||tc.getDataType()==DataType.LONG){
if(queryResult!=null){
for(Object entity:queryResult){
Object val=null;
if(entity!=null){
String str=entity.getClass().getName();
if(str.indexOf("[")==0){
val=((Object[])entity)[columnIndex];
}else{
val=BeanUtils.getProperty(entity, colName);
}
}
if(val!=null){
if(tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE){
totalFloat=totalFloat+Double.parseDouble(val.toString());
}else if(tc.getDataType()==DataType.FLOAT){
totalFloat=totalFloat+Float.parseFloat(val.toString());
}else if(tc.getDataType()==DataType.INTEGER||tc.getDataType()==DataType.NUMBER||tc.getDataType()==DataType.LONG){
totalInt=totalInt+Integer.parseInt(val.toString());
}
}
}
}
}
if(tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE||tc.getDataType()==DataType.FLOAT){
jsonData.append("\"").append(totalFloat).append("\"");
}else{
jsonData.append("\"").append(totalInt).append("\"");
}
jsonData.append(",");
}
i++;
columnIndex++;
}
if(StringUtils.isNotEmpty(jsonData.toString())){
if(isOperate!=null&&isOperate&&"fail".equals(totalStr)){//有操作时,合计显示在操作列
totalStr="\"act\":\""+getLocal("grid.total")+"\"";
}
if(!"fail".equals(totalStr)){
jsonData.append(totalStr);
}else{
jsonData=jsonData.replace(jsonData.length()-1,jsonData.length(), "");
}
jsonData.append("}");
}
}catch (Exception e) {
}
return jsonData.toString();
}
/**
* 获得某条数据的json格式数据(集合为数组的集合时)
* @param obj
* @param columns
* @return
*/
public String getScriptArray(Object obj,List<ListColumn> columns){
StringBuilder sb=new StringBuilder();
try {
sb.append("{");
int i=0;
for(ListColumn col: columns){
TableColumn tc=col.getTableColumn();
if(tc!=null&&tc.getDataType()!=DataType.COLLECTION){
String colName=tc.getName();
Object val=((Object[])obj)[i];
if(val!=null&&val!=""){
if(tc.getDataType()==DataType.DATE){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDateFormat.parse(val.toString());
val=simpleDateFormat.format(date);
}else if(tc.getDataType()==DataType.TIME){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = simpleDateFormat.parse(val.toString());
val=simpleDateFormat.format(date);
}else if(tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE||tc.getDataType()==DataType.FLOAT){
NumberFormat nf=new DecimalFormat("#.##");
val=nf.format(val);
}
}else{
val=" ";
}
sb.append("\"")
.append(colName)
.append("\"")
.append(":")
.append("\"");
sb.append(val.toString().replaceAll("\"", "_@_#"));//把英文的双引号替换成_@_# 做次替换是为了在页面上显示双引号,该替换会在PageUtils中把符号_@_#再替换为英文的双引号
sb.append("\"")
.append(",");
i++;
}
}
sb=sb.replace(sb.length()-1,sb.length(), "");
sb.append("}");
} catch (Exception e) {
throw new RuntimeException(e);
}
return sb.toString();
}
public String getLocal(String code){
return textProvider.getText(code);
}
public String getInternation(String code){
return ApiFactory.getSettingService().getInternationOptionValue(code);
}
/**
* 判断是否是默认字段
* @param columnName
* @return true:表示是默认字段,false:表示不是默认字段
*/
public static boolean isDefaultField(String columnName){
return "id".equalsIgnoreCase(columnName)
||"create_date".equalsIgnoreCase(columnName)||
"creator_department".equalsIgnoreCase(columnName)||
"workflow_definition_version".equalsIgnoreCase(columnName)||
"workflow_definition_code".equalsIgnoreCase(columnName)||
"workflow_definition_id".equalsIgnoreCase(columnName)||
"workflow_definition_name".equalsIgnoreCase(columnName)||
"current_activity_name".equalsIgnoreCase(columnName)||
"process_state".equalsIgnoreCase(columnName)||
"creator_name".equalsIgnoreCase(columnName)||
"creator".equalsIgnoreCase(columnName)||
"company_id".equalsIgnoreCase(columnName)||
"instance_id".equalsIgnoreCase(columnName)||
"first_task_id".equalsIgnoreCase(columnName)||
"form_id".equalsIgnoreCase(columnName);
}
/**
* 打印html
* @return
*/
public String getPrintFormHtml(FormView form,String html,Long dataId,boolean fieldRight){
setFormHtml(html);
StringBuilder formHtml = new StringBuilder();
formHtml.append(html);
FormFields formFields=source.getFormFields();
Iterator<FormField> it = formFields.iterator();
FormField formField = null;
while(it.hasNext()){
formField = it.next();
Element element = formField.getFormControl().getElement();
StringBuilder divHtml = new StringBuilder();
System.out.println(element.toString());
if("TEXT".equals(element.getAttributeValue("pluginType"))&& !"hidden".equals(element.getAttributeValue("type")) ){
if("true".equals(element.getAttributeValue("signaturevisible"))){//签章处理
outputDocument = setSignatureImage(outputDocument,formField);
}else{
if("radio".equals(element.getAttributeValue("type"))||"checkbox".equals(element.getAttributeValue("type"))){//单选框和复选框
Collection<net.htmlparser.jericho.FormControl> list = formField.getFormControls();
String url = "";
for(net.htmlparser.jericho.FormControl control:list){
StringBuilder a = new StringBuilder();
Element e = control.getElement();
if("checked".equals(e.getAttributeValue("checked"))){
if("radio".equals(element.getAttributeValue("type"))){
url = PropUtils.getProp("host.resources")+"/images/single-selected.png";
}else{
url = PropUtils.getProp("host.resources")+"/images/double-selected.png";
}
a.append("<span>").append("<img src='"+url+"' ></img>").append("</span>");
outputDocument.replace(e.getEnd(), e.getEnd(), a.toString() );
}else{
if("radio".equals(element.getAttributeValue("type"))){
url = PropUtils.getProp("host.resources")+"/images/single-unselected.png";
}else{
url = PropUtils.getProp("host.resources")+"/images/double-unselected.png";
}
a.append("<span>").append("<img src='"+url+"' ></img>").append("</span>");
outputDocument.replace(e.getEnd(), e.getEnd(), a.toString() );
}
}
}else{
if(formField.getValues().size()>0){
divHtml.append("<span>").append(formField.getValues().get(0).toString()).append("</span>");
outputDocument.replace(element.getEnd(), element.getEnd(), divHtml.toString() );
}
}
}
}else if("TIME".equals(element.getAttributeValue("pluginType"))){//日期类型
if(formField.getValues().size()>0){
divHtml.append("<span>").append(formField.getValues().get(0).toString()).append("</span>");
}
outputDocument.replace(element.getEnd(), element.getEnd(), divHtml.toString() );
}else if("PULLDOWNMENU".equals(element.getAttributeValue("pluginType"))){//下拉选
String value = "";
if(formField.getValues().size()>0){
List<Element> subElements = element.getAllElements();
//解析子元素,取得被选项的值
for (Element e : subElements) {
if("selected".equals((e.getAttributeValue("selected")))&&StringUtils.isNotEmpty(e.getAttributeValue("value"))){
value = e.getContent().toString();
}
}
if(value!=null){
divHtml.append("<span>").append(value.toString()).append("</span>");
}
}
outputDocument.replace(element.getEnd(), element.getEnd(), divHtml.toString() );
}else if("textarea".equals(element.getAttributeValue("pluginType"))){//文本域
if(formField.getValues().size()>0){
divHtml.append("<div class=\"textArea-print\">").append(formField.getValues().get(0).toString()).append("</div>");
}
outputDocument.replace(element.getEnd(), element.getEnd(), divHtml.toString() );
}else if("CALCULATE_COMPONENT".equals(element.getAttributeValue("pluginType"))){//计算控件
if(formField.getValues().size()>0){
divHtml.append("<span>").append(formField.getValues().get(0).toString()).append("</span>");
outputDocument.replace(element.getEnd(), element.getEnd(), divHtml.toString() );
}
}
}
//(自定义的标签会有乱码)
outputDocument.replace(formFields);
StringBuilder jsHtml=new StringBuilder("");
jsHtml.append("<script type='text/javascript'>initPrintLabelControl();").append("</script>");
return outputDocument.toString()+jsHtml;
}
//表单显示签章设置
private OutputDocument setSignatureImage(OutputDocument outputDocument,
FormField formField) {
String signatureFields="";
Element element = formField.getFormControl().getElement();
StringBuilder imgs = new StringBuilder();
//获得当前文本框的值,并根据该值获得签章路径,该值一般为用户真名
List<Long> signIds=new ArrayList<Long>();
List<String> values = formField.getValues();
String url = SystemUrls.getSystemUrl("mms");
if(values.size()>0){
if(StringUtils.isNotEmpty(values.get(0))){
String names = values.get(0);
String[] nameArr = names.split(",");//多个人名之间以逗号隔开
for(String name:nameArr){
Long signId = ApiFactory.getSettingService().getSignIdByUserName(name);
if(signId!=null){
signIds.add(signId);
imgs.append("<img src='"+url+"/form/form-view-showPic.htm?signId="+signId+"' style='width:2cm;height:1cm;'></img>").append(",");
}else{
imgs.append(name).append(",");
}
}
}else{
imgs.append("<img src='"+PropUtils.getProp("host.resources")+"/images/noSign.gif;' style='width:2cm;height:1cm;'></img> ");
}
}
if(signIds.size()>0){//如果签章路径存在
if(StringUtils.isEmpty(signatureFields)){
signatureFields=element.getAttributeValue("name");
}else{
signatureFields=signatureFields+","+element.getAttributeValue("name");
}
}
if(StringUtils.isNotEmpty(imgs.toString())){
imgs.replace(imgs.length()-1, imgs.length(), "");
outputDocument.replace(element.getEnd(), element.getEnd(), imgs.toString() );
}
return outputDocument;
}
}