|  |  |  | 
|---|
|  |  |  | 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.CrmCustomerInfoModel; | 
|---|
|  |  |  | import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel; | 
|---|
|  |  |  | 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.scheduling.annotation.Async; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.net.URLEncoder; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | * @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 int postDataToCrm(CrmCustomerSubmmitModel entity )  { | 
|---|
|  |  |  | // TODO Auto-generated method stub | 
|---|
|  |  |  | int status = 2; | 
|---|
|  |  |  | if(entity==null || entity.getCusInfo()==null || entity.getCusInfo().size() ==0){ | 
|---|
|  |  |  | return status; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String type = "postCusData"; | 
|---|
|  |  |  | String appid = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_KEY); | 
|---|
|  |  |  | String urlStr =  (String)redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) ; | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | String crmInfo="提交失败"; | 
|---|
|  |  |  | if (StringUtils.isNotBlank(appid)||StringUtils.isNotBlank(urlStr)) { | 
|---|
|  |  |  | String token = DigestUtils.md5Hex(type + _t + appid); | 
|---|
|  |  |  | String url = urlStr + "?type=" + type + "&_t=" + _t + "&token=" + token;// 提交CRM地址 | 
|---|
|  |  |  | String param = JSONObject.toJSONString(entity); | 
|---|
|  |  |  | int success =1; | 
|---|
|  |  |  | String result = null; | 
|---|
|  |  |  | if (StringUtils.isNotBlank(appKey)||StringUtils.isNotBlank(url)) { | 
|---|
|  |  |  | String res = null; | 
|---|
|  |  |  | int success = 0; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | result = HttpsUtil.postJson(url,param); | 
|---|
|  |  |  | if (StringUtils.isNotBlank(result)) { | 
|---|
|  |  |  | JSONObject r = JSONObject.parseObject(result.replace("(", "").replace(")", "")); | 
|---|
|  |  |  | if (r != null && (StringUtils.equalsIgnoreCase(r.getString("code"), "1") | 
|---|
|  |  |  | || StringUtils.equalsIgnoreCase(r.getString("code"), "2"))) { | 
|---|
|  |  |  | status = 1; | 
|---|
|  |  |  | crmInfo="提交成功"; | 
|---|
|  |  |  | success =0; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | status = 2; | 
|---|
|  |  |  | crmInfo="提交失败["+ result+"]"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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){ | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | crmInfo+= e.getMessage(); | 
|---|
|  |  |  | success = 1; | 
|---|
|  |  |  | log.error("【"+name+"】================失败===="+ JSONObject.toJSONString(param)); | 
|---|
|  |  |  | }finally { | 
|---|
|  |  |  | saveInterfaceLog(url,"志邦CRM客户留资信息提交",param,success,result); | 
|---|
|  |  |  | 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{ | 
|---|
|  |  |  | status = 2; | 
|---|
|  |  |  | crmInfo="提交失败crm配置有误,appid:["+ appid+"]"+"url:["+ urlStr+"]"; | 
|---|
|  |  |  | log.error("【CRM接口:"+name+"】================失败====:\n"+ res); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<Long> idList = new ArrayList<>(); | 
|---|
|  |  |  | for(CrmCustomerInfoModel info : entity.getCusInfo()){ | 
|---|
|  |  |  | idList.add(info.getId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 如果提交成功 | 
|---|
|  |  |  | CustomerLog d = new CustomerLog(); | 
|---|
|  |  |  | d.setId(entity.getCusInfo().get(0).getId()); | 
|---|
|  |  |  | d.setCrmStatus(Constants.ONE); | 
|---|
|  |  |  | customerLogMapper.update(null,new UpdateWrapper<CustomerLog>().lambda() | 
|---|
|  |  |  | .in(CustomerLog::getId,idList) | 
|---|
|  |  |  | .set(CustomerLog::getCrmStatus,Constants.ONE ) | 
|---|
|  |  |  | .set(CustomerLog::getCrmInfo,crmInfo ) | 
|---|
|  |  |  | .set(CustomerLog::getCrmDate,new Date() ));// 更新状态 | 
|---|
|  |  |  | return status;// 默认失败 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone){ | 
|---|
|  |  |  | if(crmInterfaceLogMapper ==null){ | 
|---|
|  |  |  | 
|---|
|  |  |  | 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(),"获取跳转地址失败哦!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|