对接飞书多维表格

多维表格数据新增,controller层

package com.porton.feishuintegration.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.porton.feishuintegration.model.common.FeishuCommonResponseDto;
import com.porton.feishuintegration.model.common.ResultResponse;
import com.porton.feishuintegration.model.feishuBitable.*;
import com.porton.feishuintegration.model.feishuBitable.entity.ApplyDto;
import com.porton.feishuintegration.model.feishuBitable.entity.MaterialDetail;
import com.porton.feishuintegration.model.feishuBitable.entity.YldParam;
import com.porton.feishuintegration.service.FeishuBitableService;
import com.porton.feishuintegration.util.Utils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.logging.LoggerConfiguration;
import org.springframework.http.*;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import sun.rmi.runtime.Log;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Logger;

/**
 * @author
 * 多维表格
 */
@RequestMapping("/feishu/bitable/tables")
@RestController
@Slf4j
public class BitableController {

    @Autowired
    private FeishuBitableService bitableService;


//    @Autowired
//    private CommonServie commonServie;


    @Autowired
    private RestTemplate restTemplate;

    @PostMapping("/views")
    public FeishuBitableResponseDto batchAddUserForGroup(@RequestBody BitableTableIdParam param) {
        return bitableService.getAppData(param);
    }


    /***
     * 获取表格数据
     * @param param
     * @return
     */
    @PostMapping("/tables")
    public FeishuBitableResponseDto batchViewsAddUserForGroup(@RequestBody BitableTableIdParam param) {
        FeishuBitableResponseDto dto=new FeishuBitableResponseDto();
        //如果传app_token 和 table_id
        if (ObjectUtil.isNotEmpty(param.getAppToken()) && ObjectUtil.isNotEmpty(param.getTableId()) && ObjectUtil.isNotEmpty(param.getViewId())) {
            BitableTableIdParam appTokenParam = BeanUtil.copyProperties(param, BitableTableIdParam.class);
             dto = bitableService.getRecordsAppData(appTokenParam);
            return dto;
        }else {
            dto.setCode(400);
            dto.setMsg("appToken,tableId,viewId 为必传");
            return dto;
        }
    }


    @PostMapping("/getApplyMaterialList")
    public ApplyDto getApplyMaterialList(@RequestBody YldParam param) {
        ApplyDto applyDto=new ApplyDto();
        JSONObject urlParm = new JSONObject();
        if (Strings.isNotEmpty(param.getWerks())) {
            urlParm.put("WERKS", param.getWerks());
        }
        if (param.getRsnum() != null) {
            urlParm.put("RSNUM", param.getRsnum());
        }
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("ZINPUT", urlParm);
        String s = JSON.toJSONString(hashMap);
        String s1 = JSONUtil.toJsonStr(hashMap);
        log.info("入参为=》{}", s);
        log.info("入参为=》{}", s1);

//        String str = restTemplate.postForObject("https://esb-test.porton.cn/restcloud/sap/zbpm_reservation_info", s, String.class);
        String res = Utils.sendPostO("https://esb-test.porton.cn/restcloud/sap/zbpm_reservation_info", s1);
        String ress = Utils.sendPostO("https://esb-test.porton.cn/restcloud/sap/zbpm_reservation_approval", s1);


//        String res = Utils.sendPostO(yldDataQueryUrl, s);
//        ResponseEntity<ResultResponse> results = restTemplate.postForEntity(yldDataQueryUrl,s, ResultResponse.class);
        Assert.isTrue(Strings.isNotEmpty(res), "接口错误,请联系管理员重试");

        JSONObject parse = JSONObject.parseObject(res);
        log.info("查询结果为=》{}", res);
        List<ApplyDto> applyDtos = JSONObject.parseArray(parse.get("ZOUT_HEAD").toString(), ApplyDto.class);
        if (applyDtos !=null && applyDtos.size()>0){
             applyDto = applyDtos.get(0);
            List<MaterialDetail> materialDetails = JSONObject.parseArray(parse.get("ZOUT_ITEM").toString(), MaterialDetail.class);
            applyDto.setDetailList(materialDetails);
        }
        return applyDto;

    }
//    @PostMapping("/tables")
//    public ResultResponse batchViewsAddUserForGroup(@RequestBody BitableTableIdParam param) {
//
//        ResultResponse viewsAppData=new ResultResponse();
//        //如果传app_token 和 table_id
//        if (ObjectUtil.isNotEmpty(param.getAppToken()) && ObjectUtil.isNotEmpty(param.getTableId())){
//            viewsAppData = bitableService.getAppTokentableIdAppData(param);
//            //如果只传如果传app_token
//        }else if (ObjectUtil.isNotEmpty(param.getAppToken())){
//            //复制参数
//            BitableAppTokenParam appTokenParam = BeanUtil.copyProperties(param, BitableAppTokenParam.class);
//            viewsAppData = bitableService.getAppTokenAppData(appTokenParam);
//        }else if (ObjectUtil.isNotEmpty(param.getAppToken()) && ObjectUtil.isNotEmpty(param.getTableId()) && ObjectUtil.isNotEmpty(param.getViewId())){
//            BitableTableIdParam appTokenParam = BeanUtil.copyProperties(param, BitableTableIdParam.class);
//            FeishuBitableResponseDto = bitableService.getRecordsAppData(appTokenParam);
//        }
//        return viewsAppData;
//    }


