Explorar el Código

优化考勤功能 提醒考勤任务

Your Name hace 3 años
padre
commit
35e3954008

+ 30 - 0
java110-bean/src/main/java/com/java110/dto/attendanceClasses/AttendanceClassesTaskDetailDto.java

@@ -47,6 +47,8 @@ public class AttendanceClassesTaskDetailDto extends PageDto implements Serializa
 
     private String staffId;
 
+    private String staffName;
+
     private String[] taskIds;
 
 
@@ -58,6 +60,10 @@ public class AttendanceClassesTaskDetailDto extends PageDto implements Serializa
     private String leaveValue;
     private String lateValue;
 
+    private String startTime;
+
+    private String endTime;
+
 
     public String getCheckTime() {
         return checkTime;
@@ -220,4 +226,28 @@ public class AttendanceClassesTaskDetailDto extends PageDto implements Serializa
     public void setStaffId(String staffId) {
         this.staffId = staffId;
     }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getStaffName() {
+        return staffName;
+    }
+
+    public void setStaffName(String staffName) {
+        this.staffName = staffName;
+    }
 }

+ 43 - 19
java110-bean/src/main/java/com/java110/dto/attendanceClasses/AttendanceLogDto.java

@@ -1,6 +1,7 @@
 package com.java110.dto.attendanceClasses;
 
 import com.java110.dto.PageDto;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -15,59 +16,74 @@ import java.util.Date;
 public class AttendanceLogDto extends PageDto implements Serializable {
 
     private String departmentName;
-private String departmentId;
-private String staffName;
-private String logId;
-private String storeId;
-private String staffId;
-private String clockTime;
+    private String departmentId;
+    private String staffName;
+    private String logId;
+    private String storeId;
+    private String staffId;
+    private String clockTime;
 
 
     private Date createTime;
 
     private String statusCd = "0";
 
+    private String facePath;
+
 
     public String getDepartmentName() {
         return departmentName;
     }
-public void setDepartmentName(String departmentName) {
+
+    public void setDepartmentName(String departmentName) {
         this.departmentName = departmentName;
     }
-public String getDepartmentId() {
+
+    public String getDepartmentId() {
         return departmentId;
     }
-public void setDepartmentId(String departmentId) {
+
+    public void setDepartmentId(String departmentId) {
         this.departmentId = departmentId;
     }
-public String getStaffName() {
+
+    public String getStaffName() {
         return staffName;
     }
-public void setStaffName(String staffName) {
+
+    public void setStaffName(String staffName) {
         this.staffName = staffName;
     }
-public String getLogId() {
+
+    public String getLogId() {
         return logId;
     }
-public void setLogId(String logId) {
+
+    public void setLogId(String logId) {
         this.logId = logId;
     }
-public String getStoreId() {
+
+    public String getStoreId() {
         return storeId;
     }
-public void setStoreId(String storeId) {
+
+    public void setStoreId(String storeId) {
         this.storeId = storeId;
     }
-public String getStaffId() {
+
+    public String getStaffId() {
         return staffId;
     }
-public void setStaffId(String staffId) {
+
+    public void setStaffId(String staffId) {
         this.staffId = staffId;
     }
-public String getClockTime() {
+
+    public String getClockTime() {
         return clockTime;
     }
-public void setClockTime(String clockTime) {
+
+    public void setClockTime(String clockTime) {
         this.clockTime = clockTime;
     }
 
@@ -87,4 +103,12 @@ public void setClockTime(String clockTime) {
     public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
+
+    public String getFacePath() {
+        return facePath;
+    }
+
+    public void setFacePath(String facePath) {
+        this.facePath = facePath;
+    }
 }

+ 8 - 0
java110-bean/src/main/java/com/java110/po/attendanceLog/AttendanceLogPo.java

@@ -14,6 +14,8 @@ public class AttendanceLogPo implements Serializable {
     private String staffId;
     private String clockTime;
 
+    private String facePath;
+
     public String getDepartmentName() {
         return departmentName;
     }
@@ -78,5 +80,11 @@ public class AttendanceLogPo implements Serializable {
         this.clockTime = clockTime;
     }
 
+    public String getFacePath() {
+        return facePath;
+    }
 
+    public void setFacePath(String facePath) {
+        this.facePath = facePath;
+    }
 }

+ 15 - 0
java110-db/src/main/resources/mapper/common/AttendanceClassesTaskDetailServiceDaoImplMapper.xml

@@ -161,4 +161,19 @@
 
     </select>
 
+
+    <select id="queryWaitSendMsgDetail" parameterType="Map" resultType="Map">
+        select t.check_time,t.check_time checkTime,t.detail_id,t.detail_id detailId,t.spec_cd,t.spec_cd
+        specCd,t.status_cd,t.status_cd statusCd,t.remark,t.face_path,t.face_path facePath,t.state,t.store_id,t.store_id
+        storeId,t.value,t.task_id,t.task_id taskId,t.leave_value leaveValue,t.late_value lateValue,act.staff_id staffId, act.staff_name staffName
+        from attendance_classes_task_detail t
+        left join attendance_classes_task act on t.task_id = act.task_id and act.status_cd = '0'
+        where 1 =1
+        <if test="startTime != null and startTime != ''">
+        and t.`value` &gt; #{startTime}
+        and t.`value` &lt;= #{endTime}
+        </if>
+        and t.status_cd = '0'
+        and t.state = '10000'
+    </select>
 </mapper>

+ 7 - 3
java110-db/src/main/resources/mapper/common/AttendanceLogServiceDaoImplMapper.xml

@@ -8,9 +8,9 @@
     <!-- 保存考勤日志信息 add by wuxw 2018-07-03 -->
     <insert id="saveAttendanceLogInfo" parameterType="Map">
         insert into attendance_log(
-        department_name,department_id,staff_name,log_id,store_id,staff_id,clock_time
+        department_name,department_id,staff_name,log_id,store_id,staff_id,clock_time,face_path
         ) values (
-        #{departmentName},#{departmentId},#{staffName},#{logId},#{storeId},#{staffId},#{clockTime}
+        #{departmentName},#{departmentId},#{staffName},#{logId},#{storeId},#{staffId},#{clockTime},#{facePath}
         )
     </insert>
 
@@ -19,7 +19,8 @@
     <select id="getAttendanceLogInfo" parameterType="Map" resultType="Map">
         select t.department_name,t.department_name departmentName,t.department_id,t.department_id
         departmentId,t.staff_name,t.staff_name staffName,t.log_id,t.log_id logId,t.status_cd,t.status_cd
-        statusCd,t.store_id,t.store_id storeId,t.staff_id,t.staff_id staffId,t.clock_time,t.clock_time clockTime
+        statusCd,t.store_id,t.store_id storeId,t.staff_id,t.staff_id staffId,t.clock_time,t.clock_time clockTime,
+        t.face_path facePath
         from attendance_log t
         where 1 =1
         <if test="departmentName !=null and departmentName != ''">
@@ -78,6 +79,9 @@
         <if test="clockTime !=null and clockTime != ''">
             , t.clock_time= #{clockTime}
         </if>
+        <if test="facePath !=null and facePath != ''">
+            , t.face_path = #{facePath}
+        </if>
         where 1=1
         <if test="logId !=null and logId != ''">
             and t.log_id= #{logId}

+ 3 - 0
java110-interface/src/main/java/com/java110/intf/common/IAttendanceClassesTaskDetailInnerServiceSMO.java

@@ -50,4 +50,7 @@ public interface IAttendanceClassesTaskDetailInnerServiceSMO {
      */
     @RequestMapping(value = "/queryAttendanceClassesTaskDetailsCount", method = RequestMethod.POST)
     int queryAttendanceClassesTaskDetailsCount(@RequestBody AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto);
+
+    @RequestMapping(value = "/queryWaitSendMsgDetail", method = RequestMethod.POST)
+    List<AttendanceClassesTaskDetailDto> queryWaitSendMsgDetail(@RequestBody AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto);
 }

+ 20 - 10
service-common/src/main/java/com/java110/common/cmd/attendanceClasses/CheckInCmd.java

@@ -3,11 +3,13 @@ package com.java110.common.cmd.attendanceClasses;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.common.smo.impl.AttendanceClassesTaskDetailInnerServiceSMOImpl;
 import com.java110.core.annotation.Java110Cmd;
+import com.java110.core.annotation.Java110Transactional;
 import com.java110.core.client.FileUploadTemplate;
 import com.java110.core.context.ICmdDataFlowContext;
 import com.java110.core.event.cmd.Cmd;
 import com.java110.core.event.cmd.CmdEvent;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.core.smo.IPhotoSMO;
 import com.java110.doc.annotation.*;
 import com.java110.dto.attendanceClasses.AttendanceClassesDto;
 import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto;
@@ -94,6 +96,9 @@ public class CheckInCmd extends Cmd {
     @Autowired
     private IOrgStaffRelV1InnerServiceSMO orgStaffRelV1InnerServiceSMOImpl;
 
+    @Autowired
+    private IPhotoSMO photoSMOImpl;
+
     @Override
     public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
 
@@ -102,6 +107,7 @@ public class CheckInCmd extends Cmd {
     }
 
     @Override
+    @Java110Transactional
     public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
 
         StoreUserDto storeUserDto = new StoreUserDto();
@@ -147,6 +153,19 @@ public class CheckInCmd extends Cmd {
     }
 
     private void doCheckInAttendanceLog(ICmdDataFlowContext context, JSONObject reqJson, List<StoreUserDto> storeUserDtos, List<UserDto> userDtos, AttendanceClassesDto attendanceClassesDto) {
+
+        String photo = "";
+        if (reqJson.containsKey("photo") && !StringUtil.isEmpty(reqJson.getString("photo"))) {
+            FileDto fileDto = new FileDto();
+            fileDto.setFileId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_file_id));
+            fileDto.setFileName(fileDto.getFileId());
+            fileDto.setContext(reqJson.getString("photo"));
+            fileDto.setSuffix("jpeg");
+            fileDto.setCommunityId("-1");
+            photo = fileInnerServiceSMOImpl.saveFile(fileDto);
+        }
+
+
         AttendanceLogPo attendanceLogPo = new AttendanceLogPo();
         attendanceLogPo.setLogId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_logId));
         attendanceLogPo.setStoreId(storeUserDtos.get(0).getStoreId());
@@ -155,6 +174,7 @@ public class CheckInCmd extends Cmd {
         attendanceLogPo.setDepartmentId(attendanceClassesDto.getClassesObjId());
         attendanceLogPo.setDepartmentName(attendanceClassesDto.getClassesObjName());
         attendanceLogPo.setStaffName(userDtos.get(0).getName());
+        attendanceLogPo.setFacePath(photo);
 
         int flag = attendanceLogInnerServiceSMOImpl.saveAttendanceLog(attendanceLogPo);
 
@@ -175,16 +195,6 @@ public class CheckInCmd extends Cmd {
             return;
         }
 
-        String photo = "";
-        if (reqJson.containsKey("photo") && !StringUtil.isEmpty(reqJson.getString("photo"))) {
-            FileDto fileDto = new FileDto();
-            fileDto.setFileId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_file_id));
-            fileDto.setFileName(fileDto.getFileId());
-            fileDto.setContext(reqJson.getString("photo"));
-            fileDto.setSuffix("jpeg");
-            fileDto.setCommunityId("-1");
-            photo = fileInnerServiceSMOImpl.saveFile(fileDto);
-        }
 
         //当前考勤的 记录
         AttendanceClassesTaskDetailDto nowAttendanceClassesTaskDetailDto = attendanceClassesTaskDetailDtos.get(0);

+ 2 - 0
service-common/src/main/java/com/java110/common/dao/IAttendanceClassesTaskDetailServiceDao.java

@@ -1,6 +1,7 @@
 package com.java110.common.dao;
 
 
+import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto;
 import com.java110.utils.exception.DAOException;
 import com.java110.entity.merchant.BoMerchant;
 import com.java110.entity.merchant.BoMerchantAttr;
@@ -58,4 +59,5 @@ public interface IAttendanceClassesTaskDetailServiceDao {
      */
     int queryAttendanceClassesTaskDetailsCount(Map info);
 
+    List<Map> queryWaitSendMsgDetail(Map info);
 }

+ 7 - 0
service-common/src/main/java/com/java110/common/dao/impl/AttendanceClassesTaskDetailServiceDaoImpl.java

@@ -1,6 +1,7 @@
 package com.java110.common.dao.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto;
 import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.exception.DAOException;
 import com.java110.utils.util.DateUtil;
@@ -94,5 +95,11 @@ public class AttendanceClassesTaskDetailServiceDaoImpl extends BaseServiceDao im
         return Integer.parseInt(businessAttendanceClassesTaskDetailInfos.get(0).get("count").toString());
     }
 
+    @Override
+    public List<Map> queryWaitSendMsgDetail(Map info) {
+        List<Map> result = sqlSessionTemplate.selectList("attendanceClassesTaskDetailServiceDaoImpl.queryWaitSendMsgDetail", info);
+        return result;
+    }
+
 
 }

+ 5 - 0
service-common/src/main/java/com/java110/common/smo/impl/AttendanceClassesTaskDetailInnerServiceSMOImpl.java

@@ -73,6 +73,11 @@ public class AttendanceClassesTaskDetailInnerServiceSMOImpl extends BaseServiceS
         return attendanceClassesTaskDetailServiceDaoImpl.queryAttendanceClassesTaskDetailsCount(BeanConvertUtil.beanCovertMap(attendanceClassesTaskDetailDto));
     }
 
+    @Override
+    public List<AttendanceClassesTaskDetailDto> queryWaitSendMsgDetail(@RequestBody AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto) {
+        return BeanConvertUtil.covertBeanList(attendanceClassesTaskDetailServiceDaoImpl.queryWaitSendMsgDetail(BeanConvertUtil.beanCovertMap(attendanceClassesTaskDetailDto)), AttendanceClassesTaskDetailDto.class);
+    }
+
     public IAttendanceClassesTaskDetailServiceDao getAttendanceClassesTaskDetailServiceDaoImpl() {
         return attendanceClassesTaskDetailServiceDaoImpl;
     }

+ 6 - 0
service-common/src/main/java/com/java110/common/smo/impl/AttendanceClassesTaskInnerServiceSMOImpl.java

@@ -11,6 +11,8 @@ import com.java110.intf.common.IAttendanceClassesTaskDetailInnerServiceSMO;
 import com.java110.intf.common.IAttendanceClassesTaskInnerServiceSMO;
 import com.java110.intf.user.IUserInnerServiceSMO;
 import com.java110.po.attendanceClassesTask.AttendanceClassesTaskPo;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.MappingConstant;
 import com.java110.utils.util.BeanConvertUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -107,6 +109,10 @@ public class AttendanceClassesTaskInnerServiceSMOImpl extends BaseServiceSMO imp
             return;
         }
         List<AttendanceClassesTaskDetailDto> tmpAttendanceClassesTaskDetailDtos = null;
+        String imgUrl = MappingCache.getValue(MappingConstant.FILE_DOMAIN, "IMG_PATH");
+        for (AttendanceClassesTaskDetailDto tmpAttendanceClassesTaskDetailDto : attendanceClassesTaskDetailDtos) {
+            tmpAttendanceClassesTaskDetailDto.setFacePath(imgUrl + tmpAttendanceClassesTaskDetailDto.getFacePath());
+        }
         for (AttendanceClassesTaskDto attendanceClassesTaskDto : attendanceClassesTasks) {
             tmpAttendanceClassesTaskDetailDtos = new ArrayList<>();
             for (AttendanceClassesTaskDetailDto tmpAttendanceClassesTaskDetailDto : attendanceClassesTaskDetailDtos) {

+ 11 - 0
service-common/src/main/java/com/java110/common/smo/impl/AttendanceLogInnerServiceSMOImpl.java

@@ -7,6 +7,8 @@ import com.java110.dto.PageDto;
 import com.java110.dto.attendanceClasses.AttendanceLogDto;
 import com.java110.intf.common.IAttendanceLogInnerServiceSMO;
 import com.java110.po.attendanceLog.AttendanceLogPo;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.MappingConstant;
 import com.java110.utils.util.BeanConvertUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -64,6 +66,15 @@ public class AttendanceLogInnerServiceSMOImpl extends BaseServiceSMO implements
 
         List<AttendanceLogDto> attendanceLogs = BeanConvertUtil.covertBeanList(attendanceLogServiceDaoImpl.getAttendanceLogInfo(BeanConvertUtil.beanCovertMap(attendanceLogDto)), AttendanceLogDto.class);
 
+        if (attendanceLogs == null || attendanceLogs.size() < 1) {
+            return attendanceLogs;
+        }
+        String imgUrl = MappingCache.getValue(MappingConstant.FILE_DOMAIN, "IMG_PATH");
+
+        for (AttendanceLogDto tmpAttendanceLogDto : attendanceLogs) {
+            tmpAttendanceLogDto.setFacePath(imgUrl + tmpAttendanceLogDto.getFacePath());
+        }
+
         return attendanceLogs;
     }
 

+ 175 - 0
service-job/src/main/java/com/java110/job/task/attendance/PublishStaffAttendanceTaskTemplate.java

@@ -0,0 +1,175 @@
+package com.java110.job.task.attendance;
+
+import com.alibaba.fastjson.JSON;
+import com.java110.core.factory.WechatFactory;
+import com.java110.dto.CommunityMemberDto;
+import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto;
+import com.java110.dto.community.CommunityDto;
+import com.java110.dto.inspectionPlan.InspectionTaskDetailDto;
+import com.java110.dto.inspectionPlan.InspectionTaskDto;
+import com.java110.dto.smallWeChat.SmallWeChatDto;
+import com.java110.dto.smallWechatAttr.SmallWechatAttrDto;
+import com.java110.dto.staffAppAuth.StaffAppAuthDto;
+import com.java110.dto.task.TaskDto;
+import com.java110.entity.wechat.Content;
+import com.java110.entity.wechat.Data;
+import com.java110.entity.wechat.PropertyFeeTemplateMessage;
+import com.java110.intf.common.IAttendanceClassesTaskDetailInnerServiceSMO;
+import com.java110.intf.community.*;
+import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
+import com.java110.intf.store.ISmallWechatAttrInnerServiceSMO;
+import com.java110.intf.user.IStaffAppAuthInnerServiceSMO;
+import com.java110.intf.user.IUserInnerServiceSMO;
+import com.java110.job.quartz.TaskSystemQuartz;
+import com.java110.po.attendanceClassesTaskDetail.AttendanceClassesTaskDetailPo;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.MappingConstant;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 推送员工考勤提示
+ */
+@Component
+public class PublishStaffAttendanceTaskTemplate extends TaskSystemQuartz {
+
+
+    @Autowired
+    private IAttendanceClassesTaskDetailInnerServiceSMO attendanceClassesTaskDetailInnerServiceSMOImpl;
+
+    @Autowired
+    private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
+
+    @Autowired
+    private ISmallWechatAttrInnerServiceSMO smallWechatAttrInnerServiceSMOImpl;
+
+    @Autowired
+    private IStaffAppAuthInnerServiceSMO staffAppAuthInnerServiceSMO;
+
+    @Autowired
+    private RestTemplate outRestTemplate;
+
+    @Autowired
+    private IUserInnerServiceSMO userInnerServiceSMO;
+
+    @Autowired
+    private ICommunityMemberV1InnerServiceSMO communityMemberV1InnerServiceSMOImpl;
+
+
+    //模板信息推送地址
+    private static String sendMsgUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";
+
+    @Override
+    protected void process(TaskDto taskDto) throws Exception {
+        logger.debug("开始执行微信模板信息推送" + taskDto.toString());
+
+        // 获取小区
+        publishStaffInspectionTask(taskDto);
+
+    }
+
+    /**
+     * 考勤任务
+     *
+     * @param taskDto
+     */
+    private void publishStaffInspectionTask(TaskDto taskDto) {
+        AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto = new AttendanceClassesTaskDetailDto();
+        attendanceClassesTaskDetailDto.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        Calendar endCal = Calendar.getInstance();
+        endCal.add(Calendar.MINUTE, 5);
+        attendanceClassesTaskDetailDto.setEndTime(DateUtil.getFormatTimeString(endCal.getTime(), DateUtil.DATE_FORMATE_STRING_A));
+        attendanceClassesTaskDetailDto.setState(AttendanceClassesTaskDetailDto.STATE_WAIT);
+        List<AttendanceClassesTaskDetailDto> inspectionTaskDetailDtos = attendanceClassesTaskDetailInnerServiceSMOImpl.queryWaitSendMsgDetail(attendanceClassesTaskDetailDto);
+
+        if(inspectionTaskDetailDtos == null || inspectionTaskDetailDtos.size() < 1){
+            return;
+        }
+        for (AttendanceClassesTaskDetailDto tmpAttendanceClassesTaskDetailDto : inspectionTaskDetailDtos) {
+            try {
+                dealAttendanceClassesTaskDetail(tmpAttendanceClassesTaskDetailDto, taskDto);
+            } catch (Exception e) {
+                logger.error("推送考勤提示失败", e);
+            }
+        }
+    }
+
+    /**
+     * 处理考勤
+     *
+     * @param attendanceClassesTaskDetailDto
+     * @param taskDto
+     */
+    private void dealAttendanceClassesTaskDetail(AttendanceClassesTaskDetailDto attendanceClassesTaskDetailDto, TaskDto taskDto) {
+
+        CommunityMemberDto communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setMemberId(attendanceClassesTaskDetailDto.getStoreId());
+        communityMemberDto.setState(CommunityMemberDto.STATE_NORMAL);
+        List<CommunityMemberDto> communityMemberDtos = communityMemberV1InnerServiceSMOImpl.queryCommunityMembers(communityMemberDto);
+
+        if(communityMemberDtos == null || communityMemberDtos.size() < 1){
+            return ;
+        }
+
+        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+        smallWeChatDto.setWeChatType("1100");
+        smallWeChatDto.setObjType(SmallWeChatDto.OBJ_TYPE_COMMUNITY);
+        smallWeChatDto.setObjId(communityMemberDtos.get(0).getCommunityId());
+        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);
+        if (smallWeChatDto == null || smallWeChatDtos.size() <= 0) {
+            logger.info("未配置微信公众号信息,定时任务执行结束");
+            return;
+        }
+        SmallWeChatDto weChatDto = smallWeChatDtos.get(0);
+        SmallWechatAttrDto smallWechatAttrDto = new SmallWechatAttrDto();
+        smallWechatAttrDto.setCommunityId(communityMemberDtos.get(0).getCommunityId());
+        smallWechatAttrDto.setWechatId(weChatDto.getWeChatId());
+        smallWechatAttrDto.setSpecCd(SmallWechatAttrDto.SPEC_CD_WECHAT_TEMPLATE);
+        List<SmallWechatAttrDto> smallWechatAttrDtos = smallWechatAttrInnerServiceSMOImpl.querySmallWechatAttrs(smallWechatAttrDto);
+        if (smallWechatAttrDtos == null || smallWechatAttrDtos.size() <= 0) {
+            logger.info("未配置微信公众号消息模板");
+            return;
+        }
+        String templateId = smallWechatAttrDtos.get(0).getValue();
+        String accessToken = WechatFactory.getAccessToken(weChatDto.getAppId(), weChatDto.getAppSecret());
+        if (StringUtil.isEmpty(accessToken)) {
+            logger.info("推送微信模板,获取accessToken失败:{}", accessToken);
+            return;
+        }
+        String url = sendMsgUrl + accessToken;
+        //根据 userId 查询到openId
+        StaffAppAuthDto staffAppAuthDto = new StaffAppAuthDto();
+        staffAppAuthDto.setStaffId(attendanceClassesTaskDetailDto.getStaffId());
+        staffAppAuthDto.setAppType("WECHAT");
+        List<StaffAppAuthDto> staffAppAuthDtos = staffAppAuthInnerServiceSMO.queryStaffAppAuths(staffAppAuthDto);
+        if (staffAppAuthDtos == null || staffAppAuthDtos.size() < 1) {
+            return;
+        }
+        String openId = staffAppAuthDtos.get(0).getOpenId();
+        Data data = new Data();
+        PropertyFeeTemplateMessage templateMessage = new PropertyFeeTemplateMessage();
+        templateMessage.setTemplate_id(templateId);
+        templateMessage.setTouser(openId);
+        data.setFirst(new Content("您有新的考勤任务:"));
+        data.setKeyword1(new Content(attendanceClassesTaskDetailDto.getStaffName()+"-"+("1001".equals(attendanceClassesTaskDetailDto.getSpecCd())?"上班考勤":"下班考勤")));
+        data.setKeyword2(new Content(attendanceClassesTaskDetailDto.getValue()));
+        data.setKeyword3(new Content("请到考勤机及时考勤"));
+        data.setRemark(new Content("如有疑问请联系管理员"));
+        templateMessage.setData(data);
+
+        logger.info("发送模板消息内容:{}", JSON.toJSONString(templateMessage));
+        ResponseEntity<String> responseEntity = outRestTemplate.postForEntity(url, JSON.toJSONString(templateMessage), String.class);
+        logger.info("微信模板返回内容:{}", responseEntity);
+
+    }
+
+}