一、引言
在客户使用高级任务计划过程中,针对“表单输入项”遇到了一些问题,主要可以归纳为以下几点:
由于以上两个问题,极大地限制了客户在多种场景下对高级任务计划的有效使用。
二、解决思路
针对问题1,可以在维持原本“表单触发方式”的情况下,在下方增加一步“运行RPA应用”,用RPA的“自定义对话框”来代替钉钉表单的输入项


针对问题2,会稍微复杂一些,因为目前影刀RPA没有这种封装好的模块,需要自己用Python的tkinter设计一个,参考代码如下:
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import json # 导入 json 模块
# 创建 AutocompleteCombobox 类
class AutocompleteCombobox(ttk.Combobox):
def set_completion_list(self, completion_list):
"""设置下拉框的可选项"""
self._completion_list = sorted(completion_list) # 排序
self._hits = []
self._hit_index = 0
self.position = 0
self.configure(values=self._completion_list)
self.bind('<KeyRelease>', self.handle_keyrelease) # 监听键盘事件
def autocomplete(self):
"""根据输入自动筛选选项"""
input_text = self.get().lower() # 忽略大小写
if input_text == '':
self._hits = self._completion_list
else:
# 改为模糊匹配,输入的内容可以出现在任意位置
self._hits = [item for item in self._completion_list if input_text in item.lower()]
if self._hits:
self._hit_index = 0
self.configure(values=self._hits)
def handle_keyrelease(self, event):
"""处理键盘输入"""
if event.keysym in ('BackSpace', 'Left', 'Right', 'Up', 'Down'):
return
self.autocomplete()
# 创建主窗口
root = tk.Tk()
root.title("订单表单")
# 用于保存商品名称的列表
product_list = 相机型号列表 = [
"佳能 EOS R5",
"尼康 D850",
"索尼 A7 III",
......
]
# 表单项列表,存储每个控件对
form_entries = {}
# 表单生成函数
def create_form(root, num_items):
# 创建订单编号输入框
tk.Label(root, text="订单编号:").grid(row=0, column=0, padx=10, pady=10)
order_number_entry = tk.Entry(root)
order_number_entry.grid(row=0, column=1, padx=10, pady=10)
# 将订单编号控件存入字典
form_entries['order_number'] = order_number_entry
# 循环创建商品名称和数量输入框
for i in range(1, num_items + 1):
# 商品名称
tk.Label(root, text=f"商品名称{i}:").grid(row=i, column=0, padx=10, pady=5)
product_combobox = AutocompleteCombobox(root)
product_combobox.set_completion_list(product_list)
product_combobox.grid(row=i, column=1, padx=10, pady=5)
# 商品数量
tk.Label(root, text=f"商品{i}数量:").grid(row=i, column=2, padx=10, pady=5)
quantity_entry = tk.Entry(root)
quantity_entry.grid(row=i, column=3, padx=10, pady=5)
# 将控件对存入字典
form_entries[f'product_{i}'] = (product_combobox, quantity_entry)
# 获取表单数据并将其保存为 JSON
def get_form_data():
order_number = form_entries['order_number'].get() # 获取订单编号
data = {
"order_number": order_number,
"products": []
}
# 遍历所有商品的名称和数量
for i in range(1, 6): # 这里假设有5对商品
product_combobox, quantity_entry = form_entries[f'product_{i}']
product_name = product_combobox.get()
quantity = quantity_entry.get()
if product_name or quantity: # 只保存非空的商品
data["products"].append({
"product_name": product_name,
"quantity": quantity
})
# 将数据保存为 JSON 字符串
global loop_json
loop_json = json.dumps(data, ensure_ascii=False, indent=4)
return loop_json
# 验证表单数据
def validate_form():
# 验证订单编号是否为大于10位的数字
order_number = form_entries['order_number'].get()
if not (order_number.isdigit() and len(order_number) > 10):
messagebox.showerror("输入错误", "订单编号必须为大于10位的数字")
return False
# 验证商品名称和数量
for i in range(1, 6):
product_combobox, quantity_entry = form_entries[f'product_{i}']
product_name = product_combobox.get()
quantity = quantity_entry.get()
# 商品名称和数量均为空时,跳过验证
if product_name == '' and quantity == '':
continue
# 如果商品名称非空,检查它是否在列表中
if product_name and product_name not in product_list:
messagebox.showerror("输入错误", f"商品名称{i}必须是列表中的项")
return False
# 如果商品数量非空,检查它是否为正整数
if quantity:
if not (quantity.isdigit() and int(quantity) > 0):
messagebox.showerror("输入错误", f"商品{i}数量必须为正整数")
return False
return True
# 自定义弹窗
def show_custom_dialog(form_data):
dialog = tk.Toplevel(root) # 创建顶级窗口
dialog.title("提交结果")
# 显示提交的表单数据
tk.Label(dialog, text=form_data, justify='left').grid(row=0, column=0, columnspan=3, padx=10, pady=10)
# "确认"按钮,关闭窗口并提交
confirm_button = tk.Button(dialog, text="确认", command=lambda: [dialog.destroy(), root.destroy()])
confirm_button.grid(row=1, column=0, padx=10, pady=10)
# "重写"按钮,清空表单
def rewrite():
for key in form_entries:
if isinstance(form_entries[key], tuple): # 如果是商品的名称和数量
form_entries[key][0].set('') # 清空商品名称
form_entries[key][1].delete(0, tk.END) # 清空数量输入框
else:
form_entries[key].delete(0, tk.END) # 清空订单编号
dialog.destroy()
rewrite_button = tk.Button(dialog, text="重写", command=rewrite)
rewrite_button.grid(row=1, column=1, padx=10, pady=10)
# "取消"按钮,关闭窗口但不提交
cancel_button = tk.Button(dialog, text="取消", command=lambda: dialog.destroy())
cancel_button.grid(row=1, column=2, padx=10, pady=10)
# 提交按钮事件
def submit():
if validate_form(): # 只有验证通过后才显示确认弹窗
form_data = get_form_data() # 获取JSON格式的数据
show_custom_dialog(form_data)
# 创建表单,指定商品数量为5
create_form(root, 5)
# 创建提交按钮
submit_button = tk.Button(root, text="确定", command=submit)
submit_button.grid(row=6, column=0, columnspan=4, pady=20)
# 启动主窗口的事件循环
root.mainloop()
def main(args):
return loop_json




tkinter 创建一个图形化界面,其中包含订单编号输入框,以及商品名称和商品数量的输入对。AutocompleteCombobox 类提供商品名称的自动补全功能,通过模糊匹配实现用户输入的智能建议。json.dumps() 方法将该字典转换为 JSON 格式字符串,并存储在全局变量 loop_json 中。loop_json 变量中,便于后续的使用或保存到文件、发送到服务器等操作。2.2 输入项修改方式
将上面的示例代码扔进ChatGPT,并按自己的需求让gpt更改
三、场景探索(欢迎补充这种”需要更丰富输入项设计“的高级任务计划场景)
1. 客服补发场景
场景描述:客服从客户那里收集到补发需求后,需要手动将数据填写至”在线补发表“;另有一个RPA机器人,每20分钟从表中读取一次新添数据,这是就会出现一个问题:当客服填写数据时,恰巧机器人开始执行,会导致获取到残缺的数据。
解决思路:利用高级任务计划的”钉钉表单“触发方式 + 代码实现的功能更完善的输入项设置,实现更快捷、有序的补发数据填写,实现输入数据后全流程的自动化。