Browse Source

新增接口文档生成

heshan 9 months ago
parent
commit
120b78fddb

+ 5 - 0
studio/modules/data-market-service-parent/data-market-service/pom.xml

@@ -84,6 +84,11 @@
             <artifactId>data-metadata-service-api</artifactId>
             <version>0.4.x</version>
         </dependency>
+        <dependency>
+            <groupId>com.platform</groupId>
+            <artifactId>common-office</artifactId>
+            <version>0.4.x</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 10 - 2
studio/modules/data-market-service-parent/data-market-service/src/main/java/cn/datax/service/data/market/controller/DataApiController.java

@@ -14,6 +14,9 @@ import cn.datax.service.data.market.api.vo.SqlParseVo;
 import cn.datax.service.data.market.mapstruct.DataApiMapper;
 import cn.datax.service.data.market.service.DataApiService;
 import cn.hutool.core.util.StrUtil;
+import com.aspose.words.Document;
+import com.aspose.words.SaveFormat;
+import com.aspose.words.SaveOptions;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -33,6 +36,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -217,14 +221,18 @@ public class DataApiController extends BaseController {
 	@ApiOperation(value = "接口文档", notes = "根据url的id来指定生成接口文档对象")
 	@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
 	@PostMapping("/word/{id}")
-	public R wordDataApi(@PathVariable String id, HttpServletResponse response) throws Exception {
+	public void wordDataApi(@PathVariable String id, HttpServletResponse response) throws Exception {
 		// 清空response
 		response.reset();
 		// 设置response的Header
 		response.setContentType("application/octet-stream;charset=utf-8");
 		// 设置content-disposition响应头控制浏览器以下载的形式打开文件
 		response.addHeader("Content-Disposition", "attachment;filename=" + new String("接口文档.docx".getBytes()));
-		return R.ok();
+		Document doc = dataApiService.wordDataApi(id);
+		OutputStream out = response.getOutputStream();
+		doc.save(out, SaveOptions.createSaveOptions(SaveFormat.DOC));
+		out.flush();
+		out.close();
 	}
 
 	@GetMapping("/detail/{id}")

+ 3 - 0
studio/modules/data-market-service-parent/data-market-service/src/main/java/cn/datax/service/data/market/service/DataApiService.java

@@ -5,6 +5,7 @@ import cn.datax.service.data.market.api.entity.DataApiEntity;
 import cn.datax.service.data.market.api.dto.DataApiDto;
 import cn.datax.common.base.BaseService;
 import cn.datax.service.data.market.api.vo.SqlParseVo;
+import com.aspose.words.Document;
 
 import java.util.List;
 import java.util.Map;
@@ -19,6 +20,8 @@ import java.util.Map;
  */
 public interface DataApiService extends BaseService<DataApiEntity> {
 
+    Document wordDataApi(String id) throws Exception;
+
     void saveDataApi(DataApiDto dataApi);
 
     void updateDataApi(DataApiDto dataApi);

+ 66 - 1
studio/modules/data-market-service-parent/data-market-service/src/main/java/cn/datax/service/data/market/service/impl/DataApiServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.datax.service.data.market.service.impl;
 
+import cn.datax.commo.office.word.WordUtil;
 import cn.datax.common.base.BaseServiceImpl;
 import cn.datax.common.core.DataConstant;
 import cn.datax.common.core.RedisConstant;
@@ -28,9 +29,15 @@ import cn.datax.service.data.metadata.api.entity.MetadataColumnEntity;
 import cn.datax.service.data.metadata.api.entity.MetadataSourceEntity;
 import cn.datax.service.data.metadata.api.entity.MetadataTableEntity;
 import cn.datax.service.data.metadata.api.enums.DataLevel;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.aspose.words.Document;
+import com.aspose.words.MailMerge;
+import com.aspose.words.net.System.Data.DataRow;
+import com.aspose.words.net.System.Data.DataSet;
+import com.aspose.words.net.System.Data.DataTable;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -67,7 +74,6 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -107,6 +113,65 @@ public class DataApiServiceImpl extends BaseServiceImpl<DataApiDao, DataApiEntit
 	@Autowired
 	private RedisService redisService;
 
+	@Override
+	public Document wordDataApi(String id) throws Exception {
+		DataApiEntity table = super.getById(id);
+		// 元数据(子表) TableStart:ReqParamList TableEnd:ReqParamList
+		DataTable columnTable = new DataTable("ReqParamList");
+		columnTable.getColumns().add("paramName");
+		columnTable.getColumns().add("paramComment");
+		columnTable.getColumns().add("paramType");
+		columnTable.getColumns().add("nullable");
+		columnTable.getColumns().add("exampleValue");
+		List<ReqParam> reqParams = table.getReqParams();
+		if(CollUtil.isNotEmpty(reqParams)){
+			for (int i = 0; i < reqParams.size(); i++) {
+				DataRow row = columnTable.newRow();
+				ReqParam reqParam = objectMapper.convertValue(reqParams.get(i), ReqParam.class);
+				row.set(0, reqParam.getParamName());
+				row.set(1, reqParam.getParamComment());
+				row.set(2, reqParam.getParamType());
+				row.set(3, reqParam.getNullable());
+				row.set(4, reqParam.getExampleValue());
+				columnTable.getRows().add(row);
+			}
+		}
+		// 元数据(子表) TableStart:ResParamList TableEnd:ResParamList
+		DataTable columnTableres = new DataTable("ResParamList");
+		columnTableres.getColumns().add("fieldName");
+		columnTableres.getColumns().add("dataType");
+		columnTableres.getColumns().add("fieldComment");
+		columnTableres.getColumns().add("exampleValue");
+		List<ResParam> resParams = table.getResParams();
+		if(CollUtil.isNotEmpty(resParams)){
+			for (int i = 0; i < resParams.size(); i++) {
+				DataRow row = columnTableres.newRow();
+				ResParam resParam = objectMapper.convertValue(resParams.get(i), ResParam.class);
+				row.set(0, resParam.getFieldName());
+				row.set(1, resParam.getDataType());
+				row.set(2, resParam.getFieldComment());
+				row.set(3, resParam.getExampleValue());
+				columnTableres.getRows().add(row);
+			}
+		}
+		// 提供数据源
+		DataSet dataSet = new DataSet();
+		dataSet.getTables().add(columnTable);
+		dataSet.getTables().add(columnTableres);
+		// 合并模版
+		ClassPathResource classPathResource = new ClassPathResource("templates/api_1.0.0.docx");
+		InputStream inputStream = classPathResource.getInputStream();
+		Document doc = WordUtil.getInstance().getDocument(inputStream);
+        // 提供数据源
+		String[] fieldNames = new String[] {"apiName","apiVersion","reqMethod","resType","apiUrl","remark"};
+		Object[] fieldValues = new Object[] {table.getApiName(),table.getApiVersion(),table.getReqMethod(),table.getResType(),table.getApiUrl(),table.getRemark()};
+		MailMerge mailMerge = doc.getMailMerge();
+		mailMerge.execute(fieldNames, fieldValues);
+		mailMerge.executeWithRegions(dataSet);
+		WordUtil.getInstance().insertWatermarkText(doc, SecurityUtil.getUserName());
+		return doc;
+	}
+
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void saveDataApi(DataApiDto dataApiDto) {