Ver Fonte

add:
1.crm同步

caozixuan há 1 ano atrás
pai
commit
9f906ff9d2

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

@@ -169,4 +169,9 @@ public interface TBCrmService extends IService<TBCrm> {
      * @return 派单
      */
     List<TBCrm> findByTBCrmListByServiceUnitIdAndAddress(Long serviceUnitId, String province, String city);
+
+    /**
+     * 从纷享销客同步派单信息
+     */
+    void syncCrmFromFxxk();
 }

+ 140 - 0
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.sop.business.bean.dto.DataPermissionDto;
+import com.qmth.sop.business.bean.dto.RoleDto;
 import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.dto.UserArchivesDto;
 import com.qmth.sop.business.bean.params.ServiceScopeParam;
@@ -14,6 +15,8 @@ import com.qmth.sop.business.bean.result.*;
 import com.qmth.sop.business.entity.*;
 import com.qmth.sop.business.mapper.TBCrmMapper;
 import com.qmth.sop.business.service.*;
+import com.qmth.sop.business.sync.FxxkApiUtils;
+import com.qmth.sop.business.sync.been.FxxkCrm;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.*;
 import com.qmth.sop.common.util.ResultUtil;
@@ -50,6 +53,12 @@ public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements
     private TBServiceRegionService tbServiceRegionService;
     @Resource
     private SysUserService sysUserService;
+    @Resource
+    private FxxkApiUtils fxxkApiUtils;
+    @Resource
+    private SysCustomService sysCustomService;
+    @Resource
+    private TBProductService tbProductService;
 
     @Override
     public IPage<CrmServiceResult> findServiceScopePage(Long serviceUnitId, String city, ProductTypeEnum productType, String customName, Boolean bindStatus, Integer pageNumber, Integer pageSize) {
@@ -396,4 +405,135 @@ public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements
     public List<TBCrm> findByTBCrmListByServiceUnitIdAndAddress(Long serviceUnitId, String province, String city) {
         return this.baseMapper.findByTBCrmListByServiceUnitIdAndAddress(serviceUnitId, province, city);
     }
+
+    @Transactional
+    @Override
+    public void syncCrmFromFxxk() {
+        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);
+                } 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);
+                    } 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 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 (errorMsgList.size() > 0) {
+            throw ExceptionResultEnum.ERROR.exception(String.join(";\n", errorMsgList));
+        }
+    }
 }

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