    /***
     * 新增数据表
     * @param param
     * @return
     */
    @PostMapping("/addBitTableForName")
    public FeishuCommonResponseDto addBitTableForName(@RequestBody AddTableIdParam param) {
        return bitableService.addBitTableForName(param);
    }



    /***
     * 新增多个数据表
     * @param param
     * @return
     */
    @PostMapping("/batchAddBitTableForNames")
    public FeishuCommonResponseDto BatchAddBitTableForNames(@RequestBody BatchAddTableIdParam param) {
        return bitableService.BatchAddBitTableForNames(param);
    }


    /**
     * 新增视图
     * @param param
     * @return
     */
    @PostMapping("/addBitTableForViews")
    public FeishuCommonResponseDto AddBitTableForViews(@RequestBody AddTableIdViewsParam param) {
        return bitableService.AddBitTableForViews(param);
    }


    /**
     * 删除视图
     * @param param
     * @return
     */
    @PostMapping("/deleteBitTableForViews")
    public FeishuCommonResponseDto deleteBitTableForViews(@RequestBody AddTableIdViewsParam param) {
        return bitableService.deleteBitTableForViews(param);
    }


    /**
     * 新增记录
     * @param param
     * @return
     */
    @PostMapping("/addBitTableForRecords")
    public FeishuCommonResponseDto addBitTableForRecords(@RequestBody AddRecordsParam param) {
        return bitableService.addBitTableForRecords(param);
    }


    /**
     * 新增多条记录
     * @param param
     * @return
     */
    @PostMapping("/batchAddBitTableForRecords")
    public FeishuCommonResponseDto batchAddBitTableForRecords(@RequestBody BatchAddRecordsParam param) {
        return bitableService.batchAddBitTableForRecords(param);
    }


    /**
     * 更新记录
     * @param param
     * @return
     */
    @PostMapping("/updateBitTableForRecords")
    public FeishuCommonResponseDto updateBitTableForRecords(@RequestBody UpdateRecordsParam param) {
        return bitableService.updateBitTableForRecords(param);
    }


    /**
     * 更新多条记录
     * @param param
     * @return
     */
    @PostMapping("/batchUpdateBitTableForRecords")
    public FeishuCommonResponseDto batchUpdateBitTableForRecords(@RequestBody BatchUpdateRecordsParam param) {
        return bitableService.batchUpdateBitTableForRecords(param);
    }


    /**
     * 列出字段
     * @param param
     * @return
     */
    @PostMapping("/queryBitTableForFields")
    public FeishuBitableResponseDto queryBitTableForFields(@RequestBody QueryFieldsParam param) {
        return bitableService.queryBitTableForFields(param);
    }


    /**
     * 新增字段
     * @param param
     * @return
     */
    @PostMapping("/addBitTableForFields")
    public FeishuCommonResponseDto addBitTableForFields(@RequestBody AddFieldsParam param) {
        return bitableService.addBitTableForFields(param);
    }


    /**
     * 更新字段
     * @param param
     * @return
     */
    @PostMapping("/updateBitTableForFields")
    public FeishuCommonResponseDto updateBitTableForFields(@RequestBody UpdateFieldsParam param) {
        return bitableService.updateBitTableForFields(param);
    }


    /**
     * 删除字段
     * @param param
     * @return
     */
    @PostMapping("/deleteBitTableForFields")
    public FeishuCommonResponseDto deleteBitTableForFields(@RequestBody UpdateFieldsParam param) {
        return bitableService.deleteBitTableForFields(param);
    }


