浏览代码

处理事务问题

lixing 3 年之前
父节点
当前提交
f6898273bb
共有 13 个文件被更改,包括 139 次插入53 次删除
  1. 3 0
      src/main/java/com/persagy/apm/energy/report/monthly/outline/controller/ReportOutlineController.java
  2. 4 1
      src/main/java/com/persagy/apm/energy/report/monthly/outline/model/vo/ResponseReportOutlineListItemVO.java
  3. 11 0
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/IReportOutlineService.java
  4. 3 2
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/IBusinessReportBuilder.java
  5. 25 0
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/IBusinessReportGenerator.java
  6. 4 10
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/impl/BusinessReportBuilder.java
  7. 48 0
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/impl/BusinessReportGenerator.java
  8. 2 2
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/BusinessAreaReportGenerator.java
  9. 2 2
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/BusinessProjectReportGenerator.java
  10. 5 26
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/GenerateReportThreadPool.java
  11. 20 1
      src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/ReportOutlineServiceImpl.java
  12. 10 0
      src/main/java/com/persagy/apm/energy/report/saasweb/service/ISaasWebService.java
  13. 2 9
      src/main/java/com/persagy/apm/energy/report/saasweb/service/impl/SaasWebServiceImpl.java

+ 3 - 0
src/main/java/com/persagy/apm/energy/report/monthly/outline/controller/ReportOutlineController.java

