Bladeren bron

异常自动审核处理

guozx 3 jaren geleden
bovenliggende
commit
00c8a4bb1c

+ 35 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/entry/ApprovalUserRes.java

@@ -0,0 +1,35 @@
+package com.jihengbel.intelligent.applicationtask.entry;
+
+public class ApprovalUserRes {
+
+
+    private Long user_id;
+
+    private Integer type;
+
+    private Integer approval_level;
+
+    public Long getUser_id() {
+        return user_id;
+    }
+
+    public void setUser_id(Long user_id) {
+        this.user_id = user_id;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getApproval_level() {
+        return approval_level;
+    }
+
+    public void setApproval_level(Integer approval_level) {
+        this.approval_level = approval_level;
+    }
+}

+ 54 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/entry/ApproveEntry.java

@@ -0,0 +1,54 @@
+package com.jihengbel.intelligent.applicationtask.entry;
+
+import java.io.Serializable;
+
+public class ApproveEntry implements Serializable {
+
+    private long id;
+    private long task_id;
+    private int approval_level;
+    private long approval_user_id;
+    private int status;
+
+    public int getStatus() {
+        return status;
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public long getTask_id() {
+        return task_id;
+    }
+
+    public void setTask_id(long task_id) {
+        this.task_id = task_id;
+    }
+
+    public int getApproval_level() {
+        return approval_level;
+    }
+
+    public void setApproval_level(int approval_level) {
+        this.approval_level = approval_level;
+    }
+
+    public long getApproval_user_id() {
+        return approval_user_id;
+    }
+
+    public void setApproval_user_id(long approval_user_id) {
+        this.approval_user_id = approval_user_id;
+    }
+
+
+}

+ 116 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/init/AutoApproveErrorTaskJob.java

@@ -0,0 +1,116 @@
+package com.jihengbel.intelligent.applicationtask.init;
+
+import com.jihengbel.intelligent.applicationtask.common.CommonUtil;
+import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
+import com.jihengbel.intelligent.applicationtask.entry.FirstCalendar;
+import com.jihengbel.intelligent.applicationtask.entry.FirstTask;
+import com.jihengbel.intelligent.applicationtask.service.FirstTaskService;
+import com.jihengbel.intelligent.applicationtask.service.OnsiteTaskService;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.FutureTask;
+
+/**
+ * 首件任务定时器
+ */
+@DisallowConcurrentExecution
+public class AutoApproveErrorTaskJob implements Job {
+    private static Logger log = LoggerFactory.getLogger(AutoApproveErrorTaskJob.class);
+
+    private static int type2=2;
+    private static int type3=3;
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException {
+        ConcurrentMap<String, Object> paramMap = (ConcurrentMap<String, Object>) context.getJobDetail().getJobDataMap().get(QuartzManager.JOB_PARAM_NAME);
+        try {
+            createTask(paramMap);// 执行任务
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 创建Task主方法
+     *
+     * @param paramMap
+     */
+    public void createTask(ConcurrentMap<String, Object> paramMap) {
+        Integer result = 0;//没什么意义只是为了不出现整体并行
+        List<FutureTask<Integer>> tasks = new ArrayList<>();
+        tasks.add(getFutureTask(paramMap, type2));
+        tasks.add(getFutureTask(paramMap, type3));
+//        tasks.add(get200FutureTask(paramMap));
+        try {
+            for (FutureTask<Integer> t : tasks) {
+                t.get();
+            }//等等所有线程结束
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private FutureTask<Integer> getFutureTask(ConcurrentMap<String, Object> paramMap,int type) {
+        FutureTask<Integer> task = new FutureTask<Integer>(new AutoApproveErrorTaskJob.approveTask(paramMap,type));
+        Thread thread = new Thread(task);
+        thread.start();  //开启线程
+        return task;
+    }
+
+
+    /**
+     * 生产任务
+     */
+    public class approveTask implements Callable<Integer> {
+
+        private ConcurrentMap<String, Object> paramMap;
+        private int type;
+
+
+        public approveTask(ConcurrentMap<String, Object> paramMap, int type) {
+            this.paramMap = paramMap;
+            this.type = type;
+        }
+
+        @Override
+        public Integer call() throws Exception {
+            FirstTaskService firstTaskService = (FirstTaskService) paramMap.get("firstTaskService");
+            OnsiteTaskService onsiteTaskService = (OnsiteTaskService) paramMap.get("onsiteTaskService");
+            HashMap queryMap = new HashMap();
+            if (type == type2) {//首件
+                int maxlevel = firstTaskService.getMaxApproveLevel(null);
+                queryMap.put("approval_level", maxlevel);
+                List<ApproveEntry>  approves=firstTaskService.getApproveTaskNoDeal(queryMap);
+                for(ApproveEntry ap:approves){
+                    try {
+                        firstTaskService.addTaskForNext(ap);
+                    }catch (Throwable e){
+                        e.printStackTrace();
+                    }
+                }
+            } else {//防错
+                int maxlevel = onsiteTaskService.getMaxApproveLevel(null);
+                queryMap.put("approval_level", maxlevel);
+                List<ApproveEntry>  approves=onsiteTaskService.getApproveTaskNoDeal(queryMap);
+                for(ApproveEntry ap:approves){
+                    try {
+                        onsiteTaskService.addTaskForNext(ap);
+                    }catch (Throwable e){
+                        e.printStackTrace();
+                    }
+                }
+            }
+
+            return 0;
+        }
+    }
+
+}

+ 17 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/init/TimerTaskInit.java

@@ -43,12 +43,29 @@ public class TimerTaskInit implements CommandLineRunner {
         param.put("onsiteTaskService", onsiteTaskService);
         param.put("firstTaskService", firstTaskService);
         Scheduler sche = schedulerFactoryBean.getScheduler();
+        addAutoApproveErrorTask(param, sche);
         addOnsiteTask(param, sche);
         addOnsiteRemindWork( param, sche);
         addFirstTask(param, sche);
         addFirstRemindWork(param, sche);
     }
 
+    /**
+     * 添加异常自动审批
+     *
+     * @param param
+     * @param sche
+     */
+    private void addAutoApproveErrorTask(ConcurrentMap<String, Object> param, Scheduler sche) {
+        JobFactoryParam onsite = new JobFactoryParam();
+        onsite.setJobGroupName(QuartzManager.JOB_GROUP_NAME);
+        onsite.setJobName("errAutoTask");
+        onsite.setParamMap(param);
+        onsite.setTriggerRule("0 */5 * * * ? ");
+        onsite.setClazz(AutoApproveErrorTaskJob.class);
+        QuartzManager.addJob(sche, onsite);
+    }
+
     /**
      * 添加onsit任务的定时器
      *

+ 22 - 4
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/model/FirstTaskMapper.java

@@ -1,10 +1,7 @@
 package com.jihengbel.intelligent.applicationtask.model;
 
 
-import com.jihengbel.intelligent.applicationtask.entry.FirstCalendar;
-import com.jihengbel.intelligent.applicationtask.entry.FirstTask;
-import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
-import com.jihengbel.intelligent.applicationtask.entry.OnsiteTask;
+import com.jihengbel.intelligent.applicationtask.entry.*;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -61,6 +58,27 @@ public interface FirstTaskMapper {
      */
     public Long getRemindNoworkToManager(Map map);
 
+    /**
+     * 获取最大审批级别
+     * @param map
+     * @return
+     */
+    public int getMaxApproveLevel(Map map);
+
+    /**
+     * 或许超时没处理记录
+     * @param map
+     * @return
+     */
+    public List<ApproveEntry> getApproveTaskNoDeal(Map map);
+
+    public int updateApproveTask(ApproveEntry vo);
+
+    public int addApproveTask(ApproveEntry vo);
+
+    public ApprovalUserRes getApprovalUser(Map map);
+
+
 
 
 }

+ 21 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/model/OnsiteTaskMapper.java

@@ -1,6 +1,8 @@
 package com.jihengbel.intelligent.applicationtask.model;
 
 
+import com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes;
+import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteTask;
 import org.apache.ibatis.annotations.Mapper;
@@ -59,6 +61,25 @@ public interface OnsiteTaskMapper {
 
 
 
+    /**
+     * 获取最大审批级别
+     * @param map
+     * @return
+     */
+    public int getMaxApproveLevel(Map map);
+
+    /**
+     * 或许超时没处理记录
+     * @param map
+     * @return
+     */
+    public List<ApproveEntry> getApproveTaskNoDeal(Map map);
+
+    public int updateApproveTask(ApproveEntry vo);
+
+    public int addApproveTask(ApproveEntry vo);
+
+    public ApprovalUserRes getApprovalUser(Map map);
 
 
 }

+ 23 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/FirstTaskService.java

@@ -1,7 +1,9 @@
 package com.jihengbel.intelligent.applicationtask.service;
 
+import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
 import com.jihengbel.intelligent.applicationtask.entry.FirstCalendar;
 import com.jihengbel.intelligent.applicationtask.entry.FirstTask;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
@@ -53,4 +55,25 @@ public interface FirstTaskService {
      * @return
      */
     public Long getRemindNoworkToManager(Map map);
+
+    /**
+     * 获取最大审批级别
+     * @param map
+     * @return
+     */
+    public int getMaxApproveLevel(Map map);
+
+    /**
+     * 或许超时没处理记录
+     * @param map
+     * @return
+     */
+    public List<ApproveEntry> getApproveTaskNoDeal(Map map);
+
+    /**
+     * 添加新任务处理
+     * @param vo
+     * @return
+     */
+    public int addTaskForNext(ApproveEntry vo);
 }

+ 21 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/OnsiteTaskService.java

@@ -1,5 +1,6 @@
 package com.jihengbel.intelligent.applicationtask.service;
 
+import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteTask;
 
@@ -53,5 +54,25 @@ public interface OnsiteTaskService {
      */
     public int updateOnsiteRemindFlag(Map<String,Object> param);
 
+    /**
+     * 获取最大审批级别
+     * @param map
+     * @return
+             */
+    public int getMaxApproveLevel(Map map);
+
+    /**
+     * 或许超时没处理记录
+     * @param map
+     * @return
+     */
+    public List<ApproveEntry> getApproveTaskNoDeal(Map map);
+
+    /**
+     * 添加新任务处理
+     * @param vo
+     * @return
+     */
+    public int addTaskForNext(ApproveEntry vo);
 
 }

+ 43 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/FirstTaskServiceImp.java

@@ -1,5 +1,7 @@
 package com.jihengbel.intelligent.applicationtask.service.impl;
 
+import com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes;
+import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
 import com.jihengbel.intelligent.applicationtask.entry.FirstCalendar;
 import com.jihengbel.intelligent.applicationtask.entry.FirstTask;
 import com.jihengbel.intelligent.applicationtask.model.FirstTaskMapper;
@@ -8,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -77,4 +80,44 @@ public class FirstTaskServiceImp implements FirstTaskService {
     }
 
 
+
+    /**
+     * 获取最大审批级别
+     * @param map
+     * @return
+     */
+    public int getMaxApproveLevel(Map map){
+        return  mapper.getMaxApproveLevel(map);
+    }
+
+    /**
+     * 或许超时没处理记录
+     * @param map
+     * @return
+     */
+    public List<ApproveEntry> getApproveTaskNoDeal(Map map){
+        return  mapper.getApproveTaskNoDeal(map);
+    }
+
+    @Transactional(rollbackFor = Throwable.class)
+    public int addTaskForNext(ApproveEntry vo){
+        HashMap map=new HashMap();
+        map.put("approvalLevel",vo.getApproval_level()+1);
+        vo.setStatus(2);
+        ApprovalUserRes nextUser=mapper.getApprovalUser(map);
+        if(nextUser!=null){
+            int result= mapper.updateApproveTask(vo);
+            if(result>0){
+                ApproveEntry approve=new ApproveEntry();
+                approve.setTask_id(vo.getTask_id());
+                approve.setApproval_level(nextUser.getApproval_level());
+                approve.setApproval_user_id(nextUser.getUser_id().longValue());
+                return mapper.addApproveTask(approve);
+            }
+        }
+       return 0;
+    }
+
+
+
 }

+ 43 - 0
application-task/src/main/java/com/jihengbel/intelligent/applicationtask/service/impl/OnsiteTaskServiceImp.java

@@ -1,5 +1,7 @@
 package com.jihengbel.intelligent.applicationtask.service.impl;
 
+import com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes;
+import com.jihengbel.intelligent.applicationtask.entry.ApproveEntry;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteCalendar;
 import com.jihengbel.intelligent.applicationtask.entry.OnsiteTask;
 import com.jihengbel.intelligent.applicationtask.model.OnsiteTaskMapper;
@@ -8,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -77,4 +80,44 @@ public class OnsiteTaskServiceImp implements OnsiteTaskService {
         return result;
 
     }
+
+
+
+    /**
+     * 获取最大审批级别
+     * @param map
+     * @return
+     */
+    public int getMaxApproveLevel(Map map){
+        return  mapper.getMaxApproveLevel(map);
+    }
+
+    /**
+     * 或许超时没处理记录
+     * @param map
+     * @return
+     */
+    public List<ApproveEntry> getApproveTaskNoDeal(Map map){
+        return  mapper.getApproveTaskNoDeal(map);
+    }
+
+    @Transactional(rollbackFor = Throwable.class)
+    public int addTaskForNext(ApproveEntry vo){
+        HashMap map=new HashMap();
+        map.put("approvalLevel",vo.getApproval_level()+1);
+        vo.setStatus(2);
+        ApprovalUserRes nextUser=mapper.getApprovalUser(map);
+        if(nextUser!=null){
+            int result= mapper.updateApproveTask(vo);
+            if(result>0){
+                ApproveEntry approve=new ApproveEntry();
+                approve.setTask_id(vo.getTask_id());
+                approve.setApproval_level(nextUser.getApproval_level());
+                approve.setApproval_user_id(nextUser.getUser_id().longValue());
+                return mapper.addApproveTask(approve);
+            }
+        }
+        return 0;
+    }
+
 }

+ 70 - 27
application-task/src/main/resources/mappers/FirstTaskMapper.xml

@@ -1,6 +1,6 @@
 <?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.jihengbel.intelligent.applicationtask.model.FirstTaskMapper" >
+<mapper namespace="com.jihengbel.intelligent.applicationtask.model.FirstTaskMapper">
 
 
     <resultMap id="calendarFirst" type="com.jihengbel.intelligent.applicationtask.entry.FirstCalendar">
@@ -16,31 +16,71 @@
         <result column="task_time" property="task_time"/>
         <result column="first_task_id" property="first_task_id"/>
     </resultMap>
+    <resultMap id="approveMap" type="com.jihengbel.intelligent.applicationtask.entry.ApproveEntry">
+        <id column="id" property="id"/>
+        <result column="first_article_task_id" property="task_id"/>
+        <result column="approval_level" property="approval_level"/>
+        <result column="approval_user_id" property="approval_user_id"/>
+    </resultMap>
 
+    <select id="getMaxApproveLevel" resultType="int">
+        select max(approval_level) from approval_rule where  type = 2
+    </select>
 
+    <select id="getApproveTaskNoDeal" resultMap="approveMap">
+        select a.id, a.first_article_task_id , a.approval_level, a.approval_user_id
+        from first_article_approval_task a
+        where a.status=0 and a.approval_level &lt; ${approval_level} and now() &gt; ADDDATE(a.created_time, interval 30 minute); <!--找到30分钟没处理的 -->
+    </select>
 
+    <update id="updateApproveTask">
+        update first_article_approval_task
+        set status=${status}
+        where id = ${id}
+          and status = 0
+    </update>
 
+    <insert id="addApproveTask">
+        insert into first_article_approval_task(first_article_task_id, approval_level, approval_user_id,created_time,reason)
+        values (${task_id}, ${approval_level}, ${approval_user_id},now(),'自动审批')
+    </insert>
+
+    <select id="getApprovalUser" resultType="com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes">
+        SELECT uur.user_id,
+               ar.type,
+               ar.approval_level
+        FROM approval_rule ar,
+             us_user_role uur,
+             us_user uu
+        WHERE ar.role_id = uur.role_id
+          AND uu.del_flag = 0
+          AND uu.lock = 0
+          AND ar.approval_level = ${approvalLevel}
+          AND ar.type = 2 LIMIT   0,1
+    </select>
 
 
     <select id="getCalenderFirstForType" resultMap="calendarFirst">
-        SELECT b.* FROM  benteler_plan a,first_article_calendar b,onsite_approval_plan oap
-        WHERE a.id=b.benteler_plan_id and a.pause_flag=0 and a.deleted=0 and a.effective_date &lt;= now()
-        and b.type_flag=${type_flag}
-        and a.id = oap.benteler_plan_id
-        and a.plan_type = 1
-        and oap.approval_level = 2
-        and oap.status = 1
+        SELECT b.*
+        FROM benteler_plan a,
+             first_article_calendar b,
+             onsite_approval_plan oap
+        WHERE a.id = b.benteler_plan_id
+          and a.pause_flag = 0
+          and a.deleted = 0
+          and a.effective_date &lt;= now()
+          and b.type_flag = ${type_flag}
+          and a.id = oap.benteler_plan_id
+          and a.plan_type = 1
+          and oap.approval_level = 2
+          and oap.status = 1
     </select>
 
     <insert id="insertFirstTask" parameterType="com.jihengbel.intelligent.applicationtask.entry.FirstTask">
-        insert into first_article_task_key(first_article_calendar_id,task_time)
-        values(
-                  ${first_article_calendar_id},#{task_time}
-              );
-        insert into first_article_task(first_article_calendar_id,task_time)
-        values(
-                  ${first_article_calendar_id},#{task_time}
-              );
+        insert into first_article_task_key(first_article_calendar_id, task_time)
+        values (${first_article_calendar_id}, #{task_time});
+        insert into first_article_task(first_article_calendar_id, task_time)
+        values (${first_article_calendar_id}, #{task_time});
     </insert>
 
     <select id="getRemindWork" resultMap="calendarFirst">
@@ -48,29 +88,32 @@
         from first_article_task a,first_article_calendar b
         where a.first_article_calendar_id=b.id and a.status=0 and b.type_flag=${type_flag}
         <if test="remind_task_flag != null">
-            and  a.remind_task_flag = ${remind_task_flag}
+            and a.remind_task_flag = ${remind_task_flag}
         </if>
         <if test="remind_nowork_flag">
-            and  a.remind_nowork_flag = ${remind_nowork_flag}
+            and a.remind_nowork_flag = ${remind_nowork_flag}
         </if>
     </select>
 
 
-    <update id="updateFirstRemindFlag" >
-        update  first_article_task set ${flag}=${flagVal} where id=${first_task_id}
+    <update id="updateFirstRemindFlag">
+        update first_article_task
+        set ${flag}=${flagVal}
+        where id = ${first_task_id}
     </update>
 
-    <insert id="addRemindNowork" >
-        insert into remind_approval_task(task_id,approval_user_id,task_type)
-        values(${task_id},${approval_user_id},${task_type})
+    <insert id="addRemindNowork">
+        insert into remind_approval_task(task_id, approval_user_id, task_type)
+        values (${task_id}, ${approval_user_id}, ${task_type})
     </insert>
 
     <select id="getRemindNoworkToManager" resultType="Long">
-        select b.user_id from nowork_remind_rule a ,us_user_role b  where a.type=${type}  and  a.role_id=b.role_id limit 1
+        select b.user_id
+        from nowork_remind_rule a,
+             us_user_role b
+        where a.type = ${type}
+          and a.role_id = b.role_id limit 1
     </select>
 
 
-
-
-
 </mapper>

+ 42 - 0
application-task/src/main/resources/mappers/OnsiteTaskMapper.xml

@@ -19,6 +19,48 @@
     </resultMap>
 
 
+    <resultMap id="approveMap" type="com.jihengbel.intelligent.applicationtask.entry.ApproveEntry">
+        <id column="id" property="id"/>
+        <result column="onsite_task_id" property="task_id"/>
+        <result column="approval_level" property="approval_level"/>
+        <result column="approval_user_id" property="approval_user_id"/>
+    </resultMap>
+
+    <select id="getMaxApproveLevel" resultType="int">
+        select max(approval_level) from approval_rule where  type = 3
+    </select>
+
+    <select id="getApproveTaskNoDeal" resultMap="approveMap">
+        select a.id, a.onsite_task_id , a.approval_level, a.approval_user_id
+        from onsite_approval_task a
+        where a.status=0 and a.approval_level &lt; ${approval_level} and now() &gt; ADDDATE(a.created_time, interval 30 minute); <!--找到30分钟没处理的 -->
+    </select>
+
+    <update id="updateApproveTask">
+        update onsite_approval_task
+        set status=${status}
+        where id = ${id}
+          and status = 0
+    </update>
+
+    <insert id="addApproveTask">
+        insert into onsite_approval_task(onsite_task_id, approval_level, approval_user_id,created_time,reason)
+        values (${task_id}, ${approval_level}, ${approval_user_id},now(),'自动审批')
+    </insert>
+
+    <select id="getApprovalUser" resultType="com.jihengbel.intelligent.applicationtask.entry.ApprovalUserRes">
+        SELECT uur.user_id,
+               ar.type,
+               ar.approval_level
+        FROM approval_rule ar,
+             us_user_role uur,
+             us_user uu
+        WHERE ar.role_id = uur.role_id
+          AND uu.del_flag = 0
+          AND uu.lock = 0
+          AND ar.approval_level = ${approvalLevel}
+          AND ar.type = 3 LIMIT   0,1
+    </select>
 
 
     <insert id="addRemindNowork" >