liukangdong
2024-09-29 b2d360d9113b6955287108ca9e90d76a1f3c1419
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
@@ -1,23 +1,40 @@
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.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 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.*;
/**
@@ -26,78 +43,176 @@
 * @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;
    @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<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){
@@ -116,4 +231,99 @@
            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<String,Object> 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;
    }
}