AbstractAdmDictBaseServiceImpl.java 14 KB

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