فهرست منبع

fix 同步企微正确账户

ct 9 ساعت پیش
والد
کامیت
b85a8fd4f2

+ 19 - 18
fs-company/src/main/java/com/fs/company/controller/qw/QwUserController.java

@@ -949,26 +949,27 @@ public class QwUserController extends BaseController
         List<String> strings = qwCompanyMapper.selectQwCompanyCorpIdListByCompanyId(loginUser.getCompany().getCompanyId());
         for (String string : strings) {
             if (string.equals(corpId)){
-                // 远程调用 fs-qw-api 同步企微用户
-                String syncUserUrl = OpenQwConfig.taskApi + "/app/common/syncQwUserAsync?corpId=" + corpId;
-                try {
-                    HttpResponse response = HttpRequest.post(syncUserUrl)
-                            .timeout(apiTimeout * 1000)
-                            .execute();
-                    if (response.getStatus() != 200) {
-                        log.error("同步企微用户失败,HTTP状态码: {}", response.getStatus());
-                        return R.error("同步企微用户失败,服务返回状态码: " + response.getStatus());
-                    }
-                } catch (Exception e) {
-                    log.error("同步企微用户异常, url={}", syncUserUrl, e);
-                    if (e.getCause() instanceof SocketTimeoutException) {
-                        return R.error("同步企微用户超时,请稍后重试");
-                    }
-                    return R.error("同步企微用户失败: " + e.getMessage());
-                }
+//                // 远程调用 fs-qw-api 同步企微用户
+//                String syncUserUrl = OpenQwConfig.taskApi + "/app/common/syncQwUserAsync?corpId=" + corpId;
+//                try {
+//                    HttpResponse response = HttpRequest.post(syncUserUrl)
+//                            .timeout(apiTimeout * 1000)
+//                            .execute();
+//                    if (response.getStatus() != 200) {
+//                        log.error("同步企微用户失败,HTTP状态码: {}", response.getStatus());
+//                        return R.error("同步企微用户失败,服务返回状态码: " + response.getStatus());
+//                    }
+//                } catch (Exception e) {
+//                    log.error("同步企微用户异常, url={}", syncUserUrl, e);
+//                    if (e.getCause() instanceof SocketTimeoutException) {
+//                        return R.error("同步企微用户超时,请稍后重试");
+//                    }
+//                    return R.error("同步企微用户失败: " + e.getMessage());
+//                }
+                return qwUserService.syncQwUser(corpId,loginUser.getTenantId());
 
             }
         }
-        return R.ok();
+        return R.error("同步企微用户失败");
     }
 }

+ 569 - 0
fs-company/src/main/java/com/fs/company/controller/qw/TaskManualController.java

