二开案例.让单据体文本字段转成二维码--转载原创
金蝶云社区-爱孤独又爱你
爱孤独又爱你
4人赞赏了该文章 341次浏览 未经作者许可,禁止转载编辑于2023年10月24日 08:27:29

【应用场景】

二维码是控件,不是字段,无法将它加入到单据体中,如果单据体中有某个字段的值要转成二维码,目前可通过插件的方式,实时转换并显示。


【案例演示】

采购订单,单据体有一个二维码文本字段,将其值转成二维码图片并显示。

本案例演示了两种方式显示二维码图片:

<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() + ".png";

            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);

        }

    }

}

图标赞 4
4人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!