Procházet zdrojové kódy

预案演练代码提交

jingyuanchao před 2 roky
rodič
revize
9a84ab6c2e

+ 3 - 0
project_data/sql/0.0.2/soc/soc.sql

@@ -396,6 +396,9 @@ INSERT INTO sys_menu (id, menu_name, parent_id, order_num, path, component, quer
 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 (2314, '优秀案例管理', 2311, 2, '/rehearsaloptimal', null, null, 1, 0, 'M', '0', '0', '', '0', null, null, '超级管理员', now(), '超级管理员', now(), '');
 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 (2315, '优秀案例学习', 2311, 4, '/rehearsallearning', null, null, 1, 0, 'M', '0', '0', '', '0', null, null, '超级管理员', now(), '超级管理员', now(), '');
 
+-- 新增提系统参数
+INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark) VALUES ('演练任务行社推荐数量单季度最大值', 'HS_REC_DRILL_TASK_MAX', '3', 'Y', '超级管理员', '2023-09-21 11:20:41', '', null, null);
+INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark) VALUES ('演练任务地区推荐数量单季度最大值', 'AREA_REC_DRILL_TASK_MAX', '3', 'Y', '超级管理员', '2023-09-21 11:35:30', '', null, null);
 
 -- ----------------------------
 -- Table structure for core_message_send

+ 1 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/ErrorMsgConstants.java

@@ -16,4 +16,5 @@ public class ErrorMsgConstants {
     public static final String CUR_USER_ORT_TYPE_ERROR = "当前用户所在机构类型无法确认!";
     public static final String QUERY_USER_DATA_ERROR = "获取用户信息失败!";
     public static final String QUERY_SYS_CONFIG_ERROR = "获取参数配置信息失败!";
+    public static final String QUERY_CONFIG_ERROR = "获取系统参数配置失败!";
 }

+ 14 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/SystemParameterConstant.java

@@ -100,4 +100,18 @@ public class SystemParameterConstant {
     public static final String VIDEO_INTEGRITY_UPDATE_TIME = "VIDEO_INTEGRITY_UPDATE_TIME";
 
     public static final String OFFICEBUILDING_OPEN_ALLHOURS = "officeBuilding_open_allhours";
+
+    /**
+     * 演练任务行社推荐数量单季度最大值
+     */
+    public static final String HS_REC_DRILL_TASK_MAX = "HS_REC_DRILL_TASK_MAX";
+
+    /**
+     * 演练任务行地区推荐数量单季度最大值
+     */
+    public static final String AREA_REC_DRILL_TASK_MAX = "AREA_REC_DRILL_TASK_MAX";
+
+
+
+
 }

+ 56 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/drill/DrillRecStatus.java

@@ -0,0 +1,56 @@
+package com.xunmei.common.core.enums.drill;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum DrillRecStatus {
+
+    NORMAL(0, "正常案例"),
+
+    HS_EXCELLENT_CASE(1, "行社优秀案例"),
+
+    REC_REGION_EXCELLENT_CASE(2, "已推荐地区优秀案例"),
+
+    REGION_EXCELLENT_CASE(3, "地区优秀案例"),
+
+    REC_PROVINCE_EXCELLENT_CASE(4, "已推荐省级优秀案例"),
+
+    PROVINCE_EXCELLENT_CASE(5, "省级优秀案例"),
+
+
+
+    ;
+
+
+    /**
+     * 所有枚举
+     */
+    private static final Map<Integer, DrillRecStatus> enumMap = new LinkedHashMap<>();
+
+    static {
+        for (DrillRecStatus enumNode : DrillRecStatus.values()) {
+            enumMap.put(enumNode.code, enumNode);
+        }
+    }
+
+    private final Integer code;
+    private final String name;
+
+    /**
+     * 根据code获取name
+     */
+    public static String getName(Integer code) {
+        DrillRecStatus e = enumMap.get(code);
+        return e != null ? e.getName() : "";
+    }
+
+    public static DrillRecStatus getDrillRecStatus(Integer code) {
+        return enumMap.get(code);
+    }
+
+}

+ 2 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/mapper/CoreDrillTaskMapper.java

@@ -36,4 +36,6 @@ public interface CoreDrillTaskMapper extends BaseMapper<CoreDrillTask> {
     IPage<CoreDrillTaskRecPageVo> selectRecPage(Page<CoreDrillTaskRecPageVo> pageRequest, @Param("request") CoreDrillTaskRecPageDto request, @Param("recStatus") Integer recStatus);
 
     IPage<CoreDrillTaskRecTaskPageVo> selectRecTaskListPage(Page<Object> pageRequest, @Param("request") CoreDrillTaskRecPageDto request);
+
+    int updateStatusById(@Param("drillTaskId") Long drillTaskId, @Param("recStatus") Integer recStatus);
 }

+ 45 - 4
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillTaskServiceImpl.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.DictConstants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.constant.SystemParameterConstant;
 import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.R;
 import com.xunmei.common.core.domain.drill.domain.*;
@@ -23,6 +24,7 @@ import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingTaskReportVo;
 import com.xunmei.common.core.enums.ExportPdfType;
 import com.xunmei.common.core.enums.OrgTypeEnum;
 import com.xunmei.common.core.enums.drill.DrillDoStatus;
