Browse Source

运维接口增加管理界面

jingyuanchao 1 year ago
parent
commit
0e1daa0c42
16 changed files with 446 additions and 97 deletions
  1. 19 1
      project_data/sql/0.0.8/soc/soc.sql
  2. 73 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/compensate/domain/CoreCompensateLog.java
  3. 2 2
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/compensate/dto/CompensateDto.java
  4. 17 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/compensate/dto/CompensatePageDto.java
  5. 50 38
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java
  6. 19 10
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/controller/CompensateController.java
  7. 1 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/interfaces/CompensateService.java
  8. 20 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/mapper/CoreCompensateLogMapper.java
  9. 25 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/service/ICoreCompensateLogService.java
  10. 88 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/service/impl/CoreCompensateLogServiceImpl.java
  11. 28 10
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillPlanServiceImpl.java
  12. 29 12
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingPlanServiceImpl.java
  13. 29 12
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java
  14. 24 8
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java
  15. 19 0
      soc-modules/soc-modules-core/src/main/resources/mapper/compensate/CoreCompensateLogMapper.xml
  16. 3 3
      soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java

+ 19 - 1
project_data/sql/0.0.8/soc/soc.sql

@@ -77,6 +77,21 @@ create table if not exists core_reminder_template(
 )
     comment '短信提醒内容模板表';
 
+create table if not exists core_compensate_log
+(
+    id            int auto_increment
+        primary key,
+    business_type varchar(36)  null comment '计划类型',
+    plan_id       bigint       null comment '计划id',
+    plan_name     varchar(125) null comment '计划名称',
+    org_id        bigint       null comment '机构id',
+    org_name      varchar(125) null comment '机构名称',
+    org_path      varchar(225) null comment '机构路径',
+    time          int          null,
+    res           tinyint      null comment '执行结果'
+)
+    comment '业务数据补偿记录表';
+
 
 -- 新增短信提醒配置菜单
 delete from sys_menu where id in (1778733750137446402,1780414461203460097,1780414537732730882,1780414574810378241,1780414761414963201,1780414968466780162);
@@ -277,4 +292,7 @@ UPDATE iot_alarm_data
 SET alarm_value = REPLACE ( alarm_value, '%RH', '°C' )
 WHERE
     alarm_value IS NOT NULL
-  AND `field_code` = '4183_1';
+  AND `field_code` = '4183_1';
+
+-- 新增计划任务补偿运维界面
+INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, platform_type, icon, image_path, create_by, create_time, update_by, update_time, remark) VALUES (1782245721165127681, '任务数据补偿', 2, 5, 'compensate', 'system/compensate/index', null, 1, 0, 'C', '0', '0', null, '1', 'edit', null, '超级管理员', '2024-04-22 11:11:54', '', null, '');

+ 73 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/compensate/domain/CoreCompensateLog.java

@@ -0,0 +1,73 @@
+package com.xunmei.common.core.domain.compensate.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 业务数据补偿记录表
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-04-22
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("core_compensate_log")
+@ApiModel(value="CoreCompensateLog对象", description="业务数据补偿记录表")
+public class CoreCompensateLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "计划类型")
+    @TableField("business_type")
+    private String businessType;
+
+    @ApiModelProperty(value = "计划id")
+    @TableField("plan_id")
+    private Long planId;
+
+    @ApiModelProperty(value = "计划名称")
+    @TableField("plan_name")
+    private String planName;
+
+    @ApiModelProperty(value = "机构id")
+    @TableField("org_id")
+    private Long orgId;
+
+    @ApiModelProperty(value = "机构名称")
+    @TableField("org_name")
+    private String orgName;
+
+    @ApiModelProperty(value = "机构路径")
+    @TableField("org_path")
+    private String orgPath;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "执行时间")
+    @TableField("time")
+    private Date time;
+
+    @ApiModelProperty(value = "执行是否成功")
+    @TableField("res")
+    private Boolean res;
+
+    @ApiModelProperty(value = "错误信息")
+    @TableField("error_msg")
+    private String errorMsg;
+
+
+}

+ 2 - 2
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/dto/CompensateDto.java → soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/compensate/dto/CompensateDto.java

