Kingdee K3Cloud二开 根据基础资料判断是否可以多次下推

       在基础资料上面增加复选框,复选框打钩就是允许多次下推,复选框不打勾,该基础资料在单据中,该项只能下推一次。

导包:

      

封装类

using System;

namespace SenGe.k3cloud.Util
{
    /// <summary>
    /// 类名:Upper
    /// 描述:工具类
    /// 作者:SenGe
    /// 创建时间:<2019-01-09>
    /// 最后修改人:无
    /// 最后修改时间:<YYYY-MM-DD>
    /// 版权所有:SenGe
    /// </summary>
    [Kingdee.BOS.Util.HotUpdate]
    public class Upper
    {
        /// <summary>
        /// 实现:在下推的时候,保存下推的数据,其中之保存分项工程名称不允许多次下推的数据,存储下来用来进行判断下游单据是否下推过
        /// </summary>
        /// <param name="e"></param>
        
        //上游单据组织
        private String f_pion_orgid;
        //下推单据的fid
        private String fid;
        //上游单据单据头编号
        private String fbillno;
        //单据体需要下推的单据FEntryID
        private System.Int64 fentryid;
        //是否可以多次下推
        private Boolean f_isitretractable;
        //分项工程名称的fid
        private String feachName;

        public Upper()
        {

        }
        public Upper(string f_pion_orgid, string fid, string fbillno, long fentryid, bool f_isitretractable, string feachName)
        {
            this.f_pion_orgid = f_pion_orgid;
            this.fid = fid;
            this.fbillno = fbillno;
            this.fentryid = fentryid;
            this.f_isitretractable = f_isitretractable;
            this.feachName = feachName;
        }
        public string F_pion_orgid
        {
            get
            {
                return f_pion_orgid;
            }

            set
            {
                f_pion_orgid = value;
            }
        }
        public string Fid
        {
            get
            {
                return fid;
            }

            set
            {
                fid = value;
            }
        }
        public string Fbillno
        {
            get
            {
                return fbillno;
            }

            set
            {
                fbillno = value;
            }
        }
        public long Fentryid
        {
            get
            {
                return fentryid;
            }

            set
            {
                fentryid = value;
            }
        }
        public bool F_isitretractable
        {
            get
            {
                return f_isitretractable;
            }

            set
            {
                f_isitretractable = value;
            }
        }
        public string FeachName
        {
            get
            {
                return feachName;
            }

            set
            {
                feachName = value;
            }
        }
    }
}

下推代码

using System;
using System.Collections.Generic;

using Kingdee.BOS.App.Data;
using Kingdee.BOS;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Resource;
using System.Data;

namespace SenGe.k3cloud.Util
{
    /// <summary>
    /// 类名:IsItRetractable
    /// 描述:工具类
    /// 作者:SenGe
    /// 创建时间:<2019-01-09>
    /// 最后修改人:无
    /// 最后修改时间:<YYYY-MM-DD>
    /// 版权所有:SenGe
    /// </summary>
    [Kingdee.BOS.Util.HotUpdate]
    public class IsItRetractable : AbstractConvertPlugIn
    {
        /// <summary>
        /// 实现:下推的时候运行下面两个方法,
        ///     第一个方法是记录下推的数据库名和要下推的数据的fid,在判断分项工程名是否允许多次下推
        ///     第二个方法时获取下推目标单据的数据库名和进行查询是否有当前要下推的单据是否下推过,判断分项工程是否下推过,如果只允许下推一次,下推过,这里禁止下推
        /// </summary>
        /// <param name="e"></param>

        // 上游单据-单据头-数据库表名
        private String upperBill;
        //上有单据-单据体-数据库表名
        private String upperBody;
        //上游单据-单据体需要下推的数据的FEntryID
        private List<System.Int64> lsUpperBodyFEntryID;
        //上游单据进行下推的所有数据集合
        private List<Upper> lsUpper;


