针对当前“高级任务计划”中表单输入项功能不足的解决方案
评论
收藏

针对当前“高级任务计划”中表单输入项功能不足的解决方案

经验分享
雨杭
2024-09-29 11:44·浏览量:899
雨杭
发布于 2024-09-29 11:44899浏览

一、引言

在客户使用高级任务计划过程中,针对“表单输入项”遇到了一些问题,主要可以归纳为以下几点:

  1. 参数无法设置为“可选项”,必须为必填字段,且可以选择的输入类型太少。
  2. 下拉框功能存在局限,只支持单一选择,且不支持“部分输入式选项”的交互模式,难以满足类似于“商品选择”等场景的需求。

由于以上两个问题,极大地限制了客户在多种场景下对高级任务计划的有效使用。

二、解决思路

针对问题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

实现效果:

2.1 实现方式

1. 用户输入表单创建

  • 使用 tkinter 创建一个图形化界面,其中包含订单编号输入框,以及商品名称和商品数量的输入对。
  • AutocompleteCombobox 类提供商品名称的自动补全功能,通过模糊匹配实现用户输入的智能建议。
  • 通过循环动态生成多个商品名称和数量的输入对(在代码中假设为5对)。

2. 输入验证

  • 在用户点击“确定”提交按钮后,首先对表单数据进行验证,确保数据的合法性:
  • 如果有任何一项不满足条件,弹出错误提示,并阻止提交。

3. 数据整理与 JSON 转换

  • 当所有验证通过后,获取表单中的所有输入数据,并将其组织为一个 Python 字典,包含订单编号以及商品名称和数量的列表。
  • 使用 json.dumps() 方法将该字典转换为 JSON 格式字符串,并存储在全局变量 loop_json 中。

4. 二次确认弹窗

  • 表单数据通过验证后,显示一个二次确认弹窗,展示 JSON 格式的输入数据,供用户进行最终确认。
  • 在二次确认弹窗中提供三个按钮:

5. 最终数据的存储

  • 提交表单后,所有的输入数据会保存在 loop_json 变量中,便于后续的使用或保存到文件、发送到服务器等操作。

2.2 输入项修改方式

将上面的示例代码扔进ChatGPT,并按自己的需求让gpt更改


三、场景探索(欢迎补充这种”需要更丰富输入项设计“的高级任务计划场景)

1. 客服补发场景

场景描述:客服从客户那里收集到补发需求后,需要手动将数据填写至”在线补发表“;另有一个RPA机器人,每20分钟从表中读取一次新添数据,这是就会出现一个问题:当客服填写数据时,恰巧机器人开始执行,会导致获取到残缺的数据。

解决思路:利用高级任务计划的”钉钉表单“触发方式 + 代码实现的功能更完善的输入项设置,实现更快捷、有序的补发数据填写,实现输入数据后全流程的自动化。

收藏
全部评论1
最新
发布评论
评论