调用飞书接口导入供应商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.rhkb.cn/news/437331.html

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

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-30目录1. Proof Automation with Large Language Models概览&#xff1a;论文研究背景&#xff1a;技术挑战&#xff1a;如何破局…

成都睿明智科技有限公司赋能商家高效变现

在这个日新月异的数字时代&#xff0c;抖音电商正以不可阻挡之势崛起&#xff0c;成为众多品牌与商家竞相角逐的新战场。在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司如同一颗璀璨新星&#xff0c;凭借其专业的服务、创新的策略和敏锐的市场洞察&#xff0…

关联式容器:map和set

引言&#xff1a; 在计算机科学中&#xff0c;我们经常需要处理一系列具有关键字的元素&#xff0c;并希望对这些元素进行高效的查找、插入和删除操作。为了满足这些需求&#xff0c;我们可以使用BSTree来实现。BSTree作为一种基础的数据结构&#xff0c;它不仅能够帮助我们快…

基于 C# 的文本文件的编码识别

基于 C# 的文本文件的编码识别 前言一、有 BOM 文件头二、无 BOM 文件头三、简体中文汉字编码四、C# 程序对编码的识别1、文件选择按钮代码&#xff1a;2、获取文件编码&#xff0c;有 BOM 的文件识别3、获取文件编码&#xff0c;UTF8 无 BOM 文件的识别4、获取文件编码&#x…

【在Linux世界中追寻伟大的One Piece】System V共享内存

目录 1 -> System V共享内存 1.1 -> 共享内存数据结构 1.2 -> 共享内存函数 1.2.1 -> shmget函数 1.2.2 -> shmot函数 1.2.3 -> shmdt函数 1.2.4 -> shmctl函数 1.3 -> 实例代码 2 -> System V消息队列 3 -> System V信号量 1 -> Sy…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代&#xff0c;抖音作为短视频直播的超级流量池&#xff0c;正深刻改变着人们的购物习惯。无数商家蜂拥而至&#xff0c;渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务&#xff0c;成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

掌控物体运动艺术:图扑 Easing 函数实践应用

现如今&#xff0c;前端开发除了构建功能性的网站和应用程序外&#xff0c;还需要创建具有吸引力且尤为流畅交互的用户界面&#xff0c;其中动画技术在其中发挥着至关重要的作用。在数字孪生领域&#xff0c;动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象…

OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;YOLOv11来了&#xff1a;将重新定义AI的可能性 Ultralytics YOLOv11的问世标志着人工智能领域&#xff0c;尤其是计算机视觉领域的一个突破性时…

quiz: python网络爬虫之规则1

下面答错了&#xff1a; B c 8A&#xff0c; 9A

大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Golang | Leetcode Golang题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; func getSteps(cur, n int) (steps int) {first, last : cur, curfor first < n {steps min(last, n) - first 1first * 10last last*10 9}return }func findKthNumber(n, k int) int {cur : 1k--for k > 0 {steps : getSteps(cu…

MongoDB微服务部署

一、安装MongoDB 1.在linux中拉去MongoDB镜像文件 docker pull mongo:4.4.18 2. 2.创建数据挂载目录 linux命令创建 命令创建目录: mkdir -p /usr/local/docker/mongodb/data 可以在sshclient工具查看是否创建成功。 进入moogodb目录&#xff0c;给data赋予权限777 cd …

交通场景多目标检测系统源码分享

交通场景多目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

【机器学习】13-决策树2——决策树生成、剪枝

机器学习13-决策树2——决策树生成、剪枝 数据集划分为子集&#xff0c;构建出一棵树状结构。 文章目录 机器学习13-决策树2——决策树生成、剪枝前言1. 信息增益&#xff08;ID3算法&#xff09;&#xff08;Iterative Dichotomiser 3&#xff09;&#xff1a;选择信息增益最…

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中&#xff0c;我们制作了AB分区系统镜像&#xff0c;并成功通过uboot加载kernel以及d…

详解Java中的Collection单列集合(从底层到用法超详细解析和细节分析)

⭕在 Java 中&#xff0c;集合框架是开发过程中最常用的数据结构之一&#xff0c;其中 Collection 接口是整个集合框架的基础。Collection 是处理单列数据的接口&#xff0c;它定义了一些通用的操作&#xff0c;允许对一组对象进行操作。今天我们将深入介绍 Java 中的单列集合 …

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索&#xff1a;docker search 比如&#xff1a;docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像&#xff0c;如果有就是官方镜像&#xff0c;如果没有就是第三方的。 下载&#xff1a;docker pull 比如&#xff1a…

【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

序言&#xff1a; 本文详细讲解了关于我们在程序设计中所用到的class类的各种参数及语法。 笔者也是跟着B站黑马的课程一步步学习&#xff0c;学习的过程中添加部分自己的想法整理为笔记分享出来&#xff0c;如有代码错误或笔误&#xff0c;欢迎指正。 B站黑马的课程链接&am…

Windows开发工具使用技巧

在 Windows 上进行开发时&#xff0c;有许多工具和技巧可以提升开发效率和用户体验。以下是一些常用的开发工具和技巧&#xff1a; 常用开发工具 1. Visual Studio Code (VS Code) - 插件管理&#xff1a;利用扩展市场&#xff08;Extension Marketplace&#xff09;安装各种…

centos磁盘逻辑卷LVM创建

centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷&#xff08;PV&#xff09; 3.创…