Răsfoiți Sursa

Merge branch 'V0.1.0' into V0.1.1

jingyuanchao 1 an în urmă
părinte
comite
b0c9de2ea5
20 a modificat fișierele cu 237 adăugiri și 72 ștergeri
  1. 2 2
      project_data/sql/0.1.0/soc/soc.sql
  2. 2 1
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/ResumptionPdf.java
  3. 30 19
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/drill/service/impl/CoreDrillPlanServiceImpl.java
  4. 20 5
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/edu/service/impl/CoreEduTrainingPlanServiceImpl.java
  5. 6 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/gx/vo/ResumptionPlanVo.java
  6. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/ResumptionService.java
  7. 12 2
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/AppPlanServiceImpl.java
  8. 2 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ResumptionRecordServiceImpl.java
  9. 10 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ResumptionServiceImpl.java
  10. 36 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java
  11. 4 1
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/vo/resumptionRecord/AppResumptionDataInfoVo.java
  12. 51 16
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java
  13. 1 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafetyTaskService.java
  14. 7 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafetyTaskServiceImpl.java
  15. 4 2
      soc-modules/soc-modules-core/src/main/resources/mapper/resumption/AppPlanMapper.xml
  16. 3 1
      soc-modules/soc-modules-core/src/main/resources/mapper/resumption/ResumptionRecordMapper.xml
  17. 16 13
      soc-modules/soc-modules-core/src/main/resources/mapper/safetycheck/CoreSafetyTaskMapper.xml
  18. 3 3
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/utils/PdfUtil.java
  19. 17 3
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/SmsService.java
  20. 8 2
      soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/impl/SmsSendRecordServiceImpl.java

+ 2 - 2
project_data/sql/0.1.0/soc/soc.sql

@@ -247,8 +247,8 @@ create table sms_send_record
     content_data       varchar(225) not null comment '短信内容',
     result             varchar(225) null comment '发送结果',
     result_description varchar(125) null comment '发送结果描述',
-    req_detail        varchar(225) null comment '短信发送请求详情',
-    resp_detail        varchar(225) null comment '短信发送返回详情'
+    req_detail        varchar(5000) null comment '短信发送请求详情',
+    resp_detail        varchar(1000) null comment '短信发送返回详情'
 )
     comment '短信发送记录';
 

+ 2 - 1
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/domain/ResumptionPdf.java

@@ -13,5 +13,6 @@ public class ResumptionPdf implements Serializable {
     private String submitName;
     @ApiModelProperty(value = "执行结果")
     private Integer resValue;
-    private Integer sort;
+    private Integer pointSort;
+    private Integer itemSort;
 }

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

@@ -31,6 +31,7 @@ import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanDetailVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanPageVo;
 import com.xunmei.common.core.domain.drill.vo.CoreDrillPlanRoleVo;
 import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingPlan;
+import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingPlanToExecOrg;
 import com.xunmei.common.core.domain.reminder.domain.CoreReminderSchedule;
 import com.xunmei.common.core.domain.reminder.vo.CoreReminderConfigurationFullVo;
 import com.xunmei.common.core.enums.BusinessPlanType;