+import com.xunmei.common.core.enums.drill.DrillRecStatus;
 import com.xunmei.common.core.enums.drill.DrillType;
 import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.utils.DateUtils;
@@ -37,9 +39,11 @@ import com.xunmei.core.drill.mapper.CoreDrillTaskToUserMapper;
 import com.xunmei.core.drill.service.ICoreDrillTaskService;
 import com.xunmei.core.drill.service.ICoreDrillTaskToRoleService;
 import com.xunmei.core.drill.service.ICoreDrillTaskToUserService;
+import com.xunmei.system.api.RemoteConfigService;
 import com.xunmei.system.api.RemoteFileService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.RemoteRoleService;
+import com.xunmei.system.api.domain.SysConfig;
 import com.xunmei.system.api.domain.SysDictData;
 import com.xunmei.system.api.domain.SysOrg;
 import com.xunmei.system.api.domain.SysUser;
@@ -89,6 +93,8 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
     @Autowired
     private CoreDrillPlanMapper coreDrillPlanMapper;
 
+    @Autowired
+    RemoteConfigService remoteConfigService;
 
     @Override
     public TableDataInfo<CoreDrillTaskPageVo> selectPage(CoreDrillTaskPageDto request) {
@@ -703,13 +709,48 @@ public class CoreDrillTaskServiceImpl extends ServiceImpl<CoreDrillTaskMapper, C
         if (drillTask == null) {
             throw new SystemException("获取预案演练数据失败!");
         }
-        //todo 确认是否能取消推荐
-        if (DrillDoStatus.DONE.getCode().equals(drillTask.getStatus())){
-            //说明是已完成的案例,设置为正常案例
+        if (request.getRecStatus() > drillTask.getRecStatus()) {
+            //说明是向上级推荐优秀案例,需要判断是否已达上限
+            checkRecNum(drillTask, request.getRecStatus());
+        }
+        //判断是否越级推荐
+        if (ObjectUtil.notEqual(drillTask.getRecStatus(), request.getRecStatus() - 1)) {
+            throw new SystemException("推荐状态异常!");
+        }
+        if (ObjectUtil.notEqual(DrillDoStatus.DONE.getCode(), drillTask.getStatus())) {
+            throw new SystemException("该预案演练任务未完成或已逾期!");
+        }
+        return coreDrillTaskMapper.updateStatusById(request.getDrillTaskId(), request.getRecStatus());
+    }
 
+    private void checkRecNum(CoreDrillTask drillTask, Integer recStatus) {
+
+        DrillRecStatus drillRecStatus = DrillRecStatus.getDrillRecStatus(recStatus);
+        if (drillRecStatus == null) {
+            throw new SystemException("推荐状态异常!");
+        }
+        SysConfig sysConfig;
+        if (ObjectUtil.equal(drillRecStatus, DrillRecStatus.REC_REGION_EXCELLENT_CASE)) {
+            sysConfig = RemoteCallHandlerExecutor.executeRemoteCall(() ->
+                    remoteConfigService.findSysConfigByCode(SystemParameterConstant.HS_REC_DRILL_TASK_MAX, SecurityConstants.INNER), ErrorMsgConstants.QUERY_CONFIG_ERROR);
+            Long count = coreDrillTaskMapper.selectCount(new LambdaQueryWrapper<CoreDrillTask>()
+                    .eq(CoreDrillTask::getRecStatus, DrillRecStatus.REC_REGION_EXCELLENT_CASE.getCode())
+                    .likeRight(CoreDrillTask::getOrgPath, drillTask.getOrgPath()));
+            if (count != null && count >= Integer.parseInt(sysConfig.getConfigValue())) {
+                throw new SystemException("推荐地区优秀案例已达上限!");
+            }
+        }
+        if (ObjectUtil.equal(drillRecStatus, DrillRecStatus.REC_PROVINCE_EXCELLENT_CASE)) {
+            sysConfig = RemoteCallHandlerExecutor.executeRemoteCall(() ->
+                    remoteConfigService.findSysConfigByCode(SystemParameterConstant.AREA_REC_DRILL_TASK_MAX, SecurityConstants.INNER), ErrorMsgConstants.QUERY_CONFIG_ERROR);
 
+            Long count = coreDrillTaskMapper.selectCount(new LambdaQueryWrapper<CoreDrillTask>()
+                    .eq(CoreDrillTask::getRecStatus, DrillRecStatus.REC_PROVINCE_EXCELLENT_CASE.getCode())
+                    .likeRight(CoreDrillTask::getOrgPath, drillTask.getOrgPath()));
+            if (count != null && count >= Integer.parseInt(sysConfig.getConfigValue())) {
+                throw new SystemException("推荐省级优秀案例已达上限!");
+            }
         }
-        return 0;
     }
 }
 

+ 4 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/drill/CoreDrillTaskMapper.xml

@@ -253,4 +253,8 @@
             )
         </if>
     </select>
+
+    <update id="updateStatusById">
+        update core_drill_task set rec_status=#{recStatus} where id=#{drillTaskId}
+    </update>
 </mapper>