|
@@ -0,0 +1,161 @@
|
|
|
|
+package com.qizhen.healsphere.service.impl;
|
|
|
|
+
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
|
+import com.qizhen.healsphere.repository.mapper.KgCountInfoMapper;
|
|
|
|
+import com.qizhen.healsphere.repository.mapper.KgCountTotalInfoMapper;
|
|
|
|
+import com.qizhen.healsphere.repository.mapper.entity.KgCountInfo;
|
|
|
|
+import com.qizhen.healsphere.repository.mapper.entity.KgCountTotalInfo;
|
|
|
|
+import com.qizhen.healsphere.service.KgCountService;
|
|
|
|
+import com.qizhen.healsphere.web.param.KgCountListPageQuery;
|
|
|
|
+import com.qizhen.healsphere.web.vo.CountInfoVO;
|
|
|
|
+import com.qizhen.healsphere.web.vo.CountListVO;
|
|
|
|
+import com.qizhen.healsphere.web.vo.Page;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.List;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * <p>
|
|
|
|
+ * 服务实现类
|
|
|
|
+ * </p>
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+@Service
|
|
|
|
+public class KgCountServiceImpl implements KgCountService {
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private KgCountTotalInfoMapper kgCountTotalInfoMapper;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private KgCountInfoMapper kgCountInfoMapper;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public CountInfoVO getCountTotalInfo() {
|
|
|
|
+
|
|
|
|
+ CountInfoVO countInfoVO = new CountInfoVO();
|
|
|
|
+ List<CountInfoVO.InfoVO> infoVOS = new ArrayList<>();
|
|
|
|
+ CountInfoVO.InfoVO nodeTypeInfoVO = new CountInfoVO.InfoVO();
|
|
|
|
+ nodeTypeInfoVO.setName("实体类型");
|
|
|
|
+ nodeTypeInfoVO.setNum(0);
|
|
|
|
+
|
|
|
|
+ CountInfoVO.InfoVO nodeInfoVO = new CountInfoVO.InfoVO();
|
|
|
|
+ nodeInfoVO.setName("实体");
|
|
|
|
+ nodeInfoVO.setNum(0);
|
|
|
|
+
|
|
|
|
+ CountInfoVO.InfoVO nodePropInfoVO = new CountInfoVO.InfoVO();
|
|
|
|
+ nodePropInfoVO.setName("实体属性");
|
|
|
|
+ nodePropInfoVO.setNum(0);
|
|
|
|
+
|
|
|
|
+ CountInfoVO.InfoVO relationTypeInfoVO = new CountInfoVO.InfoVO();
|
|
|
|
+ relationTypeInfoVO.setName("关系类型");
|
|
|
|
+ relationTypeInfoVO.setNum(0);
|
|
|
|
+
|
|
|
|
+ CountInfoVO.InfoVO relationInfoVO = new CountInfoVO.InfoVO();
|
|
|
|
+ relationInfoVO.setName("关系");
|
|
|
|
+ relationInfoVO.setNum(0);
|
|
|
|
+
|
|
|
|
+ KgCountTotalInfo countTotalInfo = kgCountTotalInfoMapper.getCountTotalInfo();
|
|
|
|
+ if (countTotalInfo != null) {
|
|
|
|
+ nodeTypeInfoVO.setNum(countTotalInfo.getNodeTypeNum());
|
|
|
|
+ nodeInfoVO.setNum(countTotalInfo.getNodeNum());
|
|
|
|
+ nodePropInfoVO.setNum(countTotalInfo.getNodePropNum());
|
|
|
|
+ relationTypeInfoVO.setNum(countTotalInfo.getRelationTypeNum());
|
|
|
|
+ relationInfoVO.setNum(countTotalInfo.getRelationNum());
|
|
|
|
+ }
|
|
|
|
+ infoVOS.add(nodeTypeInfoVO);
|
|
|
|
+ infoVOS.add(nodeInfoVO);
|
|
|
|
+ infoVOS.add(nodePropInfoVO);
|
|
|
|
+ infoVOS.add(relationTypeInfoVO);
|
|
|
|
+ infoVOS.add(relationInfoVO);
|
|
|
|
+ countInfoVO.setInfos(infoVOS);
|
|
|
|
+ return countInfoVO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Page<CountListVO> getCountListInfo(KgCountListPageQuery query) {
|
|
|
|
+ Integer pageNo = query.getPageNo();
|
|
|
|
+ Integer pageSize = query.getPageSize();
|
|
|
|
+
|
|
|
|
+ Integer count = kgCountInfoMapper.count();
|
|
|
|
+ List<CountListVO> listVOS = new ArrayList<>();
|
|
|
|
+ if (count > 0){
|
|
|
|
+ List<KgCountInfo> countList = kgCountInfoMapper.getCountList(pageSize, (pageNo - 1) * pageSize);
|
|
|
|
+ if (CollUtil.isNotEmpty(countList)){
|
|
|
|
+ countList.forEach(kgCountInfo -> {
|
|
|
|
+ CountListVO countListVO = BeanUtil.copyProperties(kgCountInfo, CountListVO.class);
|
|
|
|
+ listVOS.add(countListVO);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return new Page<>(pageNo,pageSize,listVOS.size(),count,listVOS);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
+ public Boolean updateStatisticsData() {
|
|
|
|
+ try {
|
|
|
|
+ log.info("开始更新统计数据...");
|
|
|
|
+
|
|
|
|
+ // 1. 更新总体统计信息
|
|
|
|
+ updateTotalInfo();
|
|
|
|
+
|
|
|
|
+ // 2. 更新分类统计信息
|
|
|
|
+ updateDetailInfo();
|
|
|
|
+
|
|
|
|
+ log.info("统计数据更新完成");
|
|
|
|
+ return true;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("更新统计数据失败", e);
|
|
|
|
+ throw new RuntimeException("更新统计数据失败", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void updateTotalInfo() {
|
|
|
|
+ // 1. 获取新的统计数据
|
|
|
|
+ KgCountTotalInfo totalInfo = kgCountTotalInfoMapper.calculateTotalInfo();
|
|
|
|
+ if (totalInfo == null) {
|
|
|
|
+ throw new RuntimeException("计算总体统计数据失败");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 2. 查询现有数据
|
|
|
|
+ KgCountTotalInfo existingInfo = kgCountTotalInfoMapper.getCountTotalInfo();
|
|
|
|
+
|
|
|
|
+ // 3. 更新或插入数据
|
|
|
|
+ if (existingInfo != null) {
|
|
|
|
+ totalInfo.setId(existingInfo.getId());
|
|
|
|
+ kgCountTotalInfoMapper.update(totalInfo);
|
|
|
|
+ log.info("更新总体统计数据成功");
|
|
|
|
+ } else {
|
|
|
|
+ totalInfo.setId(1L);
|
|
|
|
+ kgCountTotalInfoMapper.save(totalInfo);
|
|
|
|
+ log.info("插入总体统计数据成功");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void updateDetailInfo() {
|
|
|
|
+ try {
|
|
|
|
+ // 1. 获取新的分类统计数据
|
|
|
|
+ List<KgCountInfo> detailInfoList = kgCountInfoMapper.calculateDetailInfo();
|
|
|
|
+ if (CollUtil.isEmpty(detailInfoList)) {
|
|
|
|
+ log.warn("没有获取到分类统计数据");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 2. 清空现有数据
|
|
|
|
+ kgCountInfoMapper.clearTable();
|
|
|
|
+ log.info("清空分类统计表成功");
|
|
|
|
+
|
|
|
|
+ // 3. 批量插入新数据
|
|
|
|
+ kgCountInfoMapper.batchInsert(detailInfoList);
|
|
|
|
+ log.info("插入分类统计数据成功,共 {} 条记录", detailInfoList.size());
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("更新分类统计数据失败", e);
|
|
|
|
+ throw new RuntimeException("更新分类统计数据失败", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|