        /// <summary>
        /// 实现:查询到上游单据的数据库名字
        ///     获取当前下推的数据FEntryID,进行数据库查询找到当前单据的FID,编号,进行保存到lsUpper集合里面
        /// </summary>
        /// <param name="e"></param>
        public override void OnInSelectedRow(InSelectedRowEventArgs e)
        {
            base.OnInSelectedRow(e);
            upperBill = e.SourceBusinessInfo.Entrys[0].TableName;
            upperBody = e.SourceBusinessInfo.Entrys[1].TableName;
            lsUpper = new List<Upper>();
            lsUpperBodyFEntryID = new List<System.Int64>();
            String FEntity_FEntryID = e.InSelectedRowsSQL;
            FEntity_FEntryID = FEntity_FEntryID.Remove(0, FEntity_FEntryID.IndexOf("(") + 1);
            while (true)
            {
                if (FEntity_FEntryID.ToLower().Contains(","))
                {
                    lsUpperBodyFEntryID.Add(Convert.ToInt64(FEntity_FEntryID.Substring(0, FEntity_FEntryID.IndexOf(","))));
                    FEntity_FEntryID = FEntity_FEntryID.Remove(0, FEntity_FEntryID.IndexOf(",") + 1);
                }
                else
                {
                    lsUpperBodyFEntryID.Add(Convert.ToInt64(FEntity_FEntryID.Substring(0, FEntity_FEntryID.IndexOf(")"))));
                    break;
                }
            }
            foreach (Int64 upperBodyFentryID in lsUpperBodyFEntryID)
            {
                String strSQL = "SELECT f_pion_orgid,fid,fbillno,fentryid,f_isitretractable,feachname FROM(" +
                                "SELECT t0.FID AS FID, t0.F_PION_ORGID AS F_PION_OrgId, t0.FBILLNO AS FBillNo FROM " + upperBill + " t0 ) e0 INNER JOIN(" +
                                "SELECT t1.FEntryID AS FEntryID, t0.FID AS FID3, t1.FEACHNAME AS FeachName FROM " + upperBill + " t0  LEFT JOIN  " + upperBody + " t1 ON(t0.FID = t1.FID)" +
                                ") e1 ON e0.FID = e1.FID3 INNER JOIN  ( SELECT t0.FID AS FID2, t0.F_ISITRETRACTABLE AS F_IsItRetractable FROM T_EachProjectData t0" +
                                ") e2 ON e1.FeachName = e2.FID2 WHERE(e1.FID3 = '" + upperBodyFentryID + "')";
                IDataReader dataReader = DBUtils.ExecuteReader(this.Context, strSQL);
                while (dataReader.Read())
                {
                    String f_pion_orgid = Convert.ToString(dataReader["f_pion_orgid"]);
                    String fid = Convert.ToString(dataReader["fid"]);
                    String fbillno = Convert.ToString(dataReader["fbillno"]);
                    Int64 fentryid = Convert.ToInt64(dataReader["fentryid"]);
                    Int64 f_isitretractable = Convert.ToInt64(dataReader["f_isitretractable"]);
                    String feachname = Convert.ToString(dataReader["feachname"]);
                    if (f_isitretractable == 1)
                    {
                        Upper upper = new Upper(f_pion_orgid, fid, fbillno, fentryid, true, feachname);
                        lsUpper.Add(upper);
                    }
                }
                dataReader.Close();
            }
        }

        /// <summary>
        /// 实现:该方法获取下游单据的数据库表名
        ///     通过OnInSelectedRow方法获取到的数据在这里进行判断是否下推过,如果分项工程名称不允许多次下推的在这里查询到了,那么禁止下推
        /// </summary>
        /// <param name="e"></param>
        public override void OnCreateTarget(CreateTargetEventArgs e)
        {
            base.OnCreateTarget(e);
            String lowerBill = e.TargetBusinessInfo.Entrys[0].TableName;
            String lowerBody = e.TargetBusinessInfo.Entrys[1].TableName;
            String strSQL;
            foreach (Upper upper in lsUpper)
            {
                strSQL = "SELECT fid, f_pion_orgid, fsourcebillno, feachname, fname, f_isitretractable FROM(" +
                        "SELECT t0.FID AS FID, t0.F_PION_ORGID AS F_PION_OrgId, t0.FSOURCEBILLNO AS FsourceBillNo FROM " + lowerBill + " t0) e0 INNER JOIN(  SELECT t0.FID AS FID2, t1.FEACHNAME AS FeachName FROM " + lowerBill + " t0  LEFT JOIN  " + lowerBody + " t1 ON(t0.FID = t1.FID)" +
                        ") e1 ON e0.FID = e1.FID2 INNER JOIN  ( SELECT t0.FID AS FID3, t0_L.FEACHNAME AS FName, t0.F_ISITRETRACTABLE AS F_IsItRetractable FROM T_EachProjectData t0 LEFT JOIN T_EachProjectData_L t0_L ON(t0.FID = t0_L.FID AND t0_L.FLocaleId = 2052) ) e2 ON e1.FeachName = e2.FID3 WHERE(e0.FsourceBillNo = '" + upper.Fbillno + "'  AND    e0.F_PION_OrgId = '" + upper.F_pion_orgid + "'  AND    e2.F_IsItRetractable = '1' AND    e1.FeachName =" + upper.FeachName + ")";
                IDataReader dataReader = DBUtils.ExecuteReader(this.Context, strSQL);
                while (dataReader.Read())
                {
                    String fname = Convert.ToString(dataReader["fname"]);
                    dataReader.Close();
                    throw new KDExceptionValidate("convert", ResManager.LoadKDString("禁止重复下推,基础资料名为:" + fname + " 禁止重复下推!", "004002030004060", SubSystemType.SCM, new object[0]),
                        ResManager.LoadKDString("基础资料名为:" + fname + " 禁止重复下推。", "004002030004063", SubSystemType.SCM, new object[0]));
                }
                dataReader.Close();
            }
        }
    }
}

插件生成dll后,打开单据转换规则,将该dll放到里面即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影孓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值