@@ -1,4 +1,4 @@
-package com.xunmei.core.compense.dto;
+package com.xunmei.common.core.domain.compensate.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -14,7 +14,7 @@ public class CompensateDto {
      */
     @NotNull(message = "补偿类型不能为空")
     @ApiModelProperty(value = "补偿编码")
-    private String code;
+    private String businessType;
 
     @NotNull(message = "补偿计划ID不能为空")
     @ApiModelProperty(value = "补偿计划ID")

+ 17 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/compensate/dto/CompensatePageDto.java

@@ -0,0 +1,17 @@
+package com.xunmei.common.core.domain.compensate.dto;
+
+
+import com.xunmei.common.core.web.domain.PageRequest;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CompensatePageDto extends PageRequest {
+    private String businessType;
+
+    private Boolean res;
+
+    private Date[] range;
+
+}

+ 50 - 38
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/access/service/impl/TMonitoringRetrievalPlanServiceImpl.java

@@ -42,8 +42,9 @@ import com.xunmei.core.access.service.ITMonitoringRetrievalPlanService;
 import com.xunmei.core.access.service.ITMonitoringRetrievalPlanToExecOrgService;
 import com.xunmei.core.access.vo.AccessPdfVO;
 import com.xunmei.core.access.vo.TMonitoringRetrievalPlanVO;
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
 import com.xunmei.core.compense.interfaces.CompensateService;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
 import com.xunmei.core.reminder.service.ICoreReminderConfigurationService;
 import com.xunmei.core.reminder.service.ICoreReminderScheduleService;
@@ -129,6 +130,8 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
     @Autowired
     @Lazy
     ICoreReminderScheduleService reminderScheduleService;
+    @Autowired
+    ICoreCompensateLogService compensateLogService;
 
     @Override
     public TableDataInfo selectPage(TMonitoringRetrievalPlan tMonitoringRetrievalPlan) {
@@ -592,7 +595,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
     public int distribute(Long id, Boolean immediateEffect) throws ParseException {
         //查询
         TMonitoringRetrievalPlan publishPlan = tMonitoringRetrievalPlanMapper.selectById(id);
-        Integer oldPlanStatus=publishPlan.getPlanStatus();
+        Integer oldPlanStatus = publishPlan.getPlanStatus();
         publishPlan.setImmediately(immediateEffect);
         publishPlan.setIsDistribute("1");
         publishPlan.setPlanStatus(1);
@@ -615,7 +618,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
 
 
         final CompletableFuture<List<TMonitoringRetrievalPlan>> planListFuture = CompletableFuture.supplyAsync(() -> {
-            return getNeedCreateTaskPlans(loginUserOrg, publishPlan,oldPlanStatus);
+            return getNeedCreateTaskPlans(loginUserOrg, publishPlan, oldPlanStatus);
         }, threadPoolTaskExecutor);
 
         planListFuture.thenAcceptAsync((result) -> {
@@ -632,7 +635,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
         return i;
     }
 
-    private List<TMonitoringRetrievalPlan> getNeedCreateTaskPlans(SysOrg loginUserOrg, TMonitoringRetrievalPlan publishPlan,Integer oldPlanStatus) {
+    private List<TMonitoringRetrievalPlan> getNeedCreateTaskPlans(SysOrg loginUserOrg, TMonitoringRetrievalPlan publishPlan, Integer oldPlanStatus) {
         List<TMonitoringRetrievalPlan> tempPlans = new ArrayList<>();
         SysOrg publishPlanOrg = remoteOrgService.selectSysOrgById(publishPlan.getOrgId(), SecurityConstants.INNER);
         //如果登录当前是省联社 办事处
@@ -646,11 +649,9 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             //如果已存在子计划
             if (CollectionUtils.isNotEmpty(existSubPlanlist)) {
                 // 停用状态再次下发,肯定存在已完成任务,之前的子计划不会删除, 但是又有可能修改了具体执行机构 此时需要处理 历史子计划
-                if(ObjectUtil.equal(oldPlanStatus,2))
-                {
-                    tempPlans.addAll(dealSubPlanWithHistorySubPlan(existSubPlanlist,publishPlan,publishPlanOrg));
-                }
-                else {
+                if (ObjectUtil.equal(oldPlanStatus, 2)) {
+                    tempPlans.addAll(dealSubPlanWithHistorySubPlan(existSubPlanlist, publishPlan, publishPlanOrg));
+                } else {
                     for (TMonitoringRetrievalPlan tm : existSubPlanlist) {
                         tm.setPlanStatus(1);
                         tm.setIsDistribute("1");
@@ -662,7 +663,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             } else {
                 // 计划机构类型 是 省联社或者办事处及行社以下的机构类型 才创建子计划
                 if (!checkOrgType(Integer.parseInt(publishPlan.getOrgType()))) {
-                    tempPlans.addAll(buildSubPlans(publishPlan,publishPlanOrg));
+                    tempPlans.addAll(buildSubPlans(publishPlan, publishPlanOrg));
 //                    // 查询当前计划的具体执行机构
 //                    List<TMonitoringRetrievalPlanToExecOrg> planExecOrgList = tMonitoringRetrievalPlanToExecOrgMapper.selectByMap(MapUtil.of("plan_id", publishPlan.getId()));
 //
@@ -720,8 +721,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                     tempPlans.add(publishPlan);
                 }
             }
-        }
-        else // 行社计划,没有子计划,直接生成任务
+        } else // 行社计划,没有子计划,直接生成任务
         {
             publishPlan.setCreateType(1);
             publishPlan.setIsDistribute("1");
@@ -734,15 +734,15 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
 
     /**
      * 停用状态再次下发,肯定存在已完成任务,之前的子计划不会删除, 但是又有可能修改了具体执行机构 此时需要处理 历史子计划
+     *
      * @param existSubPlanlist
      * @param publishPlan
      * @param publishPlanOrg
      * @return
      */
-    private List<TMonitoringRetrievalPlan> dealSubPlanWithHistorySubPlan(List<TMonitoringRetrievalPlan> existSubPlanlist, TMonitoringRetrievalPlan publishPlan,SysOrg publishPlanOrg) {
+    private List<TMonitoringRetrievalPlan> dealSubPlanWithHistorySubPlan(List<TMonitoringRetrievalPlan> existSubPlanlist, TMonitoringRetrievalPlan publishPlan, SysOrg publishPlanOrg) {
         List<TMonitoringRetrievalPlan> tempPlans = new ArrayList<>();
-        if(ObjectUtil.isNotEmpty(existSubPlanlist))
-        {
+        if (ObjectUtil.isNotEmpty(existSubPlanlist)) {
             // 查询当前计划的具体执行机构
             List<TMonitoringRetrievalPlanToExecOrg> planExecOrgList = tMonitoringRetrievalPlanToExecOrgMapper.selectByMap(MapUtil.of("plan_id", publishPlan.getId()));
 
@@ -762,18 +762,16 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
 
             // 找出历史子计划 在新的需要创建计划列表中不存在的删除掉
             List<TMonitoringRetrievalPlan> needDeletedHistorySubPlan = existSubPlanlist.stream().filter(x -> !subPlanOrglist.stream().anyMatch(y -> ObjectUtil.equal(y.getId(), x.getOrgId()))).collect(toList());
-            if(ObjectUtil.isNotEmpty(needDeletedHistorySubPlan))
-            {
-                needDeletedHistorySubPlan.forEach(x->x.setIsDeleted(1L));
+            if (ObjectUtil.isNotEmpty(needDeletedHistorySubPlan)) {
+                needDeletedHistorySubPlan.forEach(x -> x.setIsDeleted(1L));
                 this.saveOrUpdateBatch(needDeletedHistorySubPlan);
             }
 
             for (SysOrg subPlanOrg : subPlanOrglist) {
                 Optional<TMonitoringRetrievalPlan> historySubPlanOpt = existSubPlanlist.stream().filter(x -> x.getOrgId().equals(subPlanOrg.getId())).findFirst();
                 // 该机构下存在历史子计划
-                if(historySubPlanOpt.isPresent())
-                {
-                    TMonitoringRetrievalPlan historySubPlan=historySubPlanOpt.get();
+                if (historySubPlanOpt.isPresent()) {
+                    TMonitoringRetrievalPlan historySubPlan = historySubPlanOpt.get();
                     historySubPlan.setIsDistribute("1");
                     historySubPlan.setCreateType(1);
                     historySubPlan.setPlanStatus(1);
@@ -789,8 +787,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                             needAddSubPlanExecOrgList.add(tempExecOrg);
                         });
                     }
-                }
-                else {
+                } else {
                     TMonitoringRetrievalPlan tMonitoringRetrievalPlan1 = new TMonitoringRetrievalPlan();
                     BeanUtils.copyProperties(publishPlan, tMonitoringRetrievalPlan1);
                     tMonitoringRetrievalPlan1.setId(IdWorker.getId());
@@ -822,15 +819,14 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
                 tempPlans.addAll(needSaveSubPlans);
             }
 
-        }
-        else // 不存在历史子计划,直接全新创建
+        } else // 不存在历史子计划,直接全新创建
         {
-          return buildSubPlans(publishPlan,publishPlanOrg);
+            return buildSubPlans(publishPlan, publishPlanOrg);
         }
-        return  tempPlans;
+        return tempPlans;
     }
 
-    private List<TMonitoringRetrievalPlan> buildSubPlans(TMonitoringRetrievalPlan publishPlan,SysOrg publishPlanOrg) {
+    private List<TMonitoringRetrievalPlan> buildSubPlans(TMonitoringRetrievalPlan publishPlan, SysOrg publishPlanOrg) {
 
         List<TMonitoringRetrievalPlan> tempPlans = new ArrayList<>();
         // 查询当前计划的具体执行机构
@@ -881,7 +877,7 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             });
             tempPlans.addAll(needAddSubPlans);
         }
-       return tempPlans;
+        return tempPlans;
     }
 
     private List<TMonitoringRetrievalPlanToExecOrg> buildPlanExecOrgs(List<TMonitoringRetrievalPlan> plans, List<SysOrg> execOrglist) {
@@ -1693,35 +1689,45 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
     @Override
     public void compensate(CompensateDto compensateDto) {
         TMonitoringRetrievalPlan retrievalPlan = getById(compensateDto.getPlanId());
-
+        String errorMsg = StringUtil.EMPTY_STRING;
         if (ObjectUtil.isNull(retrievalPlan)) {
-            throw new ServiceException("计划不存在");
+            errorMsg = "计划不存在";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), null, null, errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.notEqual(retrievalPlan.getPlanStatus(), PlanStatus.USING.getCode())) {
-            throw new ServiceException("计划尚未下发或已停用");
+            errorMsg = "计划尚未下发或已停用";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.equal(retrievalPlan.getIsDeleted(), "1")) {
-            throw new ServiceException("计划状态异常");
+            errorMsg = "计划已删除";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         List<SysOrgVO> orgCacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
         //推断计划 创建任务
-        deducePlanAndBuildTask(retrievalPlan, compensateDto.getOrgIdList(), orgCacheList);
+        deducePlanAndBuildTask(retrievalPlan, compensateDto.getOrgIdList(), orgCacheList, errorMsg);
     }
 
     private static final Set<OrgTypeEnum> INVALID_ORG_TYPES = Sets.newHashSet(OrgTypeEnum.SHEGN_LIAN_SHE, OrgTypeEnum.BAN_SHI_CHU, OrgTypeEnum.DIQU_HANG_SHE);
 
-    private void deducePlanAndBuildTask(TMonitoringRetrievalPlan retrievalPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
+    private void deducePlanAndBuildTask(TMonitoringRetrievalPlan retrievalPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList, String errorMsg) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(toList());
         if (orgList.isEmpty()) {
-            throw new ServiceException("未查询到orgIdList中指定的机构信息");
+            errorMsg = "未查询到指定的机构信息";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
         List<Long> idList = orgList.stream().map(SysOrgVO::getId).collect(toList());
         List<Integer> typeList = orgList.stream().map(SysOrgVO::getType).distinct().collect(toList());
         if (typeList.size() > 1) {
-            throw new ServiceException("orgIdList中指定的机构信息存在多种机构类型");
+            errorMsg = "orgIdList中指定的机构信息存在多种机构类型";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         OrgTypeEnum orgTypeEnum = OrgTypeEnum.getOrgTypeEnum(typeList.get(0));
@@ -1742,11 +1748,15 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             List<TMonitoringRetrievalPlan> reallyPlanList = findReallyPlanIdList(hsPlanIdList, hsOrgIdList);
             boolean underHsOrgType = (boolean) map.get("underHsOrgType");
             create(reallyPlanList, underHsOrgType ? idList : null);
+            compensateLogService.buildLog(getBusinessPlanType(), false, orgIdList, retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+
             return;
         }
         // 行社自建计划
         if (INVALID_ORG_TYPES.contains(orgTypeEnum)) {
-            throw new ServiceException("orgIdList中传递机构信息错误!与计划信息不匹配");
+            errorMsg = "orgIdList中传递机构信息错误!与计划信息不匹配";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         List<TMonitoringRetrievalPlan> plans = Lists.newArrayList(retrievalPlan);
@@ -1756,6 +1766,8 @@ public class TMonitoringRetrievalPlanServiceImpl extends ServiceImpl<TMonitoring
             //其实这里如果真是传入了行社以下的机构,那么大概率这里的reallyPlanIdList 计划id也只会有一个元素
             create(plans, idList);
         }
+        compensateLogService.buildLog(getBusinessPlanType(), false, orgIdList, retrievalPlan.getId(), retrievalPlan.getPlanName(), errorMsg);
+
     }
 
     private void create(List<TMonitoringRetrievalPlan> planList, List<Long> idList) {

+ 19 - 10
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/controller/CompensateController.java

@@ -1,10 +1,16 @@
 package com.xunmei.core.compense.controller;
 
 
+import com.xunmei.common.core.domain.compensate.domain.CoreCompensateLog;
+import com.xunmei.common.core.enums.BusinessPlanType;
 import com.xunmei.common.core.web.domain.AjaxResult;
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensatePageDto;
 import com.xunmei.core.compense.handel.CompensateHandel;
-import com.xunmei.common.core.enums.BusinessPlanType;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -12,20 +18,23 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 
 @RestController
-@RequestMapping
+@RequestMapping("/compensate")
 public class CompensateController {
 
+    @Autowired
+    ICoreCompensateLogService compensateLogService;
 
 
-    @RequestMapping("/compensate")
-    public AjaxResult compensate(@RequestBody @Valid CompensateDto compensateDto){
-
-        BusinessPlanType businessPlanType = BusinessPlanType.getBusinessPlanType(compensateDto.getCode());
-
 
+    @PostMapping
+    public AjaxResult compensate(@RequestBody @Valid CompensateDto compensateDto){
+        BusinessPlanType businessPlanType = BusinessPlanType.getBusinessPlanType(compensateDto.getBusinessType());
         CompensateHandel.getCompensateService(businessPlanType).compensate(compensateDto);
-
-
         return AjaxResult.success();
     }
+
+    @PostMapping("/page")
+    public TableDataInfo<CoreCompensateLog> page(@RequestBody CompensatePageDto req){
+        return compensateLogService.selectPage(req);
+    }
 }

+ 1 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/interfaces/CompensateService.java

@@ -1,6 +1,6 @@
 package com.xunmei.core.compense.interfaces;
 
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
 import com.xunmei.common.core.enums.BusinessPlanType;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 

+ 20 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/mapper/CoreCompensateLogMapper.java

@@ -0,0 +1,20 @@
+package com.xunmei.core.compense.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xunmei.common.core.domain.compensate.domain.CoreCompensateLog;
+import com.xunmei.common.core.domain.compensate.dto.CompensatePageDto;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 业务数据补偿记录表 Mapper 接口
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-04-22
+ */
+public interface CoreCompensateLogMapper extends BaseMapper<CoreCompensateLog> {
+
+    Page<CoreCompensateLog> selectPageData(Page<CoreCompensateLog> pageRequest, @Param("req") CompensatePageDto req);
+}

+ 25 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/service/ICoreCompensateLogService.java

@@ -0,0 +1,25 @@
+package com.xunmei.core.compense.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.compensate.domain.CoreCompensateLog;
+import com.xunmei.common.core.enums.BusinessPlanType;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.core.domain.compensate.dto.CompensatePageDto;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 业务数据补偿记录表 服务类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-04-22
+ */
+public interface ICoreCompensateLogService extends IService<CoreCompensateLog> {
+
+
+    void buildLog(BusinessPlanType businessPlanType, boolean isException, List<Long> orgIdList, Long planId, String planName,String errorMsg);
+
+    TableDataInfo<CoreCompensateLog> selectPage(CompensatePageDto req);
+}

+ 88 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/compense/service/impl/CoreCompensateLogServiceImpl.java

@@ -0,0 +1,88 @@
+package com.xunmei.core.compense.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.domain.compensate.domain.CoreCompensateLog;
+import com.xunmei.common.core.enums.BusinessPlanType;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.common.core.domain.compensate.dto.CompensatePageDto;
+import com.xunmei.core.compense.mapper.CoreCompensateLogMapper;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
+import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.vo.SysOrgVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ * 业务数据补偿记录表 服务实现类
+ * </p>
+ *
+ * @author jingYuanChao
+ * @since 2024-04-22
+ */
+@Service
+public class CoreCompensateLogServiceImpl extends ServiceImpl<CoreCompensateLogMapper, CoreCompensateLog> implements ICoreCompensateLogService {
+
+    @Autowired
+    private RemoteOrgService orgService;
+
+    @Override
+    public TableDataInfo<CoreCompensateLog> selectPage(CompensatePageDto req) {
+        if (req.getCheckSub()) {
+            SysOrg sysOrg = orgService.selectOrgById(req.getOrgId(), SecurityConstants.INNER);
+            req.setOrgPath(sysOrg.getPath());
+        }
+        Page<CoreCompensateLog> pageRequest = req.getPageRequest();
+        Page<CoreCompensateLog> page = baseMapper.selectPageData(pageRequest, req);
+        return TableDataInfo.build(page);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    public void buildLog(BusinessPlanType businessPlanType, boolean isException, List<Long> orgIdList, Long planId, String planName, String errorMsg) {
+        if (null == orgIdList || orgIdList.isEmpty()) {
+            CoreCompensateLog compensateLog = new CoreCompensateLog();
+            populateBean(compensateLog, businessPlanType, !isException, planId, planName, errorMsg);
+
+            return;
+        }
+        List<SysOrgVO> cacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+        for (Long orgId : orgIdList) {
+            Optional<SysOrgVO> optional = cacheList.stream().filter(r -> ObjectUtil.equal(r.getId(), orgId)).findFirst();
+            if (!optional.isPresent()) {
+                continue;
+            }
+            SysOrgVO org = optional.get();
+            CoreCompensateLog compensateLog = new CoreCompensateLog();
+            compensateLog.setOrgId(org.getId());
+            compensateLog.setOrgName(org.getShortName());
+            compensateLog.setOrgPath(org.getPath());
+            populateBean(compensateLog, businessPlanType, !isException, planId, planName, errorMsg);
+        }
+    }
+
+    private void populateBean(CoreCompensateLog compensateLog, BusinessPlanType businessPlanType, boolean isException, Long planId, String planName, String errorMsg) {
+        compensateLog.setBusinessType(businessPlanType.getCode());
+        compensateLog.setPlanId(planId);
+        compensateLog.setPlanName(planName);
+        compensateLog.setTime(new Date());
+        compensateLog.setRes(isException);
+        compensateLog.setErrorMsg(errorMsg);
+        baseMapper.insert(compensateLog);
+    }
+}
+
+
+

+ 28 - 10
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillPlanServiceImpl.java

@@ -47,8 +47,9 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
 import com.xunmei.core.compense.interfaces.CompensateService;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
 import com.xunmei.core.drill.mapper.*;
 import com.xunmei.core.drill.service.ICoreDrillPlanService;
 import com.xunmei.core.drill.service.ICoreDrillPlanToExecOrgService;
@@ -62,6 +63,7 @@ import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import com.xunmei.system.api.vo.SysOrgVO;
+import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
@@ -122,6 +124,8 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     @Autowired
     @Lazy
     ICoreReminderScheduleService reminderScheduleService;
+    @Autowired
+    ICoreCompensateLogService compensateLogService;
 
     @Override
     public TableDataInfo<CoreDrillPlanPageVo> selectPage(CoreDrillPlanPageDto request) {
@@ -1015,36 +1019,46 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
 
         CoreDrillPlan drillPlan = getById(compensateDto.getPlanId());
 
+        String errorMsg= StringUtil.EMPTY_STRING;
         if (ObjectUtil.isNull(drillPlan)) {
-            throw new ServiceException("计划不存在");
+            errorMsg = "计划不存在";
+            compensateLogService.buildLog(getBusinessPlanType(),true,compensateDto.getOrgIdList(),null,null,errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.notEqual(drillPlan.getPlanStatus(), DrillPlanStatus.USING.getCode())) {
-            throw new ServiceException("计划尚未下发或已停用");
+            errorMsg= "计划尚未下发或已停用";
+            compensateLogService.buildLog(getBusinessPlanType(),true,compensateDto.getOrgIdList(), drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.equal(drillPlan.getDeleted(), 1)) {
-            throw new ServiceException("计划状态异常");
+            errorMsg= "计划已删除";
+            compensateLogService.buildLog(getBusinessPlanType(),true,compensateDto.getOrgIdList(), drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         List<SysOrgVO> orgCacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
         //推断计划
-        deducePlanAndBuildTask(drillPlan, compensateDto.getOrgIdList(), orgCacheList);
-
+        deducePlanAndBuildTask(drillPlan, compensateDto.getOrgIdList(), orgCacheList,errorMsg);
     }
 
 
     private static final Set<OrgTypeEnum> INVALID_ORG_TYPES = Sets.newHashSet(OrgTypeEnum.SHEGN_LIAN_SHE, OrgTypeEnum.BAN_SHI_CHU, OrgTypeEnum.DIQU_HANG_SHE);
 
-    private void deducePlanAndBuildTask(CoreDrillPlan drillPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
+    private void deducePlanAndBuildTask(CoreDrillPlan drillPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList,String errorMsg) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(toList());
         if (orgList.isEmpty()) {
-            throw new ServiceException("未查询到orgIdList中指定的机构信息");
+            errorMsg= "未查询到指定的机构信息";
+            compensateLogService.buildLog(getBusinessPlanType(),true,orgIdList, drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
         List<Long> idList = orgList.stream().map(SysOrgVO::getId).collect(toList());
         List<Integer> typeList = orgList.stream().map(SysOrgVO::getType).distinct().collect(toList());
         if (typeList.size() > 1) {
-            throw new ServiceException("orgIdList中指定的机构信息存在多种机构类型");
+            errorMsg= "orgIdList中指定的机构信息存在多种机构类型";
+            compensateLogService.buildLog(getBusinessPlanType(),true,orgIdList, drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         OrgTypeEnum orgTypeEnum = OrgTypeEnum.getOrgTypeEnum(typeList.get(0));
@@ -1067,11 +1081,14 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
             for (CoreDrillPlan plan : reallyPlanIdList) {
                 create(plan, underHsOrgType ? idList : null);
             }
+            compensateLogService.buildLog(getBusinessPlanType(),false,orgIdList, drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
             return;
         }
         // 行社自建计划
         if (INVALID_ORG_TYPES.contains(orgTypeEnum)) {
-            throw new ServiceException("orgIdList中传递机构信息错误!与计划信息不匹配");
+            errorMsg= "orgIdList中传递机构信息错误!与计划信息不匹配";
+            compensateLogService.buildLog(getBusinessPlanType(),true,orgIdList, drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (OrgTypeEnum.HANG_SHE.equals(orgTypeEnum)) {
@@ -1080,6 +1097,7 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
             //其实这里如果真是传入了行社以下的机构,那么大概率这里的reallyPlanIdList 计划id也只会有一个元素
             create(drillPlan, idList);
         }
+        compensateLogService.buildLog(getBusinessPlanType(),false,orgIdList, drillPlan.getId(), drillPlan.getPlanName(), errorMsg);
 
     }
 

+ 29 - 12
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingPlanServiceImpl.java

@@ -48,8 +48,9 @@ import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
 import com.xunmei.core.compense.interfaces.CompensateService;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
 import com.xunmei.core.edu.mapper.CoreEduTrainingPlanMapper;
 import com.xunmei.core.edu.mapper.CoreEduTrainingPlanToExecOrgMapper;
 import com.xunmei.core.edu.mapper.CoreEduTrainingPlanToRoleMapper;
@@ -66,6 +67,7 @@ import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import com.xunmei.system.api.vo.SysOrgVO;
+import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
@@ -124,7 +126,8 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     @Autowired
     @Lazy
     ICoreReminderScheduleService reminderScheduleService;
-
+    @Autowired
+    ICoreCompensateLogService compensateLogService;
     @Override
     public TableDataInfo selectPage(CoreEduTrainingPlanPageDto request) throws InterruptedException {
 
@@ -987,35 +990,45 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     public void compensate(CompensateDto compensateDto) {
 
         CoreEduTrainingPlan eduTrainingPlan = getById(compensateDto.getPlanId());
-
+        String errorMsg= StringUtil.EMPTY_STRING;
         if (ObjectUtil.isNull(eduTrainingPlan)) {
-            throw new ServiceException("计划不存在");
+            errorMsg = "计划不存在";
+            compensateLogService.buildLog(getBusinessPlanType(),true,compensateDto.getOrgIdList(),null,null,errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.notEqual(eduTrainingPlan.getPlanStatus(), DrillPlanStatus.USING.getCode())) {
-            throw new ServiceException("计划尚未下发或已停用");
+            errorMsg= "计划尚未下发或已停用";
+            compensateLogService.buildLog(getBusinessPlanType(),true,compensateDto.getOrgIdList(),eduTrainingPlan.getId(),eduTrainingPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.equal(eduTrainingPlan.getDeleted(), 1)) {
-            throw new ServiceException("计划状态异常");
+            errorMsg= "计划状态异常";
+            compensateLogService.buildLog(getBusinessPlanType(),true,compensateDto.getOrgIdList(),eduTrainingPlan.getId(),eduTrainingPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         List<SysOrgVO> orgCacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
         //推断计划
-        deducePlanAndBuildTask(eduTrainingPlan, compensateDto.getOrgIdList(), orgCacheList);
+        deducePlanAndBuildTask(eduTrainingPlan, compensateDto.getOrgIdList(), orgCacheList,errorMsg);
     }
 
     private static final Set<OrgTypeEnum> INVALID_ORG_TYPES = Sets.newHashSet(OrgTypeEnum.SHEGN_LIAN_SHE, OrgTypeEnum.BAN_SHI_CHU, OrgTypeEnum.DIQU_HANG_SHE);
 
-    private void deducePlanAndBuildTask(CoreEduTrainingPlan trainingPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
+    private void deducePlanAndBuildTask(CoreEduTrainingPlan trainingPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList,String errorMsg) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(toList());
         if (orgList.isEmpty()) {
-            throw new ServiceException("未查询到orgIdList中指定的机构信息");
+            errorMsg= "未查询到指定的机构信息";
+            compensateLogService.buildLog(getBusinessPlanType(),true,orgIdList,trainingPlan.getId(),trainingPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
         List<Long> idList = orgList.stream().map(SysOrgVO::getId).collect(toList());
         List<Integer> typeList = orgList.stream().map(SysOrgVO::getType).distinct().collect(toList());
         if (typeList.size() > 1) {
-            throw new ServiceException("orgIdList中指定的机构信息存在多种机构类型");
+            errorMsg= "orgIdList中指定的机构信息存在多种机构类型";
+            compensateLogService.buildLog(getBusinessPlanType(),true,orgIdList,trainingPlan.getId(),trainingPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         OrgTypeEnum orgTypeEnum = OrgTypeEnum.getOrgTypeEnum(typeList.get(0));
@@ -1038,11 +1051,15 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
             for (CoreEduTrainingPlan plan : reallyPlanIdList) {
                 create(plan, underHsOrgType ? idList : null, threadPoolTaskExecutor);
             }
+            compensateLogService.buildLog(getBusinessPlanType(),false,orgIdList, trainingPlan.getId(), trainingPlan.getPlanName(), errorMsg);
+
             return;
         }
         // 行社自建计划
         if (INVALID_ORG_TYPES.contains(orgTypeEnum)) {
-            throw new ServiceException("orgIdList中传递机构信息错误!与计划信息不匹配");
+            errorMsg= "orgIdList中传递机构信息错误!与计划信息不匹配";
+            compensateLogService.buildLog(getBusinessPlanType(),true,orgIdList,trainingPlan.getId(),trainingPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (OrgTypeEnum.HANG_SHE.equals(orgTypeEnum)) {
@@ -1051,7 +1068,7 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
             //其实这里如果真是传入了行社以下的机构,那么大概率这里的reallyPlanIdList 计划id也只会有一个元素
             create(trainingPlan, idList, threadPoolTaskExecutor);
         }
-
+        compensateLogService.buildLog(getBusinessPlanType(),false,orgIdList, trainingPlan.getId(), trainingPlan.getPlanName(), errorMsg);
     }
 
     private void create(CoreEduTrainingPlan plan, List<Long> idList, ThreadPoolTaskExecutor executor) {

+ 29 - 12
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java

@@ -30,8 +30,9 @@ import com.xunmei.common.core.vo.IdNameVo;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
 import com.xunmei.core.compense.interfaces.CompensateService;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
 import com.xunmei.core.question.QuestionSrcType;
 import com.xunmei.core.question.domain.Question;
 import com.xunmei.core.question.service.IQuestionService;
@@ -59,6 +60,7 @@ import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
 import com.xunmei.system.api.vo.QuestionPdfVo;
 import com.xunmei.system.api.vo.SysOrgVO;
+import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -132,6 +134,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
     @Lazy
     @Autowired
     ICoreReminderScheduleService reminderScheduleService;
+
     @Override
     public List<Long> selectItemIdsByPlanId(Long id) {
         return appPlanToItemMapper.selectItemIdsByPlanId(id);
@@ -139,6 +142,8 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
 //    @Autowired
 //    private ResumptionService resumptionService;
 
+    @Autowired
+    private ICoreCompensateLogService compensateLogService;
 
     @Autowired
     RedisTemplate redisTemplate;
@@ -1515,33 +1520,43 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
          * 4、此时如果传进来的机构id数组 是网点及以下机构类型,那么说明用户是执行了具体需要生成任务的机构  那么根据传进来机构id数组 去过滤reallyOrgIdList
          */
         AppPlan appPlan = getById(compensateDto.getPlanId());
-
+        String errorMsg = StringUtil.EMPTY_STRING;
         if (ObjectUtil.isNull(appPlan)) {
-            throw new ServiceException("计划不存在");
+            errorMsg="计划不存在";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), null, null,errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.notEqual(appPlan.getPlanStatus(), PlanStatus.USING.getCode())) {
-            throw new ServiceException("计划尚未下发或已停用");
+            errorMsg="计划尚未下发或已停用";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), appPlan.getId(), appPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.equal(appPlan.getDeleted(), 1)) {
-            throw new ServiceException("计划状态异常");
+            errorMsg="计划已删除";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), appPlan.getId(), appPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         List<SysOrgVO> orgCacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
         //推断计划
-        deducePlanAndBuildTask(appPlan, compensateDto.getOrgIdList(), orgCacheList);
+        deducePlanAndBuildTask(appPlan, compensateDto.getOrgIdList(), orgCacheList,errorMsg);
 
     }
 
-    private void deducePlanAndBuildTask(AppPlan appPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
+    private void deducePlanAndBuildTask(AppPlan appPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList, String errorMsg) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(Collectors.toList());
         if (orgList.isEmpty()) {
-            throw new ServiceException("未查询到orgIdList中指定的机构信息");
+            errorMsg="未查询到指定的机构信息";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, appPlan.getId(), appPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
         List<Integer> typeList = orgList.stream().map(SysOrgVO::getType).distinct().collect(Collectors.toList());
         if (typeList.size() > 1) {
-            throw new ServiceException("orgIdList中指定的机构信息存在多种机构类型");
+            errorMsg="orgIdList中指定的机构信息存在多种机构类型";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, appPlan.getId(), appPlan.getPlanName(),errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         OrgTypeEnum orgTypeEnum = OrgTypeEnum.getOrgTypeEnum(typeList.get(0));
@@ -1565,10 +1580,13 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
             } else {
                 run(() -> resumptionTaskBusiness.buildTask(null, reallyPlanIdList, new Date()), threadPoolTaskExecutor);
             }
+            compensateLogService.buildLog(getBusinessPlanType(), false, orgIdList, appPlan.getId(), appPlan.getPlanName(),errorMsg);
             return;
         }
         //行社自建计划
         if (OrgTypeEnum.SHEGN_LIAN_SHE.equals(orgTypeEnum) || OrgTypeEnum.BAN_SHI_CHU.equals(orgTypeEnum) || OrgTypeEnum.DIQU_HANG_SHE.equals(orgTypeEnum)) {
+            errorMsg="orgIdList中传递机构信息错误!与计划信息不匹配";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, appPlan.getId(), appPlan.getPlanName(),errorMsg);
             throw new ServiceException("orgIdList中传递机构信息错误!与计划信息不匹配");
         }
         if (OrgTypeEnum.HANG_SHE.equals(orgTypeEnum)) {
@@ -1576,7 +1594,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
         } else {
             run(() -> resumptionTaskBusiness.buildTask(orgIdList, Lists.newArrayList(appPlan), new Date()), threadPoolTaskExecutor);
         }
-
+        compensateLogService.buildLog(getBusinessPlanType(), false, orgIdList, appPlan.getId(), appPlan.getPlanName(),errorMsg);
 
     }
 
@@ -1666,7 +1684,6 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
     }
 
 
-
     @Override
     public List<CoreReminderSchedule> findTaskAndBuildReminderSchedule(List<CoreReminderConfigurationFullVo> configurationList) {
         List<CoreReminderSchedule> exitTaskList = reminderScheduleService.findBySendModule(BusinessPlanType.RESUMPTION.getCode());
@@ -1738,7 +1755,7 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 for (SysUser sysUser : userList) {
                     for (Resumption task : taskList) {
                         boolean exit = exitTaskBySendModule.stream().anyMatch(t -> ObjectUtil.equal(t.getTaskId(), String.valueOf(task.getId())));
-                        if (exit){
+                        if (exit) {
                             //说明任务已经存在短信提醒任务
                             continue;
                         }

+ 24 - 8
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafecheckPlanServiceImpl.java

@@ -33,8 +33,9 @@ import com.xunmei.common.core.web.page.TableDataInfo;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
-import com.xunmei.core.compense.dto.CompensateDto;
+import com.xunmei.common.core.domain.compensate.dto.CompensateDto;
 import com.xunmei.core.compense.interfaces.CompensateService;
+import com.xunmei.core.compense.service.ICoreCompensateLogService;
 import com.xunmei.core.question.QuestionSrcType;
 import com.xunmei.core.question.service.IQuestionService;
 import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
@@ -129,6 +130,8 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     @Autowired
     @Lazy
     ICoreReminderScheduleService reminderScheduleService;
+    @Autowired
+    ICoreCompensateLogService compensateLogService;
 
     @Override
     public TableDataInfo<CoreSafecheckPlan> selectPage(CoreSafecheckPlan coreSafecheckPlan) {
@@ -1159,37 +1162,48 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
     public void compensate(CompensateDto compensateDto) {
 
         CoreSafecheckPlan safeCheckPlan = getById(compensateDto.getPlanId());
+        String errorMsg = StringUtil.EMPTY_STRING;
 
         if (ObjectUtil.isNull(safeCheckPlan)) {
-            throw new ServiceException("计划不存在");
+            errorMsg = "计划不存在";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), null, null, errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.notEqual(safeCheckPlan.getPlanStatus(), PlanStatus.USING.getCode())) {
-            throw new ServiceException("计划尚未下发或已停用");
+            errorMsg = "计划尚未下发或已停用";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), safeCheckPlan.getId(), safeCheckPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         if (ObjectUtil.equal(safeCheckPlan.getIsDeleted(), "1")) {
-            throw new ServiceException("计划状态异常");
+            errorMsg = "计划已删除";
+            compensateLogService.buildLog(getBusinessPlanType(), true, compensateDto.getOrgIdList(), safeCheckPlan.getId(), safeCheckPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         List<SysOrgVO> orgCacheList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
         //推断计划 创建任务
-        deducePlanAndBuildTask(safeCheckPlan, compensateDto.getOrgIdList(), orgCacheList);
+        deducePlanAndBuildTask(safeCheckPlan, compensateDto.getOrgIdList(), orgCacheList, errorMsg);
 
     }
 
 
     private static final Set<OrgTypeEnum> INVALID_ORG_TYPES = Sets.newHashSet(OrgTypeEnum.SHEGN_LIAN_SHE, OrgTypeEnum.BAN_SHI_CHU, OrgTypeEnum.DIQU_HANG_SHE);
 
-    private void deducePlanAndBuildTask(CoreSafecheckPlan safeCheckPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList) {
+    private void deducePlanAndBuildTask(CoreSafecheckPlan safeCheckPlan, List<Long> orgIdList, List<SysOrgVO> orgCacheList, String errorMsg) {
         List<SysOrgVO> orgList = orgCacheList.stream().filter(org -> orgIdList.contains(org.getId())).collect(toList());
         if (orgList.isEmpty()) {
-            throw new ServiceException("未查询到orgIdList中指定的机构信息");
+            errorMsg = "未查询到指定的机构信息";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, safeCheckPlan.getId(), safeCheckPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
         List<Long> idList = orgList.stream().map(SysOrgVO::getId).collect(toList());
         List<Integer> typeList = orgList.stream().map(SysOrgVO::getType).distinct().collect(toList());
         if (typeList.size() > 1) {
-            throw new ServiceException("orgIdList中指定的机构信息存在多种机构类型");
+            errorMsg = "orgIdList中指定的机构信息存在多种机构类型";
+            compensateLogService.buildLog(getBusinessPlanType(), true, orgIdList, safeCheckPlan.getId(), safeCheckPlan.getPlanName(), errorMsg);
+            throw new ServiceException(errorMsg);
         }
 
         OrgTypeEnum orgTypeEnum = OrgTypeEnum.getOrgTypeEnum(typeList.get(0));
@@ -1210,6 +1224,7 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             List<CoreSafecheckPlan> reallyPlanList = findReallyPlanIdList(hsPlanIdList, hsOrgIdList);
             boolean underHsOrgType = (boolean) map.get("underHsOrgType");
             create(reallyPlanList, underHsOrgType ? idList : null);
+            compensateLogService.buildLog(getBusinessPlanType(), false, orgIdList, safeCheckPlan.getId(), safeCheckPlan.getPlanName(), errorMsg);
             return;
         }
         // 行社自建计划
@@ -1224,6 +1239,7 @@ public class CoreSafecheckPlanServiceImpl extends ServiceImpl<CoreSafecheckPlanM
             //其实这里如果真是传入了行社以下的机构,那么大概率这里的reallyPlanIdList 计划id也只会有一个元素
             create(plans, idList);
         }
+        compensateLogService.buildLog(getBusinessPlanType(), false, orgIdList, safeCheckPlan.getId(), safeCheckPlan.getPlanName(), errorMsg);
     }
 
     private void create(List<CoreSafecheckPlan> planList, List<Long> idList) {

+ 19 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/compensate/CoreCompensateLogMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xunmei.core.compense.mapper.CoreCompensateLogMapper">
+
+    <select id="selectPageData" resultType="com.xunmei.common.core.domain.compensate.domain.CoreCompensateLog">
+        select * from core_compensate_log l
+        <where>
+            <if test="req.businessType != null and req.businessType != ''">
+                and l.business_type =#{req.businessType}
+            </if>
+            <if test="req.res != null">
+                and l.res=#{req.res}
+            </if>
+            <if test="req.checkSub==true">
+                and l.org_path like concat(#{req.orgPath},'%')
+            </if>
+        </where>
+    </select>
+</mapper>

+ 3 - 3
soc-modules/soc-modules-gen/src/main/java/com/xunmei/gen/util/CodeGenerators.java

@@ -29,8 +29,8 @@ public class CodeGenerators {
         throw new MybatisPlusException("请输入正确的" + tip + "!");
     }*/
 
-    public static final String moduleName="com.xunmei.core.reminder";
-    public static final String tableNames="core_reminder_configuration_org";
+    public static final String moduleName="com.xunmei.core.compensate";
+    public static final String tableNames="core_compensate_log";
 
     public static void main(String[] args) {
         // 代码生成器
@@ -53,7 +53,7 @@ public class CodeGenerators {
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setPassword("jinJie@2021");*/
-        dsc.setUrl("jdbc:mysql://10.87.21.103:3306/soc_iot?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&characterSetResults=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true");
+        dsc.setUrl("jdbc:mysql://10.87.21.108:3306/soc?serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&characterSetResults=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true");
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setPassword("XM_zm2019");