| package com.doumee.biz.zbom.impl; | 
|   | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.alibaba.fastjson.TypeReference; | 
| import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; | 
| import com.doumee.biz.zbom.ZbomCRMService; | 
| import com.doumee.biz.zbom.model.crm.*; | 
| import com.doumee.biz.zbom.model.crm.response.CRMBaseResponse; | 
| import com.doumee.biz.zbom.model.crm.response.CRMCustomerListResponse; | 
| import com.doumee.biz.zbom.model.crm.response.CRMDaogouBindListResponse; | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
| import com.doumee.core.utils.Constants; | 
| import com.doumee.core.utils.DateUtil; | 
| import com.doumee.core.utils.HttpsUtil; | 
| import com.doumee.dao.business.CrmInterfaceLogMapper; | 
| import com.doumee.dao.business.CustomerLogMapper; | 
| import com.doumee.dao.business.model.CrmInterfaceLog; | 
| import com.doumee.dao.business.model.CustomerLog; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.apache.commons.codec.digest.DigestUtils; | 
| import org.apache.commons.lang3.StringUtils; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.data.redis.core.RedisTemplate; | 
| import org.springframework.scheduling.annotation.Async; | 
| import org.springframework.stereotype.Service; | 
|   | 
| import java.net.URLEncoder; | 
| import java.util.*; | 
|   | 
| /** | 
|  * 志邦CRM客户信息提交接口 | 
|  * @author 江蹄蹄 | 
|  * @date 2023/11/30 15:33 | 
|  */ | 
| @Service | 
| @Slf4j | 
| public class ZbomCRMServiceImpl implements ZbomCRMService { | 
|   | 
|     @Autowired | 
|     private CustomerLogMapper customerLogMapper; | 
|     @Autowired | 
|     private CrmInterfaceLogMapper crmInterfaceLogMapper; | 
|     @Autowired | 
|     private RedisTemplate<String, Object> redisTemplate; | 
|   | 
|   | 
|   | 
|     /** | 
|      * 志邦客户信息提交接口 | 
|      * @param customerLog | 
|      * @return | 
|      */ | 
|     @Override | 
|     @Async | 
|     public void dealCustomerLogData(CustomerLog customerLog){ | 
|         if(StringUtils.isBlank(customerLog.getPhone())){ | 
|             return; | 
|         } | 
|         CrmCustomerInfoRequest entity = new CrmCustomerInfoRequest(); | 
|         entity.setId(customerLog.getId()); | 
|         entity.setName(customerLog.getName()); | 
|         entity.setPhone(zbomEncode(customerLog.getPhone())); | 
|         entity.setAreaname(customerLog.getAreaName()); | 
|         entity.setAreacode(customerLog.getAreaCode()); | 
|         entity.setOpenid(customerLog.getOpenid()); | 
| //        提交类型 0-测试装修风格;1-0元定制;2装修计算器 | 
|         if(Constants.equalsInteger(customerLog.getType(),Constants.ONE)){ | 
|             entity.setSource(CRMConstants.CRM_SOURCE.SOURCE_MP01); | 
|             entity.setChannel(CRMConstants.CRM_SOURCE.SOURCE_MP01+"00"); | 
|         }else{ | 
|             entity.setSource(CRMConstants.CRM_SOURCE.SOURCE_MP02); | 
|             entity.setChannel(CRMConstants.CRM_SOURCE.SOURCE_MP02+"00"); | 
|         } | 
| //        entity.setOpenId(customerLog.getOpenid()); | 
|         entity.setOpenid(customerLog.getOpenid()); | 
|         entity.setDate(DateUtil.dateToString(customerLog.getCreateDate(),"yyyy/MM/dd HH:mm")); | 
|         CrmCustomerPostRequest obj = new CrmCustomerPostRequest(); | 
|         obj.setCusInfo(new ArrayList<>()); | 
|         obj.getCusInfo().add(entity); | 
|         int status ; | 
|         String crmInfo; | 
|         String param = JSONObject.toJSONString(obj); | 
|         CRMBaseResponse result = sendCusHttpRequest(CRMConstants.IntegerUrl.POST_CUS_DATA_URL,CRMConstants.IntegerName.POST_CUS_DATA_NAME,param); | 
|         if (result != null && (StringUtils.equalsIgnoreCase(result.getCode(), CRMConstants.CODE_SUCCESS))) { | 
|             status = 1; | 
|             crmInfo="提交成功"; | 
|         }else{ | 
|             status = 2; | 
|             crmInfo="提交失败["+ result!=null?result.getMsg():"接口请求失败!"+"]"; | 
|         } | 
|         customerLogMapper.update(null,new UpdateWrapper<CustomerLog>().lambda() | 
|                 .eq(CustomerLog::getId,entity.getId()) | 
|                 .set(CustomerLog::getCrmStatus,Constants.ONE ) | 
|                 .set(CustomerLog::getCrmInfo,crmInfo ) | 
|                 .set(CustomerLog::getCrmDate,new Date() ));// 更新状态 | 
|     } | 
|     /** | 
|      * 获取导购绑定列表 | 
|      * @param entity | 
|      * @return | 
|      */ | 
|     @Override | 
|     public  CRMBaseResponse<List<CRMDaogouBindListResponse>> getDaogouBindList(CrmDaogouBindListRequest entity ){ | 
|         int status ; | 
|         String crmInfo; | 
|         String param = JSONObject.toJSONString(entity); | 
|         CRMBaseResponse<List<CRMDaogouBindListResponse>> result = sendHttpRequest(CRMConstants.IntegerUrl.DAOGOU_BIND_LIST_URL, | 
|                 CRMConstants.IntegerName.DAOGOU_BIND_LIST_NAME, | 
|                 param, | 
|                 new TypeReference<CRMBaseResponse<List<CRMDaogouBindListResponse>>>(){}); | 
|         return result;// 默认失败 | 
|     } | 
|   | 
|     /** | 
|      * 获取客户列表 | 
|      * @param entity | 
|      * @return | 
|      */ | 
|     @Override | 
|     public CRMBaseResponse<List<CRMCustomerListResponse>> getCustomerList(CrmCustomerListRequest entity ){ | 
|         int status ; | 
|         String crmInfo; | 
|         String param = JSONObject.toJSONString(entity); | 
|         CRMBaseResponse<List<CRMCustomerListResponse>> result = sendHttpRequest(CRMConstants.IntegerUrl.CUS_BEFORE_PAGE_LIST_URL | 
|                 ,CRMConstants.IntegerName.CUS_BEFORE_PAGE_LIST_NAME | 
|                 ,param | 
|                 ,new TypeReference<CRMBaseResponse<List<CRMCustomerListResponse>>>(){}); | 
|         return result;// 默认失败 | 
|     } | 
|   | 
|     public   <T> CRMBaseResponse<T> sendCusHttpRequest(String interfaceUrl,  String name,  String param){ | 
|         log.info("【"+name+"】================开始===="+ JSONObject.toJSONString(param)); | 
|         String appKey = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_POSTCUS_API_KEY); | 
|         String url = redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) + interfaceUrl ; | 
|         long _t = System.currentTimeMillis(); | 
|         if (StringUtils.isNotBlank(appKey)||StringUtils.isNotBlank(url)) { | 
|             String res = null; | 
|             int success = 0; | 
|             try { | 
|                 url += "?type=postCusData&_t=" + _t + "&token=" + DigestUtils.md5Hex( "postCusData" + _t + appKey); | 
|                 Map<String,String> headers = new HashMap<>(); | 
|                 res = HttpsUtil.postJson(url,param); | 
|                 TypeReference typeReference = | 
|                         new TypeReference<CRMBaseResponse<T>>(){}; | 
|                 CRMBaseResponse<T>  result = JSONObject.parseObject(res, typeReference.getType()); | 
|                 logResult(result,name); | 
|                 if(StringUtils.equals(result.getCode(),CRMConstants.CODE_SUCCESS)){ | 
|                     return  result; | 
|                 }else{ | 
|                     success =1; | 
|                 } | 
|             }catch (Exception e){ | 
|                 success = 1; | 
|                 log.error("【"+name+"】================失败===="+ JSONObject.toJSONString(param)); | 
|             }finally { | 
|                 saveInterfaceLog(url,name,param,success,res); | 
|             } | 
|         } | 
|         return  null; | 
|     } | 
|     public   <T> CRMBaseResponse<T> sendHttpRequest(String interfaceUrl,  String name,  String param,TypeReference<CRMBaseResponse<T>> typeReference){ | 
|         log.info("【"+name+"】================开始===="+ JSONObject.toJSONString(param)); | 
|         String appKey = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_KEY); | 
|         String url = redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) + interfaceUrl ; | 
|         long _t = System.currentTimeMillis(); | 
|         if (StringUtils.isNotBlank(appKey)||StringUtils.isNotBlank(url)) { | 
|             String res = null; | 
|             int success = 0; | 
|             try { | 
|                 url += "?timestamp=" + _t + "&sign=" + DigestUtils.md5Hex( _t + appKey); | 
|                 Map<String,String> headers = new HashMap<>(); | 
|                 res = HttpsUtil.postJson(url,param); | 
|                 CRMBaseResponse<T>  result = JSONObject.parseObject(res, typeReference.getType()); | 
|                 logResult(result,name); | 
|                 if(StringUtils.equals(result.getCode(),CRMConstants.CODE_SUCCESS)){ | 
|                     return  result; | 
|                 }else{ | 
|                     success =1; | 
|                 } | 
|             }catch (Exception e){ | 
|                 success = 1; | 
|                 log.error("【"+name+"】================失败===="+ JSONObject.toJSONString(param)); | 
|             }finally { | 
|                 saveInterfaceLog(url,name,param,success,res); | 
|             } | 
|         } | 
|         return  null; | 
|     } | 
|     private static void logResult(CRMBaseResponse res,String name) { | 
|         if(StringUtils.equals(res.getCode(), CRMConstants.CODE_SUCCESS)){ | 
|             log.info("【CRM接口:"+name+"】================成功====\n"+res); | 
|         }else{ | 
|             log.error("【CRM接口:"+name+"】================失败====:\n"+ res); | 
|         } | 
|     } | 
|     public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone){ | 
|             if(crmInterfaceLogMapper ==null){ | 
|                 return; | 
|             } | 
|             CrmInterfaceLog log = new CrmInterfaceLog(); | 
|             log.setCreateDate(new Date()); | 
|             log.setUrl(url); | 
|             log.setEditDate(log.getCreateDate()); | 
|             log.setPlat(Constants.ZERO); | 
|             log.setName(name); | 
|             log.setIsdeleted(Constants.ZERO); | 
|             log.setRequest(param); | 
|             log.setType(Constants.ONE); | 
|             log.setSuccess(success); | 
|             log.setRepose(respone); | 
|             crmInterfaceLogMapper.insert(log); | 
|     } | 
|   | 
|     /** | 
|      * 志邦字符串加密 | 
|      * @param str | 
|      * @return | 
|      */ | 
|   | 
|     @Override | 
|     public   String zbomEncode(String str)  { | 
|         StringBuffer sb = new StringBuffer(); | 
|         String result = null; | 
|         try { | 
|             // 创建StringBuffer对象用来操作字符串 | 
|             String  urlStr =  (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_ENCODE_URL); | 
|             sb = new StringBuffer( | 
|                     urlStr + "?code=" + URLEncoder.encode(str, "UTF-8") + "&type=0&numstr=wy?"); | 
|             result = HttpsUtil.sendGet(sb.toString()); | 
|   | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         }finally { | 
|             saveInterfaceLog(sb.toString(),"志邦字符串加密接口",str, result==null?1:0,result ); | 
|         } | 
|         return  result; | 
|     } | 
|   | 
|     /** | 
|      * 跳转crm功能 获取授权地址 | 
|      * http://localhost:8080/core/oauth/authorize/jump?timestamp=1719998741&sign=41fbeb13965c43916876db7b5799e8ac&agent_phone_number=199077&bindKey=mp | 
|      * @param userName | 
|      * @return | 
|      */ | 
|     @Override | 
|     public    String getCrmGoUrl(String userName,Integer type){ | 
|         try { | 
|             // 创建StringBuffer对象用来操作字符串 | 
|             int _t = (int)(System.currentTimeMillis()); | 
|             String pageKey ="mp";//客户列表页面码 | 
|             if(Constants.equalsInteger(type,Constants.ONE)){ | 
|                 pageKey = "mpAddIntention";//新增意向页面码 | 
|             } | 
|             String  appkey =  (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_AUTH_API_KEY); | 
|             String  url =   redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) | 
|                     +CRMConstants.IntegerUrl.GO_CRM_AUTH_URL | 
|                     + "?timestamp="+_t | 
|                     +"&agent_phone_number=" + URLEncoder.encode(userName, "UTF-8") | 
|                     + "&bindKey="+pageKey+"&sign="+ DigestUtils.md5Hex( _t + appkey);; | 
|             return url; | 
|         }catch (Exception e){ | 
|             e.printStackTrace(); | 
|         } | 
|        throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"获取跳转地址失败哦!"); | 
|     } | 
| } |