@@ -0,0 +1,569 @@
+package com.fs.company.controller.qw;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.fs.common.config.RedisTenantContext;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.ResponseResult;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.service.ICompanyService;
+import com.fs.company.vo.RedPacketMoneyVO;
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.course.mapper.FsCourseWatchLogMapper;
+import com.fs.course.param.newfs.FsUserCourseAddCompanyUserParam;
+import com.fs.course.service.*;
+import com.fs.course.vo.FsUserCourseVideoQVO;
+import com.fs.framework.datasource.TenantDataSourceManager;
+import com.fs.his.domain.FsUser;
+import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.utils.qrcode.QRCodeUtils;
+import com.fs.qw.domain.QwCompany;
+import com.fs.qw.domain.QwIpadServerLog;
+import com.fs.qw.domain.QwUser;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.*;
+import com.fs.qwApi.service.QwApiService;
+import com.fs.sop.mapper.QwSopLogsMapper;
+import com.fs.sop.mapper.QwSopMapper;
+import com.fs.sop.mapper.SopUserLogsMapper;
+import com.fs.sop.service.*;
+import com.fs.sop.vo.QwSopLogsDoSendListTVO;
+import com.fs.store.service.IFsUserCourseCountService;
+import com.fs.tenant.domain.TenantInfo;
+import com.fs.tenant.service.TenantInfoService;
+import com.fs.wxwork.dto.WxWorkGetQrCodeDTO;
+import com.fs.wxwork.service.WxWorkService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+@Api("公共接口")
+@RestController
+@RequestMapping(value="/app/common")
+public class TaskManualController {
+
+    private static final Logger log = LoggerFactory.getLogger(TaskManualController.class);
+
+//    @Autowired
+//    private SopLogsTaskService service;
+    @Autowired
+    private IFsUserCourseVideoService courseVideoService;
+    @Autowired
+    private IQwExternalContactService qwExternalContactService;
+    @Autowired
+    private IFsUserVideoService fsUserVideoService;
+    @Autowired
+    private IHuaweiObsService huaweiObsService;
+    @Autowired
+    private IFsCourseWatchLogService watchLogService;
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+    @Autowired
+    private IFsCourseRedPacketLogService fsCourseRedPacketLogService;
+
+    @Autowired
+    private IQwSopLogsService qwSopLogsService;
+
+    @Autowired
+    private QwSopMapper qwSopMapper;
+
+    @Autowired
+    private FsCourseWatchLogMapper fsCourseWatchLogMapper;
+
+    @Autowired
+    private IFsCourseLinkService courseLinkService;
+    @Autowired
+    private FsCourseRedPacketLogMapper fsCourseRedPacketLogMapper;
+    @Autowired
+    private ICompanyService companyService;
+
+    @Autowired
+    private SopUserLogsMapper sopUserLogsMapper;
+
+    @Autowired
+    private QwSopLogsMapper qwSopLogsMapper;
+    @Autowired
+    private IQwSopTempRulesService tempRulesService;
+    @Autowired
+    private IQwSopTempVoiceService qwSopTempVoiceService;
+
+//    @Autowired
+//    private QwExternalContactRatingService qwExternalContactRatingService;
+
+    @Autowired
+    private ISopUserLogsService iSopUserLogsService;
+
+    @Autowired
+    private IFsUserCourseCountService userCourseCountService;
+
+    @Autowired
+    private ISopUserLogsInfoService iSopUserLogsInfoService;
+
+    @Autowired
+    private IFsInquiryOrderService inquiryOrderService;
+
+    @Autowired
+    private IQwMaterialService iQwMaterialService;
+
+    @Autowired
+    private IFsCourseLinkService iFsCourseLinkService;
+
+//    @Autowired
+//    private SyncQwExternalContactService syncQwExternalContactService;
+    @Autowired
+    private IFsUserCourseVideoService fsUserCourseVideoService;
+
+    @Autowired
+    public RedisCache redisCache;
+
+    @Autowired
+    private QwUserMapper qwUserMapper;
+
+
+    @Autowired
+    IQwIpadServerService ipadServerService;
+
+    @Autowired
+    IQwIpadServerLogService qwIpadServerLogService;
+    @Autowired
+    IQwIpadServerUserService qwIpadServerUserService;
+
+    @Autowired
+    IQwExternalContactService externalContactService;
+    @Autowired
+    WxWorkService wxWorkService;
+    @Autowired
+    private IQwUserService qwUserService;
+    @Autowired
+    private IQwDeptService qwDeptService;
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private IQwCompanyService qwCompanyService;
+    @Autowired
+    private TenantDataSourceManager tenantDataSourceManager;
+
+    @RequestMapping("/syncQwUserAsync")
+    public void syncQwUserAsync(String corpId) {
+        QwCompany qwCompany = qwCompanyService.selectQwCompanyByCorpId(corpId);
+        if (ObjectUtil.isEmpty(corpId)) {
+            return; // 跳过无效租户,继续下一个
+        }
+
+        TenantInfo tenantInfo = null;
+        try {
+            tenantInfo = tenantInfoService.getById(qwCompany.getTenantId());
+            if (ObjectUtil.isEmpty(tenantInfo)) {
+                log.warn("租户信息不存在,tenantId={}", qwCompany.getTenantId());
+                return;
+            }
+
+            // 切换到租户数据源
+            tenantDataSourceManager.switchTenant(tenantInfo);
+            // 切换Redis租户上下文
+            RedisTenantContext.setTenantId(tenantInfo.getId());
+
+            log.info("开始同步企微用户,租户={}, corpId={}", tenantInfo.getId(), qwCompany.getCorpId());
+
+            // 执行同步操作
+            qwUserService.syncQwUser(qwCompany.getCorpId(),tenantInfo.getId());
+
+            log.info("同步完成,租户={}", tenantInfo.getId());
+
+        } catch (Exception e) {
+            log.error("同步企微员工和部门失败,租户={}, corpId={}",
+                    qwCompany.getTenantId(), qwCompany.getCorpId(), e);
+        } finally {
+            // 清理租户上下文(数据源和Redis)
+            try {
+                tenantDataSourceManager.clear(); // 假设有此方法,请根据实际API调整
+            } catch (Exception ignored) {}
+
+            try {
+                RedisTenantContext.clear(); // 或 RedisTenantContext.removeTenantId()
+            } catch (Exception ignored) {}
+        }
+    }
+    /**
+     *
+     */
+    @GetMapping("/selectQwUserByTest")
+    public void selectQwUserByTest() {
+        try {
+            List<QwUser> list = qwUserMapper.selectQwUserByTest();
+            for (QwUser qwUser : list) {
+                try {
+
+                     Long serverId = qwUser.getServerId();
+
+                    if (serverId==null){
+                        System.out.println("serverId不存在");
+                    }else {
+                        //没绑定销售 或者 已经离职
+                        if (qwUser.getStatus()==0 || qwUser.getIsDel()==2){
+
+                            updateIpadStatus(qwUser,serverId);
+                        }
+
+                        //绑定了销售-也绑定了ipad,但是长时间离线的(离线状态,无操作超过2天的,也自动解绑)
+                        if(qwUser.getUpdateTime()!=null){
+                            Date createTime = qwUser.getUpdateTime();
+                            Integer serverStatus = qwUser.getServerStatus();
+                            Integer ipadStatus = qwUser.getIpadStatus();
+
+                            boolean result = isCreateTimeMoreThanDaysWithOptional(createTime, 2);
+                            //大于2天 ,绑定了ipad,离线
+                            if(result && serverStatus==1 && ipadStatus==0){
+                                updateIpadStatus(qwUser,serverId);
+
+                            }
+                        }
+
+
+                    }
+
+
+                } catch (Exception e) {
+                    System.out.println("解绑ipad报错"+e);
+
+                }
+            }
+        } catch (Exception e) {
+            log.error("定时处理未绑定员工企微异常",e);
+        }
+
+    }
+
+
+    public void updateIpadStatus(QwUser qwUser,Long serverId){
+        QwUser u = new QwUser();
+        u.setId(qwUser.getId());
+        u.setServerId(null);
+        u.setServerStatus(0);
+        qwUserMapper.updateQwUser(u);
+        ipadServerService.addServer(serverId);
+        QwIpadServerLog qwIpadServerLog = new QwIpadServerLog();
+        qwIpadServerLog.setType(2);
+        qwIpadServerLog.setTilie("解绑");
+        qwIpadServerLog.setServerId(serverId);
+        qwIpadServerLog.setQwUserId(qwUser.getId());
+        qwIpadServerLog.setCompanyUserId(qwUser.getCompanyUserId());
+        qwIpadServerLog.setCompanyId(qwUser.getCompanyId());
+        qwIpadServerLog.setCreateTime(new Date());
+        qwIpadServerLogService.insertQwIpadServerLog(qwIpadServerLog);
+        qwIpadServerUserService.deleteQwIpadServerUserByQwUserId(qwUser.getId());
+        WxWorkGetQrCodeDTO wxWorkGetQrCodeDTO = new WxWorkGetQrCodeDTO();
+        wxWorkGetQrCodeDTO.setUuid(qwUser.getUid());
+        wxWorkService.LoginOut(wxWorkGetQrCodeDTO,qwUser.getServerId());
+        updateIpadStatus(qwUser.getId(),0);
+    }
+
+    public static boolean isCreateTimeMoreThanDaysWithOptional(Date createTime, int days) {
+        return Optional.ofNullable(createTime)
+                .map(time -> {
+                    LocalDateTime createDateTime = time.toInstant()
+                            .atZone(ZoneId.systemDefault())
+                            .toLocalDateTime();
+                    LocalDateTime now = LocalDateTime.now();
+                    Duration duration = Duration.between(createDateTime, now);
+                    return duration.toDays() > days;
+                })
+                .orElse(false); // 为null时返回false,可根据需求调整
+    }
+
+    void updateIpadStatus(Long id ,Integer status){
+        QwUser u = new QwUser();
+        u.setId(id);
+        u.setIpadStatus(status);
+        qwUserMapper.updateQwUser(u);
+    }
+    /**
+     *
+     */
+    @GetMapping("/countQwApiAopLogToken")
+    public void countQwApiAopLogToken() {
+
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 获取当前日期(只包含年月日)
+        LocalDate currentDate = LocalDate.now();
+
+        String todayStr = currentDate.format(dateFormatter);
+        qwSopLogsService.countQwApiAopLogToken(todayStr);
+
+    }
+
+    /**
+     * 查询视频时长
+     */
+    @GetMapping("/getVideoDuration")
+    public Long getVideoDuration(Long videoId) {
+
+            String redisKey = "h5user:video:duration:" + videoId;
+            Long duration = redisCache.getCacheObject(redisKey);
+
+            if (duration == null) {
+                FsUserCourseVideoQVO videoInfo = fsUserCourseVideoService.selectFsUserCourseVideoByVideoIdVO(videoId,null);
+                if (videoInfo == null || videoInfo.getDuration() == null) {
+                    throw new IllegalArgumentException("视频时长信息不存在");
+                }
+                duration = videoInfo.getDuration();
+
+                // 将查询结果缓存到Redis,设置适当过期时间
+                redisCache.setCacheObject(redisKey, duration);
+            }
+
+            return duration;
+
+    }
+
+
+
+    /**
+     * 获取跳转微信小程序的链接地址
+     */
+    @GetMapping("/getGotoWxAppLink")
+    @ApiOperation("获取跳转微信小程序的链接地址")
+    public ResponseResult<String> getGotoWxAppLink(String linkStr,String appid) {
+        return ResponseResult.ok(courseLinkService.getGotoWxAppLink(linkStr,appid));
+    }
+
+    /**
+    * 发官方通连
+    */
+    @GetMapping("/sopguanfanone")
+    public R sopguanfanone(String dateTime) throws Exception {
+
+        LocalDateTime localDateTime = DateUtil.parseLocalDateTime(dateTime);
+
+        int currentHour = localDateTime.getHour();
+        LocalDate localDate = localDateTime.toLocalDate();
+
+        String taskStartTime = localDate.atTime(currentHour, 0, 0)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        String taskEndTime = localDate.atTime(currentHour, 59, 59)
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+
+        qwSopLogsService.createCorpMassSendingByUserLogs( taskStartTime, taskEndTime);
+        return R.ok();
+    }
+
+    /**
+    * 发一对一
+    */
+    @GetMapping("/sopguanfantwo")
+    public R sopguanfantwo(String dateTime) throws Exception {
+
+        LocalDateTime localDateTime = DateUtil.parseLocalDateTime(dateTime);
+
+
+        LocalDate localDate = localDateTime.toLocalDate();
+        String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
+        qwSopLogsService.createCorpMassSending(date);
+        return R.ok();
+    }
+
+    /**
+     * 查官方的执行结果
+     */
+    @GetMapping("/sopguanfantResult")
+    public R sopguanfantResult() throws Exception {
+        qwSopLogsService.qwSopLogsResultNew();
+        return R.ok();
+    }
+
+
+    @GetMapping("/testMaterial")
+    public void testMaterial() throws Exception {
+
+        iQwMaterialService.updateQwMaterialByQw();
+
+    }
+
+    @GetMapping("/testSop")
+    public R testSop() throws Exception {
+
+        return iFsCourseLinkService.getWxaCodeGenerateScheme("/pages_course/video.html?course={\"companyId\":100,\"companyUserId\":2020,\"corpId\":\"wweb0666cc79d79da5\",\"courseId\":61,\"link\":\"1950497651577323520\",\"linkType\":3,\"qwExternalId\":2356946,\"qwUserId\":\"1682\",\"uNo\":\"b8b010e1-ee0f-42ec-8ad8-06681d1b449a\",\"videoId\":366}","wx34bba1ae94d34986");
+    }
+
+    @GetMapping("/testRatingSop")
+    public R testRatingSop(String sopId) throws Exception {
+
+        long startTimeMillis = System.currentTimeMillis();
+        log.info("====== 开始选择和处理 sop营期-用户分级 ======");
+
+        iSopUserLogsService.ratingUserLogs(sopId);
+
+        long endTimeMillis = System.currentTimeMillis();
+        log.info("====== sop营期-用户分级处理完成,耗时 {} 毫秒 ======", (endTimeMillis - startTimeMillis));
+        return R.ok();
+    }
+
+    // 定义一个方法来批量处理插入逻辑,支持每 500 条数据一次的批量插入
+    private void processAndInsertQwSopLogs(List<QwSopLogsDoSendListTVO> logsByJsApiNotExtId) {
+        // 定义批量插入的大小
+        int batchSize = 500;
+
+        // 循环处理外部用户 ID,每次处理批量大小的子集
+        for (int i = 0; i < logsByJsApiNotExtId.size(); i += batchSize) {
+
+            int endIndex = Math.min(i + batchSize, logsByJsApiNotExtId.size());
+            List<QwSopLogsDoSendListTVO> batchList = logsByJsApiNotExtId.subList(i, endIndex);  // 获取当前批次的子集
+
+            // 直接使用批次数据进行批量更新,不需要额外的 List
+            try {
+                qwSopLogsMapper.batchUpdateQwSopLogsBySendTime(batchList);
+            } catch (Exception e) {
+                // 记录异常日志,方便后续排查问题
+                log.error("批量更新数据时发生异常,处理的批次起始索引为: " + i, e);
+            }
+        }
+    }
+
+//    @GetMapping("/test")
+//    public R test(String time, String sopId) throws Exception {
+//        log.info("进入sop任务");
+////        LocalDateTime currentTime = DateUtil.parseLocalDateTime(time);
+////        // 计算下一个整点时间
+////        LocalDateTime nextHourTime = currentTime.withMinute(0).withSecond(0).withNano(0).plusHours(1);
+////
+////        // 打印日志,确认时间
+////        log.info("任务实际执行时间: {}", currentTime);
+////        log.info("传递给任务的时间参数: {}", nextHourTime);
+//        List<String> sopidList = new ArrayList<>();
+//        if(StringUtils.isNotEmpty(sopId)){
+//            sopidList = Arrays.asList(sopId.split(","));
+//        }
+//        sopLogsTaskService.selectSopUserLogsListByTime(DateUtil.parseLocalDateTime(time), sopidList);
+//        return R.ok();
+//    }
+//    @GetMapping("/testWx")
+//    public R testWx(String time) throws Exception {
+//        sopWxLogsService.wxSopLogsByTime(DateUtil.parseLocalDateTime(time));
+//        return R.ok();
+//    }
+
+
+    @GetMapping("/testVideo")
+    public R testVideo(String sopId) throws Exception {
+        qwSopTempVoiceService.synchronous(sopId, Arrays.asList(Arrays.asList(2020L, 100L), Arrays.asList(2758L, 170L)));
+        return R.ok();
+    }
+
+    @Autowired
+    IQwCompanyService iQwCompanyService;
+    @GetMapping("/testSop2")
+    public R testSop2() throws Exception {
+
+        String cropId="ww401085d7b785aae8";
+
+        QwCompany qwCompany = iQwCompanyService.getQwCompanyByRedis(cropId);
+
+        String status="100_asddas_6666";
+
+        String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+cropId+"&redirect_uri=" +
+                "http://"+qwCompany.getRealmNameUrl()+"/qwh5/pages/user/index?corpId="+cropId +
+                "&response_type=code&scope=snsapi_base&state="+status+"&agentid="+qwCompany.getServerAgentId()+"#wechat_redirect";
+
+        R andUpload = QRCodeUtils.createAndUpload(url);
+
+        return R.ok().put("data",andUpload);
+    }
+
+    @Autowired
+    private QwApiService qwApiService;
+
+    @GetMapping("/testSop3")
+    public R testSop3(String date) throws Exception {
+//        qwSopLogsService.createCorpMassSending(date);
+//        QwGetGroupmsgSendParam qwGetGroupmsgSendParam = new QwGetGroupmsgSendParam();
+//        qwGetGroupmsgSendParam.setMsgid("msg7tWFCgAAjJC-HqurNKsOJif5oUHQiA");
+//        qwGetGroupmsgSendParam.setUserid("ZhangZhanYue");
+//
+//        QwGroupmsgSendResult groupmsgSendResult = qwApiService.getGroupmsgSendResult(qwGetGroupmsgSendParam, "ww5a88c4f879f204c5");
+        return R.ok();
+    }
+
+    @Autowired
+    IQwSopTagService qwSopTagService;
+    @GetMapping("/tag")
+    public R tag() throws Exception {
+        qwSopTagService.addTag();
+        return R.ok();
+    }
+
+
+//    @Autowired
+//    private SopLogsChatTaskService sopLogsChatTaskService;
+//    @GetMapping("/test2")
+//    public String selectChatSopUserLogsListByTime() throws Exception {
+//        userCourseCountService.insertFsUserCourseCountTask();
+//        return "s";
+//    }
+    @GetMapping("/isAddkf")
+    public ResponseResult<FsUser> isAddkf(FsUserCourseAddCompanyUserParam param) throws Exception {
+        return courseVideoService.isAddCompanyUser(param);
+    }
+
+    @PostMapping("/updateUrl")
+    public R updateUrl()
+    {
+        log.info("开始更新URL");
+        try {
+            fsUserVideoService.updateVideoUrl();
+            huaweiObsService.uploadByCOS();
+            log.info("更新URL成功完成");
+
+
+        } catch (Exception e) {
+            log.error("开始更新URL执行失败", e);
+        }
+        return R.ok();
+    }
+    @GetMapping("/updateRedPack")
+    public R updateRedPack(String start , String end    ){
+        LocalDateTime startTime = DateUtil.parseLocalDateTime(start);
+        LocalDateTime endTime = DateUtil.parseLocalDateTime(end);
+        List<RedPacketMoneyVO> redPacketMoneyVOS = fsCourseRedPacketLogMapper.selectFsCourseRedPacketLogHourseByCompany(startTime, endTime);
+        for (RedPacketMoneyVO redPacketMoneyVO : redPacketMoneyVOS) {
+            companyService.subtractCompanyMoneyHourse(redPacketMoneyVO.getMoney(),redPacketMoneyVO.getCompanyId(), startTime.toLocalTime(), endTime.toLocalTime());
+        }
+        return R.ok();
+    }
+
+//    @GetMapping("/syncQwExternalContactUnionid")
+//    public R syncQwExternalContactUnionid(){
+//        return syncQwExternalContactService.syncQwExternalContactUnionid();
+//    }
+
+
+    @GetMapping("/queryRedPacketResult")
+    public R queryRedPacketResult(String startTime , String  endTime) {
+        fsCourseRedPacketLogService.queryRedPacketResult(startTime, endTime);
+        return R.ok();
+    }
+
+//    @GetMapping("/autoPullGroup")
+//    public R autoPullGroup(){
+//        qwTask1.autoPullGroup();
+//        return R.ok();
+//    }
+
+}