package com.norteksoft.mms.form.web;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.beans.factory.annotation.Autowired;
import com.norteksoft.mms.base.data.DataHandle;
import com.norteksoft.mms.form.entity.DataTable;
import com.norteksoft.mms.form.entity.GenerateSetting;
import com.norteksoft.mms.form.entity.TableColumn;
import com.norteksoft.mms.form.service.DataTableManager;
import com.norteksoft.mms.form.service.ImportDataTableManager;
import com.norteksoft.mms.form.service.SheetManager;
import com.norteksoft.mms.form.service.TableColumnManager;
import com.norteksoft.mms.module.entity.Menu;
import com.norteksoft.mms.module.service.MenuManager;
import com.norteksoft.product.api.ApiFactory;
import com.norteksoft.product.enumeration.DataState;
import com.norteksoft.product.orm.Page;
import com.norteksoft.product.util.ContextUtils;
import com.norteksoft.product.util.JsTreeUtils;
import com.norteksoft.product.util.PageUtils;
import com.norteksoft.product.util.ZipUtils;
import com.norteksoft.product.util.freemarker.TagUtil;
import com.norteksoft.product.util.freemarker.TemplateRender;
import com.norteksoft.product.web.struts2.CrudActionSupport;
import com.norteksoft.product.web.struts2.Struts2Utils;
@Namespace("/form")
@ParentPackage("default")
@Results( { @Result(name = CrudActionSupport.RELOAD, location = "data-table", type = "redirectAction") })
public class DataTableAction extends CrudActionSupport<DataTable> {
private static final long serialVersionUID = 1L;
private DataTable dataTable;
private Long tableId;
private Long menuId;
private MenuManager menuManager;
private DataHandle dataHandle;
private Page<DataTable> dataTables = new Page<DataTable>(0, true);
private List<Long> tableIds;
private DataTableManager dataTableManager;
private TableColumnManager tableColumnManager;
private SheetManager sheetManager;
@Autowired
private ImportDataTableManager importDataTableManager;
private String tableName;
private List<TableColumn> columns;
private String states;
private boolean canChange;
private boolean deleteEnable = false;
private String ids;
private File file;
private Long id;//数据表字段id
private String fileName;
private static final String SUCCESS_MESSAGE_LEFT = "<font class=\"onSuccess\"><nobr>";
private static final String MESSAGE_RIGHT = "</nobr></font>";
private static final String ERROR_MESSAGE_LEFT = "<font class=\"onError\"><nobr>";
private Log log = LogFactory.getLog(DataTableAction.class);
protected void addErrorMessage(String message){
this.addActionMessage(ERROR_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
protected void addSuccessMessage(String message){
this.addActionMessage(SUCCESS_MESSAGE_LEFT+message+MESSAGE_RIGHT);
}
@Autowired
public void setMenuManager(MenuManager menuManager) {
this.menuManager = menuManager;
}
@Autowired
public void setDataHandle(DataHandle dataHandle) {
this.dataHandle = dataHandle;
}
@Override
@Action("data-table-list-data")
public String list() throws Exception {
List<Menu> menus = menuManager.getEnabledStandardRootMenuByCompany();
if(menuId==null&&menus.size()>0){
menuId = menus.get(0).getId();
}
if(menuId!=null){
if(dataTables.getPageSize()>1){
dataTableManager.getSystemAllDataTables(dataTables, menuId);
ApiFactory.getBussinessLogService().log("数据表管理",
"数据表列表",
ContextUtils.getSystemId("mms"));
this.renderText(PageUtils.pageToJson(dataTables));
return null;
}
}
return "data-table";
}
@Action("data-table-defaultDataTableList")
public String defaultDataTableList() throws Exception {
if(menuId!=null){
if(dataTables.getPageSize()>1){
dataTableManager.getSystemDefaultDataTables(dataTables, menuId);
ApiFactory.getBussinessLogService().log("数据表管理",
"数据表列表",
ContextUtils.getSystemId("mms"));
this.renderText(PageUtils.pageToJson(dataTables));
return null;
}
}
return "data-table-default";
}
public String findAllEnableDateTable() throws Exception {
dataTableManager.getAllEnableDataTables(dataTables);
return "enable";
}
@Override
@Action("data-table-input")
public String input() throws Exception {
ApiFactory.getBussinessLogService().log("数据表管理",
"数据表表单",
ContextUtils.getSystemId("mms"));
return "data-table-input";
}
@Action("data-table-viewCustom")
public String viewCustom() throws Exception {
dataTable = dataTableManager.getDataTable(tableId);
return "data-table-view";
}
public String checkTableName() throws Exception {
renderText(String.valueOf(dataTableManager.getDataTableByName(
tableName, tableId)));
return null;
}
/**
* 保存只存在改表结构,在草稿到启用时才是建表
*/
@Override
@Action("data-table-save")
public String save() throws Exception {
dataTableManager.saveDataTable(dataTable);
ApiFactory.getBussinessLogService().log("数据表管理",
"保存数据表",
ContextUtils.getSystemId("mms"));
addSuccessMessage("保存成功");
return "data-table-input";
}
public void prepareDealWithTableColumn() throws Exception {
dataTable = dataTableManager.getDataTable(tableId);
}
/**
* 字段设置页面
*
* @return
* @throws Exception
*/
@Action("data-table-dealWithTableColumn")
public String dealWithTableColumn() throws Exception {
dataTable = dataTableManager.getDataTable(tableId);
columns=tableColumnManager.getTableColumnByDataTableId(tableId);
ApiFactory.getBussinessLogService().log("数据表管理",
"字段信息设置页面",
ContextUtils.getSystemId("mms"));
return "data-table-columns";
}
/**
* 自定义数据表查看页面字段设置页面
*
* @return
* @throws Exception
*/
@Action("data-table-viewCustomTableColumn")
public String viewCustomTableColumn() throws Exception {
dataTable = dataTableManager.getDataTable(tableId);
columns=tableColumnManager.getTableColumnByDataTableId(tableId);
ApiFactory.getBussinessLogService().log("数据表管理",
"字段信息设置页面",
ContextUtils.getSystemId("mms"));
return "data-table-custom-columns";
}
/**
* 删除数据表信息--只能为草稿状态的
*/
@Override
public String delete() throws Exception {
if(deleteEnable){
deleteEnable();
}else{
deleteDraft();
}
ApiFactory.getBussinessLogService().log("数据表管理",
"删除数据表",
ContextUtils.getSystemId("mms"));
return list();
}
private void deleteEnable(){
dataTableManager.deleteEnableDataTables(tableIds);
addSuccessMessage("删除成功");
}
private void deleteDraft(){
boolean canDelete = true;
for (Long tableId : tableIds) {
dataTable = dataTableManager.getDataTable(tableId);
if (dataTable.getTableState() != DataState.DRAFT) {
canDelete = false;
}
}
if (canDelete) {
dataTableManager.deleteDataTables(tableIds);
addSuccessMessage("删除成功");
} else {
addErrorMessage("不能删除已启用和禁用的数据表");
}
}
/**
* 删除启用或草稿状态的自定义数据表
*/
@Action("data-table-deleteCustom")
public String deleteCustom() throws Exception {
if(deleteEnable){
deleteEnable();
}else{
deleteDraft();
}
ApiFactory.getBussinessLogService().log("数据表管理",
"删除数据表",
ContextUtils.getSystemId("mms"));
return defaultDataTableList();
}
public void prepareSaveColumns() throws Exception {
dataTable = dataTableManager.getDataTable(tableId);
}
/**
* 保存字段信息
*
* @return
* @throws Exception
*/
public String saveColumns() throws Exception {
tableColumnManager.saveTableColumns(dataTable);
columns=tableColumnManager.getTableColumnByDataTableId(tableId);
ApiFactory.getBussinessLogService().log("数据表管理",
"保存字段信息",
ContextUtils.getSystemId("mms"));
addSuccessMessage("保存成功");
return "columns";
}
// public void prepareChangeTableState() throws Exception {
// dataTable = dataTableManager.getDataTable(tableId);
// }
/**
* 改变数据表的状态(草稿->启用;启用->禁用;禁用->启用)
*
* @return
* @throws Exception
*/
public String changeTableState() throws Exception {
//dataTableManager.changeTableState(tableIds);
addSuccessMessage(dataTableManager.changeTableState(tableIds,menuId));
ApiFactory.getBussinessLogService().log("数据表管理",
"改变数据表的状态",
ContextUtils.getSystemId("mms"));
log.debug("table info has saved");
return list();
}
public String exportToExcel() throws Exception{
HttpServletResponse response = Struts2Utils.getResponse();
response.reset();
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("字段信息.xls","UTF-8"));
sheetManager.exportToExcel(response.getOutputStream());
return null;
}
public String showImport() throws Exception{
return "import";
}
public String importInto() throws Exception{
dataTable = dataTableManager.getDataTable(tableId);
columns=sheetManager.importIntoData(file,dataTable);
addSuccessMessage("导入成功");
return "import";
}
@Override
protected void prepareModel() throws Exception {
if (tableId != null) {
dataTable = dataTableManager.getDataTable(tableId);
menuId=dataTable.getMenuId();
} else {
dataTable = new DataTable();
}
if(menuId!=null && menuId.intValue()!=0){
dataTable.setMenuId(menuId);
}
}
/**
* 数据表管理的系统树
*/
public String dataTableStandardSysTree() throws Exception {
StringBuilder tree = new StringBuilder("[ ");
List<Menu> menus1 = menuManager.getEnabledStandardRootMenuByCompany();
java.util.Collections.sort(menus1);
StringBuilder subNodes1 = new StringBuilder();
for(Menu menu :menus1){
subNodes1.append(JsTreeUtils.generateJsTreeNodeNew(menu.getId().toString()+"_STANDARD", null, menu.getName(),"")).append(",");
}
JsTreeUtils.removeLastComma(subNodes1);
if(menus1.isEmpty()){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("STANDARD_SYSTEM", "close",
"标准数据表",subNodes1.toString())).append(",");
}else{
tree.append(JsTreeUtils.generateJsTreeNodeDefault("STANDARD_SYSTEM", "open",
"标准数据表",subNodes1.toString())).append(",");
}
List<Menu> menus2 = menuManager.getEnabledCustomRootMenuByCompany();
StringBuilder subNodes2 = new StringBuilder();
for(Menu menu :menus2){
subNodes2.append(JsTreeUtils.generateJsTreeNodeNew(menu.getId().toString()+"_CUSTOM", null, menu.getName(),"")).append(",");
}
JsTreeUtils.removeLastComma(subNodes2);
if(menus2.isEmpty()){
tree.append(JsTreeUtils.generateJsTreeNodeDefault("CUSTOM_SYSTEM", "close",
"自定义数据表",subNodes2.toString())).append(",");
}else{
tree.append(JsTreeUtils.generateJsTreeNodeDefault("CUSTOM_SYSTEM", "open",
"自定义数据表",subNodes2.toString())).append(",");
}
JsTreeUtils.removeLastComma(tree);
tree.append(" ]");
renderText(tree.toString());
return null;
}
/**
* 数据表管理的系统树
*/
public String dataTableTree() throws Exception {
List<Menu> menus = menuManager.getEnabledRootMenuByCompany();
java.util.Collections.sort(menus);
StringBuilder tree = new StringBuilder("[ ");
for(Menu menu :menus){
tree.append(JsTreeUtils.generateJsTreeNodeNew(menu.getId().toString(), "root", menu.getName(),"")).append(",");
// tree.append(JsTreeUtil.generateJsTreeNode(menu.getId().toString(), "root", menu.getName())).append(",");
}
JsTreeUtils.removeLastComma(tree);
tree.append(" ]");
renderText(tree.toString());
return null;
}
/**
* 删除数据表字段
* @return
* @throws Exception
*/
@Action("delete-table-column")
public String deleteTableColumn() throws Exception {
tableColumnManager.deleteTableColumn(id);
ApiFactory.getBussinessLogService().log("数据表管理",
"删除数据表字段",
ContextUtils.getSystemId("mms"));
String callback=Struts2Utils.getParameter("callback");
this.renderText(callback+"({msg:'删除成功'})");
return null;
}
/**
* 导出数据表及字段信息
* @return
* @throws Exception
*/
@Action("export-data-table")
public String exportDataTable() throws Exception{
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
response.setContentType("application/x-download");
Menu menu=menuManager.getMenu(menuId);
String name="data-table";
if(menu!=null)name=name+"-"+menu.getCode();
response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(name+".xls","UTF-8"));
dataHandle.exportDataTable(response.getOutputStream(),tableIds,menuId);
ApiFactory.getBussinessLogService().log("数据表管理",
"导出数据表",
ContextUtils.getSystemId("mms"));
return null;
}
@Action("show-import-data-table")
public String showImportDataTable() throws Exception{
return "show-import-data-table";
}
/**
* 导入数据表及字段信息
* @return
* @throws Exception
*/
@Action("import-data-table")
public String importDataTable() throws Exception{
String result = "";
try {
result = ApiFactory.getDataImporterService().importData(file, fileName,importDataTableManager);
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
renderText(result);
return null;
}
@Action("generate-code")
public String generateCode() throws Exception{
try {
String[] tempIds=ids.split(",");
HttpServletResponse response = Struts2Utils.getResponse();
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("generate-code.zip","utf-8"));
for(String dataTableId:tempIds){
boolean processFlag=false;//表示是否走流程
GenerateSetting setting = dataTableManager.getGenerateSettingByTable(Long.valueOf(dataTableId));
String workflowCode="";
if(setting!=null){
processFlag=setting.getFlowable();
workflowCode=setting.getWorkflowCode();
}
dataTable=dataTableManager.getDataTable(Long.valueOf(dataTableId));
Map<String, Object> dataModel= new HashMap<String, Object>();
if(setting==null||setting.getEntitative()){//如果对应数据表没有设置代码生成配置 ,或者生成代码配置里设置生成实体,则生成实体代码
dataModel =dataTableManager.generateEntity(dataTable,processFlag);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
}
dataModel = dataTableManager.generateDao(dataTable);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
dataModel = dataTableManager.generateService(dataTable,processFlag);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
dataModel=dataTableManager.generateAction(dataTable,processFlag,menuId,workflowCode);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
TagUtil.generateFile(dataModel, "menus/", "header.jsp", "generateHeader.ftl");
TagUtil.generateFile(null, "menus/", "second-menu.jsp", "generateSecondMenu.ftl");
TagUtil.generateFile(null, "menus/", "third-menu.jsp", "generateThirdMenu.ftl");
dataModel=dataTableManager.generateList(dataTable,processFlag,menuId,workflowCode);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
dataModel=dataTableManager.generateInput(dataTable,processFlag,menuId,workflowCode);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
dataModel=dataTableManager.generateEditableList(dataTable,processFlag);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
if(processFlag){
dataModel=dataTableManager.generateTask(dataTable);
TagUtil.generateFile(dataModel, dataModel.get("filePath").toString(), dataModel.get("fileName").toString(), dataModel.get("templateName").toString());
TagUtil.generateFile(dataModel, "jsp/"+dataModel.get("nameSpace").toString()+"/", dataModel.get("lowCaseEntityName").toString()+"-history.jsp", "generateHistory.ftl");
}
}
OutputStream fileOut=response.getOutputStream();
ZipUtils.zipFolder(TemplateRender.GENERATE_DIR, fileOut);
if(fileOut!=null)fileOut.close();
FileUtils.deleteDirectory(new File(TemplateRender.GENERATE_DIR));//删除文件夹
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
public DataTable getModel() {
return dataTable;
}
@Autowired
public void setDataTableManager(DataTableManager dataTableManager) {
this.dataTableManager = dataTableManager;
}
@Autowired
public void setTableColumnManager(TableColumnManager tableColumnManager) {
this.tableColumnManager = tableColumnManager;
}
@Autowired
public void setSheetManager(SheetManager sheetManager) {
this.sheetManager = sheetManager;
}
public void setDataTables(Page<DataTable> dataTables) {
this.dataTables = dataTables;
}
public Page<DataTable> getDataTables() {
return dataTables;
}
public void setTableId(Long tableId) {
this.tableId = tableId;
}
public Long getTableId() {
return tableId;
}
public void setTableIds(List<Long> tableIds) {
this.tableIds = tableIds;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public List<TableColumn> getColumns() {
return columns;
}
public void setColumns(List<TableColumn> columns) {
this.columns = columns;
}
public String getStates() {
return states;
}
public void setStates(String states) {
this.states = states;
}
public boolean isCanChange() {
return canChange;
}
public void setCanChange(boolean canChange) {
this.canChange = canChange;
}
public Long getMenuId() {
return menuId;
}
public void setMenuId(Long menuId) {
this.menuId = menuId;
}
public void setFile(File file) {
this.file = file;
}
public DataTable getDataTable() {
return dataTable;
}
public void setId(Long id) {
this.id = id;
}
public void setFileFileName(String fileName) {
this.fileName = fileName;
}
public void setDeleteEnable(boolean deleteEnable) {
this.deleteEnable = deleteEnable;
}
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids = ids;
}
}