package com.norteksoft.mms.custom.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.norteksoft.mms.form.dao.ListColumnDao;
import com.norteksoft.mms.form.dao.ListViewDao;
import com.norteksoft.mms.form.dao.TableColumnDao;
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.DataType;
import com.norteksoft.mms.form.jdbc.JdbcSupport;
import com.norteksoft.mms.form.service.FormHtmlParser;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.orm.hibernate.HibernateDao;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.web.struts2.Struts2Utils;
@Repository
public class CommonDao extends HibernateDao<Object, Long>{
@Autowired
private ListColumnDao listColumnDao;
@Autowired
private ListViewDao listViewDao;
@Autowired
private JdbcSupport jdbcDao;
@Autowired
private TableColumnDao tableColumnDao;
/**
* 根据列表编号查询数据
* @param page
* @param listCode
* @return
*/
public Page<Object> list(Page<Object> page, String listCode){
ListView view = listViewDao.getListViewByCode(listCode);
String fieldSql = getSelectPartByListCode(listCode);
StringBuilder sql=new StringBuilder();
sql.append("select ");
sql.append(fieldSql);
sql.append(" from ");
sql.append(view.getDataTable().getName()).append(" ");
sql.append("where company_id=? ");
return this.searchPageBySql(page, sql.toString(), ContextUtils.getCompanyId());
}
public Page<Object> listEntity(Page<Object> page, String entityName){
return this.searchPageByHql(page, "from " + entityName + " t");
}
private String getSelectPartByListCode(String listCode){
List<ListColumn> columns = listColumnDao.getColumnsByViewCode(listCode);
StringBuffer columnsStr = new StringBuffer();
String columnName = null;
for (int i = 0; i < columns.size(); i++) {
if(i != 0){
columnsStr.append(",");
}
columnName = columns.get(i).getTableColumn().getName();
if(!FormHtmlParser.isDefaultField(columnName)){
columnsStr.append("dt_");
}
columnsStr.append(columns.get(i).getTableColumn().getName());
}
return columnsStr.toString();
}
/**
* 查询数据
* @param tableName 表名
* @param id 数据ID
* @return
*/
public Object getDateById(String tableName, Long id){
return jdbcDao.getDataMap(tableName, id);
}
public Object getEntityById(String entityName, Long id){
List<Object> objs = this.find("from " + entityName + " t where t.id=?", id);
Object obj = null;
if(objs.size() == 1){
obj = objs.get(0);
}
return obj;
}
public Long save(Map<String,String[]> parameter, FormView form, List<FormControl> fields){
return jdbcDao.insertTable(parameter, form, fields);
}
public Long update(Map<String,String[]> parameter, FormView form, List<FormControl> fields, Long id){
return jdbcDao.updateTable(parameter, form, fields, id);
}
public void delete(String tableName, List<Long> ids){
jdbcDao.deleteDatas(tableName, ids);
}
public void delete(String tableName,Long id){
jdbcDao.deleteData(tableName, id);
}
public Map<String, Object> getAmountTotal(List<String> names) {
String listCode=Struts2Utils.getParameter("_list_code");
ListView listView=listViewDao.getListViewByCode(listCode);
StringBuilder sql=new StringBuilder();
StringBuilder field=new StringBuilder();
String name="";
List<TableColumn> filedType=new ArrayList<TableColumn>();
for(int i=0;i<names.size();i++){
name=names.get(i);
if(!FormHtmlParser.isDefaultField(names.get(i))){
name="dt_"+name;
}
List<TableColumn> tableColumns=tableColumnDao.find("from TableColumn t where t.companyId=? and t.dataTableId=? and t.dbColumnName=?",ContextUtils.getCompanyId(),listView.getDataTable().getId(),name);
TableColumn tc=tableColumns.get(0);
filedType.add(tc);
if(isTotalType(tc)){
if(StringUtils.isNotEmpty(field.toString())){
field.append(",");
}
field.append("sum(p.");
field.append(name);
field.append(")");
}
}
Object[] values=null;
Object value=null;
if(StringUtils.isNotEmpty(field.toString())){
sql.append("select ");
sql.append(field.toString());
sql.append(" from ");
sql.append(listView.getDataTable().getName());
sql.append(" p ");
sql.append(" where p.company_id=? ");
if(field.toString().contains(",")){
values=(Object[])findBySql(sql.toString(),ContextUtils.getCompanyId()).get(0);
}else{
value=findBySql(sql.toString(),ContextUtils.getCompanyId()).get(0);
}
}
Map<String,Object> totalValues=new HashMap<String, Object>();
int j=0;
for(int i=0;i<filedType.size();i++){
if(isTotalType(filedType.get(i))){
if(field.toString().contains(",")){
totalValues.put(names.get(i), values[j]);
j++;
}else{
totalValues.put(names.get(i), value);
}
}else{
totalValues.put(names.get(i), 0);
}
}
return totalValues;
}
private boolean isTotalType(TableColumn tc){
return tc.getDataType()==DataType.AMOUNT||tc.getDataType()==DataType.DOUBLE||tc.getDataType()==DataType.FLOAT||tc.getDataType()==DataType.INTEGER||tc.getDataType()==DataType.NUMBER||tc.getDataType()==DataType.LONG;
}
}