فهرست منبع

add:
1.fxxk派单同步定时任务 6-23点 每5分钟一次

caozixuan 1 سال پیش
والد
کامیت
01af500fce

+ 4 - 2
sop-api/src/main/java/com/qmth/sop/server/api/SysController.java

@@ -34,7 +34,6 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -93,6 +92,9 @@ public class SysController {
     @Resource
     TBUserArchivesService tbUserArchivesService;
 
+    @Resource
+    SysConfigService sysConfigService;
+
     @ApiOperation(value = "登录")
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = LoginResult.class)})
@@ -224,7 +226,7 @@ public class SysController {
                 String filePath = (String) jsonObject.get(SystemConstant.PATH);
                 HttpServletResponse response = ServletUtil.getResponse();
                 byte[] bytes = fileStoreUtil.ossDownload(filePath, uploadFileEnum.getFssType());
-                content = new String(bytes, StandardCharsets.UTF_8);
+                content = new String(bytes, sysConfigService.findByConfigKey(SystemConstant.SYS_CONFIG_KEY_CHARSETS).getConfigValue());
 //                response.setContentType("text/html; charset=utf-8");
 //                response.getWriter().print(string);
                 break;

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmService.java

@@ -173,5 +173,5 @@ public interface TBCrmService extends IService<TBCrm> {
     /**
      * 从纷享销客同步派单信息
      */
-    void syncCrmFromFxxk();
+    Map<String, Object> syncCrmFromFxxk(Map<String, Object> map);
 }

+ 124 - 114
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmServiceImpl.java

@@ -408,132 +408,142 @@ public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements
 
     @Transactional
     @Override
-    public void syncCrmFromFxxk() {
+    public Map<String, Object> syncCrmFromFxxk(Map<String, Object> map) {
         List<String> errorMsgList = new ArrayList<>();
         List<FxxkCrm> fxxkCrmList = fxxkApiUtils.findCustomList();
-        for (FxxkCrm fxxkCrm : fxxkCrmList) {
-            String basicInfoMissingError = "";
-
-            String crmNo = fxxkCrm.getCrmNo();
-            String crmName = fxxkCrm.getCrmName();
-            Long beginTime = fxxkCrm.getBeginTime();
-            String managerName = fxxkCrm.getManagerName();
-            String managerMobileNumber = fxxkCrm.getManagerMobileNumber();
-            ProductTypeEnum customType = fxxkCrm.getCustomType();
-            String customName = fxxkCrm.getCustomName();
-            Long examStartTime = fxxkCrm.getExamStartTime();
-            Long examEndTime = fxxkCrm.getExamEndTime();
-
-            if (crmName == null || crmName.length() == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少派单名称";
-            }
-            if (beginTime == null || beginTime == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少派单开始时间";
-            }
-            if (managerName == null || managerName.length() == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少客户经理";
-            }
-            if (managerMobileNumber == null || managerMobileNumber.length() == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少客户经理电话";
-            }
-            if (customType == null) {
-                basicInfoMissingError = basicInfoMissingError + "缺少客户类型或客户类型不为['高校教务处'或'研究生招办']";
-            }
-            if (customName == null || customName.length() == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少客户名称";
-            }
-            if (examStartTime == null || examStartTime == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少考试开始时间";
-            }
-            if (examEndTime == null || examEndTime == 0) {
-                basicInfoMissingError = basicInfoMissingError + "缺少考试结束时间";
-            }
-            if (basicInfoMissingError.length() > 0) {
-                // fxxk 项目派单基础信息缺失异常 -> 补充fxxk系统的派单基础信息
-                basicInfoMissingError = "纷享销客派单基础信息异常请补充: " + basicInfoMissingError + "\n";
-                errorMsgList.add(basicInfoMissingError);
-            } else {
-                // 基础信息正常再继续解析需要和质控平台对接的信息
-                String matchInfoError = "";
-
-                // 客户经理校验
-                Long crmUserId = null;
-                SysUser sysUser = sysUserService.getOne(new QueryWrapper<SysUser>().lambda()
-                        .eq(SysUser::getMobileNumber, managerMobileNumber)
-                        .eq(SysUser::getRealName, managerName));
-                if (Objects.isNull(sysUser) || !sysUser.getEnable()) {
-                    matchInfoError = matchInfoError + String.format("纷享销客中的客户经理[%s(%s)]在质控平台不存在或已禁用(姓名 + 手机号)\n", managerName, managerMobileNumber);
+        int totalCount = fxxkCrmList.size();
+        int successCount = 0;
+        try {
+            for (FxxkCrm fxxkCrm : fxxkCrmList) {
+                String basicInfoMissingError = "";
+
+                String crmNo = fxxkCrm.getCrmNo();
+                String crmName = fxxkCrm.getCrmName();
+                Long beginTime = fxxkCrm.getBeginTime();
+                String managerName = fxxkCrm.getManagerName();
+                String managerMobileNumber = fxxkCrm.getManagerMobileNumber();
+                ProductTypeEnum customType = fxxkCrm.getCustomType();
+                String customName = fxxkCrm.getCustomName();
+                Long examStartTime = fxxkCrm.getExamStartTime();
+                Long examEndTime = fxxkCrm.getExamEndTime();
+
+                if (crmName == null || crmName.length() == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少派单名称";
+                }
+                if (beginTime == null || beginTime == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少派单开始时间";
+                }
+                if (managerName == null || managerName.length() == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少客户经理";
+                }
+                if (managerMobileNumber == null || managerMobileNumber.length() == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少客户经理电话";
+                }
+                if (customType == null) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少客户类型或客户类型不为['高校教务处'或'研究生招办']";
+                }
+                if (customName == null || customName.length() == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少客户名称";
+                }
+                if (examStartTime == null || examStartTime == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少考试开始时间";
+                }
+                if (examEndTime == null || examEndTime == 0) {
+                    basicInfoMissingError = basicInfoMissingError + "缺少考试结束时间";
+                }
+                if (basicInfoMissingError.length() > 0) {
+                    // fxxk 项目派单基础信息缺失异常 -> 补充fxxk系统的派单基础信息
+                    basicInfoMissingError = String.format("纷享销客派单[%s]基础信息异常请补充: %s \n", crmNo, basicInfoMissingError);
+                    errorMsgList.add(basicInfoMissingError);
                 } else {
-                    List<RoleDto> roleDtoList = sysRoleService.listRolesByUserId(sysUser.getId());
-                    if (roleDtoList.stream().noneMatch(e -> RoleTypeEnum.ACCOUNT_MANAGER.equals(e.getType()))) {
-                        matchInfoError = matchInfoError + String.format("纷享销客中的客户经理[%s(%s)]在质控平台缺少[%s]角色)\n", managerName, managerMobileNumber, RoleTypeEnum.ACCOUNT_MANAGER);
+                    // 基础信息正常再继续解析需要和质控平台对接的信息
+                    String matchInfoError = "";
+
+                    // 客户经理校验
+                    Long crmUserId = null;
+                    SysUser sysUser = sysUserService.getOne(new QueryWrapper<SysUser>().lambda()
+                            .eq(SysUser::getMobileNumber, managerMobileNumber)
+                            .eq(SysUser::getRealName, managerName));
+                    if (Objects.isNull(sysUser) || !sysUser.getEnable()) {
+                        matchInfoError = matchInfoError + String.format("纷享销客中的客户经理[%s(%s)]在质控平台不存在或已禁用(姓名 + 手机号)\n", managerName, managerMobileNumber);
                     } else {
-                        crmUserId = sysUser.getId();
+                        List<RoleDto> roleDtoList = sysRoleService.listRolesByUserId(sysUser.getId());
+                        if (roleDtoList.stream().noneMatch(e -> RoleTypeEnum.ACCOUNT_MANAGER.equals(e.getType()))) {
+                            matchInfoError = matchInfoError + String.format("纷享销客中的客户经理[%s(%s)]在质控平台缺少[%s]角色)\n", managerName, managerMobileNumber, RoleTypeEnum.ACCOUNT_MANAGER);
+                        } else {
+                            crmUserId = sysUser.getId();
+                        }
                     }
-                }
 
-                // 客户名称校验
-                Long customId = null;
-                List<SysCustom> sysCustomList = sysCustomService.list(new QueryWrapper<SysCustom>()
-                        .lambda()
-                        .eq(SysCustom::getName, customName)
-                        .eq(SysCustom::getType, customType)
-                        .eq(SysCustom::getEnable, true));
-
-                if (CollectionUtils.isEmpty(sysCustomList)) {
-                    matchInfoError = matchInfoError + String.format("纷享销客中的客户[%s(%s)]在质控平台不存在或已禁用(客户名称 + 客户类型)\n", customName, customType.getTitle());
-                } else if (sysCustomList.size() > 1) {
-                    throw ExceptionResultEnum.ERROR.exception("客户数据异常 :客户名称-客户类型 不唯一\n");
-                } else {
-                    SysCustom sysCustom = sysCustomList.get(0);
-                    customId = sysCustom.getId();
-                }
+                    // 客户名称校验
+                    Long customId = null;
+                    List<SysCustom> sysCustomList = sysCustomService.list(new QueryWrapper<SysCustom>()
+                            .lambda()
+                            .eq(SysCustom::getName, customName)
+                            .eq(SysCustom::getType, customType)
+                            .eq(SysCustom::getEnable, true));
+
+                    if (CollectionUtils.isEmpty(sysCustomList)) {
+                        matchInfoError = matchInfoError + String.format("纷享销客中的客户[%s(%s)]在质控平台不存在或已禁用(客户名称 + 客户类型)\n", customName, customType.getTitle());
+                    } else if (sysCustomList.size() > 1) {
+                        throw ExceptionResultEnum.ERROR.exception("客户数据异常 :客户名称-客户类型 不唯一\n");
+                    } else {
+                        SysCustom sysCustom = sysCustomList.get(0);
+                        customId = sysCustom.getId();
+                    }
 
-                // 实施产品校验
-                Long productId = null;
-                List<TBProduct> tbProductList = tbProductService.list(new QueryWrapper<TBProduct>()
-                        .lambda()
-                        .eq(TBProduct::getCode, customType)
-                        .eq(TBProduct::getEnable, true));
-                if (CollectionUtils.isEmpty(tbProductList)) {
-                    matchInfoError = matchInfoError + String.format("质控平台客户类型为[%s]的产品不存在\n", customType);
-                } else {
-                    productId = tbProductList.get(0).getId();
-                }
+                    // 实施产品校验
+                    Long productId = null;
+                    List<TBProduct> tbProductList = tbProductService.list(new QueryWrapper<TBProduct>()
+                            .lambda()
+                            .eq(TBProduct::getCode, customType)
+                            .eq(TBProduct::getEnable, true));
+                    if (CollectionUtils.isEmpty(tbProductList)) {
+                        matchInfoError = matchInfoError + String.format("质控平台客户类型为[%s]的产品不存在\n", customType);
+                    } else {
+                        productId = tbProductList.get(0).getId();
+                    }
 
 
-                if (matchInfoError.length() > 0) {
-                    // 质控平台基础信息缺失异常 -> 补充质控平台系统的派单相关信息
-                    matchInfoError = "请先补充质控平台系统的派单相关信息: " + matchInfoError + "\n";
-                    errorMsgList.add(matchInfoError);
-                } else {
-                    // 没有任何异常 -> 组装信息
-                    List<TBCrm> tbCrmList = this.list(new QueryWrapper<TBCrm>()
-                            .lambda()
-                            .eq(TBCrm::getCrmNo, crmNo)
-                            .eq(TBCrm::getSync, true));
-
-                    if (CollectionUtils.isEmpty(tbCrmList)) {
-                        // 新增
-                        TBCrm tbCrm = new TBCrm();
-                        tbCrm.setCrmNo(crmNo);
-                        tbCrm.setName(crmName);
-                        tbCrm.setBeginTime(beginTime);
-                        tbCrm.setServiceId(crmUserId);
-                        tbCrm.setCustomId(customId);
-                        tbCrm.setExamStartTime(examStartTime);
-                        tbCrm.setExamEndTime(examEndTime);
-                        tbCrm.setProductId(productId);
-                        tbCrm.setSync(true);
-                        tbCrm.setEnable(true);
-                        tbCrm.setStatus(CrmStatusEnum.UN_PUBLISH);
-                        this.save(tbCrm);
+                    if (matchInfoError.length() > 0) {
+                        // 质控平台基础信息缺失异常 -> 补充质控平台系统的派单相关信息
+                        matchInfoError = String.format("纷享销客派单[%s]中的相关信息在质控平台中缺失,请先补充质控平台系统的派单相关信息: %s \n", crmNo, matchInfoError);
+                        errorMsgList.add(matchInfoError);
+                    } else {
+                        // 没有任何异常 -> 组装信息
+                        List<TBCrm> tbCrmList = this.list(new QueryWrapper<TBCrm>()
+                                .lambda()
+                                .eq(TBCrm::getCrmNo, crmNo)
+                                .eq(TBCrm::getSync, true));
+
+                        if (CollectionUtils.isEmpty(tbCrmList)) {
+                            // 新增
+                            TBCrm tbCrm = new TBCrm();
+                            tbCrm.setCrmNo(crmNo);
+                            tbCrm.setName(crmName);
+                            tbCrm.setBeginTime(beginTime);
+                            tbCrm.setServiceId(crmUserId);
+                            tbCrm.setCustomId(customId);
+                            tbCrm.setExamStartTime(examStartTime);
+                            tbCrm.setExamEndTime(examEndTime);
+                            tbCrm.setProductId(productId);
+                            tbCrm.setSync(true);
+                            tbCrm.setEnable(true);
+                            tbCrm.setStatus(CrmStatusEnum.UN_PUBLISH);
+                            this.save(tbCrm);
+                            successCount++;
+                        }
                     }
                 }
             }
-        }
-        if (errorMsgList.size() > 0) {
-            throw ExceptionResultEnum.ERROR.exception(String.join(";\n", errorMsgList));
+            if (errorMsgList.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(String.join(";\n", errorMsgList));
+            }
+            map.put(SystemConstant.SUCCESS, successCount);
+            map.put(SystemConstant.ERROR, totalCount - successCount);
+            return map;
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
         }
     }
 }

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/sync/FxxkApiUtils.java

@@ -190,7 +190,7 @@ public class FxxkApiUtils {
 
                 String crmName = cell.getString("display_name");
                 String crmNo = cell.getString("name");
-                Long beginTime = cell.getLong("createTime");
+                Long beginTime = cell.getLong("create_time");
 
                 JSONObject ownerR = cell.getJSONObject("owner__r");
                 String managerName = ownerR.getString("name");

+ 69 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncFxxkCrmSyncService.java

@@ -0,0 +1,69 @@
+package com.qmth.sop.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.service.TaskLogicService;
+import com.qmth.sop.business.templete.syncData.AsyncSyncDataTaskTemplate;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskResultEnum;
+import com.qmth.sop.common.enums.TaskStatusEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 纷享销客派单推送
+ * @Author: CaoZixuan
+ * @Date: 2023-10-27
+ */
+@Service
+public class AsyncFxxkCrmSyncService extends AsyncSyncDataTaskTemplate {
+    private final static Logger log = LoggerFactory.getLogger(AsyncFxxkCrmSyncService.class);
+    @Resource
+    TaskLogicService taskLogicService;
+
+    @Resource
+    TBTaskService tbTaskService;
+
+
+    public static final String OBJ_TITLE = "纷享销客派单信息";
+
+    @Override
+    public Result syncData(Map<String, Object> map) throws Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n").add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        tbTask.setSummary(stringJoinerSummary.toString());
+        tbTaskService.updateById(tbTask);
+        try {
+            // 执行同步分享逍客数据
+            Map<String, Object> result = taskLogicService.executeSyncFxxkData(map);
+            int successSize = Integer.parseInt(String.valueOf(result.get(SystemConstant.SUCCESS)));
+            int errorSize = Integer.parseInt(String.valueOf(result.get(SystemConstant.RESULT_ERROR)));
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}{4}{5}{6}{7}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, (successSize + errorSize), FINISH_TOTAL_SIZE, successSize, FINISH_SUCCESS_SIZE, errorSize, FINISH_ERROR_SIZE));
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 9 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java

@@ -83,4 +83,13 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String, Object> executeExportDingSubmitLogic(Map<String, Object> map) throws Exception;
+
+    /**
+     * 执行同步纷享销客派单数据任务
+     *
+     * @param map 数据
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String, Object> executeSyncFxxkData(Map<String, Object> map) throws Exception;
 }

+ 21 - 10
sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -44,34 +44,36 @@ import java.util.stream.Collectors;
 @Service
 public class TaskLogicServiceImpl implements TaskLogicService {
     private final static Logger log = LoggerFactory.getLogger(TaskLogicServiceImpl.class);
-
     @Resource
-    ImportExportUtil importExportUtil;
+    private ImportExportUtil importExportUtil;
 
     @Resource
-    BasicAttachmentService basicAttachmentService;
-
+    private BasicAttachmentService basicAttachmentService;
 
     @Resource
-    SysCustomService sysCustomService;
+    private SysCustomService sysCustomService;
 
     @Resource
-    SysUserService sysUserService;
-
+    private SysUserService sysUserService;
 
     @Resource
-    SysLevelService sysLevelService;
+    private SysLevelService sysLevelService;
 
     @Resource
-    SysMessageService sysMessageService;
+    private SysMessageService sysMessageService;
+
     @Resource
-    TBDingService tbDingService;
+    private TBDingService tbDingService;
+
     @Resource
     private SysSupplierService sysSupplierService;
+
     @Resource
     private SysRoleService sysRoleService;
+
     @Resource
     private TBUserArchivesService tbUserArchivesService;
+
     @Resource
     private SequenceService sequenceService;
 
@@ -87,6 +89,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Resource
     private SysDeviceModelService sysDeviceModelService;
 
+    @Resource
+    private TBCrmService tbCrmService;
+
     /**
      * 处理导入人员档案数据
      *
@@ -540,4 +545,10 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         }
         return map;
     }
+
+    @Transactional
+    @Override
+    public Map<String, Object> executeSyncFxxkData(Map<String, Object> map) {
+        return tbCrmService.syncCrmFromFxxk(map);
+    }
 }

+ 82 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/syncData/AsyncSyncDataTaskTemplate.java

@@ -0,0 +1,82 @@
+package com.qmth.sop.business.templete.syncData;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.util.ImportExportUtil;
+import com.qmth.sop.common.contant.SpringContextHolder;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskResultEnum;
+import com.qmth.sop.common.enums.TaskStatusEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 同步数据任务模板
+ * @Author: CaoZixuan
+ * @Date: 2023-10-27
+ */
+public abstract class AsyncSyncDataTaskTemplate {
+    private final static Logger log = LoggerFactory.getLogger(AsyncSyncDataTaskTemplate.class);
+    public static final String BEGIN_TITLE = "->开始准备处理同步的";
+    public static final String EXCEPTION_TITLE = "->数据处理发生异常!";
+    public static final String EXCEPTION_DATA = "错误信息:";
+    public static final String FINISH_TITLE = "->数据处理结束,共需处理";
+    public static final String SUCCESS_TITLE = "条数据,其中成功处理了";
+    public static final String FINISH_SIZE = "条数据。";
+    public static final String EXCEPTION_CREATE_TXT_TITLE = "->创建导出日志时发生异常!";
+    public static final String ERROR_DATA = "->失败原因如下:";
+    public static final String FINISH_TOTAL_SIZE = "条数据,成功";
+    public static final String FINISH_SUCCESS_SIZE = "条数据,失败";
+    public static final String FINISH_ERROR_SIZE = "条数据";
+
+    /**
+     * 异步同步数据任务
+     *
+     * @param map 数据
+     * @return 返回值
+     * @throws IOException 异常
+     */
+    @Async
+    public abstract Result syncData(Map<String, Object> map) throws Exception;
+
+    /**
+     * 创建txt文件
+     *
+     * @param tbTask tbTask
+     */
+    public void createTxt(TBTask tbTask) throws IOException {
+        try {
+            ImportExportUtil importExportUtil = SpringContextHolder.getBean(ImportExportUtil.class);
+            JSONObject json = importExportUtil.createTxt(tbTask.getSummary());
+            tbTask.setReportFilePath(json.toJSONString());
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            StringJoiner stringJoinerSummary = new StringJoiner("").add(tbTask.getSummary()).add("\n");
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_CREATE_TXT_TITLE, EXCEPTION_DATA, e.getMessage()));
+
+            tbTask.setSummary(stringJoinerSummary.toString());
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+            tbTask.setStatus(TaskStatusEnum.FINISH);
+            tbTaskService.updateById(tbTask);
+        }
+    }
+}

+ 1 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -41,6 +41,7 @@ public class SystemConstant {
     public static final Charset CHARSET = Charset.forName(CHARSET_NAME);
     public static final String CHARSET_GBK = "gbk";
     public static final String SUCCESS = "success";
+    public static final String RESULT_ERROR = "error";
     public static final String UPDATE_TIME = "updateTime";
     public static final String SESSION = "session:";
     public static final String USER = "account";

+ 5 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/JobEnum.java

@@ -19,7 +19,11 @@ public enum JobEnum {
 
     SEQUENCE_JOB_GROUP("序列重置定时任务组"),
 
-    REMIND_QUARTZ_JOB_GROUP("任务提醒一次性job group");
+    REMIND_QUARTZ_JOB_GROUP("任务提醒一次性job group"),
+
+    SYNC_FXXK_CRM("同步纷享销客派单数据定时任务"),
+
+    SYNC_FXXK_CRM_GROUP("同步纷享销客派单数据定时任务组");
 
     private String title;
 

+ 3 - 1
sop-common/src/main/java/com/qmth/sop/common/enums/TaskTypeEnum.java

@@ -25,7 +25,9 @@ public enum TaskTypeEnum {
 
     DING_SUBMIT_EXPORT("考勤提交导出"),
 
-    DEVICE_IMPORT("设备导入");
+    DEVICE_IMPORT("设备导入"),
+
+    CRM_SYNC("派单同步");
 
     private String title;
 

+ 28 - 0
sop-task/src/main/java/com/qmth/sop/task/job/FxxkCrmSyncJob.java

@@ -0,0 +1,28 @@
+package com.qmth.sop.task.job;
+
+import com.qmth.sop.common.enums.ExceptionResultEnum;
+import com.qmth.sop.task.job.service.JobService;
+import org.quartz.JobExecutionContext;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 纷享销客派单推送定时任务
+ * @Author: CaoZixuan
+ * @Date: 2023-10-27
+ */
+public class FxxkCrmSyncJob extends QuartzJobBean {
+    @Resource
+    JobService jobService;
+
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) {
+        try {
+            jobService.fxxkCrmSync();
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+}

+ 8 - 1
sop-task/src/main/java/com/qmth/sop/task/job/service/JobService.java

@@ -2,6 +2,8 @@ package com.qmth.sop.task.job.service;
 
 import com.qmth.sop.common.enums.JobEnum;
 
+import java.util.Map;
+
 /**
  * @Description: job service
  * @Param:
@@ -31,4 +33,9 @@ public interface JobService {
      * 序列重置
      */
     void sequenceReset();
-}
+
+    /**
+     * 纷享销客派单同步
+     */
+    void fxxkCrmSync() throws Exception;
+}

+ 41 - 3
sop-task/src/main/java/com/qmth/sop/task/job/service/impl/JobServiceImpl.java

@@ -3,13 +3,16 @@ package com.qmth.sop.task.job.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.sop.business.cache.CommonCacheService;
 import com.qmth.sop.business.entity.SysConfig;
+import com.qmth.sop.business.entity.SysUser;
+import com.qmth.sop.business.entity.TBTask;
 import com.qmth.sop.business.entity.TSJobRemind;
 import com.qmth.sop.business.service.SequenceService;
+import com.qmth.sop.business.service.SysUserService;
+import com.qmth.sop.business.service.TBTaskService;
 import com.qmth.sop.business.service.TSJobRemindService;
+import com.qmth.sop.business.templete.execute.AsyncFxxkCrmSyncService;
 import com.qmth.sop.common.contant.SystemConstant;
-import com.qmth.sop.common.enums.ExceptionResultEnum;
-import com.qmth.sop.common.enums.JobEnum;
-import com.qmth.sop.common.enums.JobQuartzTypeEnum;
+import com.qmth.sop.common.enums.*;
 import com.qmth.sop.task.job.RemindTaskJob;
 import com.qmth.sop.task.job.service.JobService;
 import com.qmth.sop.task.service.QuartzService;
@@ -46,6 +49,15 @@ public class JobServiceImpl implements JobService {
     @Resource
     SequenceService sequenceService;
 
+    @Resource
+    AsyncFxxkCrmSyncService asyncFxxkCrmSyncService;
+
+    @Resource
+    TBTaskService tbTaskService;
+
+    @Resource
+    SysUserService sysUserService;
+
     /**
      * 流程任务提醒task
      */
@@ -161,4 +173,30 @@ public class JobServiceImpl implements JobService {
     public void sequenceReset() {
         sequenceService.sequenceReset();
     }
+
+    @Override
+    public void fxxkCrmSync() throws Exception {
+        Map<String, Object> map = new HashMap<>();
+        List<TBTask> tbTaskList = tbTaskService.list(new QueryWrapper<TBTask>().lambda().eq(TBTask::getType, TaskTypeEnum.CRM_SYNC));
+        TBTask tbTask;
+        if (!CollectionUtils.isEmpty(tbTaskList)) {
+            if (tbTaskList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception(String.format("存在多条类型为[%s]的任务", TaskTypeEnum.CRM_SYNC.getTitle()));
+            }
+            tbTask = tbTaskList.get(0);
+            tbTask.setStatus(TaskStatusEnum.RUNNING);
+            tbTaskService.updateById(tbTask);
+        } else {
+            SysUser sysUser = sysUserService.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getLoginName, "sysadmin"));
+            if (Objects.isNull(sysUser)) {
+                throw ExceptionResultEnum.ERROR.exception("缺少系统管理员");
+            }
+            tbTask = new TBTask(TaskTypeEnum.CRM_SYNC,
+                    TaskStatusEnum.RUNNING,
+                    sysUser.getId());
+            tbTaskService.save(tbTask);
+        }
+        map.put(SystemConstant.TASK, tbTask);
+        asyncFxxkCrmSyncService.syncData(map);
+    }
 }

+ 9 - 0
sop-task/src/main/java/com/qmth/sop/task/start/StartRunning.java

@@ -6,6 +6,7 @@ import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.JobEnum;
 import com.qmth.sop.task.job.FlowTaskRemindJob;
+import com.qmth.sop.task.job.FxxkCrmSyncJob;
 import com.qmth.sop.task.job.SequenceJob;
 import com.qmth.sop.task.service.QuartzService;
 import org.slf4j.Logger;
@@ -59,6 +60,14 @@ public class StartRunning implements CommandLineRunner {
         quartzService.addJob(FlowTaskRemindJob.class, JobEnum.FLOW_TASK_REMIND_JOB.name(), JobEnum.FLOW_TASK_REMIND_JOB_GROUP.name(), sysConfig.getConfigValue(), flowTaskRemindJobMap);
         log.info("增加流程任务提醒定时任务 end");
 
+
+        log.info("fxxk派单同步定时任务 start");
+        Map<Object,Object> fxxkCrmSyncMap = new HashMap<>();
+        fxxkCrmSyncMap.put(SystemConstant.NAME, FxxkCrmSyncJob.class.getName());
+        quartzService.deleteJob(JobEnum.SYNC_FXXK_CRM.name(), JobEnum.SYNC_FXXK_CRM_GROUP.name());
+        quartzService.addJob(FxxkCrmSyncJob.class, JobEnum.SYNC_FXXK_CRM.name(), JobEnum.SYNC_FXXK_CRM_GROUP.name(), "0 0/5 6-23 * * ?", fxxkCrmSyncMap);
+        log.info("fxxk派单同步定时任务 end");
+
         log.info("服务器启动时执行 end");
     }
 }