二开案例.表单插件.单据体文本字段转成二维码
【应用场景】
二维码是控件,不是字段,无法将其加入到单据体中,如果单据体中有某个字段的值要转成二维码,目前可通过插件的方式,实时转换并显示。
【案例演示】
采购订单,单据体有一个二维码文本字段,将其值转成二维码图片并显示。
本案例演示了两种方式显示二维码图片:
<1>修改元数据的DataBound。
<2>通过控件编程模型更新属性SourceUrl。
【实现步骤】
<1>编写表单插件,代码如下。
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.Util;
using System;
using System.ComponentModel;
using System.Text;
using ThoughtWorks.QRCode.Codec;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【表单插件】单据体文本字段转成二维码
/// </summary>
[Description("【表单插件】单据体文本字段转成二维码"), HotUpdate]
public class ConvertTextToQrCodeFormPlugIn : AbstractDynamicFormPlugIn
{
/// <summary>
/// 切换分录数据行时,自动生成二维码
/// </summary>
/// <param name="e"></param>
public override void EntityRowClick(EntityRowClickEventArgs e)
{
base.EntityRowClick(e);
if (!e.Key.EqualsIgnoreCase("FPOOrderEntry"))
{
return;
}
if (e.Row < 0)
{
return;
}
var text = (string)this.View.Model.GetValue("F_Jac_Text", e.Row);
var qrText = "[Customer]" + text;
SetQrCode("F_Jac_Barcode", qrText);
this.View.ShowMessage(string.Format("已将当前分录行的二维码文本{0}生成为二维码图片,可用手机扫描查验。", text));
}
public override void BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
if (e.BarItemKey.EqualsIgnoreCase("SetQrCode"))
{
var billNo = (string)this.View.Model.GetValue("FBillNo");
var qrCodeImageUrl = GetQrCode(billNo);
// 通过控件编程模型更新二维码
this.View.GetControl("F_Jac_Barcode").SetCustomPropertyValue("SourceUrl", qrCodeImageUrl);
this.View.ShowMessage(string.Format("已将单据编号{0}生成为二维码图片,可用手机扫描查验。", billNo));
}
}
/// <summary>
/// 通过修改元数据的方式更新二维码
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
private void SetQrCode(string key, string value)
{
var qrCode = (BarcodeAppearance)this.View.LayoutInfo.GetControlAppearance(key);
qrCode.DataBound = value;
this.View.UpdateView(key);
}
/// <summary>
/// 生成二维码并返回该二维码图片在应用服务器上的访问路径
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string GetQrCode(string data)
{
var imgFileName = GuidTo16String() + ".webp";
var encoder = new QRCodeEncoder();
encoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方法(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
encoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)
var bp = encoder.Encode(data, Encoding.GetEncoding("UTF-8"));
var imgFilePath = AppDomain.CurrentDomain.BaseDirectory + "TempfilePath/" + imgFileName;
bp.Save(imgFilePath);
return "./TempfilePath/" + imgFileName;
}
/// <summary>
/// Guid转字符串,用于生成随机的图片文件名
/// </summary>
/// <returns></returns>
public static string GuidTo16String()
{
long i = 1;
foreach (byte b in Guid.NewGuid().ToByteArray())
{
i *= (b + 1);
}
return string.Format("{0:x}", i - DateTime.Now.Ticks);
}
}
}
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>BOSIDE扩展采购订单,单据体新增文本字段,基本页签新增二维码控件,菜单集合新增菜单项,注册表单插件,保存元数据,开发完毕。
【功能验证】
<1>登录业务站点,打开采购订单编辑界面,切换分录数据行,可动态生成二维码。
点击菜单项SetQrCode,可动态生成二维码。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.表单插件.单据体文本字段转成二维码
本文2024-09-23 04:18:38发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164487.html