@@ -96,6 +96,9 @@ public class ReportOutlineController {
                 ReportType reportType = reportTypeService.queryReportTypeDetail(item.getReportTypeId());
                 ResponseReportTypeItemVO responseReportTypeItemVO = ConvertReportTypeTool.INSTANCE.convert2ResponseItemDTO(reportType);
                 responseReportOutlineListItemVO.setReportType(responseReportTypeItemVO);
+
+                responseReportOutlineListItemVO.setBelongName(
+                        reportOutlineService.getBelongName(reportType.getBelongType(), item.getBelong()));
                 ReportStateEnum reportStateEnum = ReportStateEnum.getByType(item.getStatus());
                 if (reportStateEnum != null) {
                     responseReportOutlineListItemVO.setStatusName(reportStateEnum.getDesc());

+ 4 - 1
src/main/java/com/persagy/apm/energy/report/monthly/outline/model/vo/ResponseReportOutlineListItemVO.java

@@ -27,9 +27,12 @@ public class ResponseReportOutlineListItemVO {
     @ApiModelProperty("报告月份")
     private Date reportMonth;
 
-    @ApiModelProperty("报告所属类型")
+    @ApiModelProperty("报告所属")
     private String belong;
 
+    @ApiModelProperty("报告所属中文名称")
+    private String belongName;
+
     @ApiModelProperty("报告类型对象")
     private ResponseReportTypeItemVO reportType;
 

+ 11 - 0
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/IReportOutlineService.java

@@ -114,4 +114,15 @@ public interface IReportOutlineService {
      * @version V1.0 2021/5/31 9:47 上午
      */
     String recreateReportOutline(RecreateReportOutlineDTO recreateReportOutlineDTO);
+
+    /**
+     * 获取报告所属名称
+     *
+     * @param reportBelongType 报告所属类型
+     * @param belongId 报告所属id
+     * @return 报告所属中文名
+     * @author lixing
+     * @version V1.0 2021/6/3 4:19 下午
+     */
+    String getBelongName(String reportBelongType, String belongId);
 }

+ 3 - 2
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/IBusinessReportBuilder.java

@@ -20,13 +20,14 @@ import java.util.List;
  **/
 public interface IBusinessReportBuilder {
     /**
-     * 生成报告
+     * 生成报告详情
      *
      * @param reportOutline 报告outline对象
+     * @return 是否生成成功
      * @author lixing
      * @version V1.0 2021/5/24 4:09 下午
      */
-    void generateReport(ReportOutline reportOutline);
+    boolean generateNewReportDetail(ReportOutline reportOutline);
 
     /**
      * 删除之前的报告详情信息

+ 25 - 0
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/IBusinessReportGenerator.java

@@ -0,0 +1,25 @@
+package com.persagy.apm.energy.report.monthly.outline.service.builder;
+
+import com.persagy.apm.energy.report.monthly.detail.business.model.Platform;
+import com.persagy.apm.energy.report.monthly.detail.business.model.vo.CostVO;
+import com.persagy.apm.energy.report.monthly.detail.business.model.vo.PowerVO;
+import com.persagy.apm.energy.report.monthly.outline.model.ReportOutline;
+
+import java.util.List;
+
+/**
+ * 生成商业报告建造者接口
+ *
+ * @author lixing
+ * @version V1.0 2021/5/30 10:26 下午
+ **/
+public interface IBusinessReportGenerator {
+    /**
+     * 生成报告。如果生成失败,数据回滚并且报告状态修改为生成失败
+     *
+     * @param reportOutline 报告outline对象
+     * @author lixing
+     * @version V1.0 2021/5/24 4:09 下午
+     */
+    void generateReport(ReportOutline reportOutline);
+}

+ 4 - 10
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/impl/BusinessReportBuilder.java

@@ -38,16 +38,9 @@ public class BusinessReportBuilder implements IBusinessReportBuilder {
     @Autowired
     private IReportOutlineService reportOutlineService;
 
-    /**
-     * 生成报告
-     *
-     * @param reportOutline 报告outline对象
-     * @author lixing
-     * @version V1.0 2021/5/24 4:09 下午
-     */
-    @Transactional(rollbackFor=Exception.class)
     @Override
-    public void generateReport(ReportOutline reportOutline) {
+    @Transactional(rollbackFor = Exception.class)
+    public boolean generateNewReportDetail(ReportOutline reportOutline) {
         try {
             // 删除之前关联的报告信息
             deletePreviousReportDetail(reportOutline.getDetailId());
@@ -66,10 +59,11 @@ public class BusinessReportBuilder implements IBusinessReportBuilder {
             String detailId = businessDetailService.createReportBusinessDetail(addReportBusinessDetailDTO);
             reportOutline.setDetailId(detailId);
             updateReportOutlineInfoWhenSuccess(reportOutline);
+            return true;
         } catch (Exception e) {
             log.error("生成报告失败", e);
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            updateReportOutlineInfoWhenFailure(reportOutline);
+            return false;
         }
     }
 

+ 48 - 0
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/builder/impl/BusinessReportGenerator.java

@@ -0,0 +1,48 @@
+package com.persagy.apm.energy.report.monthly.outline.service.builder.impl;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.persagy.apm.energy.report.monthly.config.type.constant.enums.BelongTypeEnum;
+import com.persagy.apm.energy.report.monthly.config.type.constant.enums.BuildingTypeEnum;
+import com.persagy.apm.energy.report.monthly.config.type.model.ReportType;
+import com.persagy.apm.energy.report.monthly.config.type.service.IReportTypeService;
+import com.persagy.apm.energy.report.monthly.outline.model.ReportOutline;
+import com.persagy.apm.energy.report.monthly.outline.service.builder.IBusinessReportBuilder;
+import com.persagy.apm.energy.report.monthly.outline.service.builder.IBusinessReportGenerator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 商业项目报告建造者
+ *
+ * @author lixing
+ * @version V1.0 2021/5/12 2:53 下午
+ **/
+@Component
+@Slf4j
+public class BusinessReportGenerator implements IBusinessReportGenerator {
+    @Autowired
+    private IReportTypeService reportTypeService;
+
+    @Override
+    public void generateReport(ReportOutline reportOutline) {
+        String reportTypeId = reportOutline.getReportTypeId();
+        ReportType reportType = reportTypeService.queryReportTypeDetail(reportTypeId);
+
+        if (BuildingTypeEnum.BUSINESS.getType().equals(reportType.getBuildingType())) {
+            IBusinessReportBuilder businessReportBuilder;
+            // 如果后续类型增多,可以修改为switch,case或者用map存储映射
+            if (BelongTypeEnum.PROJECT.getType().equals(reportType.getBelongType())) {
+                businessReportBuilder = SpringUtil.getBean("businessProjectReportBuilder");
+            } else {
+                businessReportBuilder = SpringUtil.getBean("businessAreaReportBuilder");
+            }
+            // 生成报告,有事务控制。如果生成成功,更新报告状态为已生成
+            boolean generateSuccess = businessReportBuilder.generateNewReportDetail(reportOutline);
+            if (!generateSuccess) {
+                // 生成失败,回滚上述生成报告操作,更新报告状态为生成失败
+                businessReportBuilder.updateReportOutlineInfoWhenFailure(reportOutline);
+            }
+        }
+    }
+}

+ 2 - 2
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/BusinessAreaReportGenerator.java

@@ -5,13 +5,13 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 /**
- * 商业项目报告生成类
+ * 商业项目报告建造者
  *
  * @author lixing
  * @version V1.0 2021/5/12 2:53 下午
  **/
 @Component
 @Slf4j
-public class BusinessAreaReportGenerator extends BusinessReportBuilder {
+public class BusinessAreaReportBuilder extends BusinessReportBuilder {
 
 }

+ 2 - 2
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/BusinessProjectReportGenerator.java

@@ -8,14 +8,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
 /**
- * 商业项目报告生成类
+ * 商业项目报告建造者
  *
  * @author lixing
  * @version V1.0 2021/5/12 2:53 下午
  **/
 @Component
 @Slf4j
-public class BusinessProjectReportGenerator extends BusinessReportBuilder {
+public class BusinessProjectReportBuilder extends BusinessReportBuilder {
     @Override
     public PowerVO getComparePowerInfo(ReportOutline reportOutline) {
         return null;

+ 5 - 26
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/GenerateReportThreadPool.java

@@ -4,10 +4,8 @@ import cn.hutool.core.thread.ExecutorBuilder;
 import com.persagy.apm.common.context.poems.PoemsContext;
 import com.persagy.apm.energy.report.monthly.config.type.constant.enums.BelongTypeEnum;
 import com.persagy.apm.energy.report.monthly.config.type.constant.enums.BuildingTypeEnum;
-import com.persagy.apm.energy.report.monthly.config.type.model.ReportType;
-import com.persagy.apm.energy.report.monthly.config.type.service.IReportTypeService;
-import com.persagy.apm.energy.report.monthly.outline.constants.enums.ReportStateEnum;
 import com.persagy.apm.energy.report.monthly.outline.model.ReportOutline;
+import com.persagy.apm.energy.report.monthly.outline.service.builder.IBusinessReportGenerator;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -26,11 +24,7 @@ import java.util.concurrent.ThreadPoolExecutor;
 @Slf4j
 public class GenerateReportThreadPool {
     @Autowired
-    private BusinessProjectReportGenerator businessProjectReportGenerator;
-    @Autowired
-    private BusinessAreaReportGenerator businessAreaReportGenerator;
-    @Autowired
-    private IReportTypeService reportTypeService;
+    IBusinessReportGenerator businessReportGenerator;
 
     private final ExecutorService es;
 
@@ -56,24 +50,9 @@ public class GenerateReportThreadPool {
         String pd = PoemsContext.getContext().getPd();
         String loginDevice = PoemsContext.getContext().getLoginDevice();
         es.execute(() -> {
-            try {
-                PoemsContext.setContext(userId, loginDevice, pd);
-                String reportTypeId = reportOutline.getReportTypeId();
-                ReportType reportType = reportTypeService.queryReportTypeDetail(reportTypeId);
-                if (BuildingTypeEnum.BUSINESS.getType().equals(reportType.getBuildingType())) {
-                    if (BelongTypeEnum.PROJECT.getType().equals(reportType.getBelongType())) {
-                        synchronized (reportOutline.getId().intern()) {
-                            businessProjectReportGenerator.generateReport(reportOutline);
-                        }
-                    } else {
-                        synchronized (reportOutline.getId().intern()) {
-                            businessAreaReportGenerator.generateReport(reportOutline);
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                log.error("生成报告失败", e);
-                reportOutline.setStatus(ReportStateEnum.BUILD_FAILED.getType());
+            PoemsContext.setContext(userId, loginDevice, pd);
+            synchronized (reportOutline.getId().intern()) {
+                businessReportGenerator.generateReport(reportOutline);
             }
         });
     }

+ 20 - 1
src/main/java/com/persagy/apm/energy/report/monthly/outline/service/impl/ReportOutlineServiceImpl.java

@@ -30,6 +30,7 @@ import com.persagy.apm.energy.report.monthly.outline.service.IReportOutlineServi
 import com.persagy.apm.energy.report.saasweb.model.vo.PoemsProjectVO;
 import com.persagy.apm.energy.report.saasweb.model.vo.ReportAreaVO;
 import com.persagy.apm.energy.report.saasweb.model.vo.ReportProjectVO;
+import com.persagy.apm.energy.report.saasweb.model.vo.SimpleProjectVO;
 import com.persagy.apm.energy.report.saasweb.service.ISaasWebService;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -308,7 +309,7 @@ public class ReportOutlineServiceImpl extends ServiceImpl<ReportOutlineMapper, R
         // 排序信息
         if (CollectionUtils.isEmpty(pageQueryReportOutlineDTO.getOrders())) {
             // 默认按创建时间倒序排序
-            queryWrapper.orderBy(true, false, ReportOutline.PROP_CREATIONTIME);
+            queryWrapper.orderBy(true, false, ReportOutline.PROP_MODIFIEDTIME);
         } else {
             List<Sort> orders = pageQueryReportOutlineDTO.getOrders();
             for (Sort sort : orders) {
@@ -365,4 +366,22 @@ public class ReportOutlineServiceImpl extends ServiceImpl<ReportOutlineMapper, R
         ReportOutline reportOutline = checkExists(id);
         return generateReport(reportOutline);
     }
+
+    @Override
+    public String getBelongName(String reportBelongType, String belongId) {
+        String belongName = "";
+        if (BelongTypeEnum.PROJECT.getType().equals(reportBelongType)) {
+            SimpleProjectVO simpleProjectInfo = saasWebService.getSimpleProjectInfo(belongId);
+            if (simpleProjectInfo != null) {
+                belongName = simpleProjectInfo.getProjectName();
+            }
+        }
+        if (BelongTypeEnum.AREA.getType().equals(reportBelongType)) {
+            ReportAreaVO reportAreaBaseInfo = saasWebService.getReportAreaBaseInfo(belongId);
+            if (reportAreaBaseInfo != null) {
+                belongName = reportAreaBaseInfo.getAreaName();
+            }
+        }
+        return belongName;
+    }
 }

+ 10 - 0
src/main/java/com/persagy/apm/energy/report/saasweb/service/ISaasWebService.java

@@ -67,6 +67,16 @@ public interface ISaasWebService {
     ReportAreaVO getReportAreaInfo(String areaCode, String buildingType);
 
     /**
+     * 获取区域的基本信息
+     *
+     * @param areaCode 区域编码
+     * @return 区域的基本信息
+     * @author lixing
+     * @version V1.0 2021/5/31 6:04 下午
+     */
+    ReportAreaVO getReportAreaBaseInfo(String areaCode);
+
+    /**
      * 获取分区下所有的项目
      *
      * @param areaCode 分区编码

+ 2 - 9
src/main/java/com/persagy/apm/energy/report/saasweb/service/impl/SaasWebServiceImpl.java

@@ -149,15 +149,8 @@ public class SaasWebServiceImpl implements ISaasWebService {
         return reportAreaVO;
     }
 
-    /**
-     * 获取区域的基本信息
-     *
-     * @param areaCode 区域编码
-     * @return 区域的基本信息
-     * @author lixing
-     * @version V1.0 2021/5/31 6:04 下午
-     */
-    private ReportAreaVO getReportAreaBaseInfo(String areaCode) {
+    @Override
+    public ReportAreaVO getReportAreaBaseInfo(String areaCode) {
         ReportAreaVO reportAreaVO = new ReportAreaVO();
         // 查询管理分区信息
         QueryPartitionDTO queryPartitionDTO = new QueryPartitionDTO();