@@ -652,9 +653,9 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
     public int revocationPlan(Long planId) {
         checkPlanIsCreatingTask(planId, "撤回");
         List<Long> list = coreDrillPlanMapper.selectIdByParentId(planId);
-        int isExecute = coreDrillTaskMapper.checkHasTaskIsDoneByPlanParentId(planId);
+        Integer isExecute = coreDrillTaskMapper.checkHasTaskIsDoneByPlanParentId(planId);
         //计划下没有已完成:删除所有任务数据和子计划,计划状态回到草稿状态。
-        if (isExecute < 1/* || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())*/) {
+        if (ObjectUtil.isNull(isExecute) || isExecute < 1/* || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())*/) {
             // 删除所有任务数据
             coreDrillTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
             //删除所有子计划
@@ -782,22 +783,17 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         if (planToExecOrgs.size() > 0) {
             coreDrillPlanToExecOrgService.saveBatch(planToExecOrgs);
         }
-        /*List<CoreDrillPlanToRole> insertPlanRoleList = new ArrayList<>();
-        for (CoreDrillPlan drillPlan : list) {
-            //保存执行角色
-            for (CoreDrillPlanToRole planRole : planRoleList) {
-                CoreDrillPlanToRole role = new CoreDrillPlanToRole();
-                role.setPlanId(drillPlan.getId());
-                role.setRoleId(planRole.getRoleId());
-                insertPlanRoleList.add(role);
+        if (!list.isEmpty()) {
+            for (CoreDrillPlan plan1 : list) {
+                final CoreDrillPlan exit = baseMapper.selectCoreDrillPlanById(plan1.getId());
+                if (exit != null) {
+                    updateById(exit);
+                } else {
+                    save(plan1);
+                }
             }
-        }*/
-        if (list.size() > 0) {
-            this.saveBatch(list);
+
         }
-        /*if (insertPlanRoleList.size() > 0) {
-            coreDrillPlanToRoleService.saveBatch(insertPlanRoleList);
-        }*/
 
         return list;
     }
@@ -808,10 +804,25 @@ public class CoreDrillPlanServiceImpl extends ServiceImpl<CoreDrillPlanMapper, C
         if (oldPlan != null) {
             oldPlan.setDeleted(0);
             coreDrillPlanToExecOrgMapper.deleteByMap(MapUtil.of("plan_id", oldPlan.getId()));
-            if (planToExecOrgs.size() > 0) {
-                final List<Long> collect = planToExecOrgs.stream().map(SysOrgVO::getId).distinct().collect(toList());
-                batchSavePlanToExecOrg(collect, oldPlan.getId());
+//            if (planToExecOrgs.size() > 0) {
+//                final List<Long> collect = planToExecOrgs.stream().map(SysOrgVO::getId).distinct().collect(toList());
+//                batchSavePlanToExecOrg(collect, oldPlan.getId());
+//            }
+
+            List<CoreDrillPlanToExecOrg> newPlanToExecOrgs = new ArrayList<>();
+            if (ObjectUtil.isNotEmpty(planToExecOrgs)) {
+                // 找到子计划所属的具体执行机构
+                planToExecOrgs.stream().filter(x -> x.getPath().contains(sysOrg.getPath())).forEach(y -> {
+                    CoreDrillPlanToExecOrg temp = new CoreDrillPlanToExecOrg();
+                    temp.setPlanId(oldPlan.getId());
+                    temp.setOrgId(y.getId());
+                    newPlanToExecOrgs.add(temp);
+                });
             }
+            if (newPlanToExecOrgs.size() > 0) {
+                coreDrillPlanToExecOrgService.saveBatch(newPlanToExecOrgs);
+            }
+
             oldPlan.setPlanName(plan.getPlanName());
             oldPlan.setPlanStatus(DrillPlanStatus.USING.getCode());
             oldPlan.setBuildTaskNow(plan.getBuildTaskNow());

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

@@ -738,10 +738,25 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
         if (oldPlan != null) {
             oldPlan.setDeleted(0);
             coreEduTrainingPlanToExecOrgMapper.deleteByMap(MapUtil.of("plan_id", oldPlan.getId()));
-            if (planToExecOrgs.size() > 0) {
-                final List<Long> collect = planToExecOrgs.stream().map(SysOrgVO::getId).distinct().collect(toList());
-                batchSavePlanToExecOrg(collect, oldPlan.getId());
+//            if (planToExecOrgs.size() > 0) {
+//                final List<Long> collect = planToExecOrgs.stream().map(SysOrgVO::getId).distinct().collect(toList());
+//                batchSavePlanToExecOrg(collect, oldPlan.getId());
+//            }
+
+            List<CoreEduTrainingPlanToExecOrg> newPlanToExecOrgs = new ArrayList<>();
+            if (ObjectUtil.isNotEmpty(planToExecOrgs)) {
+                // 找到子计划所属的具体执行机构
+                planToExecOrgs.stream().filter(x -> x.getPath().contains(sysOrg.getPath())).forEach(y -> {
+                    CoreEduTrainingPlanToExecOrg temp = new CoreEduTrainingPlanToExecOrg();
+                    temp.setPlanId(oldPlan.getId());
+                    temp.setOrgId(y.getId());
+                    newPlanToExecOrgs.add(temp);
+                });
             }
+            if (newPlanToExecOrgs.size() > 0) {
+                coreEduTrainingPlanToExecOrgService.saveBatch(newPlanToExecOrgs);
+            }
+
             oldPlan.setPlanName(plan.getPlanName());
             oldPlan.setPlanStatus(EduTrainingPlanStatus.USING.getCode());
             oldPlan.setBuildTaskNow(plan.getBuildTaskNow());
@@ -765,9 +780,9 @@ public class CoreEduTrainingPlanServiceImpl extends ServiceImpl<CoreEduTrainingP
     public Integer revocationPlan(Long planId) {
         checkPlanIsCreatingTask(planId, "撤回");
         List<Long> list = coreEduTrainingPlanMapper.selectIdByParentId(planId);
-        int isExecute = coreEduTrainingTaskMapper.checkHasTaskIsDoneByPlanParentId(planId);
+        Integer isExecute = coreEduTrainingTaskMapper.checkHasTaskIsDoneByPlanParentId(planId);
         //计划下没有已完成:计划下没有已完成:删除所有任务数据,计划状态回到草稿状态。
-        if (isExecute < 1/* || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())*/) {
+        if (ObjectUtil.isNull(isExecute) || isExecute < 1/* || EduTrainingPlanCycleEnum.NONE.getCode().equals(plan.getPlanCycle())*/) {
             // 删除所有任务数据
             coreEduTrainingTaskService.delByStartTimeAndEndTimeAndPlanIdList(list, null, null);
             //删除所有子计划

+ 6 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/gx/vo/ResumptionPlanVo.java

@@ -118,6 +118,11 @@ public class ResumptionPlanVo {
     /**
      * 要点排序值
      */
-    private Integer sort = 0;
+    private Integer pointSort;
+
+    /**
+     * 检查项排序值
+     */
+    private Integer itemSort;
 
 }

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/ResumptionService.java

@@ -15,6 +15,7 @@ import com.xunmei.core.resumption.vo.AppRulePointTaskVo;
 import com.xunmei.core.resumption.vo.ResumptionAppVo;
 import com.xunmei.core.resumption.vo.ResumptionTaskNewDto;
 import com.xunmei.core.resumption.vo.WorkChangeResumptionVo;
+import com.xunmei.core.safetyCheck.domain.CoreSafetyTask;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -52,4 +53,6 @@ public interface ResumptionService extends IService<Resumption> {
     void findResumptionList(List<Long> orgIds,DateTime time);
 
     List<SafeScoreResumptionDataVo>  findSource(SafeScoreSourceDto request);
+
+    List<Resumption> selectTaskListByPlanId(Long planId);
 }

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

@@ -1955,12 +1955,22 @@ public class AppPlanServiceImpl extends ServiceImpl<AppPlanMapper, AppPlan> impl
                 tem.setSubmitName(String.valueOf(submitName));
                 //null:未执行  0:正常 1:异常
                 tem.setResValue(result);
-                tem.setSort(vo.getSort());
+                tem.setPointSort(vo.getPointSort());
+                tem.setItemSort(vo.getItemSort());
                 befs.add(tem);
             }
 
         }
-        befs.sort(Comparator.comparing(ResumptionPdf::getSort));
+        befs.sort(new Comparator<ResumptionPdf>() {
+            @Override
+            public int compare(ResumptionPdf o1, ResumptionPdf o2) {
+                final int compare = o1.getItemSort().compareTo(o2.getItemSort());
+                if (compare != 0) {
+                    return compare;
+                }
+                return o1.getPointSort().compareTo(o2.getPointSort());
+            }
+        });
         return befs;
     }
 

+ 2 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ResumptionRecordServiceImpl.java

@@ -256,7 +256,8 @@ public class ResumptionRecordServiceImpl extends ServiceImpl<ResumptionRecordMap
             temp.setItemId(x.getItemId());
             temp.setExecuteResult(StringUtils.EMPTY);
             temp.setSubmitName(StringUtils.EMPTY);
-            temp.setSort(x.getSort());
+            temp.setPointSort(x.getPointSort());
+            temp.setItemSort(x.getItemSort());
             result.add(temp);
         });
 

+ 10 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/service/impl/ResumptionServiceImpl.java

@@ -376,6 +376,16 @@ public class ResumptionServiceImpl extends ServiceImpl<ResumptionMapper, Resumpt
     }
 
     @Override
+    public List<Resumption> selectTaskListByPlanId(Long planId) {
+        LambdaQueryWrapper<Resumption> wrapper=new LambdaQueryWrapper<>();
+
+        wrapper.eq(Resumption::getPlanId,planId);
+
+
+        return baseMapper.selectList(wrapper);
+    }
+
+    @Override
     public List<SafeScoreResumptionDataVo> findSource(SafeScoreSourceDto request) {
 
 

+ 36 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/task/ResumptionTaskBusiness.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.R;
@@ -32,6 +33,8 @@ import com.xunmei.core.resumption.mapper.AppPlanToExecOrgMapper;
 import com.xunmei.core.resumption.mapper.ResumptionMapper;
 import com.xunmei.core.resumption.service.IAppRulePointService;
 import com.xunmei.core.resumption.service.ResumptionService;
+import com.xunmei.core.safetyCheck.domain.CoreSafetyTask;
+import com.xunmei.core.safetyCheck.vo.PlanTaskBuildVo;
 import com.xunmei.system.api.Eto.OrgListByTypesConditionEto;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
@@ -474,11 +477,28 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
         return buildResumptions(appPlan, execOrg, planstartTime, planendTime, executedOrders, workTimes);
     }
 
+    //递归查找最早的计划id,任务在多次撤回编辑下发后任务id发生变化,为避免生成重复任务,需要查询到最初的计划来查询是否存在相同周期的任务来去重
+    private Long getReallyPlanId(Long planId, Long copyPlanId) {
+        if (ObjectUtil.equal(planId, copyPlanId)) {
+            return planId;
+        }
+        final AppPlan plan = appPlanMapper.getById(copyPlanId);
+        if (plan == null) {
+            return planId;
+        }
+        return getReallyPlanId(copyPlanId, plan.getSolidId());
+    }
+
     private List<Resumption> buildResumptions(AppPlan appPlan, SysOrg execOrg, Date planStartTime, Date planEndTime, List<Short> executedOrders, Map<Long, List<SysWorkTime>> allWorkTimes) {
         if (ObjectUtil.equal(execOrg.getIsLock(), 1)) {
             return new ArrayList<>();
         }
         Map<Short, DateRange> rangeMap = null;
+        List<Resumption> exitTaskList = new ArrayList<>();
+        if (ObjectUtil.notEqual(appPlan.getId(), appPlan.getSolidId())) {
+            Long planId = getReallyPlanId(appPlan.getId(), appPlan.getSolidId());
+            exitTaskList = resumptionService.selectTaskListByPlanId(planId);
+        }
 
 
         List<Resumption> resumptionList = new ArrayList<>();
@@ -550,6 +570,22 @@ public class ResumptionTaskBusiness extends TaskCreatingServiceImplBase<Resumpti
             resumption.setPlanEndTime(timeRange.getEndTime());
             resumption.setCreateTime(new Date());
             resumption.setTimes(realOrder);
+            if (!exitTaskList.isEmpty()) {
+                final Optional<Resumption> optional =   exitTaskList.stream().filter(t->{
+                    final String exitST = DateUtil.format(t.getPlanStartTime(), Constants.HMS_FORMAT);
+                    final String exitED = DateUtil.format(t.getPlanEndTime(), Constants.HMS_FORMAT);
+                    final String newST = DateUtil.format(resumption.getStartTime(), Constants.HMS_FORMAT);
+                    final String newED = DateUtil.format(resumption.getEndTime(), Constants.HMS_FORMAT);
+                    if (ObjectUtil.equal(exitST,newST)&&ObjectUtil.equal(exitED,newED)&&ObjectUtil.equal(t.getOrgId(), resumption.getOrgId())){
+                        return true;
+                    }
+                    return false;
+                }).findAny();
+                if (optional.isPresent()){
+                    log.info("安全检查任务生成时,发现计划{}已存在相同周期任务",appPlan.getPlanName());
+                    continue;
+                }
+            }
             resumptionList.add(resumption);
         }
 

+ 4 - 1
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/resumption/vo/resumptionRecord/AppResumptionDataInfoVo.java

@@ -59,7 +59,10 @@ public class AppResumptionDataInfoVo {
 
     private List<ResumptionDataProtectionVo> protections;
 
+    @ApiModelProperty(value = "检查项排序值",notes = "如果没有设置排序,那么放在最后")
+    private Integer itemSort=999;
+
     @ApiModelProperty(value = "要点排序值",notes = "如果没有设置排序,那么放在最后")
-    private Integer sort=999;
+    private Integer pointSort=999;
 
 }

+ 51 - 16
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/job/SafetyCheckJobBusiness.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.xunmei.common.core.constant.Constants;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.DateRange;
 import com.xunmei.common.core.domain.worktime.domain.SysWorkTime;
@@ -96,7 +97,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      * @throws Exception
      */
     public void createTaskForCycle(DateTime dateTime, Date start, Date end, CoreSafecheckPlan plan, Boolean isNeedSendTodo, Integer sourceType) throws Exception {
-        List<PlanTaskBuildVo> planTask = createPlanTask(plan,new ArrayList<>());
+        List<PlanTaskBuildVo> planTask = createPlanTask(plan, new ArrayList<>());
         //生成具体任务
         buildTask(dateTime, planTask, start, end, isNeedSendTodo, sourceType);
     }
@@ -159,7 +160,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
 
         List<PlanTaskBuildVo> tasks = new ArrayList<>();
         for (CoreSafecheckPlan plan : plans) {
-            List<PlanTaskBuildVo> planTask = createPlanTask(plan,new ArrayList<>());
+            List<PlanTaskBuildVo> planTask = createPlanTask(plan, new ArrayList<>());
             tasks.addAll(planTask);
         }
 
@@ -175,23 +176,22 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      */
     @Async
     public void createTaskByPlans(List<CoreSafecheckPlan> plans) {
-        createTask(plans,null);
+        createTask(plans, null);
     }
 
     @Async
-    public void createTaskByPlans(List<CoreSafecheckPlan> plans,Long parentPlanId) {
-        String redisKey="SafeCheck_Creating_Task" + parentPlanId;
+    public void createTaskByPlans(List<CoreSafecheckPlan> plans, Long parentPlanId) {
+        String redisKey = "SafeCheck_Creating_Task" + parentPlanId;
         RedisUtils.deleteObject(redisKey);
         Boolean hasKey = RedisUtils.hasKey(redisKey);
         if (!hasKey) {
-            RedisUtils.setCacheObject(redisKey, parentPlanId, Duration.ofMillis(1000 * 60*5));
+            RedisUtils.setCacheObject(redisKey, parentPlanId, Duration.ofMillis(1000 * 60 * 5));
         }
-        createTask(plans,null);
+        createTask(plans, null);
         RedisUtils.deleteObject(redisKey);
     }
 
-    public void createTask(List<CoreSafecheckPlan> plans,List<Long> needBuildTaskOrgIds)
-    {
+    public void createTask(List<CoreSafecheckPlan> plans, List<Long> needBuildTaskOrgIds) {
         try {
             if (plans != null && plans.size() > 0) {
                 DateTime datetime = new DateTime();
@@ -207,13 +207,13 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
                     if (ObjectUtil.notEqual(plan.getPlanStatus(), PlanStatus.USING.getCode())) {
                         continue;
                     }
-                    List<PlanTaskBuildVo> planTask = createPlanTask(plan,needBuildTaskOrgIds);
+                    List<PlanTaskBuildVo> planTask = createPlanTask(plan, needBuildTaskOrgIds);
                     tasks.addAll(planTask);
                 }
 
                 String collect = tasks.stream().map(t -> t.getExecOrg().getId()).distinct().map(String::valueOf).collect(Collectors.joining(","));
-                System.out.println("("+collect+")");
-                System.out.println("("+collect.split(",").length+")");
+                System.out.println("(" + collect + ")");
+                System.out.println("(" + collect.split(",").length + ")");
 
                 //生成具体任务
                 buildTask(datetime, tasks, dateRange.getStartTime(), dateRange.getEndTime(), true, 0);
@@ -228,7 +228,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      *
      * @param plan
      */
-    private List<PlanTaskBuildVo> createPlanTask(CoreSafecheckPlan plan,List<Long> needBuildTaskOrgIds) {
+    private List<PlanTaskBuildVo> createPlanTask(CoreSafecheckPlan plan, List<Long> needBuildTaskOrgIds) {
 
         List<PlanTaskBuildVo> list = new ArrayList<>();
         Integer execOrgType = Math.toIntExact(plan.getExecOrgType());
@@ -295,7 +295,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
             checkOrgs = checkOrgs.stream().filter(o -> o.getIsLock() < 1).collect(Collectors.toList());
             if (ObjectUtil.isNotEmpty(needBuildTaskOrgIds)) {
                 //此处是运维接口需要指定生成某个机构的情况下需要过滤
-                checkOrgs=checkOrgs.stream().filter(o->needBuildTaskOrgIds.contains(o.getId())).collect(Collectors.toList());
+                checkOrgs = checkOrgs.stream().filter(o -> needBuildTaskOrgIds.contains(o.getId())).collect(Collectors.toList());
             }
             //构建数据
             List<PlanTaskBuildVo> bs = getBuild(plan, org, checkOrgs, roles);
@@ -405,6 +405,18 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
         return list;
     }
 
+    //递归查找最早的计划id,任务在多次撤回编辑下发后任务id发生变化,为避免生成重复任务,需要查询到最初的计划来查询是否存在相同周期的任务来去重
+    private Long getReallyPlanId(Long planId, Long copyPlanId) {
+        if (ObjectUtil.equal(planId, copyPlanId)) {
+            return planId;
+        }
+        final CoreSafecheckPlan plan = planMapper.get(copyPlanId);
+        if (plan == null) {
+            return planId;
+        }
+        return getReallyPlanId(copyPlanId, plan.getSolidId());
+    }
+
     /**
      * 构建任务所需条件
      *
@@ -415,6 +427,12 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
      * @return
      */
     private List<PlanTaskBuildVo> getBuild(CoreSafecheckPlan plan, SysOrg check, List<SysOrg> execOrgList, List<CoreSafecheckPlanToRole> roles) {
+        List<CoreSafetyTask> exitTaskList = new ArrayList<>();
+        if (ObjectUtil.notEqual(plan.getId(), plan.getSolidId())) {
+            Long planId = getReallyPlanId(plan.getId(), plan.getSolidId());
+            exitTaskList = checkTaskService.selectTaskListByPlanId(planId);
+        }
+
 
         List<PlanTaskBuildVo> list = new ArrayList<>();
 
@@ -470,12 +488,29 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
                 vo.setCount((int) i);
                 vo.setPlanCycle(Math.toIntExact(plan.getPlanCycle()));
                 //任务名称去除为1
-                if (rangeMap.size()<=1) {
+                if (rangeMap.size() <= 1) {
                     vo.setPlanName(plan.getPlanName());
                 } else {
                     vo.setPlanName(plan.getPlanName() + "第" + cou + "次");
                 }
                 cou++;
+                if (!exitTaskList.isEmpty()) {
+                    PlanTaskBuildVo finalVo = vo;
+                    final Optional<CoreSafetyTask> optional =   exitTaskList.stream().filter(t->{
+                        final String exitST = DateUtil.format(t.getPlanStartTime(), Constants.HMS_FORMAT);
+                        final String exitED = DateUtil.format(t.getPlanEndTime(), Constants.HMS_FORMAT);
+                        final String newST = DateUtil.format(finalVo.getStartTime(), Constants.HMS_FORMAT);
+                        final String newED = DateUtil.format(finalVo.getEndTime(), Constants.HMS_FORMAT);
+                        if (ObjectUtil.equal(exitST,newST)&&ObjectUtil.equal(exitED,newED)&&ObjectUtil.equal(t.getOrgId(),finalVo.getExecOrg().getId())){
+                            return true;
+                        }
+                        return false;
+                    }).findAny();
+                    if (optional.isPresent()){
+                        log.info("安全检查任务生成时,发现计划{}已存在相同周期任务",plan.getPlanName());
+                        continue;
+                    }
+                }
                 list.add(vo);
             }
 //            for (CoreSafecheckPlanToRole role : roles) {
@@ -642,7 +677,7 @@ public class SafetyCheckJobBusiness extends TaskCreatingServiceImplBase<CoreSafe
     }
 
     public void rebuildTask(List<Long> orgIds, Date startDate, Date endDate, CycleCommonEnum cycle) {
-        DateRange range=DateUtils.getStartAndEnd(startDate,cycle);
+        DateRange range = DateUtils.getStartAndEnd(startDate, cycle);
         Map<Long, Boolean> workingMap = orgWorkTimeStatusMap(range, orgIds);
 //        List<Long> deleteTaskIds = new ArrayList<>();
         Integer planCycle = 0;

+ 1 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/ICoreSafetyTaskService.java

@@ -96,4 +96,5 @@ public interface ICoreSafetyTaskService extends IService<CoreSafetyTask> {
 
     List<String> checkTaskExit(List<String> allSafetyCheckIdList);
 
+    List<CoreSafetyTask> selectTaskListByPlanId(Long planId);
 }

+ 7 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/safetyCheck/service/impl/CoreSafetyTaskServiceImpl.java

@@ -340,4 +340,11 @@ public class CoreSafetyTaskServiceImpl extends ServiceImpl<CoreSafetyTaskMapper,
         List<CoreSafetyTask> coreSafetyTasks = baseMapper.selectList(queryWrapper);
         return coreSafetyTasks.stream().map(CoreSafetyTask::getId).map(String::valueOf).collect(Collectors.toList());
     }
+
+    @Override
+    public List<CoreSafetyTask> selectTaskListByPlanId(Long planId) {
+        LambdaQueryWrapper<CoreSafetyTask> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CoreSafetyTask::getPlanId, planId);
+        return baseMapper.selectList(queryWrapper);
+    }
 }

+ 4 - 2
soc-modules/soc-modules-core/src/main/resources/mapper/resumption/AppPlanMapper.xml

@@ -418,7 +418,8 @@
                q.point_scan,
                q.required,
                q.business_type as pointDataSource,
-               q.sort
+               q.pointSort as pointSort,
+               q.itemSort  as itemSort
         from (select c.id     as item_id,
                      c.`name` as item_name,
                      b.id     as point_id,
@@ -433,7 +434,8 @@
                      a.plan_id,
                      a.point_scan,
                      a.required,
-                     b.sort
+                     ifnull(c.sort,999) as itemSort,
+                     ifnull(b.sort,999) as pointSort
               from core_resumption_plan_to_point a
                        LEFT JOIN core_resumption_rule_point b on a.point_id = b.id
                        LEFT JOIN core_resumption_rule_item c on b.item_id = c.id

+ 3 - 1
soc-modules/soc-modules-core/src/main/resources/mapper/resumption/ResumptionRecordMapper.xml

@@ -285,9 +285,11 @@
                d.item_id,
                d.res_value,
                d.submit_name,
-               p.sort
+               p.sort as pointSort,
+               ri.sort  as itemSort
         FROM core_resumption_data d
                  INNER JOIN core_resumption_rule_point p ON d.item_id = p.id
+                 INNER JOIN core_resumption_rule_item ri ON ri.id = p.item_id
                  LEFT JOIN sys_area a ON a.id = d.area_id
                  LEFT JOIN sys_area_check ch on ch.id = d.check_id
         WHERE d.resumption_id = #{resumptionId}

+ 16 - 13
soc-modules/soc-modules-core/src/main/resources/mapper/safetycheck/CoreSafetyTaskMapper.xml

@@ -731,19 +731,21 @@
             r.id as ruleId,
             r.name as ruleName,
             f.id                      as areaId,
-               f.name                    as areaName,
-               e.id                      as itemId,
-               e.name                    as itemName,
-               rd.id                     as pointDataId,
-               a.id                      as pointId,
-               a.name                    as pointName,
-               1                         as mustCheck,
-               rd.is_add                 as isAdd,
-               rd.value                  as status,
-               rd.remark                 as remark,
-               rd.rectification_deadline as rectificationDeadline,
-               rd.submit_by,
-               rd.submit_time
+            f.name                    as areaName,
+            e.id                      as itemId,
+            e.name                    as itemName,
+            rd.id                     as pointDataId,
+            a.id                      as pointId,
+            a.name                    as pointName,
+            1                         as mustCheck,
+            rd.is_add                 as isAdd,
+            rd.value                  as status,
+            rd.remark                 as remark,
+            rd.rectification_deadline as rectificationDeadline,
+            rd.submit_by,
+            rd.submit_time,
+            e.sort as itemSort,
+            a.sort as pointSort
         FROM core_safety_task_data rd
                  LEFT JOIN core_safetycheck_rule_point a ON a.id = rd.point_id
                  LEFT JOIN core_safetycheck_rule_item e ON a.item_id = e.id
@@ -751,6 +753,7 @@
                  left join core_safetycheck_rule r on a.rule_id=r.id
         WHERE rd.task_id = #{taskId}
           and a.deleted = 0
+        order by ifnull(e.sort,999),ifnull(a.sort,999)
     </select>
 
     <select id="selectNfc" resultType="com.xunmei.core.safetyCheck.vo.regsiter.TaskRegisterNfcVo">

+ 3 - 3
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/utils/PdfUtil.java

@@ -391,15 +391,15 @@ public class PdfUtil {
         createPDFCell(tableFont, table, "接待日期", Element.ALIGN_MIDDLE, 1, 1);
         createPDFCell(tableFont, table, data.get("time").toString(), Element.ALIGN_MIDDLE, 2, 1);
         //第二行
-        createPDFCell(tableFont, table, "来访事由", Element.ALIGN_MIDDLE, 1, 1);
+        createPDFCell(tableFont, table, "出入事由", Element.ALIGN_MIDDLE, 1, 1);
         createPDFCell(tableFont, table, data.get("reasons").toString(), Element.ALIGN_MIDDLE, 2, 1);
         createPDFCell(tableFont, table, "陪同人员", Element.ALIGN_MIDDLE, 1, 1);
         createPDFCell(tableFont, table, data.get("accompanyingPerson").toString(), Element.ALIGN_MIDDLE, 2, 1);
 
         //第三行
-        createPDFCell(tableFont, table, "所在单位", Element.ALIGN_MIDDLE, 1, 1);
+        createPDFCell(tableFont, table, "申请单位", Element.ALIGN_MIDDLE, 1, 1);
         createPDFCell(tableFont, table, data.get("outOrgName").toString(), Element.ALIGN_MIDDLE, 2, 1);
-        createPDFCell(tableFont, table, "来访人员", Element.ALIGN_MIDDLE, 1, 1);
+        createPDFCell(tableFont, table, "出入人员", Element.ALIGN_MIDDLE, 1, 1);
         createPDFCell(tableFont, table, data.get("userName").toString(), Element.ALIGN_MIDDLE, 2, 1);
         //第四行
         createPDFCell(tableFont, table, "证件类型", Element.ALIGN_MIDDLE, 1, 1);

+ 17 - 3
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/SmsService.java

@@ -9,6 +9,7 @@ import com.xunmei.common.core.constant.*;
 import com.xunmei.common.core.domain.reminder.dto.ReminderScheduleMsgDto;
 import com.xunmei.common.core.domain.reminder.vo.ReminderScheduleMsgVo;
 import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.security.utils.SecurityUtils;
 import com.xunmei.sms.utils.SmsNotifyType;
 import com.xunmei.sms.utils.SmsUtil;
 import com.xunmei.system.api.RemoteOrgService;
@@ -92,11 +93,24 @@ public class SmsService implements ISmsService {
                 logger.error("【发送短信】转换数据出错:原数据:" + JSONObject.toJSON(data));
                 return AjaxResult.error("【发送短信】转换数据出错");
             }
-            CompositeData rspData = ESBClient.request(smsCompositeData);
+            CompositeData rspData = null;
+            try {
+                rspData =ESBClient.request(smsCompositeData);
+            } catch (Exception e) {
+                logger.error("短信发送时发生异常 :", e);
+            }
             logger.debug("【发送短信】返回数据:" + JSONObject.toJSON(rspData));
-//            return getResult(rspData);
+
             AjaxResult result = getResult(rspData);
-            recordService.saveSmsRecord(new SysOrg(), new SysUser(), result, data,smsCompositeData);
+            SysOrg tempOrg= new SysOrg();
+            tempOrg.setId(ObjectUtil.isNotEmpty(SecurityUtils.getLoginUser())? SecurityUtils.getLoginUser().getOrgId():4352539158904832L);
+            tempOrg.setShortName("短信发送测试");
+
+            SysUser tempUser=new SysUser();
+            tempUser.setId(ObjectUtil.isNotEmpty(SecurityUtils.getLoginUser()) ? SecurityUtils.getLoginUser().getUserid():1L);
+            tempUser.setName(ObjectUtil.isNotEmpty(SecurityUtils.getLoginUser()) ? SecurityUtils.getLoginUser().getName():"管理员");
+
+            recordService.saveSmsRecord(tempOrg, tempUser, result, data,smsCompositeData);
             return result;
         } catch (Exception ex) {
             logger.error("【发送短信】发送时内部异常:数据:" + JSONObject.toJSON(data), ex);

+ 8 - 2
soc-modules/soc-modules-sms/src/main/java/com/xunmei/sms/service/impl/SmsSendRecordServiceImpl.java

@@ -2,11 +2,13 @@ package com.xunmei.sms.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dc.eai.data.CompositeData;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.xunmei.common.core.constant.HttpStatus;
 import com.xunmei.common.core.constant.SecurityConstants;
 import com.xunmei.common.core.domain.reminder.dto.ReminderScheduleMsgDto;
@@ -24,14 +26,17 @@ import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.vo.SmsInfoVo;
 import io.netty.util.internal.StringUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 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.security.Security;
 import java.time.LocalDateTime;
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
 
 /**
  * <p>
@@ -104,7 +109,8 @@ public class SmsSendRecordServiceImpl extends ServiceImpl<SmsSendRecordMapper, S
         record.setTypeText(smsInfoVo.getRetMsg());
         record.setResult(result.get(AjaxResult.CODE_TAG).equals(String.valueOf(HttpStatus.SUCCESS)) ? "0" : "1");
         record.setResultDescription(result.get(AjaxResult.MSG_TAG).toString());
-        record.setReqDetail(smsCompositeData == null ? StringUtil.EMPTY_STRING : JSON.toJSONString(smsCompositeData));
+        String temp =smsCompositeData == null ? StringUtil.EMPTY_STRING : smsCompositeData.toString();
+        record.setReqDetail(temp);
         record.setRespDetail(JSON.toJSONString(result));
         int insert = baseMapper.insert(record);
         if (insert == 0) {
@@ -131,7 +137,7 @@ public class SmsSendRecordServiceImpl extends ServiceImpl<SmsSendRecordMapper, S
         record.setTypeText(smsInfoVo.getRetMsg());
         record.setResult(result.get(AjaxResult.CODE_TAG).equals(String.valueOf(HttpStatus.SUCCESS)) ? "0" : "1");
         record.setResultDescription(result.get(AjaxResult.MSG_TAG).toString());
-        record.setReqDetail(JSON.toJSONString(smsCompositeData));
+        record.setReqDetail(smsCompositeData.toString());
         record.setRespDetail(JSON.toJSONString(result));
         int insert = baseMapper.insert(record);
         if (insert == 0) {