diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/parser/TableInfoParser.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/parser/TableInfoParser.java index 1210106..509cb38 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/parser/TableInfoParser.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/parser/TableInfoParser.java @@ -26,14 +26,12 @@ public class TableInfoParser { .name(form.getFormId()) .comment(form.getFormName()) .build(); - String dbType = ContextHelper.getDatabaseType(); DbColumns dbColumns = DbColumns.valueOf(dbType); Assert.notNull(dbColumns, "该数据库不支持:" + dbType); - JSONArray fieldConfigJson = JSONArray.parseArray(form.getFieldConfig()); + analyzeGrid(fieldConfigJson); Assert.isTrue(fieldConfigJson != null && fieldConfigJson.size() > 0, "表单解析失败,没有发现字段配置"); - List columns = new ArrayList<>(); fieldConfigJson.forEach(obj -> { JSONObject json = (JSONObject) obj; @@ -53,10 +51,58 @@ public class TableInfoParser { columns.add(col); } table.setColumns(columns); - return table; } + /** + * 处理 grid (表单中的一行多列组件) + * @param fieldConfigJson + * @author YaoJz + * @date 2024/04/11 16:12 + */ + private static void analyzeGrid(JSONArray fieldConfigJson){ + //grid中列的信息 + JSONArray gridColJsonArr = new JSONArray(); +// fieldConfigJson中为grid的列 + JSONArray gridJsonArr = new JSONArray(); + fieldConfigJson.forEach(obj ->{ + JSONObject json = (JSONObject) obj; + if ("grid".equals(json.get("tag").toString())){ + gridJsonArr.add(obj); + getGridCol(json, gridColJsonArr); + } + }); + gridJsonArr.forEach(obj->{ + fieldConfigJson.remove(obj); + }); + gridColJsonArr.forEach(obj->{ + fieldConfigJson.add(obj); + }); + } + /** + * 获取到 grid下的所有列---遍历树 + * @param json + * @param gridColJsonArr + * @author YaoJz + * @date 2024/04/11 17:00 + */ + private static void getGridCol( JSONObject json,JSONArray gridColJsonArr ){ + JSONArray columns = json.getJSONArray("columns"); + columns.forEach(col ->{ + JSONObject colJson = (JSONObject) col; + JSONArray list = colJson.getJSONArray("list"); + list.forEach(obj ->{ + JSONObject colNextJson = (JSONObject) obj; + if (colNextJson!=null){ + if ("grid".equals(colNextJson.get("tag").toString())){ + getGridCol(colNextJson, gridColJsonArr ); + }else { + gridColJsonArr.add(colNextJson); + } + } + }); + }); + } public static Column parseColumn(@NotNull JSONObject json, Column dbColumn) { Integer length = json.getInteger("fieldLength"); if (length == null) { diff --git a/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java b/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java index 6d5edf1..2fbdeb4 100644 --- a/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java +++ b/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java @@ -3,11 +3,16 @@ package com.keyware.shandan.bianmu.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.keyware.shandan.bianmu.entity.DirectoryMetadataVo; +import com.keyware.shandan.bianmu.entity.DirectoryResource; import com.keyware.shandan.bianmu.entity.MetadataBasicVo; import com.keyware.shandan.bianmu.enums.ReviewStatus; +import com.keyware.shandan.bianmu.export.DirectoryExport; +import com.keyware.shandan.bianmu.export.ExportCache; +import com.keyware.shandan.bianmu.export.ExportProgress; import com.keyware.shandan.bianmu.service.DataLabelsService; import com.keyware.shandan.bianmu.service.DirectoryMetadataService; import com.keyware.shandan.bianmu.service.MetadataService; +import com.keyware.shandan.browser.entity.SearchConditionVo; import com.keyware.shandan.common.controller.BaseController; import com.keyware.shandan.common.entity.Result; import com.keyware.shandan.common.enums.SecretLevel; @@ -19,6 +24,8 @@ import com.keyware.shandan.system.entity.SysFormConfig; import com.keyware.shandan.system.service.SysFileService; import com.keyware.shandan.system.service.SysFormConfigService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -182,4 +189,27 @@ public class MetadataController extends BaseController sb.append("[").append(id).append("],")); return sb.toString(); } + + /** + * 目录数据导出-创建任务 + * + * @param directoryId 目录ID + * @param condition 复杂查询条件 + * @return 导出ID + */ + @PostMapping("/export/directory/{directoryId}") + public Result exportQuery(@PathVariable String directoryId, SearchConditionVo condition, Authentication auth) { +// Assert.notNull(auth, "用户信息认证失败"); +// String userId = auth.getPrincipal().toString(); +// // 这个逻辑只允许同一个用户同时只能有一个导出任务 +// ExportProgress export = ExportCache.getCache(userId, null); +// if (export == null) { +// // 查询数据 +// List list = metadataSearchService.searchAllListByCondition(directoryId, condition); +// export = new DirectoryExport(userId, list); +// ExportCache.startExport(export); +// } +// return Result.of(export.getProgress(), !export.isError()); + return null; + } } diff --git a/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/SearchController.java b/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/SearchController.java new file mode 100644 index 0000000..9bea762 --- /dev/null +++ b/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/SearchController.java @@ -0,0 +1,65 @@ +package com.keyware.shandan.bianmu.controller; + +import cn.hutool.core.io.FileUtil; +import com.keyware.shandan.bianmu.export.ExportCache; +import com.keyware.shandan.bianmu.export.ExportProgress; +import com.keyware.shandan.bianmu.service.MetadataService; +import com.keyware.shandan.common.entity.Result; +import com.keyware.shandan.common.util.FileDownload; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.File; + +/** + * 组合搜索前端控制器 + * + * @author Administrator + * @since 2021/7/1 + */ +@RestController +@RequestMapping("/search") +public class SearchController { + @Autowired + private MetadataService metadataService; + /** + * 目录数据导出-查询任务状态 + * + * @param exportId 导出ID + * @return 导出ID + */ + @GetMapping("/export/status/{exportId}") + public Result exportStatus(@PathVariable String exportId, Authentication auth) { + String userId = auth.getPrincipal().toString(); + ExportProgress export = ExportCache.getCache(userId, exportId); + if (export == null) { + return Result.of(null, false, "导出任务不存在"); + } + if (export.isError()) { + ExportCache.popCache(userId, exportId); + } + return Result.of(export.getProgress(), !export.isError()); + } + + /** + * 目录数据导出-下载 + * + * @param response HttpServletResponse + * @param exportId 导出ID + * @return - + */ + @GetMapping("/export/download/{exportId}") + public String exportDownload(HttpServletResponse response, @PathVariable String exportId, Authentication auth) { + String userId = auth.getPrincipal().toString(); + ExportProgress export = ExportCache.popCache(userId, exportId); + if (export == null) { + return "错误:导出任务不存在"; + } + String path = export.getDownloadPath(); + String downloadName = FileUtil.getName(path); + File file = new File(path); + return FileDownload.download(response, file, downloadName, true); + } + +} diff --git a/shandan-bianmu/src/main/resources/static/js/business/directory/directory.js b/shandan-bianmu/src/main/resources/static/js/business/directory/directory.js index 48aa18c..cf0d44c 100644 --- a/shandan-bianmu/src/main/resources/static/js/business/directory/directory.js +++ b/shandan-bianmu/src/main/resources/static/js/business/directory/directory.js @@ -369,7 +369,35 @@ function startRender() { openEditLayer(`${ctx}/business/metadata/edit?id=${obj.id}`) } }) - + //导出文件 + metaListTable.addTableRowEvent('export', function (obj) { + console.log("文件导出") + if (basicData.id === DIR_ROOT_ID) { + showErrorMsg('不允许导出根目录数据'); + return false; + } + Util.exportFileSearchResource('/business/metadata/list/exportDirectory',metaListTable.table.where) + // if (obj.resourceType === 'file') { + // layer.open({ + // title: '文件下载', + // type: 0, + // content: `

是否需要同时下载置标标签数据?

`, + // btn: ['需要', '不需要'], + // yes: function (index) { + // layer.close(index) + // window.open(`${ctx}/sys/file/download/${obj.id}`) + // window.open(`${ctx}/sys/file/download/label/${obj.id}`) + // }, + // btn2: function (index) { + // layer.close(index); + // window.open(`${ctx}/sys/file/download/${obj.id}`) + // }, + // + // }); + // } else { + // showErrorMsg('数据表不支持下载'); + // } + }) // 下载 metaListTable.addTableRowEvent('downFile', function (obj) { if (obj.resourceType === 'file') { @@ -680,7 +708,7 @@ function startRender() { metaListTable.reloadTable(); }); }); - }) + }) } }, /*{ diff --git a/shandan-bianmu/src/main/resources/view/business/directory/directory.html b/shandan-bianmu/src/main/resources/view/business/directory/directory.html index aa704ce..f2e5fdb 100644 --- a/shandan-bianmu/src/main/resources/view/business/directory/directory.html +++ b/shandan-bianmu/src/main/resources/view/business/directory/directory.html @@ -94,7 +94,12 @@ title="{{disabled ? title : ''}}" disabled="{{disabled ? 'disabled' : ''}}" lay-event="addLink">关联数据表 - --> + addFile{{disabled ? 'disabled' : ''}} + --> +