Ver Fonte

新增saveOrUpdate

周浩 há 9 anos atrás
pai
commit
0650ab2304

+ 143 - 5
hsweb-web-service-impl-common/src/main/java/org/hsweb/web/service/impl/form/DynamicFormServiceImpl.java

@@ -11,6 +11,9 @@ import org.hsweb.web.bean.po.GenericPo;
 import org.hsweb.web.bean.po.form.Form;
 import org.hsweb.web.bean.po.history.History;
 import org.hsweb.web.core.Install;
+import org.hsweb.web.core.exception.BusinessException;
+import org.hsweb.web.core.exception.NotFoundException;
+import org.hsweb.web.service.form.DynamicFormDataValidator;
 import org.hsweb.web.service.form.DynamicFormService;
 import org.hsweb.web.service.form.FormService;
 import org.hsweb.web.service.history.HistoryService;
@@ -19,16 +22,22 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
+import org.webbuilder.office.excel.ExcelIO;
+import org.webbuilder.office.excel.config.Header;
 import org.webbuilder.sql.*;
 import org.webbuilder.sql.exception.CreateException;
+import org.webbuilder.sql.exception.TriggerException;
 import org.webbuilder.sql.param.ExecuteCondition;
+import org.webbuilder.sql.trigger.TriggerResult;
+import org.webbuilder.utils.script.engine.DynamicScriptEngine;
+import org.webbuilder.utils.script.engine.DynamicScriptEngineFactory;
+import org.webbuilder.utils.script.engine.ExecuteResult;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.*;
 
 /**
  * Created by zhouhao on 16-4-14.
@@ -50,6 +59,9 @@ public class DynamicFormServiceImpl implements DynamicFormService {
     @Resource
     protected HistoryService historyService;
 
+    @Autowired(required = false)
+    protected List<DynamicFormDataValidator> dynamicFormDataValidator;
+
     protected void initDefaultField(TableMetaData metaData) {
         String dataType;
         switch (Install.getDatabaseType()) {
@@ -129,7 +141,9 @@ public class DynamicFormServiceImpl implements DynamicFormService {
         Table table = dataBase.getTable(name.toUpperCase());
         if (table == null)
             table = dataBase.getTable(name.toLowerCase());
-        Assert.notNull(table, "表单[" + name + "]不存在");
+        if (table == null) {
+            throw new NotFoundException("表单[" + name + "]不存在");
+        }
         return table;
     }
 
@@ -185,6 +199,29 @@ public class DynamicFormServiceImpl implements DynamicFormService {
         return pk;
     }
 
+    @Override
+    public String saveOrUpdate(String name, Map<String, Object> data) throws Exception {
+        String id = getRepeatDataId(name, data);
+        if (id != null) {
+            update(name, new UpdateMapParam(data).where(getPrimaryKeyName(name), id));
+        } else {
+            id = insert(name, new InsertMapParam(data));
+        }
+        return id;
+    }
+
+    protected String getRepeatDataId(String name, Map<String, Object> data) {
+        if (dynamicFormDataValidator != null) {
+            for (DynamicFormDataValidator validator : dynamicFormDataValidator) {
+                String id = validator.getRepeatDataId(name, data);
+                if (id != null) {
+                    return id;
+                }
+            }
+        }
+        return null;
+    }
+
     @Override
     @ReadLock
     @LockName(value = "'form.lock.'+#name", isExpression = true)
@@ -243,6 +280,107 @@ public class DynamicFormServiceImpl implements DynamicFormService {
         return query.single(proxy);
     }
 
+    @Override
+    @ReadLock
+    @LockName(value = "'form.lock.'+#name", isExpression = true)
+    public void exportExcel(String name, QueryParam param, OutputStream outputStream) throws Exception {
+        List<Object> dataList = select(name, param);
+        Table table = getTableByName(name);
+        TableMetaData metaData = table.getMetaData();
+        List<Header> headers = new LinkedList<>();
+        metaData.getFields().forEach(fieldMetaData -> {
+            ValueWrapper valueWrapper = fieldMetaData.attrWrapper("exportExcel", true);
+            if (valueWrapper.toBoolean()) {
+                String title = fieldMetaData.attrWrapper("excelHeader", fieldMetaData.getComment()).toString();
+                String field = fieldMetaData.getName();
+                headers.add(new Header(title, field));
+            }
+        });
+        if (metaData.triggerSupport("export.excel")) {
+            Map<String, Object> var = new HashMap<>();
+            var.put("dataList", dataList);
+            var.put("headers", headers);
+            metaData.on("export.excel", var);
+        }
+        ExcelIO.write(outputStream, headers, dataList);
+    }
+
+    @Override
+    @ReadLock
+    @LockName(value = "'form.lock.'+#name", isExpression = true)
+    public Map<String, Object> importExcel(String name, InputStream inputStream) throws Exception {
+        Map<String, Object> result = new HashMap<>();
+        long startTime = System.currentTimeMillis();
+        List<Map<String, Object>> excelData;
+        try {
+            excelData = ExcelIO.read2Map(inputStream);
+        } catch (Exception e) {
+            throw new BusinessException("解析excel失败,请确定文件格式正确!", e, 500);
+        }
+        List<Map<String, Object>> dataList = new LinkedList<>();
+        Map<String, String> headerMapper = new HashMap<>();
+        Table table = getTableByName(name);
+        TableMetaData metaData = table.getMetaData();
+        metaData.getFields().forEach(fieldMetaData -> {
+            ValueWrapper valueWrapper = fieldMetaData.attrWrapper("importExcel", true);
+            if (valueWrapper.toBoolean()) {
+                String title = fieldMetaData.attrWrapper("excelHeader", fieldMetaData.getComment()).toString();
+                String field = fieldMetaData.getName();
+                headerMapper.put(title, field);
+            }
+        });
+        if (metaData.triggerSupport("export.import.before")) {
+            Map<String, Object> var = new HashMap<>();
+            var.put("headerMapper", headerMapper);
+            var.put("excelData", excelData);
+            var.put("dataList", dataList);
+            metaData.on("export.excel", var);
+        } else
+            excelData.forEach(data -> {
+                Map<String, Object> newData = new HashMap<>();
+                data.forEach((k, v) -> {
+                    String field = headerMapper.get(k);
+                    if (field != null) {
+                        newData.put(field, v);
+                    } else {
+                        newData.put(k, v);
+                    }
+                });
+                dataList.add(newData);
+            });
+        List<Map<String, Object>> errorMessage = new LinkedList<>();
+        int index = 0, success = 0;
+        for (Map<String, Object> map : dataList) {
+            index++;
+            try {
+                if (metaData.triggerSupport("export.import.each")) {
+                    Map<String, Object> var = new HashMap<>();
+                    var.put("headerMapper", headerMapper);
+                    var.put("excelData", excelData);
+                    var.put("dataList", dataList);
+                    TriggerResult triggerResult = metaData.on("export.excel", var);
+                    if (!triggerResult.isSuccess()) {
+                        throw new TriggerException(triggerResult.getMessage());
+                    }
+                }
+                saveOrUpdate(name, map);
+                success++;
+            } catch (Exception e) {
+                Map<String, Object> errorMsg = new HashMap<>();
+                errorMsg.put("index", index);
+                errorMsg.put("message", e.getMessage());
+                errorMessage.add(errorMsg);
+            }
+        }
+        long endTime = System.currentTimeMillis();
+        result.put("startTime", startTime);
+        result.put("endTime", endTime);
+        result.put("total", dataList.size());
+        result.put("success", success);
+        result.put("errorMessage", errorMessage);
+        return result;
+    }
+
     public static class QueryParamProxy extends org.webbuilder.sql.param.query.QueryParam {
         public QueryParamProxy orderBy(String mode, Set<String> fields) {
             addProperty("order_by", fields);