调用飞书接口导入供应商bug

1、业务背景

财务这边大部分系统都是供应商项目,由于供应商的研发人员没有飞书项目的权限,涉及到供应商系统需求 财务这边都是通过多维表格进行bug的生命周期管理如图:

但多维表格没有跟飞书项目直接关联,测试组做bug统计的时候无法计入供应商bug,对测试人员的bug数量造成一些影响。

解决方案:

读取表格数据,调用飞书项目接口,将bug导入到对应飞书项目需求里

2、结果展示
1、点击桌面“供应商bug导入”应用图标

2、输入文件路径和飞书项目ID

3、结果展示

导入结果:

原始数据:

备注:代码逻辑里对bug优先级做了映射,高级-- C类、中级-- B类、低级和建议-- C类

3、实现方式

官方文档: 飞书项目开发者手册

1、创建插件

插件入口

点击个人头像,从「开发者后台」进入插件开发者后台;

创建完成后,对插件进行数据权限管理和发布

插件凭证

插件凭证是插件开发阶段、运行阶段用于身份鉴权的唯一凭证。

2、名词解释

中文名词

API名词

描述

空间域名

simple_name

字段ID

field_key

工作项实例

instance

工作项实例是一个具体的事例,例如,一个已经创建的需求、缺陷、项目等

3、接口调用

通过基础名词解释可得,我们创建bug就是新增一个工作实例,找到官方文档中的创建工作项的接口信息

1、创建工作项接口

请求方式

POST

请求地址

/open_api/:project_key/work_item/create

请求header

详见 请求header

请求参数

参数类型

参数名

是否必填

值类型

说明

路径参数

project_key

string

空间id(project_key),或者空间域名(simple_name)

请求体参数

work_item_type_key

string

工作项类型,自定义工作项可通过获取空间下工作项类型获取

name

string

工作项名称

field_value_pairs

list<FieldValuePair>

FieldValuePair

创建工作项的具体字段可以从获取创建工作项元数据 接口中获取,字段格式可查看字段与属性解析格式

template_id

int64

模板ID,可以从以下途径获取:

  1. 获取创建工作项元数据接口中的template字段的options中获取,选择对应的value

  2. 获取工作项下的流程模板列表接口的template_id

  3. 获取字段信息接口中的template字段的options中获取,选择对应的value

请求体格式

