package com.norteksoft.tags.search;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.xwork.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.norteksoft.bs.options.entity.Option;
import com.norteksoft.mms.form.entity.ListColumn;
import com.norteksoft.mms.form.entity.ListView;
import com.norteksoft.mms.form.service.FormHtmlParser;
import com.norteksoft.mms.form.service.ListColumnManager;
import com.norteksoft.mms.form.service.ListViewManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsonParser;
import com.norteksoft.product.util.freemarker.TagUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.TextProvider;
import com.opensymphony.xwork2.TextProviderFactory;
@Service
@Transactional
public class SearchData {
// private String tableId;
// private String listTableCode;
// private String submitForm;
// private String url;
@SuppressWarnings("unused")
private Integer fixedSearchSign;//如果有固定查询先显示固定查询的标记
private ListColumnManager listColumnManager;
private ListViewManager listViewManager;
private FormHtmlParser formHtmlParser;
@Transactional(readOnly=true)
public String getContent(String listTableCode,String url,String tableId,String submitForm) throws Exception{
List<ObjectField> fieldList = new ArrayList<ObjectField>();
String fieldString = getFieldListByCode(listTableCode);
//判断是否高级查询从mms中取值
String advancedSearch = getSearchPropertyByCode(listTableCode,"isAdvancedQuery");
//判断是否弹框从mms中取值
String containerId = getSearchPropertyByCode(listTableCode,"isContainerIdQuery");
dealWithFieldString(fieldString, fieldList);
List<ObjectField> fixedFields = new ArrayList<ObjectField>();
for (ObjectField field : fieldList) {
if(field.getFixedField()){
fixedFields.add(field);
}
}
String jsonStr = JsonParser.object2Json(fieldList);
Map<String, Object> root=new HashMap<String, Object>();
if(submitForm==null){
submitForm="";
}
root.put("tableId", tableId);
root.put("submitForm", submitForm);
root.put("url", url);
root.put("containerId", containerId);
root.put("advancedSearch", advancedSearch);
root.put("fieldList", jsonStr);
root.put("fixedField", fixedFields);
root.put("fixedSearchSign", fixedFields.size());
root.put("textProvider", textProvider);
String result = TagUtil.getContent(root, "search/search.ftl");
return result;
}
//[{enName:groupName,chName:工作流名称,propertyType:STRING,fixedField:false},{enName:title,chName:任务名称,propertyType:STRING,fixedField:true},{enName:name,chName:环节名称,propertyType:STRING,fixedField:false},{enName:createDate,chName:生成日期,propertyType:DATE,fixedField:true},{enName:creatorName,chName:流程发起人,propertyType:STRING,fixedField:true}]
private void dealWithFieldString(String fieldString, List<ObjectField> fieldList) {
int endIndex = 0;
while((endIndex = fieldString.indexOf("}"))>=0){
int beginIndex = fieldString.indexOf("{");
String partStr = fieldString.substring(beginIndex+1, endIndex);
//partStr = enName:groupName,chName:工作流名称,propertyType:STRING,fixedField:false,optionsCode:***
ObjectField field = new ObjectField();
String[] elements = partStr.split(",");
for (String element : elements) {
//element = enName:groupName
String[] part = element.split(":");
if("enName".equals(part[0].trim())){
field.setEnName(part[1].trim());
}else if("chName".equals(part[0].trim())){
field.setChName(part[1].trim());
}else if("propertyType".equals(part[0].trim())){
field.setPropertyType(PropertyType.valueOf(part[1].trim()));
}else if("fixedField".equals(part[0].trim())){
field.setFixedField(Boolean.valueOf(part[1].trim()));
}else if("optionsCode".equals(part[0].trim())){
field.setOptionsCode(part[1].trim());
}else if("enumName".equals(part[0].trim())){
field.setEnumName(part[2].trim());
}else if("keyValue".equals(part[0].trim())){
if(part.length>1)field.setKeyValue(part[1].trim().replace("$", ":").replace("#", ","));
}else if("beanName".equals(part[0].trim())){
field.setBeanName(part[1].trim().replace("$", ":").replace("#", ","));
}else if("optionGroup".equals(part[0].trim())){
field.setOptionGroup(part[1].trim());
}else if("eventType".equals(part[0].trim())){
field.setEventType(part[1].trim());
}else if("dbName".equals(part[0].trim())){
field.setDbName(part[1].trim());
}
}
if(field.getPropertyType() == PropertyType.BOOLEAN){
// List<Option> options = new ArrayList<Option>();
// Option option = new Option();
// option.setName(textProvider.getText("common.yes"));
// option.setValue("true");
// options.add(option);
// option = new Option();
// option.setName(textProvider.getText("common.no"));
// option.setValue("false");
// options.add(option);
// field.setDefaultValues(options);
String keyValue = field.getKeyValue();
if(keyValue != null && !"".equals(keyValue.trim())){
String[] property = keyValue.split(",");
field.setDefaultValues(createOption(property));
}
}else if(field.getPropertyType() == PropertyType.ENUM){
try {
Object[] objs = Class.forName(field.getEnumName()).getEnumConstants();
List<Option> options = new ArrayList<Option>();
Option option = null;
for(Object obj : objs){
option = new Option();
options.add(option);
option.setName(textProvider.getText(BeanUtils.getProperty(obj, "code")));
option.setValue(obj.toString());
}
field.setDefaultValues(options);
} catch (Exception e) {
}
}else if(field.getPropertyType() == PropertyType.STRING||field.getPropertyType() == PropertyType.INTEGER){
String keyValue = field.getKeyValue();
String beanName = field.getBeanName();
String optionGroup = field.getOptionGroup();
if(beanName != null && !"".equals(beanName.trim()) && beanName.contains("beanname")){//接口
beanName = beanName.substring(8, beanName.length());
String[] property = beanName.split(",");
field.setDefaultValues(createOption(property));
}else if(keyValue != null && !"".equals(keyValue.trim())){//键值对
String[] property = keyValue.split(",");
field.setDefaultValues(createOption(property));
}else if(optionGroup != null && !"".equals(optionGroup.trim())){//选项组
String[] property = getOptionGroupByCode(optionGroup).split(",");
field.setDefaultValues(createOption(property));
}
}
fieldList.add(field);
fieldString = fieldString.replace("{" + partStr + "}", "");
//[,,,,]
}
}
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;
}
}});
//通过列表编号获得想要查询的字段信息
private String getFieldListByCode(String ListTableCode){
String fieldString="[";
listColumnManager = (ListColumnManager)ContextUtils.getBean("listColumnManager");
List<ListColumn> ListColumns = listColumnManager.getQueryColumnsByCode(ListTableCode);
listViewManager = (ListViewManager)ContextUtils.getBean("listViewManager");
formHtmlParser = (FormHtmlParser)ContextUtils.getBean("formHtmlParser");
ListView listView = listViewManager.getListViewByCode(ListTableCode);
Boolean isStandard = listView.getStandard();
for(ListColumn listColumn : ListColumns){
if(listColumn.getTableColumn()!=null){
//值设置
String valueSet = listColumn.getValueSet();
String enName = listColumn.getTableColumn().getName();
String dbName = listColumn.getTableColumn().getDbColumnName();
if(StringUtils.isEmpty(dbName)){
dbName=null;
}
//自定义表单在字段名前面加dt_
if(isStandard==false){
if(!FormHtmlParser.isDefaultField(enName)){
enName="dt_"+enName;
}
}
String chName = formHtmlParser.getInternation(listColumn.getHeaderName());
String propertyType = listColumn.getTableColumn().getDataType().toString();
if("TEXT".equals(propertyType)){
propertyType = "STRING";
}else if("CLOB".equals(propertyType)||"BLOB".equals(propertyType)||"COLLECTION".equals(propertyType)){
continue;
}
//控件类型为“自定义”时,查询字段的控件类型为普通的输入框
if("CUSTOM".equals(listColumn.getControlValue())){
valueSet=null;
propertyType = "STRING";
}
if(StringUtils.isNotEmpty(listColumn.getQuerySettingValue())&&listColumn.getQuerySettingValue().contains("FIXED")){//普通查询
String fixedField = "true";
fieldString = fillFieldString(fieldString,propertyType,enName,chName,fixedField,valueSet,listColumn,dbName);
}else if(StringUtils.isNotEmpty(listColumn.getQuerySettingValue())&&listColumn.getQuerySettingValue().contains("CUSTOM")){//高级查询
String fixedField = "false";
fieldString = fillFieldString(fieldString,propertyType,enName,chName,fixedField,valueSet,listColumn,dbName);
}
}
}
if(fieldString.length()>1){
fieldString = fieldString.substring(0,fieldString.length()-1);
fieldString += "]";
}else{
fieldString = "";
}
return fieldString;
}
//通过列表编号判断属性
private String getSearchPropertyByCode(String ListTableCode,String searchType){
String sign = "";
listViewManager = (ListViewManager)ContextUtils.getBean("listViewManager");
ListView listView = listViewManager.getListViewByCode(ListTableCode);
Boolean propertyBoolean = null;
if(searchType=="isAdvancedQuery"){
propertyBoolean = listView.getAdvancedQuery();
}else if(searchType=="isContainerIdQuery"){
if(listView.getPopUp()==null||listView.getPopUp()){//数据库中没值或者是弹出式查询时
propertyBoolean = false;
}else{
propertyBoolean = true;
}
}
if(propertyBoolean){
sign = "true";
}else{
sign = "false";
}
return sign;
}
//通过值设置获得选项组
private String getOptionGroupByCode(String valueSet){
StringBuilder opitions=new StringBuilder();
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(op.getValue())
.append(":")
.append(op.getName());
if(i<ops.size()){
opitions.append(",");
}
}
}
return opitions.toString();
}
//通过值设置和列获得接口
private String getOPtionByListColumnAndValueSet(ListColumn listColumn,String valueSet){
formHtmlParser = (FormHtmlParser)ContextUtils.getBean("formHtmlParser");
String colName = listColumn.getTableColumn().getName();
String getOptions = formHtmlParser.getOptionsByBeanName(valueSet, colName, null);
return getOptions;
}
//生成option
private List<Option> createOption(String[] property){
List<Option> options = new ArrayList<Option>();
Option option = null;
for (String p : property) {
if(StringUtils.isNotEmpty(p)){
option = new Option();
String[] part = p.split(":");
options.add(option);
option.setName(part[1].trim());
option.setValue(part[0].trim());
}
}
return options;
}
private String fillFieldString(String fieldString,String propertyType,String enName,String chName,String fixedField,String valueSet,ListColumn listColumn,String dbName){
if("BOOLEAN".equals(propertyType)){
if(StringUtils.isNotEmpty(valueSet)){
valueSet = valueSet.replace(",", "#");
valueSet = valueSet.replace(":", "$");
valueSet = valueSet.replace("'", "");
}else{
valueSet="";
}
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",keyValue:"+valueSet+",optionsCode:exist"+getEventType(listColumn)+",dbName:"+dbName+"},";
}else if("ENUM".equals(propertyType)){//枚举的值设置
String enumname = listColumn.getTableColumn().getObjectPath();
if(StringUtils.isNotEmpty(enumname)){
enumname = "enumname:"+enumname;//兼容之前的列表字段设置中的值设置
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",enumName:"+enumname+getEventType(listColumn)+",dbName:"+dbName+"},";
}else{
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",enumName:"+valueSet+getEventType(listColumn)+",dbName:"+dbName+"},";
}
}else if(("STRING".equals(propertyType)||"INTEGER".equals(propertyType)) && valueSet != null && !"".equals(valueSet.trim())){
if(valueSet.contains("beanname")){//接口
String bneannameValSet = getOPtionByListColumnAndValueSet(listColumn, valueSet);
bneannameValSet = bneannameValSet.replace(",", "#").replace("\'", "");
bneannameValSet = bneannameValSet.replace(":", "$");
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",beanName:beanname"+bneannameValSet+",optionsCode:exist"+getEventType(listColumn)+",dbName:"+dbName+"},";
}else if(valueSet.contains(":")){//键值对
valueSet = valueSet.replace(",", "#");
valueSet = valueSet.replace(":", "$");
valueSet = valueSet.replace("'", "");
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",keyValue:"+valueSet+",optionsCode:exist"+getEventType(listColumn)+",dbName:"+dbName+"},";
}else{//选项组
//valueSet = valueSet.replace(":", "$");
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+",optionGroup:"+valueSet+",optionsCode:exist"+getEventType(listColumn)+",dbName:"+dbName+"},";
}
}else{
fieldString += "{enName:"+enName+",chName:"+chName+",propertyType:"+propertyType+",fixedField:"+fixedField+getEventType(listColumn)+",dbName:"+dbName+"},";
}
return fieldString;
}
// public void setTableId(String tableId) {
// this.tableId = tableId;
// }
//
// public String getListTableCode() {
// return listTableCode;
// }
//
// public void setListTableCode(String listTableCode) {
// this.listTableCode = listTableCode;
// }
//
// public void setSubmitForm(String submitForm) {
// this.submitForm = submitForm;
// }
//
// public void setUrl(String url) {
// this.url = url;
// }
/**
* 获得查询的事件类型
*/
private String getEventType(ListColumn listColumn) {
String querySetting="";
String querySettingValue=listColumn.getQuerySettingValue();
String controlValue=listColumn.getControlValue();
if(StringUtils.isNotEmpty(querySettingValue)){
String[] arr=querySettingValue.split(",");
//查询时,当控件类型为“人员部门树”时,查询事件优先于控件类型;
if(arr.length>1){
querySetting=",eventType:"+arr[1];
}else if(StringUtils.isNotEmpty(controlValue)&&controlValue.contains("SELECT_TREE")){//控件类型是人员部门树
String[] val=controlValue.split(",");
querySetting=",eventType:"+val[2]+"/"+val[3];
}
}
return querySetting;
}
public void setFixedSearchSign(Integer fixedSearchSign) {
this.fixedSearchSign = fixedSearchSign;
}
}