@@ -57,9 +57,6 @@ public class FxxkApiUtils {
      * @return 应用级授权信息
      */
     public FxxkAppAuthInfo findFxxkAppAuthInfo() {
-//        String appId = sysConfigService.findByConfigKey(SystemConstant.FXXK_APP_ID).getConfigValue();
-//        String appSecret = sysConfigService.findByConfigKey(SystemConstant.FXXK_APP_SECRET).getConfigValue();
-//        String permanentCode = sysConfigService.findByConfigKey(SystemConstant.FXXK_PERMANENT_CODE).getConfigValue();
         String postUrl = sysConfigService.findByConfigKey(SystemConstant.FXXK_APP_AUTH_URL).getConfigValue();
         try {
             Map<String, Object> map = new HashMap<>();
@@ -122,7 +119,6 @@ public class FxxkApiUtils {
      * 查询自定义对象列表
      */
     public List<FxxkCrm> findCustomList() {
-//        String currentOpenUserId = sysConfigService.findByConfigKey(SystemConstant.FXXK_CURRENT_OPEN_USER_ID).getConfigValue();
         String postUrl = sysConfigService.findByConfigKey(SystemConstant.FXXK_CUSTOM_QUERY_URL).getConfigValue();
         try {
             FxxkAppAuthInfo fxxkAppAuthInfo = this.findFxxkAppAuthInfo();
@@ -135,34 +131,42 @@ public class FxxkApiUtils {
             map.put("currentOpenUserId", validParam(fxxkCurrenOpenUserId, null, true, "当前操作人OpenUserID"));
 
             Map<String, Object> dataMap = new HashMap<>();
-//            dataMap.put("dataObjectApiName", sysConfigService.findByConfigKey(SystemConstant.FXXK_API_NAME_CRM).getConfigValue());
             dataMap.put("dataObjectApiName", fxxkApiNameCrm);
 
             Map<String, Object> queryMap = new HashMap<>();
             queryMap.put("offset", 0.0);
             queryMap.put("limit", 1000.0);
-            queryMap.put("filters", new ArrayList<>());
 
             // 查询
-            List<Map<String,Object>> filterMapList = new ArrayList<>();
-            Map<String,Object> filterMap = new HashMap<>();
-            filterMap.put("field_name","life_status");
+            List<Map<String, Object>> filterMapList = new ArrayList<>();
+            // 查询条件1 : 派单状态为正常的
+            Map<String, Object> filterMap1 = new HashMap<>();
+            filterMap1.put("field_name", "life_status");
             List<String> fieldValues = new ArrayList<>();
             fieldValues.add("normal");
-            filterMap.put("field_values",fieldValues);
-            filterMap.put("operator","EQ");
+            filterMap1.put("field_values", fieldValues);
+            filterMap1.put("operator", "EQ");
+            filterMapList.add(filterMap1);
 
-            filterMapList.add(filterMap);
-            queryMap.put("filters",filterMapList);
+            // 查询条件2 : 派单号为
+            Map<String, Object> filterMap2 = new HashMap<>();
+            filterMap2.put("field_name", "name");
+            List<String> fieldValues2 = new ArrayList<>();
+            fieldValues2.add("Od-2023-10-2001");
+            filterMap2.put("field_values", fieldValues2);
+            filterMap2.put("operator", "EQ");
+            filterMapList.add(filterMap2);
+
+            queryMap.put("filters", filterMapList);
 
             // 排序
-            List<Map<String,Object>> orderMapList = new ArrayList<>();
+            List<Map<String, Object>> orderMapList = new ArrayList<>();
             // 最后更新时间降序
-            Map<String,Object> orderMap = new HashMap<>();
-            orderMap.put("fieldName","last_modified_time");
-            orderMap.put("isAsc",false);
+            Map<String, Object> orderMap = new HashMap<>();
+            orderMap.put("fieldName", "last_modified_time");
+            orderMap.put("isAsc", false);
             orderMapList.add(orderMap);
-            queryMap.put("orders",orderMapList);
+            queryMap.put("orders", orderMapList);
 
             dataMap.put("search_query_info", queryMap);
             map.put("data", dataMap);
@@ -183,14 +187,28 @@ public class FxxkApiUtils {
             List<FxxkCrm> fxxkCrmList = new ArrayList<>();
             for (int i = 0; i < dataList.size(); i++) {
                 JSONObject cell = dataList.getJSONObject(i);
+
                 String crmName = cell.getString("display_name");
                 String crmNo = cell.getString("name");
                 Long beginTime = cell.getLong("createTime");
 
                 JSONObject ownerR = cell.getJSONObject("owner__r");
                 String managerName = ownerR.getString("name");
+                String managerMobileNumber = ownerR.getString("mobile");
+
+                String customTypeStr = cell.getString("field_spOcm__c");
+                ProductTypeEnum productType = null;
+                if (customTypeStr != null && customTypeStr.length() > 0) {
+                    switch (customTypeStr) {
+                        case "kvdZqVYXU":
+                            productType = ProductTypeEnum.OFFICE;
+                            break;
+                        case "yD18iX9oz":
+                            productType = ProductTypeEnum.CLOUD_MARK;
+                            break;
+                    }
+                }
 
-                String customType = cell.getString("field_spOcm__c");
                 String customName = cell.getString("field_6TD92__c__r");
                 String customCounty = cell.getString("field_O0l25__c__r");
                 String customProvince = cell.getString("field_Nc2M6__c__r");
@@ -200,12 +218,27 @@ public class FxxkApiUtils {
                 Long examStartTime = cell.getLong("field_Fl84j__c");
                 Long examEndTime = cell.getLong("field_Gcsmt__c");
 
+                Boolean sync = null;
+                String syncStr = cell.getString("field_f4uvT__c");
+                if (syncStr != null && syncStr.length() > 0) {
+                    switch (syncStr) {
+                        case "option1":
+                            sync = true;
+                            break;
+                        case "cJB5sxeMC":
+                            sync = false;
+                            break;
+                    }
+                }
+
+
                 FxxkCrm fxxkCrm = new FxxkCrm();
                 fxxkCrm.setCrmName(crmName);
                 fxxkCrm.setCrmNo(crmNo);
                 fxxkCrm.setBeginTime(beginTime);
                 fxxkCrm.setManagerName(managerName);
-                fxxkCrm.setCustomType(ProductTypeEnum.CLOUD_MARK);
+                fxxkCrm.setManagerMobileNumber(managerMobileNumber);
+                fxxkCrm.setCustomType(productType);
                 fxxkCrm.setCustomName(customName);
                 fxxkCrm.setCustomCounty(customCounty);
                 fxxkCrm.setCustomProvince(customProvince);
@@ -213,6 +246,7 @@ public class FxxkApiUtils {
                 fxxkCrm.setCustomAddress(customAddress);
                 fxxkCrm.setExamStartTime(examStartTime);
                 fxxkCrm.setExamEndTime(examEndTime);
+                fxxkCrm.setSync(sync);
                 fxxkCrmList.add(fxxkCrm);
             }
             return fxxkCrmList;

+ 22 - 0
sop-business/src/main/java/com/qmth/sop/business/sync/been/FxxkCrm.java

@@ -21,6 +21,9 @@ public class FxxkCrm {
     @ApiModelProperty("客户经理")
     private String managerName;
 
+    @ApiModelProperty("客户经理电话")
+    private String managerMobileNumber;
+
     @ApiModelProperty("客户类型")
     private ProductTypeEnum customType;
     @ApiModelProperty("客户名称")
@@ -39,6 +42,9 @@ public class FxxkCrm {
     @ApiModelProperty("考试结束时间")
     private Long examEndTime;
 
+    @ApiModelProperty("fxxk同步质控平台")
+    private Boolean sync;
+
     public String getCrmNo() {
         return crmNo;
     }
@@ -71,6 +77,14 @@ public class FxxkCrm {
         this.managerName = managerName;
     }
 
+    public String getManagerMobileNumber() {
+        return managerMobileNumber;
+    }
+
+    public void setManagerMobileNumber(String managerMobileNumber) {
+        this.managerMobileNumber = managerMobileNumber;
+    }
+
     public ProductTypeEnum getCustomType() {
         return customType;
     }
@@ -134,4 +148,12 @@ public class FxxkCrm {
     public void setExamEndTime(Long examEndTime) {
         this.examEndTime = examEndTime;
     }
+
+    public Boolean getSync() {
+        return sync;
+    }
+
+    public void setSync(Boolean sync) {
+        this.sync = sync;
+    }
 }