AbstractAdmDictBaseServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package com.persagy.proxy.adm.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fasterxml.jackson.databind.JsonNode;
  7. import com.fasterxml.jackson.databind.node.ArrayNode;
  8. import com.persagy.dmp.basic.model.QueryCriteria;
  9. import com.persagy.dmp.basic.utils.JsonNodeUtils;
  10. import com.persagy.dmp.common.utils.JsonHelper;
  11. import com.persagy.proxy.adm.constant.AdmCommonConstant;
  12. import com.persagy.proxy.adm.constant.AdmDictConstant;
  13. import com.persagy.proxy.adm.constant.enums.ValidEnum;
  14. import com.persagy.proxy.adm.model.AdmObjectInfo;
  15. import com.persagy.proxy.adm.model.AdmObjectType;
  16. import com.persagy.proxy.adm.request.AdmQueryCriteria;
  17. import com.persagy.proxy.adm.request.AdmResponse;
  18. import com.persagy.proxy.adm.service.IAdmDictBaseService;
  19. import com.persagy.proxy.adm.utils.AdmEntityTransferUtil;
  20. import com.persagy.proxy.adm.utils.AdmQueryCriteriaHelper;
  21. import com.persagy.proxy.common.client.DmpDicClient;
  22. import com.persagy.proxy.common.client.DmpRwdClient;
  23. import com.persagy.proxy.common.entity.DmpResult;
  24. import com.persagy.proxy.common.entity.InstanceUrlParam;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.apache.commons.lang.StringUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import java.io.IOException;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. /**
  33. * @ClassName AbstractAdmDictBaseServiceImpl
  34. * @Description: 字典查询
  35. * @Author linhuili
  36. * @Date 2021/8/31 18:21
  37. * @Version V1.0
  38. **/
  39. @Slf4j
  40. public class AbstractAdmDictBaseServiceImpl<T> implements IAdmDictBaseService<T> {
  41. @Autowired
  42. private DmpRwdClient rwdClient;
  43. @Autowired
  44. private DmpDicClient dicClient;
  45. @Value("${middleware.group.code}")
  46. private String groupCode;
  47. /**
  48. * 查询DMP字典数据
  49. * @param context
  50. * @param dmpRequest
  51. * @param clazz
  52. * @return
  53. */
  54. @Override
  55. public AdmResponse doQueryDictData(InstanceUrlParam context,QueryCriteria dmpRequest, Class<T> clazz) {
  56. // 转换参数
  57. JSONObject para = null;
  58. try {
  59. para = JsonHelper.toJsonObject(dmpRequest);
  60. } catch (IOException e) {
  61. log.error(e.getMessage(), e);
  62. return null;
  63. }
  64. // 调用中台查询
  65. DmpResult<JSONArray> dmpResult = dicClient.queryDictData(context, para);
  66. List<AdmObjectType> admVOs = dictDataVOTransfer(dmpResult.getData());
  67. // 设置返回值
  68. AdmResponse response = AdmResponse.success(admVOs);
  69. Long total = dmpResult.getCount() == null ? null : dmpResult.getCount().longValue();
  70. response.setTotal(total);
  71. return response;
  72. }
  73. /**
  74. * 查询DMP对象类型
  75. * @param context
  76. * @param dmpRequest
  77. * @param clazz
  78. * @return
  79. */
  80. @Override
  81. public AdmResponse doQueryObjectType(InstanceUrlParam context,QueryCriteria dmpRequest, Class<T> clazz) {
  82. // 转换参数
  83. JSONObject para = null;
  84. try {
  85. para = JsonHelper.toJsonObject(dmpRequest);
  86. } catch (IOException e) {
  87. log.error(e.getMessage(), e);
  88. return null;
  89. }
  90. // 调用中台查询
  91. DmpResult<JSONArray> dmpResult = rwdClient.queryObjectType(context, para);
  92. JSONArray data = dmpResult.getData();
  93. List<AdmObjectType> admVOs = new ArrayList<>();
  94. if(CollUtil.isNotEmpty(data)){
  95. admVOs = data.toJavaList(AdmObjectType.class);
  96. }
  97. //参数格式转换
  98. dictDefTypeTransfer(admVOs);
  99. // 设置返回值
  100. AdmResponse response = AdmResponse.success(admVOs);
  101. Long total = dmpResult.getCount() == null ? null : dmpResult.getCount().longValue();
  102. response.setTotal(total);
  103. return response;
  104. }
  105. /**
  106. * 查询对象信息点
  107. * @param request
  108. * @return
  109. */
  110. @Override
  111. public AdmResponse doQueryObjectInfo(InstanceUrlParam context, AdmQueryCriteria request,String fieldName, Class<T> clazz) {
  112. // 转换为数据中台查询条件
  113. QueryCriteria dmpRequest = toDmpCriteria(request,fieldName);
  114. // 转换参数
  115. JSONObject para = null;
  116. try {
  117. para = JsonHelper.toJsonObject(dmpRequest);
  118. } catch (IOException e) {
  119. log.error(e.getMessage(), e);
  120. return null;
  121. }
  122. // 调用中台查询
  123. DmpResult<JSONArray> dmpResult = rwdClient.queryObjectInfo(context, para);
  124. List<AdmObjectInfo> admVOs = AdmEntityTransferUtil.toAdmMultiEntity(dmpResult.getData(), request.getProjection(), AdmObjectInfo.class);
  125. // BDTP信息点格式与ADM兼容处理
  126. handleObjectInfoResult(admVOs);
  127. // 设置返回值
  128. AdmResponse response = AdmResponse.success(admVOs);
  129. Long total = dmpResult.getCount() == null ? null : dmpResult.getCount().longValue();
  130. response.setTotal(total);
  131. response.setPageNumber(request.getPageNumber());
  132. response.setPageSize(request.getPageSize());
  133. return response;
  134. }
  135. /**
  136. * 修改
  137. * @param context
  138. * @param clazz
  139. * @param voList
  140. * @return
  141. */
  142. @Override
  143. public List<T> doUpdateObjectInfo(InstanceUrlParam context, Class<T> clazz, List<T> voList) {
  144. if(CollUtil.isEmpty(voList)) {
  145. return null;
  146. }
  147. ArrayNode vos = JsonNodeUtils.toArrayNode(voList, null, null);
  148. // 调用中台修改
  149. DmpResult<cn.hutool.json.JSONArray> response = rwdClient.batchUpdateObjectInfo(context, JSONArray.parseArray(vos.toString()));
  150. if(!DmpResult.SUCCESS.equals(response.getResult())) {
  151. throw new RuntimeException("调用中台查询接口出错:" + response.getMessage());
  152. }
  153. // 转换为结果
  154. return AdmEntityTransferUtil.toAdmMultiEntity(response.getData(), null, clazz);
  155. }
  156. /**
  157. * 删除信息点
  158. * @param context
  159. * @param voList
  160. * @return
  161. */
  162. @Override
  163. public void doDeleteObjectInfo(InstanceUrlParam context, List<T> voList) {
  164. if(CollUtil.isEmpty(voList)) {
  165. return;
  166. }
  167. List<String> idList = CollUtil.getFieldValues(voList, "id", String.class);
  168. // 调用中台修改
  169. DmpResult response = rwdClient.batchDeleteObjectInfo(context, idList);
  170. if(!DmpResult.SUCCESS.equals(response.getResult())) {
  171. throw new RuntimeException("调用中台查询接口出错:" + response.getMessage());
  172. }
  173. }
  174. /**
  175. * 信息点格式与ADM兼容处理
  176. * @param admVOs
  177. */
  178. private void handleObjectInfoResult(List<AdmObjectInfo> admVOs){
  179. if(CollUtil.isEmpty(admVOs)){
  180. return;
  181. }
  182. for (AdmObjectInfo admVO : admVOs) {
  183. admVO.setFirstName(admVO.getFirstTag());
  184. admVO.setSecondName(admVO.getSecondTag());
  185. admVO.setMultiple(admVO.getIsMultiple());
  186. admVO.setRegion(admVO.getIsRegion());
  187. admVO.setGroupCode(groupCode);
  188. //path路径处理
  189. if(StringUtils.isEmpty(admVO.getFirstName()) || AdmDictConstant.FIRST_BASE_TAG.equals(admVO.getFirstName())
  190. || AdmDictConstant.HIS_FIRST_BASE_TAG.equals(admVO.getFirstName())){
  191. admVO.setPath(admVO.getCode());
  192. }else{
  193. admVO.setPath(AdmDictConstant.INFOS_EX+admVO.getCode());
  194. }
  195. //信息点是否可见
  196. if(admVO.getVisible() == null){
  197. if("localName".equals(admVO.getCode()) || "localId".equals(admVO.getCode())){
  198. admVO.setVisible(true);
  199. }else{
  200. admVO.setVisible(false);
  201. }
  202. }
  203. //信息点是否可编辑
  204. if(admVO.getEditable() == null){
  205. List<String> unEditableList = checkoutDefInfoUnEditable();
  206. if(unEditableList.contains(admVO.getCode())){
  207. admVO.setEditable(false);
  208. }else {
  209. admVO.setEditable(true);
  210. }
  211. }
  212. //是否禁止操作
  213. if(admVO.getUnDisabled() == null){
  214. List<String> unDisableList = checkoutDefInfoUnDisable();
  215. if(unDisableList.contains(admVO.getCode())){
  216. admVO.setUnDisabled(false);
  217. }else {
  218. admVO.setUnDisabled(true);
  219. }
  220. }
  221. }
  222. }
  223. /**
  224. * 校验信息点是否可编辑
  225. * @return
  226. */
  227. public List<String> checkoutDefInfoUnEditable(){
  228. List<String> list = new ArrayList<>();
  229. list.add("id");
  230. list.add("name");
  231. list.add("qRCodePic");
  232. list.add("defaultQRCode");
  233. list.add("bimId");
  234. list.add("bimFamilyName");
  235. list.add("bimFamilySymbol");
  236. return list;
  237. }
  238. /**
  239. * 校验信息点是否禁止使用
  240. * @return
  241. */
  242. public List<String> checkoutDefInfoUnDisable(){
  243. List<String> list = new ArrayList<>();
  244. list.add("id");
  245. list.add("name");
  246. list.add("localId");
  247. list.add("localName");
  248. list.add("qRCodePic");
  249. list.add("defaultQRCode");
  250. list.add("bimId");
  251. list.add("bimFamilyName");
  252. list.add("bimFamilySymbol");
  253. return list;
  254. }
  255. /**
  256. * 字典数据格式与ADM兼容
  257. * @param array
  258. */
  259. private List<AdmObjectType> dictDataVOTransfer(JSONArray array){
  260. List<AdmObjectType> result = new ArrayList<>();
  261. if(CollUtil.isEmpty(array)){
  262. return result;
  263. }
  264. ArrayNode dataNode = JsonNodeUtils.toArrayNode(array, null, null);
  265. for (JsonNode dicData : dataNode) {
  266. AdmObjectType objectType = new AdmObjectType();
  267. objectType.setCode(dicData.get("code").textValue());
  268. objectType.setName(dicData.get("label").textValue());
  269. objectType.setAliasCode(dicData.get("code").textValue());
  270. objectType.setAliasName(dicData.get("label").textValue());
  271. objectType.setObjType(dicData.get("type").textValue());
  272. result.add(objectType);
  273. }
  274. return result;
  275. }
  276. /**
  277. * 将ADM的查询条件转换为DMP的
  278. * 调用前注意:
  279. * - 调用前将name赋值,才会将条件中adm的属性替换为dmp的属性
  280. * - 统计查询时将isOnlyCount设置为true
  281. * 调用后注意(需要调用者自行处理的):
  282. * - 不处理级联,级联应在调用者里处理级联调用转换后查询赋值
  283. * - 不处理projection,查询后自行根据projection筛选返回属性。(dmp只能指定扩展属性,而adm的是针对所有属性的)
  284. * @param admCriteria
  285. * @return
  286. */
  287. public static QueryCriteria toDmpCriteria(AdmQueryCriteria admCriteria,String fieldName) {
  288. QueryCriteria dmpCriteria = new QueryCriteria();
  289. // 拷贝分页
  290. AdmQueryCriteriaHelper.copyPageInfo(admCriteria, dmpCriteria);
  291. // 处理filters
  292. dmpCriteria.setCriteria(AdmQueryCriteriaHelper.toCriteria(admCriteria.getName(), admCriteria.getFilters()));
  293. if(StrUtil.isNotEmpty(admCriteria.getName())){
  294. // 处理name
  295. dmpCriteria.getCriteria().put(fieldName, admCriteria.getName());
  296. }
  297. dmpCriteria.getCriteria().put(AdmCommonConstant.VALID,ValidEnum.TRUE.getValue());
  298. // 处理排序
  299. dmpCriteria.setOrders(AdmQueryCriteriaHelper.toOrderItem(admCriteria.getOrders()));
  300. // 处理统计
  301. dmpCriteria.setOnlyCount(admCriteria.isOnlyCount());
  302. return dmpCriteria;
  303. }
  304. /**
  305. * 字典类型返回结构与ADM兼容
  306. * @param data
  307. */
  308. private List<AdmObjectType> dictDefTypeTransfer(List<AdmObjectType> data){
  309. if(CollUtil.isEmpty(data)){
  310. return new ArrayList<>();
  311. }
  312. for (AdmObjectType datum : data) {
  313. String projectId = datum.getProjectId();
  314. String groupCode = datum.getGroupCode();
  315. if(StringUtils.isNotEmpty(groupCode) && !"0".equals(groupCode)){
  316. //集团级
  317. datum.setType("group");
  318. }else if(StringUtils.isNotEmpty(projectId) && !"0".equals(projectId)){
  319. //项目级
  320. datum.setType("project");
  321. }else{
  322. //平台级
  323. datum.setType("common");
  324. }
  325. }
  326. return data;
  327. }
  328. }