​
{ "work_item_type_key": "story",//工作项类型 "template_id": 123123,//流程模板id "name":"2333",//工作项名称 "field_value_pairs": [ { "field_key": "description",//字段key,作为请求参数和field_alias二选一必填,选择范围为工作项元数据中获取的字段全集 "field_value": "2333"//字段值,作为请求参数必填;value填写规则取决于字段类型,不同类型的规则可见字段与属性解析格式  } ] }​

返回格式

{ "data": 19781, // 工作项id "err": {}, "err_msg": "", "err_code": 0 }

根据接口文档描述,我们需要获得 请求header 信息。需要查看header文档

通过请求header文档,得知我们需要获取访问凭证

1、获取访问凭证接口

调用 获取插件访问凭证 接口,通过插件凭证 Plugin IDPlugin Secret获取 plugin_access_token (或者virtual_plugin_access_token

请求方式

POST

请求地址

https://{平台域名}/open_api/authen/plugin_token

请求头参数

参数名

类型

必填

说明

Content-Type

string

固定值:“application/json”

请求体参数

参数名

类型

必填

说明

plugin_id

string

插件唯一标识,Plugin ID

plugin_secret

string

插件密钥,Plugin Secret

type

int

插件访问凭证类型,可选值:0、1。默认为plugin_access_token,值为1时将返回virtual_plugin_access_token

cURL示例

curl --location 'https://{平台域名}/open_api/authen/plugin_token' \ --header 'Content-Type: application/json' \ --data '{ "plugin_id": "MII_63E9D49B8C820014", "plugin_secret": "D01B5F1A191C8620D133CDC371C0C7CB", "type": 0 }'

响应体参数

{ "data": { "expire_time": 7200, // token失效时间 "token": "p-49257489-f7d7-4cd6-b34f-98c6b81db375" // 插件访问凭证 plugin_access_token } }

"plugin_id" 和 "plugin_secret" 我们创建插件时已经获得,由接口文档,可以轻松获取到请求header的凭证信息

2、工作项类型获取

根据创建工作项的接口文档 work_item_type_key 需要通过 获取空间下工作项类型 接口获取

为了方便获取到我们需要的参数,只需要用postman获取即可

即: "work_item_type_key": "issue"

3、获取 template_id

同理我们可以调用获取字段信息接口,拿到缺陷的 template_id

即: "template_id": 34673,

4、其余自定义字段获取

可以通过获取工作项详情查询

最终的请求数据

{ "work_item_type_key": "issue", "name": data[i][0], "template_id": 34673, "field_value_pairs": [ { "field_alias": "bug_priority", "field_value": {"label": priority_map.get(data[i][6], {"label": "B类", "value": "53cnaxoz_"}).get("label"), "value": priority_map.get(data[i][6], {"label": "B类", "value": "53cnaxoz_"}).get("value") }, }, {"field_alias": "_field_linked_story", "field_value": linked_story}, {"field_alias": "owner", "field_value": reporter_map.get(data[i][1], "7230980664668045340")}, {"field_alias": "issue_reporter", "field_value": reporter_map.get(data[i][1], "7230980664668045340")}, {"field_alias": "issue_operator", "field_value": ["7413123527076806659"]}, {"field_alias": "description", "field_value": data[i][0]}, ] }

2、状态流转接口

状态流转接口新

请求方式

POST

请求地址

/open_api/:project_key/workflow/:work_item_type_key/:work_item_id/node/state_change

请求header

详见 请求header

请求参数

参数类型

参数名

是否必填

值类型

说明

路径参数

work_item_id

int64

工作项ID

work_item_type_key

string

工作项类型可以,从获取空间下工作项类型接口获取

project_key

string

空间id(project_key),或者空间域名(simple_name)

请求体参数

transition_id

int64

流转到下一状态的id,从获取工作流详情接口查询状态流获取

role_owners

list<RoleOwner>

RoleOwner

角色及负责人

fields

list<FieldValuePair>

FieldValuePair

要更新的字段数组(只能更新状态表单)

请求体格式

{ "transition_id":12345//状态id,仅状态流返回 "fields":[ { "field_alias": "sentry_link",//字段对接标识 "field_key": "field_658c22",//字段key "field_type_key": "text",//字段类型 "field_value": "23333"//字段值 } ] }

根据接口文档,我们需要获取header、work_item_id、work_item_type_key、project_key、transition_id等信息

其中header、work_item_type_key、project_key可以参考 “创建工作项” 接口里的获取方式

1、work_item_id的取值

work_item_id 我们可以从创建工作项接口的返回值里取到

2、transition_id 获取

transition_id 可以通过调用 获取工作流详情 接口获取

从接口返回信息可得,bug状态 :

由 OPEN --> RESOLVED 的 transition_id 是 983309

由 RESOLVED --> CLOSED 的 transition_id 是 983314

状态流转的请求json信息

{ "transition_id": 983309, # 状态改成 RESOLVED "fields": [ {"field_alias": "bug_remark", "field_value": "供应商bug"}, {"field_alias": "bug_reason", "field_type_key": "select", "field_key": "field_21fcfb", "field_value": {"label": "自测不仔细产生bug", "value": "b39yvbscm"}} ] }

4、代码示例
import pandas as pd
import json
import requests
from tkinter_test import imp_confirmdef get_plugin_token():"""获取插件的 token并返回:return: 插件的token信息"""url = 'https://project.feishu.cn/open_api/authen/plugin_token'payload = json.dumps({"plugin_id": plugin_id,"plugin_secret": plugin_secret,"type": 0})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload)return response.json()['data']['token']def add_bug_datas(linked_story, file_path):"""把bug导入到对应的飞书项目里:param linked_story:  飞书项目ID:param file_path: bug文件路径"""df = pd.read_excel(file_path)data = df.iloc[0:, :]data = data.to_numpy()url = "https://project.feishu.cn/open_api/hdltech/work_item/create"for i in range(len(data)):user_data = {"work_item_type_key": "issue","name": data[i][0],"template_id": 34673,"field_value_pairs": [{"field_alias": "bug_priority","field_value": {"label": priority_map.get(data[i][6], {"label": "B类", "value": "53cnaxoz_"}).get("label"),"value": priority_map.get(data[i][6], {"label": "B类", "value": "53cnaxoz_"}).get("value")},},{"field_alias": "_field_linked_story", "field_value": linked_story},{"field_alias": "owner", "field_value": reporter_map.get(data[i][1], "7230980664668045340")},{"field_alias": "issue_reporter", "field_value": reporter_map.get(data[i][1], "7230980664668045340")},{"field_alias": "issue_operator","field_value": ["7413123527076806659"]},{"field_alias": "description", "field_value": data[i][0]},]}data_to_send = json.dumps(user_data).encode("utf-8")header = {"content-type": "application/json","X-User-Key": user_key,"X-PLUGIN-TOKEN": get_plugin_token()}r = requests.post(url, data=data_to_send, headers=header)data_list.append(r.json()["data"])print(r.json())def close_bug():"""更改bug状态"""headers = {"Content-Type": "application/json","X-PLUGIN-TOKEN": get_plugin_token(),"X-USER-KEY": user_key,}for bug_id in data_list:bug_id = bug_idurl = f"https://project.feishu.cn/open_api/hdltech/workflow/issue/{bug_id}/node/state_change"data = {"transition_id": 983309,  # 状态改成 RESOLVED"fields": [{"field_alias": "bug_remark", "field_value": "供应商bug"},{"field_alias": "bug_reason","field_type_key": "select","field_key": "field_21fcfb","field_value": {"label": "自测不仔细产生bug", "value": "b39yvbscm"}}]}requests.post(url, json=data, headers=headers).json()data = {"transition_id": 983314,  # 状态改成close"fields": [{"field_alias": "bug_remark", "field_value": "供应商bug"},]}result = requests.post(url, json=data, headers=headers).json()print(result)file_path, linked_story = imp_confirm()
add_bug_datas(linked_story, file_path)
close_bug()
#print(file_path, linked_story)
4、弹窗信息的实现

Python GUI编程(Tkinter) :https://docs.python.org/zh-cn/3/library/tk.html

Tkinter文档

import tkinter as tkroot = tk.Tk()
root.geometry('400x230+500+260')
root.title('导入bug操作')
page = tk.Frame(root)
page.pack()file_path = tk.StringVar()
story_id = tk.StringVar()tk.Label(page).grid(row=0, column=0)
tk.Label(page, text='请输入文件路径').grid(row=1, column=1)
tk.Entry(page, textvariable=file_path).grid(row=1, column=2, pady=10)
tk.Label(page, text='请输入项目ID').grid(row=2, column=1, pady=10)
tk.Entry(page, textvariable=story_id).grid(row=2, column=2, pady=10)def imp_confirm():filepath = file_path.get().replace(" ", "")storyid = story_id.get().replace(" ", "")if len(filepath) == 0:messagebox.showwarning("警告", "文件路径不能为空")elif len(storyid) == 0:messagebox.showwarning("警告", "项目ID不能为空")elif not storyid.isdigit():messagebox.showwarning('警告', '项目ID为整数请确认后输入')else:page.quit()#messagebox.showinfo("提示", "开始导入请稍后")return filepath, int(storyid)tk.Button(page, text='确认', command=imp_confirm).grid(row=3, column=1, pady=10)
tk.Button(page, text='取消', command=page.quit).grid(row=3, column=2)root.mainloop()
5、打包操作

使用 Pyinstaller 进行打包

pyinsatll中文文档

pyinstaller -w -i im.icns -n 供应商bug导入 opexcel.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis Redis-Cluster常用命令与Redis性能监控

起因&#xff1a;随着项目的进一步推广&#xff0c;数据量的增大&#xff0c;直接访问mysql数据库获取数据所使用的时间越来越长&#xff0c;为解决当前主要矛盾&#xff0c;决定引入redis非关系型数据库作为缓存层&#xff0c;使得数据并不能直接命中数据库&#xff0c;减少访…

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序&#xff0c;致敬全 A 的答案&#xff0c;和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数&#xff0c;就想到了二分。然后写一个判…

【C++】list详解及模拟实现

目录 1. list介绍 2. list使用 2.1 修改相关 2.2 遍历 2.3 构造 2.4 迭代器 2.5 容量相关 2.6 元素访问 2.7 操作相关 3. 模拟实现 3.1 节点类 3.1.1 初始结构 3.1.2 节点的构造函数 3.2 迭代器类 3.2.1 初始结构 3.2.2 迭代器 3.2.3 迭代器-- 3.2.4 解引…

path_provider插件的用法

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…

什么是远程过程调用(RPC)

进程间通信(IPC) 进程间通信(Inter-Process Communication)是指两个进程或者线程之间传送数据或者信号的一些技术或者方法。进程是计算机进行资源分配的最小的单位。每个进程都有自己独立的系统资源,而且彼此之间是相对隔离的。为了使得不同的进程之间能够互相访问,相互协…

AI-Talk开发板之wifi scan

一、说明 AI-Talk开发板使用ESP32-C3扩展WIFI通信功能&#xff0c;与CSK6011A通过SPI接口通信。 与处理器的信号连接&#xff1a; ESP32-C3需要烧录hosted固件&#xff0c;参考&#xff1a;AI-Talk开发板更新ESP32固件_esp32 固件-CSDN博客 二、工程 1、创建项目 进入exampl…

C语言中的一些小知识(三)

一、你了解printf()吗&#xff1f; 你知道下面代码的输出结果吗&#xff1f; int a123; printf("%2d \n",a); printf() 函数是 C 语言中用于格式化输出的标准函数&#xff0c;它允许你将数据以特定的格式输出到标准输出设备&#xff08;通常是屏幕&#xff09;。p…

Linux应用开发实验班——JSON-RPC

目录 前言 1.是什么JSON-RPC 2.常用的JSON函数 1.创建JSON 2.根据名字获取JSON 3.获取JSON的值 4.删除JSON 3.如何进行远程调用 服务器 客户端 4.基于JSON-RPC进行硬件操作 课程链接 前言 学习的课程是百问网韦东山老师的课程&#xff0c;对更详细步骤感兴趣的同学…

89个H5小游戏源码

下载地址&#xff1a;https://download.csdn.net/download/w2sft/89791650 亲测可用&#xff0c;代码完整&#xff0c;都是htmljs&#xff0c;保存到本地即可。 游戏截图&#xff1a;

3519嵌入式如何通过ssh 或者telnet连接嵌入式设备

需求 PC电脑连接嵌入式设备&#xff0c;已经能够连接串口&#xff0c;想要额外连接嵌入式设备&#xff0c;查看终端信息。 尝试了两种方法&#xff1a;1.通过SSH登录(失败) 2.通过telnet登录(成功) 问题描述 1.SSH登录 3519通过网线和串口线连接PC windows&#xff0c;并在…

JVM(HotSpot):虚拟机栈(JVM Stacks)之线程问题排查方法

文章目录 前言一、CPU占用过大二、程序运行很长时间没有结果三、总结 前言 本篇讲的排查都是基于Linux环境的。 一、CPU占用过大 这个一般是出现了死循环导致的。 1、先用top命令查看占用CPU的进程ID top2、再用ps命令查看对应的线程 就看一查看到对应的线程id ps H -eo …

hexo github部署,通过域名访问你的博客

hexo github部署&#xff0c;通过域名访问你的博客 hexo 常用命令hexo github 部署 在部署之前&#xff0c;了解一下hexo的常用命令 hexo 常用命令 hexo new "My New Post" # 新建文章 hexo n "My New Post"hexo generate # 生成静态文件 hexo ghexo serv…

2024必备中英互译利器全知道

现在英语目前还是学习最广泛的第二语言&#xff0c;所以很多资料都有英文的版本。如果外语不好&#xff0c;那中英互译翻译工具就能帮我们解决这个问题。今天我们一起来探讨下有哪些好用的翻译工具。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这个工具…

无人机的避障的航迹规划详解!!!

一、无人机避障技术 视觉避障系统&#xff1a;通过安装在无人机上的摄像头捕捉周围环境的图像&#xff0c;利用计算机视觉技术对图像进行处理和分析&#xff0c;提取出障碍物的信息。这种方法直观、信息丰富&#xff0c;但在光线不足或变化多的情况下可能影响识别效果&#xf…

解决启动docker desktop报The network name cannot be found的问题

现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…

【网络通信基础与实践番外一】多图预警之图解UDP和TCP前置知识

参考大佬的文章https://www.cnblogs.com/cxuanBlog/p/14059379.html 一、宏观架构中的传输层 在计算机中&#xff0c;任何一个可以交换信息的介质都可以称为端系统。计算机网络的运输层则负责把报文从一端运输到另一端&#xff0c;运输层实现了让两个互不相关的主机进行了逻辑…

【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作(超详解)

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解多线程的知识哟~~~&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;【后端开发】JavaEE初阶—线程的理解和编程实现-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondl…

Android OpenGLES2.0开发(三):绘制一个三角形

我们总是对陌生人太客气&#xff0c;而对亲密的人太苛刻 上一篇文章中&#xff0c;我们已经将OpenGL ES环境搭建完成。接下来我们就可以开始我们的绘图之旅了。该篇我们讲解最基本图形三角形的绘制&#xff0c;这是一切绘制的基础。在OpenGL ES的世界里一切图形都可以由三角形拼…

OrangePi 烧录镜像步骤

理解&#xff1a;第一步&#xff1a;烧录镜像。第二步&#xff1a;建立编译环境&#xff08;一般是PC端的Linux虚拟机&#xff09;和板卡端的文件连接。因为要传文件&#xff0c;一般用挂载的方法。第三步&#xff1a;软件程序的编译与部署。 第一步&#xff1a;烧录镜像步骤 …

数据分析:Python语言网络图绘制

文章目录 介绍加载R包类别导入数据下载数据画图介绍 网络图是一种图形表示法,用于展示实体之间的关系。在不同的领域中,网络图有着不同的含义和用途:在生物学中,网络图可以用来表示生物分子之间的相互作用,如蛋白质相互作用网络。 加载R包 import pandas as pd import …