    @PostMapping("/postBitTableForFields")
    public ResultResponse postBitTableForFields(@RequestBody Crmt crmt) {

        String fielStr=null;
        String exitTime = crmt.getExitTime();
        DateTime dateTime = DateUtil.parse(exitTime, "yyyy-MM-dd HH:mm:ss");
        System.out.println("日期==============="+dateTime);
        List<String> arrayList = new ArrayList<>();
        String fujian =crmt.getFileName();
        if (StringUtils.isNotEmpty(fujian)){
            String[] split = fujian.split(",");
            List<String> strings = Arrays.asList(split);
            if (strings !=null && strings.size()>0){
                for (String str:strings){
                   String strs = "https://bpm-pre.porton.cn/bpmapi/bpm/attachment/download/" + str+ "?attachmentType=bpm";
                    arrayList.add(strs);
                }
            }
            fielStr=arrayList.toString();
        }

        List<SeqData> objects = new ArrayList<>();
        for (int i=1;i<10;i++){
            SeqData seqData = new SeqData();
            Date date = new Date();
            SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateStr = fmt.format(date);
            seqData.setTimestamp(dateStr);
            seqData.setMessageTemplate("好辣鸡啊,阿根廷1234");

            objects.add(seqData);
        }
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("events",objects);
        String jsonStr = JSONUtil.toJsonStr(hashMap);
//        String jsonStr = JSONUtil.toJsonStr(hashMap);
        crmt.setFileName(fielStr);
//        UserInformationDto czht = commonServie.getUserInfo(instanceInfo.getDrafter(), "ZJGCCRMT");
//        ResponseEntity<ResultResponse> results = restTemplate.postForEntity("https://vrms-test.porton.cn/btjdapi/api/ExitVoucher/Add",crmt, ResultResponse.class);
//        ResponseEntity<ResultResponse> results = restTemplate.postForEntity("http://btpcpi.yilvzp.com/api/ExitVoucher/Add",crmt, ResultResponse.class);
//        ResponseEntity<ResultResponse> results = restTemplate.postForEntity("https://vrmsfs-test.porton.cn/api/api/ExitVoucher/Add",crmt, ResultResponse.class);
        ResponseEntity<ResultResponse> results = restTemplate.postForEntity("http://10.200.24.51:8009/api/events/raw",jsonStr, ResultResponse.class);
//        String postsResult = Utils.sendPostO("http://10.200.24.51:8009/api/events/raw",jsonStr);

        JSONArray jArray = new JSONArray();
        jArray.add(hashMap);
        String str = jArray.toString();
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth("wX6rGbp7yKQOsALRnCGh");
        headers.setConnection("wX6rGbp7yKQOsALRnCGh");
//        RequestEntity<String> requestEntity = RequestEntity
//                .post("http://10.200.24.51:8009/api/events/raw")
//                .headers(headers)
//                .contentType(MediaType.APPLICATION_JSON)
//                .body(str);

//        restTemplate.put("http://10.200.24.51:8009/api/events/raw",jsonStr);
//        if (ObjectUtil.isNotEmpty(requestEntity)){
//            ResultResponse body = results.getBody();
//            ResultUserJobBpmDto resultDto = new Gson().fromJson(postsResult, ResultUserJobBpmDto.class);
//        }
//        ResultResponse body = results.getBody();
        setLogger(newLoggerConfiguration().writeTo(seq(“http://10.200.24.51::8009”)).创建记录器());日志。information(“Hello from {lang}!”,“Java”);
//                Log.setLogger(new LoggerConfiguration()
//                .writeTo(coloredConsole())
//                .writeTo(rollingFile("test-{Date}.log"), LogEventLevel.Information)
//                .writeTo(seq("http://localhost:5341/"))
//                .setMinimumLevel(LogEventLevel.Verbose)
//                .createLogger());
        return new ResultResponse();
    }




    @PostMapping("/postSapSend")
    public ResultResponse postSapSend(@RequestBody Crmt crmt) {

        String exitTime = crmt.getExitTime();
        DateTime dateTime = DateUtil.parse(exitTime, "yyyy-MM-dd HH:mm:ss");
        System.out.println("日期==============="+dateTime);


        String allotMoney = crmt.getApplyDepartment();
        BigDecimal bigDecimal = new BigDecimal(allotMoney);
        String s = bigDecimal.toPlainString();
//        UserInformationDto czht = commonServie.getUserInfo(instanceInfo.getDrafter(), "ZJGCCRMT");
        ResponseEntity<ResultResponse> results = restTemplate.postForEntity("https://vrms-test.porton.cn/btjdapi/api/ExitVoucher/Add",crmt, ResultResponse.class);

        if (ObjectUtil.isNotEmpty(results)){
            ResultResponse body = results.getBody();
        }
        ResultResponse body = results.getBody();
        return new ResultResponse();
    }



    @PostMapping("/postSapSendddjs")
    public void postSapSendddjs() {

        String url="https://esb-test.porton.cn/restcloud/ddjssq/apexrest/AcceptContracts";

        // 先获取token
        HttpHeaders requestHeaders = new HttpHeaders();
        Map<String, String> requestParam = new HashMap<>();
        requestParam.put("grant_type", "password");
        requestParam.put("client_id", "3MVG96vIeT8jJWjJT_fMo8DsIwIu0b49Qli6kfIXOCj2CnYdNj1T1utoTalPnTxCO5J_FsnUlhAGaxMbM017T");
        requestParam.put("client_secret", "6FDE5995D087638DBDC3AAAB64192DB43F59175ED1C38127C5CF3DA86767A6F7");
        requestParam.put("username", "chengzange_admin@frensworkz.com.devpharma");
        requestParam.put("password", "1qaz2WSX");
        HttpEntity requestEntity = new HttpEntity(requestParam, requestHeaders);
        CrmTokenDto tokenDto = restTemplate.postForObject("https://esb-test.porton.cn/restcloud/crm-test/token", requestEntity, CrmTokenDto.class);
        log.info(JSON.toJSONString(tokenDto));

        //请求头
        log.info(JSON.toJSONString(tokenDto));
        // 拼接token再去回调Update接口
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(tokenDto.getAccess_token());
        headers.setContentType(MediaType.APPLICATION_JSON);
        //获取审批结果
//        ExecutorDto executorDto = flowExecutor.getExecutorDto();
//        log.info("流程参数有" + JSON.toJSONString(executorDto));
//        String approvalResult = executorDto.getApprovalResult();
//        Map<String, Object> bizData = executorDto.getBizData();

        List<JSONObject> jbarrayList = new ArrayList<>();

        JSONObject jb=new JSONObject();
//        String sfid = Obj2String(businessRule.get("SFID"));
//        jb.put("Contract_ID",sfid);
//        String double_chapter_contract =(String) bizData.get("DOUBLE_CHAPTER_CONTRACT");
        List<JSONObject> arrayList = new ArrayList<>();
//        if (StringUtils.isNotEmpty(double_chapter_contract)){
//            String[] strings = double_chapter_contract.split(",");
//            List<String> stringList = Arrays.asList(strings);
//            for (String str:stringList){
//                Map<String, Object> map = commonDao.selectAttById(str);
//                if (map !=null && !map.isEmpty()){
//                    JSONObject object = new JSONObject();
//                    object.put("Name","map");
//                    String linkUrl =  "/bpmapi/bpm/attachment/download/attachmentType=bpm";
//                    object.put("LinkUrl",linkUrl);
//                    object.put("ContractId","a05BK000001QA3ZYAW");
//                    arrayList.add(object);
//                }
//            }
//            jb.put("Files",double_chapter_contract);
//        }
//        if ("AGREED".equals(approvalResult)){
//            jb.put("Approval_Status","审批通过");
//            jb.put("Files",arrayList);
//        }else {
//            jb.put("Approval_Status","审批拒绝");
//            jb.put("Files","");
//        }
        jb.put("Approval_Status","审批通过");
        jb.put("Files",arrayList);
        jb.put("Contract_ID","a05BK000001QA3ZYAW");
        jbarrayList.add(jb);
        HttpEntity httpEntity = new HttpEntity(jbarrayList, headers);

        System.out.println("======"+httpEntity);
        System.out.println(JSON.toJSONString(jbarrayList));

        String res = restTemplate.postForObject(url, httpEntity, String.class);
        log.info("请求外部接口返回参数=》{}", res);
//        JSONObject jsonObj = JSON.parseObject(res);
//        if (Strings.isEmpty(res)){
//            log.info("接口错误,请联系管理员查看错误原因");
//        }
    }



    @GetMapping("/postSapSendxmwdckqxs")
    public void xmwdckqxsqEndTospStart() {

        log.info("====项目文档权限申请流程结束开始====");
//        log.info("项目文档权限申请-params参数有" + JSON.toJSONString(params));
        try{
          String url="https://esb-test.porton.cn/restcloud/portsite/webservice/ProjectDoc"+ "?InstanceId=" +"946788896833032192";
//            if ("End".equals(str) &&  "AGREED".equals(approvalResult)){

//                url=url+"&Status=2";
                url=url+"&Status=2";
//            }
//            if ("after".equals(str)){
//                url=url+"&Status=1";
//            }
            String res = Utils.sendByGet(url);
            if (Strings.isEmpty(res)){
                log.info("接口错误,请联系管理员查看错误原因");
            }
            log.info("请求外部接口返回参数=》{}", res);
            JSONObject jsonObj = JSON.parseObject(res);
            if (!"200".equals(jsonObj.get("Code").toString())){
                log.info(jsonObj.get("Message").toString());
            }
            // 保存请求接口日志
//            commonServie.saveLogAboutSendThirdApi(instanceInfo.getProcessname(), bpmtoSpUrl, JSON.toJSONString(url), res);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            log.error("项目文档权限申请节点通知SP系统接口失败,原因:" + e.getMessage());
        }
        log.info("====外项目文档权限申请程结束结束====");
    }

}

实现类:service层

package com.porton.feishuintegration.service;

import com.porton.feishuintegration.model.common.FeishuCommonResponseDto;
import com.porton.feishuintegration.model.common.ResultResponse;
import com.porton.feishuintegration.model.feishuBitable.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;
import java.util.Map;

/**
 * 飞书多维表格服务接口
 * 
 */
public interface FeishuBitableService {

    /**
     * 获取多维表格元数据
     * @param param
     * 多维表格ID
     * @return 多维表格信息
     */
//    FeishuBitableResponseDto getAppData(String appToken);
    FeishuBitableResponseDto getAppData(BitableTableIdParam param);


    /***
     * 获取多维表格
     * 表格里的视图
     * 视图级
     * 第二层
     * @param param
     * @return
     */
    ResultResponse getAppTokentableIdAppData(BitableTableIdParam param);


    /***
     * 获取多维表格
     * 表格级
     * 列出数据表
     * 第一层
     * @param param
     * @return
     */
    ResultResponse getAppTokenAppData(BitableAppTokenParam param);


    /***
     * 获取多维表格
     * 单元格数据
     *
     * @param param
     * @return
     */
    FeishuBitableResponseDto getAppTokentableIdFormIdAppData(BitableFormIdParam param);


    /**
     * 获取多维表格
     * 列出记录
     * 明细数据
     * 第三层
     * @param param
     * @return
     */
    FeishuBitableResponseDto getRecordsAppData(BitableTableIdParam param);



    FeishuBitableResponseDto getRecordsRecursionAppData(BitableTableIdParam param);


    /***
     * 新增数据表
     * @param param
     * @return
     */
    FeishuCommonResponseDto addBitTableForName(AddTableIdParam param);


    /***
     * 新增多个数据表
     * 批量新增
     * @param param
     * @return
     */
    FeishuCommonResponseDto BatchAddBitTableForNames(BatchAddTableIdParam param);


    FeishuCommonResponseDto AddBitTableForViews(AddTableIdViewsParam param);


    FeishuCommonResponseDto deleteBitTableForViews(AddTableIdViewsParam param);



    /**
     * 新增记录
     * @param param
     * @return
     */
    FeishuCommonResponseDto addBitTableForRecords(AddRecordsParam param);


    /**
     * 新增多条记录
     * @param param
     * @return
     */
    FeishuCommonResponseDto batchAddBitTableForRecords(BatchAddRecordsParam param);


    /**
     * 更新记录
     * @param param
     * @return
     */
    FeishuCommonResponseDto updateBitTableForRecords(UpdateRecordsParam param);


    /**
     * 更新多条记录
     * @param param 111
     * @return 222
     */
    FeishuCommonResponseDto batchUpdateBitTableForRecords(BatchUpdateRecordsParam param);


    /**
     * 批量删除记录
     * @param param 111
     * @return 222
     */
    FeishuCommonResponseDto batchDeleteBitTableForRecords(BatchDeleteRecordsParam param);

    /**
     * 列出字段
     * @param param
     * @return
     */
    FeishuBitableResponseDto queryBitTableForFields(QueryFieldsParam param);


    /**
     * 新增字段
     * @param param
     * @return
     */
    FeishuCommonResponseDto addBitTableForFields(AddFieldsParam param);


    /**
     * 更新字段
     * @param param
     * @return
     */
    FeishuCommonResponseDto updateBitTableForFields(UpdateFieldsParam param);


    /**
     * 删除字段
     * @param param
     * @return
     */
    FeishuCommonResponseDto deleteBitTableForFields(UpdateFieldsParam param);
}

实现类:impl 层

package com.porton.feishuintegration.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.porton.feishuintegration.enums.ViewsTypeEnum;
import com.porton.feishuintegration.model.common.FeishuCommonResponseDto;
import com.porton.feishuintegration.model.common.ResultResponse;
import com.porton.feishuintegration.model.feishuBitable.*;
import com.porton.feishuintegration.service.FeishuBitableService;
import com.porton.feishuintegration.service.FeishuCommonService;
import com.porton.feishuintegration.util.ToolUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.porton.feishuintegration.exception.ErrorEnum.READONLY_ACCOUNT;


/**
 * 
 * 飞书多维表格服务实现类
 */
@Service
@Slf4j
public class FeishuBitablleServiceImpl implements FeishuBitableService {

    @Value("${feishu.bitable.get.url}")
    private String bitableBaseUrl;

    @Value("${feishu.robot.appId}")
    private String robotAppId;

    @Value("${feishu.robot.appSecret}")
    private String robotAppSecret;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private FeishuCommonService feishuCommonService;

//    @Override
//    public FeishuBitableResponseDto getAppData(String appToken) {
//
//        /:app_token/tables/:table_id/views
//        String url = bitableBaseUrl + appToken+"/tables"++"/views";
//        String token = feishuCommonService.getAppAccessToken(robotAppId, robotAppSecret);
//        HttpHeaders headers = new HttpHeaders();
//        headers.setBearerAuth(token);
//        HttpEntity<FeishuBitableResponseDto> response = restTemplate.exchange(url, HttpMethod.GET,
//                new HttpEntity<>(headers),FeishuBitableResponseDto.class);
//        FeishuBitableResponseDto resDto = response.getBody();
//        return resDto;
//    }

    @Override
    public FeishuBitableResponseDto getAppData(BitableTableIdParam param) {
        //url 拼接
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/views";
        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "?page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }
        //获取token,先判断前端传appid和secret,如果传了用传的,没有用默认的
        String token = getCommonToken(param.getAppId(), param.getAppSecret());

        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        //调用接口
        HttpEntity<FeishuBitableResponseDto> response = restTemplate.exchange(url, HttpMethod.GET,
                new HttpEntity<>(headers), FeishuBitableResponseDto.class);
        FeishuBitableResponseDto resDto = response.getBody();
        log.info("获取视图列表返回结果", response);
        return resDto;
    }


    /***
     * 列出视图接口
     * 要传app_token 和table_id
     * 查的是表格数据
     *
     * 第二层
     * @param param
     * @return
     */
    @Override
    public ResultResponse getAppTokentableIdAppData(BitableTableIdParam param) {
        //返回数据集
        List<FeishuBitableResponseDto> mapsList = new ArrayList<>();

        FeishuBitableResponseDto resDto = null;
        //调用接口返回数据
        HttpEntity<FeishuBitableResponseDto> response = null;

        //如果传app_token 和 table_id 的路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/views";

        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "?page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }
        //获取登录token
//        String token = feishuCommonService.getAppAccessToken(robotAppId, robotAppSecret);
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        try {
            //调用第三方接口
            response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), FeishuBitableResponseDto.class);
        } catch (Exception e) {
//            throw new BusinessException(FORBIDDEN_ACCOUNT.getCode(),FORBIDDEN_ACCOUNT.getDescription());
            return ResultResponse.failResponse(READONLY_ACCOUNT.getDescription());
        }

        if (ToolUtil.isNotEmpty(response)) {
            resDto = response.getBody();
        }

        //根据返回的值查第三层
        if (ObjectUtil.isNotEmpty(resDto) && resDto.getMsg().equals("success") && ObjectUtil.isNotEmpty(resDto.getData())) {
            Map<String, Object> data = resDto.getData();
            List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("items");
            for (Map<String, Object> m : items) {
                //获取参数
                String view_id = (String) m.get("view_id");
                String view_type = (String) m.get("view_type");
                String view_name = (String) m.get("view_name");

                param.setViewId(view_id);
                //根据视图id,查询-明细数据,这是表格
                if (ObjectUtil.equal(view_type, "grid")) {
                    FeishuBitableResponseDto recordsAppData = getRecordsAppData(param);
                    recordsAppData.setViewName(view_name);
                    mapsList.add(recordsAppData);
                }
            }
        }
        log.info("调用视图返回结果----------------" + resDto);

        System.out.println("调用视图===========" + resDto);
        return ResultResponse.successResponse(mapsList);
    }


    /***
     * 获取多维表格
     * 表格级
     * 列出数据表
     * 第一层
     * @param param
     * @return
     */
    @Override
    public ResultResponse getAppTokenAppData(BitableAppTokenParam param) {

        List<FeishuBitableResponseDto> resDto = new ArrayList<>();
        //调用接口返回
        HttpEntity<FeishuBitableResponseDto> response = null;
        String url = bitableBaseUrl + param.getAppToken() + "/tables/";
        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "?page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        try {
            response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), FeishuBitableResponseDto.class);

