瀏覽代碼

设置待审核提醒时间
定时任务发送待审核提醒

Min 2 年之前
父節點
當前提交
a461550842

+ 8 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-03-21
+ * @since 2023-04-12
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -87,7 +87,7 @@ public class TimeType extends Model<TimeType> {
     private Boolean payOvertime;
 
     /**
-     * 提醒时间
+     * 填报提醒时间
      */
     @TableField("alert_time")
     private String alertTime;
@@ -456,6 +456,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("project_custom")
     private Integer projectCustom;
 
+    /**
+     * 待审核提醒时间
+     */
+    @TableField("wait_check_alert_time")
+    private String waitCheckAlertTime;
+
 
     @Override
     protected Serializable pkVal() {

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/CompanyDingdingMapper.java

@@ -2,7 +2,9 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.CompanyDingding;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
+import org.springframework.web.bind.annotation.PathVariable;
 
 import java.util.List;
 
@@ -19,5 +21,5 @@ public interface CompanyDingdingMapper extends BaseMapper<CompanyDingding> {
     @Select("select corpid, corp_name, company_id from company_dingding left join company on company.id = company_dingding.company_id where company.set_meal = 1 and company.expiration_date > now()")
     public List<CompanyDingding> getServicedDingdingCompanyList();
 
-    List<CompanyDingding> getDingdingCompanyList();
+    List<CompanyDingding> getDingdingCompanyList(@Param("companyIds") List<Integer> companyIds);
 }

+ 0 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -121,8 +121,6 @@ public interface ReportMapper extends BaseMapper<Report> {
 
     double getMyOvertime(String userId);
 
-    List<Map<String, Object>> getWaitingApproveCnt(Integer companyId);
-
     List<Map<String, Object>> getProWaitingApproveCnt(Integer companyId);
 
     List<Map<String, Object>> getDeptWaitingApproveCnt(Integer companyId);

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/WxCorpInfoMapper.java

@@ -2,6 +2,7 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.WxCorpInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -15,5 +16,5 @@ import java.util.List;
  */
 public interface WxCorpInfoMapper extends BaseMapper<WxCorpInfo> {
 
-    List<WxCorpInfo> getWxCompanyList();
+    List<WxCorpInfo> getWxCompanyList(@Param("companyIds") List<Integer> companyIds);
 }

+ 65 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -570,36 +570,64 @@ public class TimingTask {
         }
     }
 
-    //每天9点10分提醒去审核
-    @Scheduled(cron = "0 10 9 ? * *")
+    //每分钟校验是否有需要提醒待审核的内容
+    @Scheduled(fixedRate = 60 * 1000)
     private void alertWaitingApprove() {
         if (isDev) return;
-        List<CompanyDingding> list = companyDingdingMapper.getDingdingCompanyList();
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("HH:mm");
+        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("wait_check_alert_time", df.format(now.toLocalTime())));
+        List<Integer> companyIds = timeTypeList.stream().map(TimeType::getCompanyId).distinct().collect(Collectors.toList());
+        companyIds.add(-1);
+        List<CompanyDingding> list = companyDingdingMapper.getDingdingCompanyList(companyIds);
         for (CompanyDingding companyDingding : list) {
-            List<Map<String, Object>> result = reportMapper.getWaitingApproveCnt(companyDingding.getCompanyId());
+            List<Map<String, Object>> result = reportMapper.getProWaitingApproveCnt(companyDingding.getCompanyId());
+            List<Map<String, Object>> result1 = reportMapper.getDeptWaitingApproveCnt(companyDingding.getCompanyId());
+            List<Object> resultCorpwxUserIds = result.stream().map(rl -> rl.get("auditorDDId")).collect(Collectors.toList());
             for (Map<String, Object> map : result) {
-//                if (companyDingding.getCompanyId() == 434) {
+                Optional<Map<String, Object>> first = result1.stream().filter(r1 -> r1.get("auditorDDId").equals(map.get("auditorDDId"))).findFirst();
+                Long num = Long.valueOf(String.valueOf(map.get("num")));
+                BigDecimal bigDecimal=new BigDecimal(num);
+                if(first.isPresent()){
+                    bigDecimal=bigDecimal.add(new BigDecimal(String.valueOf(first.get().get("num"))));
+                }
+                companyDingdingService.sendReportWaitingApplyMsg(companyDingding.getCompanyId(), companyDingding.getAgentId(),
+                        bigDecimal.longValue(), (String)map.get("auditorDDId"));
+            }
+            for (Map<String, Object> map : result1) {
+                if(!resultCorpwxUserIds.stream().anyMatch(ol->((String)ol).equals(map.get("auditorDDId")))){
+                    Long num = Long.valueOf(String.valueOf(map.get("num")));
+                    BigDecimal bigDecimal=new BigDecimal(num);
                     companyDingdingService.sendReportWaitingApplyMsg(companyDingding.getCompanyId(), companyDingding.getAgentId(),
-                            (Long)map.get("num"), (String)map.get("auditorDDId"));
-//                }
+                            bigDecimal.longValue(), (String)map.get("auditorDDId"));
+                }
             }
         }
-        List<WxCorpInfo> wxCorpInfoList = wxCorpInfoMapper.getWxCompanyList();
+        List<WxCorpInfo> wxCorpInfoList = wxCorpInfoMapper.getWxCompanyList(companyIds);
         for (WxCorpInfo wxCorpInfo : wxCorpInfoList) {
             if (wxCorpInfo!=null) {
-            List<Map<String, Object>> result = reportMapper.getWaitingApproveCnt(wxCorpInfo.getCompanyId());
-            for (Map<String, Object> map : result) {
-                if(map.get("corpwxUserid")!=null){
+                List<Map<String, Object>> result = reportMapper.getProWaitingApproveCnt(wxCorpInfo.getCompanyId());
+                List<Map<String, Object>> result1 = reportMapper.getDeptWaitingApproveCnt(wxCorpInfo.getCompanyId());
+                List<Object> resultCorpwxUserIds = result.stream().map(rl -> rl.get("corpwxUserid")).collect(Collectors.toList());
+                for (Map<String, Object> map : result) {
+                    Optional<Map<String, Object>> first = result1.stream().filter(r1 -> r1.get("corpwxUserid").equals(map.get("corpwxUserid"))).findFirst();
+                    if(map.get("corpwxUserid")!=null){
                     String corpwxUserid = (String) map.get("corpwxUserid");
                     //推送到企业微信
                     JSONObject json=new JSONObject();
                     JSONArray dataJson=new JSONArray();
                     JSONObject jsonObj=new JSONObject();
+                    Integer num = Integer.valueOf(String.valueOf(map.get("num")));
+                    BigDecimal bigDecimal=new BigDecimal(num);
+                    if(first.isPresent()){
+                        bigDecimal=bigDecimal.add(new BigDecimal(String.valueOf(first.get().get("num"))));
+                    }
+                    System.out.println("进来了-----------------------------------------------------------");
                     jsonObj.put("key", "待审核数量");
-                    jsonObj.put("value",StringUtils.isEmpty(map.get("num"))?"":map.get("num"));
+                    jsonObj.put("value",bigDecimal.toPlainString());
                     dataJson.add(jsonObj);
                     if(isPrivateDeploy){
-                        json.put("content","待审核数量: "+(StringUtils.isEmpty(map.get("num"))?"":map.get("num"))+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去审核</a>");
+                        json.put("content","待审核数量: "+(bigDecimal.toPlainString())+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去审核</a>");
                     }else {
                         json.put("template_id","tty9TkCAAAuPvPjabDdQXGocnG0K24EQ");
                         json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=review#wechat_redirect");
@@ -608,6 +636,30 @@ public class TimingTask {
                     wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpwxUserid, json);
                     }
                 }
+                for (Map<String, Object> map : result1) {
+                    if(!resultCorpwxUserIds.stream().anyMatch(ol->((String)ol).equals(map.get("corpwxUserid")))){
+                        if(map.get("corpwxUserid")!=null){
+                            String corpwxUserid = (String) map.get("corpwxUserid");
+                            //推送到企业微信
+                            JSONObject json=new JSONObject();
+                            JSONArray dataJson=new JSONArray();
+                            JSONObject jsonObj=new JSONObject();
+                            Integer num = Integer.valueOf(String.valueOf(map.get("num")));
+                            BigDecimal bigDecimal=new BigDecimal(num);
+                            jsonObj.put("key", "待审核数量");
+                            jsonObj.put("value",bigDecimal.toPlainString());
+                            dataJson.add(jsonObj);
+                            if(isPrivateDeploy){
+                                json.put("content","待审核数量: "+(bigDecimal.toPlainString())+"\\n<a href=\\\"https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri="+pcUrl+"/api/corpWXAuth&response_type=code&scope=snsapi_base&state=0#wechat_redirect\\\">去审核</a>");
+                            }else {
+                                json.put("template_id","tty9TkCAAAuPvPjabDdQXGocnG0K24EQ");
+                                json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=review#wechat_redirect");
+                                json.put("content_item",dataJson);
+                            }
+                            wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo, corpwxUserid, json);
+                        }
+                    }
+                }
             }
         }
     }

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDingdingMapper.xml

@@ -32,6 +32,12 @@
         left join company
         ON company_dingding.company_id = company.id
         where company.expiration_date >= now()
+        <if test="companyIds.size()>0">
+            and company.id in
+            <foreach collection="companyIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
     </select>
 
 </mapper>

+ 2 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -704,14 +704,7 @@
     <select id="getMyOvertime"  resultType="java.lang.Double">
         select IFNULL(sum(overtime_hours),0) from report where creator_id=#{userId}
     </select>
-    <select id="getWaitingApproveCnt" resultType="java.util.HashMap">
-        select count(1) as num, user.dingding_userid as auditorDDId ,user.corpwx_userid as corpwxUserid from report
-         left join user on user.id = project_auditor_id
-         where state = 0 and project_audit_state = 0 and is_dept_audit = 0
-        and report.company_id = #{companyId}
-        group by project_auditor_id
-    </select>
-    <!--<select id="getProWaitingApproveCnt" resultType="java.util.HashMap">
+    <select id="getProWaitingApproveCnt" resultType="java.util.HashMap">
         select count(1) as num, user.dingding_userid as auditorDDId ,user.corpwx_userid as corpwxUserid from report
          left join user on user.id = project_auditor_id
          where state = 0 and project_audit_state = 0 and is_dept_audit = 0
@@ -724,7 +717,7 @@
          where state = 0 and department_audit_state = 0 and is_dept_audit = 1
         and report.company_id =#{companyId}
         group by audit_dept_managerid
-    </select>-->
+    </select>
     <select id="getProjectCost" resultType="java.util.HashMap">
         SELECT project_id as projectId,basecost_id as basecostId, SUM(cost) AS cost FROM report WHERE company_id=#{companyId}
         AND (state = 0 or state = 1) and basecost_id > 0 AND project_id IN

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/WxCorpInfoMapper.xml

@@ -34,5 +34,11 @@
         left join company
         ON wx_corp_info.company_id = company.id
         where company.expiration_date >= now()
+        <if test="companyIds.size()>0">
+            and company.id in
+            <foreach collection="companyIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
     </select>
 </mapper>

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/en.json

@@ -935,7 +935,8 @@
   "reminderSettings": "Fill in the reminder settings",
   "remindermethod": "Please select a reminder method",
   "remindertext": "reminder text",
-  "remindertime": "reminder time",
+  "reportRemindertime": "report reminder time",
+  "checkRemindertime": "check reminder time",
   "settingrestPeriod": "Set a break time period",
   "showthesample": "Show example",
   "timeproportionally": "Prorated time",

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -930,8 +930,9 @@
   "pointintime": "任意时间点",
   "settingrestPeriod": "设置休息时间段",
   "timeproportionally": "按比例分配时间",
-  "reminderSettings": "填报提醒设置",
-  "remindertime": "提醒时间",
+  "reminderSettings": "提醒设置",
+  "reportRemindertime": "填报提醒时间",
+  "checkRemindertime": "审核提醒时间",
   "remindermethod": "请选择提醒方式",
   "missingfill": "每日提醒当天漏填",
   "missingfills": "每日提醒昨天漏填",

+ 19 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -190,13 +190,13 @@
         <p style="margin-left:10px;color:#666;">{{ $t('reminderSettings') }}</p>
         <el-row :gutter="20" style="padding-top:10px;width:100%;margin:0 auto;padding-left:10px;padding-right:10px;">
             <el-col :span="24" >
-                <div class="panel" style="height:200px;">
+                <div class="panel" >
                     <el-form :inline="true" :model="timeType"  style="margin-top:10px;">
-                    <el-form-item :label="$t('remindertime') " prop="alertTime">
+                    <el-form-item :label="$t('reportRemindertime') " prop="alertTime">
                         <el-time-picker 
                                 v-model="timeType.alertTime"
-                                :placeholder="$t('remindertime')"
-                                style="width:120px;"
+                                :placeholder="$t('reportRemindertime')"
+                                style="width:150px;"
                                 format="HH:mm"
                                 value-format="HH:mm"
                                 :picker-options="{
@@ -217,6 +217,20 @@
                             <!-- <el-switch v-if="timeType.alertTime" v-model="timeType.alertNonWorkday" active-color="#13ce66" inactive-color="#ff4949"></el-switch> -->
                     </el-form-item>
 
+                    <el-form-item :label="$t('checkRemindertime') " prop="waitCheckAlertTime" style="width:100%">
+                        <el-time-picker 
+                                v-model="timeType.waitCheckAlertTime"
+                                :placeholder="$t('checkRemindertime')"
+                                style="width:150px;"
+                                format="HH:mm"
+                                value-format="HH:mm"
+                                :picker-options="{
+                                start: '08:00',
+                                end: '23:30'
+                                }">
+                            </el-time-picker>
+                    </el-form-item>
+                    
                     </el-form>
                     <div class="underpanel">
                         <div class="whiteList_head">
@@ -1380,6 +1394,7 @@
 .yanjiu {
     display: flex;
     align-items: center;
+    margin-top: 10px;
     // justify-content: space-between;
     padding: 0 20px 0 0;
 }