AppApiController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package com.yihu.ehr.apps.controller;
  2. import com.yihu.ehr.agModel.app.AppApiModel;
  3. import com.yihu.ehr.apps.service.AppApiClient;
  4. import com.yihu.ehr.apps.service.AppApiParameterClient;
  5. import com.yihu.ehr.apps.service.AppApiResponseClient;
  6. import com.yihu.ehr.constants.ApiVersion;
  7. import com.yihu.ehr.constants.ServiceApi;
  8. import com.yihu.ehr.controller.BaseController;
  9. import com.yihu.ehr.model.app.MAppApi;
  10. import com.yihu.ehr.model.app.MAppApiDetail;
  11. import com.yihu.ehr.model.dict.MConventionalDict;
  12. import com.yihu.ehr.model.user.MRoleApiRelation;
  13. import com.yihu.ehr.model.user.MRoleAppRelation;
  14. import com.yihu.ehr.systemdict.service.ConventionalDictEntryClient;
  15. import com.yihu.ehr.users.service.RoleApiRelationClient;
  16. import com.yihu.ehr.users.service.RoleAppRelationClient;
  17. import com.yihu.ehr.util.rest.Envelop;
  18. import io.swagger.annotations.Api;
  19. import io.swagger.annotations.ApiOperation;
  20. import io.swagger.annotations.ApiParam;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.springframework.beans.BeanUtils;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.http.ResponseEntity;
  25. import org.springframework.web.bind.annotation.*;
  26. import java.util.ArrayList;
  27. import java.util.Collection;
  28. import java.util.List;
  29. import java.util.Map;
  30. import java.util.stream.Collectors;
  31. /**
  32. * Created by linz on 2016年7月8日11:30:18.
  33. */
  34. @RestController
  35. @RequestMapping(ApiVersion.Version1_0 + "/admin")
  36. @Api(value = "AppApiController", description = "应用开放接口维护", tags = {"应用管理-应用开放接口维护"})
  37. public class AppApiController extends BaseController {
  38. private static final String DELETE = "delete";
  39. private static final String ADD = "add";
  40. private static final String UPDATE = "update";
  41. private static final String NEW_DATA = "0";
  42. private static final String DATA_STATUS = "__status";
  43. @Autowired
  44. private AppApiClient appApiClient;
  45. @Autowired
  46. private RoleApiRelationClient roleApiRelationClient;
  47. @Autowired
  48. private AppApiParameterClient appApiParameterClient;
  49. @Autowired
  50. private AppApiResponseClient appApiResponseClient;
  51. @Autowired
  52. private ConventionalDictEntryClient conDictEntryClient;
  53. @Autowired
  54. private RoleAppRelationClient roleAppRelationClient;
  55. @RequestMapping(value = ServiceApi.AppApi.AppApis, method = RequestMethod.GET)
  56. @ApiOperation(value = "获取AppApi列表")
  57. public Envelop getAppApis(
  58. @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "")
  59. @RequestParam(value = "fields", required = false) String fields,
  60. @ApiParam(name = "filters", value = "过滤器,规则参见说明文档", defaultValue = "")
  61. @RequestParam(value = "filters", required = false) String filters,
  62. @ApiParam(name = "sort", value = "排序,规则参见说明文档", defaultValue = "")
  63. @RequestParam(value = "sort", required = false) String sort,
  64. @ApiParam(name = "size", value = "分页大小", defaultValue = "15")
  65. @RequestParam(value = "size", required = false) int size,
  66. @ApiParam(name = "page", value = "页码", defaultValue = "1")
  67. @RequestParam(value = "page", required = false) int page) {
  68. ResponseEntity<List<MAppApi>> responseEntity = appApiClient.getAppApis(fields, filters, sort, size, page);
  69. List<MAppApi> mAppApiList = responseEntity.getBody();
  70. List<AppApiModel> appApiModels = new ArrayList<>();
  71. for (MAppApi mAppApi : mAppApiList) {
  72. AppApiModel appApiModel = new AppApiModel();
  73. BeanUtils.copyProperties(mAppApi, appApiModel);
  74. appApiModels.add(appApiModel);
  75. }
  76. Integer totalCount = getTotalCount(responseEntity);
  77. Envelop envelop = getResult(appApiModels, totalCount, page, size);
  78. return envelop;
  79. }
  80. @RequestMapping(value = ServiceApi.AppApi.AppApis, method = RequestMethod.POST)
  81. @ApiOperation(value = "创建AppApi")
  82. public Envelop createAppApi(
  83. @ApiParam(name = "model", value = "对象JSON结构体", allowMultiple = true, defaultValue = "")
  84. @RequestParam(value = "model", required = false) String model,
  85. @ApiParam(name = "apiParms", value = "api请求参数集合")
  86. @RequestParam(value = "apiParms", required = false) String apiParms,
  87. @ApiParam(name = "apiResponse", value = "api响应参数集合")
  88. @RequestParam(value = "apiResponse", required = false) String apiResponse) {
  89. Envelop envelop = new Envelop();
  90. MAppApi mAppApi = appApiClient.createAppApi(model);
  91. if (mAppApi == null) {
  92. envelop.setSuccessFlg(false);
  93. envelop.setErrorMsg("保存失败!");
  94. return envelop;
  95. }
  96. AppApiModel appApiModel = new AppApiModel();
  97. BeanUtils.copyProperties(mAppApi, appApiModel);
  98. saveApiParmsResponse(appApiModel.getId() + "", apiParms, apiResponse);
  99. envelop.setSuccessFlg(true);
  100. envelop.setObj(appApiModel);
  101. return envelop;
  102. }
  103. @RequestMapping(value = ServiceApi.AppApi.AppApi, method = RequestMethod.GET)
  104. @ApiOperation(value = "获取AppApi")
  105. public Envelop getAppApi(
  106. @ApiParam(name = "id", value = "id", defaultValue = "")
  107. @PathVariable(value = "id") String id) {
  108. Envelop envelop = new Envelop();
  109. MAppApi mAppApi = appApiClient.getAppApi(id);
  110. AppApiModel appApiModel = new AppApiModel();
  111. if (mAppApi == null) {
  112. envelop.setSuccessFlg(false);
  113. envelop.setErrorMsg("获取数据失败!");
  114. return envelop;
  115. }
  116. BeanUtils.copyProperties(mAppApi, appApiModel);
  117. envelop.setSuccessFlg(true);
  118. envelop.setObj(appApiModel);
  119. return envelop;
  120. }
  121. @RequestMapping(value = ServiceApi.AppApi.AppApis, method = RequestMethod.PUT)
  122. @ApiOperation(value = "更新AppApi")
  123. public Envelop updateAppApi(
  124. @ApiParam(name = "model", value = "对象JSON结构体", allowMultiple = true)
  125. @RequestParam(value = "model", required = false) String AppApi,
  126. @ApiParam(name = "apiParms", value = "api请求参数集合")
  127. @RequestParam(value = "apiParms", required = false) String apiParms,
  128. @ApiParam(name = "apiResponse", value = "api响应参数集合")
  129. @RequestParam(value = "apiResponse", required = false) String apiResponse) {
  130. Envelop envelop = new Envelop();
  131. MAppApi mAppApi = appApiClient.createAppApi(AppApi);
  132. AppApiModel appApiModel = new AppApiModel();
  133. if (mAppApi == null) {
  134. envelop.setSuccessFlg(false);
  135. envelop.setErrorMsg("更新数据失败!");
  136. return envelop;
  137. }
  138. BeanUtils.copyProperties(mAppApi, appApiModel);
  139. saveApiParmsResponse(appApiModel.getId() + "", apiParms, apiResponse);
  140. envelop.setSuccessFlg(true);
  141. envelop.setObj(appApiModel);
  142. return envelop;
  143. }
  144. @RequestMapping(value = ServiceApi.AppApi.AppApi, method = RequestMethod.DELETE)
  145. @ApiOperation(value = "删除AppApi")
  146. public Envelop deleteAppApi(
  147. @ApiParam(name = "id", value = "id", defaultValue = "")
  148. @PathVariable(value = "id") String id) {
  149. Envelop envelop = new Envelop();
  150. Boolean isDelete = appApiClient.deleteAppApi(id);
  151. envelop.setSuccessFlg(isDelete);
  152. return envelop;
  153. }
  154. @RequestMapping(value = ServiceApi.AppApi.AppApisNoPage, method = RequestMethod.GET)
  155. @ApiOperation(value = "获取过滤App列表")
  156. public Envelop getAppApiNoPage(
  157. @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
  158. @RequestParam(value = "filters", required = false) String filters,
  159. @ApiParam(name = "roleId", value = "角色组ID,需要知道是否被关联才需要传入")
  160. @RequestParam(value = "roleId", required = false) String roleId) {
  161. Collection<MAppApi> mAppApis = appApiClient.getAppApiNoPage(filters);
  162. Envelop envelop = new Envelop();
  163. List<AppApiModel> appApiModels = new ArrayList<>();
  164. for (MAppApi mAppApi : mAppApis) {
  165. AppApiModel appApiModel = convertToModel(mAppApi, AppApiModel.class);
  166. if (StringUtils.isNotBlank(roleId)) {
  167. appApiModel.setRoleId(roleId);
  168. }
  169. converModelName(appApiModel);
  170. appApiModels.add(appApiModel);
  171. }
  172. envelop.setSuccessFlg(true);
  173. envelop.setDetailModelList(appApiModels);
  174. return envelop;
  175. }
  176. @RequestMapping(value = ServiceApi.AppApi.AppApiSearch, method = RequestMethod.GET)
  177. @ApiOperation(value = "查询Api详情")
  178. public Envelop searchApi(
  179. @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "")
  180. @RequestParam(value = "fields", required = false) String fields,
  181. @ApiParam(name = "filters", value = "过滤器,规则参见说明文档", defaultValue = "")
  182. @RequestParam(value = "filters", required = false) String filters,
  183. @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "")
  184. @RequestParam(value = "sorts", required = false) String sorts,
  185. @ApiParam(name = "size", value = "分页大小", defaultValue = "15")
  186. @RequestParam(value = "size", required = false) int size,
  187. @ApiParam(name = "page", value = "页码", defaultValue = "1")
  188. @RequestParam(value = "page", required = false) int page
  189. ) {
  190. ResponseEntity<List<MAppApiDetail>> responseEntity = appApiClient.searchApi(fields, filters, sorts, size, page);
  191. List<MAppApiDetail> mAppApiList = responseEntity.getBody();
  192. Integer totalCount = getTotalCount(responseEntity);
  193. return getResult(mAppApiList, totalCount, page, size);
  194. }
  195. @RequestMapping(value = "/role_app_api/no_paging", method = RequestMethod.GET)
  196. @ApiOperation(value = "获取角色组的AppApi列表")
  197. public Envelop getRoleAppFeatureNoPage(
  198. @ApiParam(name = "role_id", value = "角色组id")
  199. @RequestParam(value = "role_id") String roleId) {
  200. Collection<MRoleApiRelation> mRoleApiRelations = roleApiRelationClient.searchRoleApiRelationNoPaging("roleId=" + roleId);
  201. String apiIds = "";
  202. for (MRoleApiRelation m : mRoleApiRelations) {
  203. apiIds += m.getApiId() + ",";
  204. }
  205. if (!StringUtils.isEmpty(apiIds)) {
  206. apiIds = apiIds.substring(0, apiIds.length() - 1);
  207. }
  208. Collection<MAppApi> mAppApis = appApiClient.getAppApiNoPage("id=" + apiIds);
  209. Envelop envelop = new Envelop();
  210. List<AppApiModel> appApiModels = new ArrayList<>();
  211. for (MAppApi mAppApi : mAppApis) {
  212. AppApiModel appApiModel = convertToModel(mAppApi, AppApiModel.class);
  213. appApiModels.add(appApiModel);
  214. }
  215. envelop.setDetailModelList(appApiModels);
  216. return envelop;
  217. }
  218. /**
  219. * 格式化字典数据
  220. *
  221. * @param appApiModel
  222. */
  223. private void converModelName(AppApiModel appApiModel) {
  224. //是否已经被角色组适配,界面适配用
  225. if (!StringUtils.isEmpty(appApiModel.getRoleId())) {
  226. ResponseEntity<Collection<MRoleApiRelation>> responseEntity = roleApiRelationClient.searchRoleApiRelations("", "roleId=" + appApiModel.getRoleId() + ";apiId=" + appApiModel.getId(), "", 1, 1);
  227. Collection<MRoleApiRelation> mRoleFeatureRelations = responseEntity.getBody();
  228. if (mRoleFeatureRelations != null && mRoleFeatureRelations.size() > 0) {
  229. appApiModel.setIschecked(true);
  230. }
  231. }
  232. //审计等级
  233. if (!StringUtils.isEmpty(appApiModel.getAuditLevel())) {
  234. MConventionalDict catalopDict = conDictEntryClient.getAuditLevel(appApiModel.getAuditLevel());
  235. appApiModel.setAuditLevelName(catalopDict == null ? "" : catalopDict.getValue());
  236. }
  237. //开放等级
  238. if (!StringUtils.isEmpty(appApiModel.getOpenLevel())) {
  239. MConventionalDict catalopDict = conDictEntryClient.getOpenLevel(appApiModel.getOpenLevel());
  240. appApiModel.setOpenLevelName(catalopDict == null ? "" : catalopDict.getValue());
  241. }
  242. }
  243. /**
  244. * 保存apiParms及apiResponse
  245. *
  246. * @param apiId
  247. * @param apiParms
  248. * @param apiResponse
  249. */
  250. private void saveApiParmsResponse(String apiId, String apiParms, String apiResponse) {
  251. try {
  252. List<Map<String, Object>> list;
  253. if (!StringUtils.isEmpty(apiParms)) {
  254. list = objectMapper.readValue(apiParms, List.class);
  255. for (Map<String, Object> parmsMap : list) {
  256. //删除的是新增的数据直接跳过
  257. if (DELETE.equals(parmsMap.get(DATA_STATUS)) && NEW_DATA.equals(parmsMap.get("id") + "")) {
  258. continue;
  259. } else {
  260. parmsMap.put("appApiId", apiId);
  261. String json = toJson(parmsMap);
  262. if (NEW_DATA.equals(parmsMap.get("id") + "")) {
  263. appApiParameterClient.createAppApiParameter(json);
  264. } else if (UPDATE.equals(parmsMap.get(DATA_STATUS))) {
  265. appApiParameterClient.updateAppApiParameter(json);
  266. } else if (DELETE.equals(parmsMap.get(DATA_STATUS))) {
  267. appApiParameterClient.deleteAppApiParameter(parmsMap.get("id") + "");
  268. }
  269. }
  270. }
  271. }
  272. if (!StringUtils.isEmpty(apiResponse)) {
  273. list = objectMapper.readValue(apiResponse, List.class);
  274. for (Map<String, Object> parmsMap : list) {
  275. //删除的是新增的数据直接跳过
  276. if (DELETE.equals(parmsMap.get(DATA_STATUS)) && NEW_DATA.equals(parmsMap.get("id") + "")) {
  277. continue;
  278. } else {
  279. parmsMap.put("appApiId", apiId);
  280. String json = toJson(parmsMap);
  281. if (ADD.equals(parmsMap.get(DATA_STATUS))) {
  282. appApiResponseClient.createAppApiResponse(json);
  283. } else if (UPDATE.equals(parmsMap.get(DATA_STATUS))) {
  284. appApiResponseClient.updateAppApiResponse(json);
  285. } else if (DELETE.equals(parmsMap.get(DATA_STATUS))) {
  286. appApiResponseClient.deleteAppApiResponse(parmsMap.get("id") + "");
  287. }
  288. }
  289. }
  290. }
  291. } catch (Exception e) {
  292. throw new RuntimeException(e.getMessage());
  293. }
  294. }
  295. @RequestMapping(value = ServiceApi.AppApi.AppApiAuth, method = RequestMethod.GET)
  296. @ApiOperation(value = "验证应用的api调用权限")
  297. public Envelop checkAppApi(
  298. @ApiParam(name = "appId", value = "应用ID")
  299. @RequestParam(value = "appId") String appId,
  300. @ApiParam(name = "apiName", value = "api名称")
  301. @RequestParam(value = "apiName") String apiName) {
  302. Envelop envelop = new Envelop();
  303. try {
  304. //获取应用和api关系
  305. Collection<MRoleAppRelation> mRoleAppRelations = roleAppRelationClient.searchRoleAppNoPaging("appId=" + appId);
  306. String roleIds = mRoleAppRelations.stream().map(MRoleAppRelation::getRoleId).collect(Collectors.toList()).stream().map(roleId -> roleId.toString()).collect(Collectors.joining(","));
  307. if("".equals(roleIds)){
  308. return failed("应用无该API的访问权限");
  309. }
  310. //获取角色和api关系
  311. Collection<MRoleApiRelation> mRoleApiRelations = roleApiRelationClient.searchRoleApiRelationNoPaging("roleId=" + roleIds);
  312. String apiIds = mRoleApiRelations.stream().map(MRoleApiRelation::getApiId).collect(Collectors.toList()).stream().map(apiId -> apiId.toString()).collect(Collectors.joining(","));
  313. //获取角色相关的所有api
  314. Collection<MAppApi> mAppApis = appApiClient.getAppApiNoPage("id=" + apiIds + ";methodName=" + apiName);
  315. List<MAppApi> appApiList = mAppApis.stream().collect(Collectors.toList());
  316. if (appApiList!=null && appApiList.size()>0){
  317. return success("");
  318. }else {
  319. return failed("无该应用API的访问权限");
  320. }
  321. // envelop.setDetailModelList(appApiList);
  322. // return envelop;
  323. } catch (Exception e) {
  324. throw new RuntimeException(e.getMessage());
  325. }
  326. }
  327. }