            if (ToolUtil.isNotEmpty(response)) {
                List<Map<String, Object>> items = (List<Map<String, Object>>) response.getBody().getData().get("items");
                for (Map<String, Object> m : items) {
                    //获取参数
                    String table_id = (String) m.get("table_id");
                    String name = (String) m.get("name");
                    BitableTableIdParam bitableTableIdParam = BeanUtil.copyProperties(param, BitableTableIdParam.class);

                    bitableTableIdParam.setTableId(table_id);
                    //根据视图id,查询-明细数据,这是表格
                    ResultResponse appTokentableIdAppData = getAppTokentableIdAppData(bitableTableIdParam);
                    if (ObjectUtil.equal(appTokentableIdAppData.getCode(), 200)) {
                        List<FeishuBitableResponseDto> data = (List<FeishuBitableResponseDto>) appTokentableIdAppData.getData();
                        for (FeishuBitableResponseDto dto : data) {
                            dto.setTableName(name);
                        }
                        resDto.addAll(data);
                    }
                }
            }
            return ResultResponse.successResponse(resDto);
        } catch (Exception e) {
            log.error("查询表格数据,异常:", e.getMessage());
            return ResultResponse.failResponse(READONLY_ACCOUNT.getDescription());
        }
    }


    /***
     * 获取多维表格
     * 单元格数据
     *
     * @param param
     * @return
     */
    @Override
    public FeishuBitableResponseDto getAppTokentableIdFormIdAppData(BitableFormIdParam param) {
        FeishuBitableResponseDto resDto = null;

        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/forms/" + param.getFormId();

        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "?page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }
//        String token = feishuCommonService.getAppAccessToken(robotAppId, robotAppSecret);
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        HttpEntity<FeishuBitableResponseDto> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), FeishuBitableResponseDto.class);
        if (ToolUtil.isNotEmpty(response)) {
            resDto = response.getBody();
        }
        return resDto;
    }


    /**
     * 获取多维表格
     * 列出记录
     * 明细数据
     * 第三层
     *
     * @param param
     * @return
     */
    @Override
    public FeishuBitableResponseDto getRecordsAppData(BitableTableIdParam param) {
        FeishuBitableResponseDto resDto = null;

        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records";

        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getViewId())) {
            url = url + "?view_id=" + param.getViewId();
        }
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "&page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }
//        String token = feishuCommonService.getAppAccessToken(robotAppId, robotAppSecret);
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        HttpEntity<FeishuBitableResponseDto> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), FeishuBitableResponseDto.class);
        if (ToolUtil.isNotEmpty(response)) {
            resDto = response.getBody();
        }
        return resDto;
    }


    /**
     * 递归查询
     * @param param
     * @return
     */
    @Override
    public FeishuBitableResponseDto getRecordsRecursionAppData(BitableTableIdParam param) {


        FeishuBitableResponseDto resDto = null;

        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records";

        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getViewId())) {
            url = url + "?view_id=" + param.getViewId();
        }
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "&page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }

