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.system.SystemDictDataBiz; 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 com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Users; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Base64Util; 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 org.springframework.util.Base64Utils; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; 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 redisTemplate; @Autowired private SystemDictDataBiz systemDictDataBiz; /** * 志邦客户信息提交接口 * @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()); entity.setUserData(new ArrayList<>()); if(StringUtils.isNotBlank(customerLog.getUsernames())){ String[] names = customerLog.getUsernames().split(","); for(String str:names){ CrmCustomerUsernameRequest usernameRequest = new CrmCustomerUsernameRequest(); usernameRequest.setUserName(str); entity.getUserData().add(usernameRequest);//导购登陆账号集合 } } // 提交类型 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().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> getDaogouBindList(CrmDaogouBindListRequest entity ){ int status ; String crmInfo; String param = JSONObject.toJSONString(entity); CRMBaseResponse> result = sendHttpRequest(CRMConstants.IntegerUrl.DAOGOU_BIND_LIST_URL, CRMConstants.IntegerName.DAOGOU_BIND_LIST_NAME, param, new TypeReference>>(){}); return result;// 默认失败 } /** * 获取客户列表 * @param entity * @return */ @Override public CRMBaseResponse> getCustomerList(CrmCustomerListRequest entity ){ int status ; String crmInfo; String param = JSONObject.toJSONString(entity); CRMBaseResponse> result = sendHttpRequest(CRMConstants.IntegerUrl.CUS_BEFORE_PAGE_LIST_URL ,CRMConstants.IntegerName.CUS_BEFORE_PAGE_LIST_NAME ,param ,new TypeReference>>(){}); return result;// 默认失败 } public CRMBaseResponse 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 headers = new HashMap<>(); res = HttpsUtil.postJson(url,param); TypeReference typeReference = new TypeReference>(){}; CRMBaseResponse 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 CRMBaseResponse sendHttpRequest(String interfaceUrl, String name, String param,TypeReference> 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 headers = new HashMap<>(); res = HttpsUtil.postJson(url,param); CRMBaseResponse 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,String iamId){ try { // 创建StringBuffer对象用来操作字符串 int _t = (int)(System.currentTimeMillis()); String pageKey ="mp";//客户列表页面码 String fileUrl = systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_URL_MP).getCode(); if(Constants.equalsInteger(type,Constants.ONE)){ pageKey = "mpAddIntention";//新增意向页面码 fileUrl = systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_URL_MP_ADDINTENTION).getCode(); } String url = redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) + CRMConstants.IntegerUrl.GO_CRM_AUTH_URL + "?bindKey="+pageKey + "&tick=" + this.getTick(iamId, fileUrl); return url; }catch (Exception e){ e.printStackTrace(); } throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"获取跳转地址失败哦!"); } public String getTick(String iamId, String fileUrL) throws UnsupportedEncodingException { Map map = new HashMap<>(); //用户IAM主键 map.put("ssouserid",iamId); //售前小程序appid map.put("appid",systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_BUSINESS_APPID).getCode()); //跳转地址 map.put("rediUrl",fileUrL); //时间戳 map.put("timestamp",System.currentTimeMillis()/1000+""); //C端小程序appid map.put("sourceappid",systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_CUSTOMER_APPID).getCode()); System.out.println(JSONObject.toJSONString(map)); //获取tick String tick = ZbomCRMServiceImpl.encrypt( systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_URL_PRIVATE_KEY).getCode() ,JSONObject.toJSONString(map) ,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_URL_INIT_VECTOR).getCode()); String tickEncoder = URLEncoder.encode(tick,"UTF-8"); return tickEncoder; } public static String encrypt(String key, String value,String initVector) { try { IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(value.getBytes()); return Base64Utils.encodeToString(encrypted); } catch (Exception ex) { ex.printStackTrace(); } return null; } }