//        String token = feishuCommonService.getAppAccessToken(robotAppId, robotAppSecret);
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        HttpEntity<FeishuBitableResponseDto> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), FeishuBitableResponseDto.class);
        if (ToolUtil.isNotEmpty(response)) {
            resDto = response.getBody();

        }
        return resDto;
    }

    /***
     * 新增数据表
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto addBitTableForName(AddTableIdParam param) {
        //返回信息
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        //接口返回
        HttpEntity<FeishuCommonResponseDto> response = null;
        String url = bitableBaseUrl + param.getAppToken() + "/tables";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);
        //传参
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("table", param.getTable());
        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);

            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("新增表格,错误信息" + e.getMessage());
            resDto.setCode(400);
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254013")) {
                resDto.setMsg("表名重复");
            }
            return resDto;
        }

    }


    /***
     * 批量新增数据表
     * @param param
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public FeishuCommonResponseDto BatchAddBitTableForNames(BatchAddTableIdParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //判断是否有相同元素
        List<TableNameEntry> tableEntries = param.getTables();
        Integer priCount = tableEntries.size();   //集合的长度
        Long nextCount = tableEntries.stream().distinct().count();   //经过处理之后的集合长度
        if (!ObjectUtil.equal(priCount, nextCount.intValue())) {
            resDto.setCode(400);
            resDto.setMsg("有重复的表格名称");
            return resDto;
        }

        String url = bitableBaseUrl + param.getAppToken() + "/tables/batch_create";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("tables", JSONUtil.parseArray(param.getTables()));

        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("批量新增表格错误信息" + e.getMessage());
            resDto.setCode(400);
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254013")) {
                resDto.setMsg("表名重复");
            }
            return resDto;
        }

    }


    /***
     * 新建视图
     * @param param
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public FeishuCommonResponseDto AddBitTableForViews(AddTableIdViewsParam param) {

        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //视图枚举
        List<ViewsTypeEnum> allEnum = ViewsTypeEnum.getAllEnum();
        //视图类型集合
        List<String> arrayList = new ArrayList<>();
        for (ViewsTypeEnum typeEnum : allEnum) {
            arrayList.add(typeEnum.getDescription());
        }
        if (!arrayList.contains(param.getViews().getView_type())) {
            resDto.setCode(400);
            resDto.setMsg("视图类型错误,正确的视图类型如下:" + arrayList.toString());
            return resDto;
        }
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/views";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(param.getViews())); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("新增视图错误信息" + e.getMessage());
            resDto.setCode(400);
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254020")) {
                resDto.setMsg("视图名重复");
            } else if (e.getMessage().contains("1254021")) {
                resDto.setMsg("视图名为空");
            }
            return resDto;
        }
    }


    /**
     * 删除视图
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto deleteBitTableForViews(AddTableIdViewsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;

        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/views" + param.getViewId();
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        try {
            // 使用exchange发送DELETE请求
            response = restTemplate.exchange(url, HttpMethod.DELETE, null, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("删除视图错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254023")) {
                resDto.setMsg("最后一个视图禁止删除");
            }
            return resDto;
        }
    }


    /**
     * 新增记录
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto addBitTableForRecords(AddRecordsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records?user_id_type=user_id";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        Map<String, Object> hashMap = new HashMap<>();
        //这里还要在json转换一次
        hashMap.put("fields", param.getFields());
        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("新增记录错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254103")) {
                resDto.setMsg("记录数量超限, 限制20,000条");
            } else if (e.getMessage().contains("1254004")) {
                resDto.setMsg("table_id 错误");
            }

            return resDto;
        }
    }

    /**
     * 新增多条记录
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto batchAddBitTableForRecords(BatchAddRecordsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;

        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records/batch_create";
        //获取token
        String token = feishuCommonService.getAppAccessToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);


        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("records", JSONUtil.parseArray(param.getRecords()));

        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("新增多条记录错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254103")) {
                resDto.setMsg("记录数量超限, 限制20,000条");
            } else if (e.getMessage().contains("1254004")) {
                resDto.setMsg("table_id 错误");
            }
            return resDto;
        }
    }

    /**
     * 更新记录
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto updateBitTableForRecords(UpdateRecordsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;

        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records/" + param.getRecordId() + "?user_id_type=user_id";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("fields", param.getFields());

        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .put(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("更新记录错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254006")) {
                resDto.setMsg("检查 record_id");
            } else if (e.getMessage().contains("1254043")) {
                resDto.setMsg("record_id 不存在");
            }
            return resDto;
        }
    }

    /**
     * 更新多条记录
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto batchUpdateBitTableForRecords(BatchUpdateRecordsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records/batch_update";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("records", JSONUtil.parseArray(param.getRecords()));

        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("更新多条记录错误信息" + e.getMessage());
            resDto.setCode(400);
            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254006")) {
                resDto.setMsg("检查 record_id");
            } else if (e.getMessage().contains("1254043")) {
                resDto.setMsg("record_id 不存在");
            }
            return resDto;
        }
    }

    @Override
    public FeishuCommonResponseDto batchDeleteBitTableForRecords(BatchDeleteRecordsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        if (param.getRecords().size() > 0) {
            HttpEntity<FeishuCommonResponseDto> response = null;
            //路径
            String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/records/batch_delete";
            //获取token
            String token = getCommonToken(param.getAppId(), param.getAppSecret());
            HttpHeaders headers = new HttpHeaders();
            headers.setBearerAuth(token);

            Map<String, Object> hashMap = new HashMap<>();
            hashMap.put("records", JSONUtil.parseArray(param.getRecords()));
//请求体
            RequestEntity<String> requestEntity = RequestEntity
                    .post(url)
                    .headers(headers)
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
            try {
                response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
                if (ToolUtil.isNotEmpty(response)) {
                    resDto = response.getBody();
                }
                return resDto;
            } catch (Exception e) {
                log.error("删除多条记录错误信息" + e.getMessage());
                resDto.setCode(400);
                return resDto;
            }
        } else {
            return resDto;
        }
    }

    /**
     * 列出字段
     *
     * @param param
     * @return
     */
    @Override
    public FeishuBitableResponseDto queryBitTableForFields(QueryFieldsParam param) {
        FeishuBitableResponseDto resDto = new FeishuBitableResponseDto();
        //路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/fields";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());

        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        //是否拼接分页参数
        if (ToolUtil.isNotEmpty(param.getPageSize())) {
            url = url + "?page_size=" + param.getPageSize();
        }
        if (ToolUtil.isNotEmpty(param.getPageToken())) {
            url = url + "&page_token=" + param.getPageToken();
        }
        if (ToolUtil.isNotEmpty(param.getTextFieldAsArray())) {
            url = url + "&text_field_as_array=" + param.getTextFieldAsArray();
        }
        if (ToolUtil.isNotEmpty(param.getViewId())) {
            url = url + "&view_id=" + param.getViewId();
        }

        HttpEntity<FeishuBitableResponseDto> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), FeishuBitableResponseDto.class);
        if (ToolUtil.isNotEmpty(response)) {
            resDto = response.getBody();
        }

        return resDto;
    }

    /**
     * 新增字段
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto addBitTableForFields(AddFieldsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/fields";
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("field_name", param.getField_name());
        hashMap.put("type", param.getType());

        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .post(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            response = restTemplate.exchange(requestEntity, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("新增字段错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254103")) {
                resDto.setMsg("记录数量超限, 限制20,000条");
            } else if (e.getMessage().contains("1254004")) {
                resDto.setMsg("table_id 错误");
            }
            return resDto;
        }
    }


    /**
     * 更新字段
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto updateBitTableForFields(UpdateFieldsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/fields" + param.getFieldId();
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("field_name", param.getField_name());
        hashMap.put("type", param.getType());

        String jsonObj = JSONUtil.toJsonStr(hashMap);

        HttpEntity<String> httpEntity = new HttpEntity(jsonObj, headers);
        //请求体
        RequestEntity<String> requestEntity = RequestEntity
                .put(url)
                .headers(headers)
                .contentType(MediaType.APPLICATION_JSON)
                .body(JSONUtil.toJsonStr(hashMap)); //也可以是DTO
        try {
            restTemplate.put(url, httpEntity);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("更新字段错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254103")) {
                resDto.setMsg("记录数量超限, 限制20,000条");
            } else if (e.getMessage().contains("1254004")) {
                resDto.setMsg("table_id 错误");
            }
            return resDto;
        }
    }


    /**
     * 删除字段
     *
     * @param param
     * @return
     */
    @Override
    public FeishuCommonResponseDto deleteBitTableForFields(UpdateFieldsParam param) {
        FeishuCommonResponseDto resDto = new FeishuCommonResponseDto();
        HttpEntity<FeishuCommonResponseDto> response = null;
        //路径
        String url = bitableBaseUrl + param.getAppToken() + "/tables/" + param.getTableId() + "/fields" + param.getFieldId();
        //获取token
        String token = getCommonToken(param.getAppId(), param.getAppSecret());
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(token);

        try {
            // 使用exchange发送DELETE请求
            response = restTemplate.exchange(url, HttpMethod.DELETE, null, FeishuCommonResponseDto.class);
            if (ToolUtil.isNotEmpty(response)) {
                resDto = response.getBody();
            }
            return resDto;
        } catch (Exception e) {
            log.info("删除字段错误信息" + e.getMessage());
            resDto.setCode(400);

            //可以建枚举优化
            if (e.getMessage().contains("1254000") || e.getMessage().contains("1254001")) {
                resDto.setMsg("请求体错误");
            } else if (e.getMessage().contains("1254007")) {
                resDto.setMsg("空值");
            } else if (e.getMessage().contains("1254045")) {
                resDto.setMsg("字段名字不存在");
            } else if (e.getMessage().contains("1254103")) {
                resDto.setMsg("记录数量超限, 限制20,000条");
            } else if (e.getMessage().contains("1254004")) {
                resDto.setMsg("table_id 错误");
            }
            return resDto;
        }
    }


    public String getCommonToken(String appid, String appSecret) {

        String token = null;

        if (ObjectUtil.isNotEmpty(appid) && ObjectUtil.isNotEmpty(appSecret)) {
            token = feishuCommonService.getAppAccessToken(appid, appSecret);
        } else {
            token = feishuCommonService.getAppAccessToken(robotAppId, robotAppSecret);
        }

        return token;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值