using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Core.Metadata;
using System.ComponentModel;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.ServiceHelper;
using System.Data;
using Kingdee.BOS.Core.List.PlugIn.Args;

namespace LQKJ.K3.MFG.PRD.BusinessPlugIn
{
    [Kingdee.BOS.Util.HotUpdate]
    [Description("作废代码，不可调用")]
    ///作废代码！！！
    public class AlternativeMaterialT0POEditPlugin : AbstractBillPlugIn
    {
        /// <summary>
        /// 初始化，对其他界面传来的参数进行处理，对控件某些属性进行处理
        /// 这里不宜对数据DataModel进行处理
        /// </summary>
        /// <param name="e"></param>pr
        public override void OnInitialize(InitializeEventArgs e)
        {

        }

        /// <summary>
        /// 新建单据加载数据完成之后，需要处理的功能
        /// </summary>
        /// <param name="e"></param>
        public override void AfterCreateNewData(EventArgs e)
        {

        }

        /// <summary>
        /// 修改，查看单据加载已有数据之后，需要处理的功能
        /// </summary>
        /// <param name="e"></param>
        public override void AfterLoadData(EventArgs e)
        {

        }

        /// <summary>
        /// 数据加载之后，需要处理的功能，这里主要对界面样式进行处理，尽量不要对Datamodel进行处理
        /// </summary>
        /// <param name="e"></param>
        public override void AfterBindData(EventArgs e)
        {

        }

        /// <summary>
        /// 在根据编码检索数据之前调用；
        /// 通过重载本事件，可以设置必要的过滤条件，以限定检索范围；
        /// 还可以控制当前过滤是否启用组织隔离，数据状态隔离
        /// </summary>
        /// <param name="e"></param>
        public override void BeforeSetItemValueByNumber(BeforeSetItemValueByNumberArgs e)
        {
            switch (e.BaseDataField.Key.ToUpperInvariant())
            {
                //case "FXXX":通过字段的Key[大写]来区分不同的基础资料
                //e.Filter = "FXXX= AND fxxy=";过滤的字段使用对应基础资料的字段的Key，支持ksql语法
                //break;
                case "":
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// 显示基础资料列表之前调用
        /// 通过重载本事件，可以设置必要的过滤条件，以限定检索范围；
        /// </summary>
        /// <param name="e"></param>
        public override void BeforeF7Select(BeforeF7SelectEventArgs e)
        {
            switch (e.FieldKey.ToUpperInvariant())
            {
                //case "FXXX":通过字段的Key[大写]来区分不同的基础资料
                //    e.ListFilterParameter.Filter = "FXXX= AND fxxy=";过滤的字段使用对应基础资料的字段的Key，支持ksql语法
                //break;
                case "":
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// 界面数据发生变化之前，需要处理的功能
        /// </summary>
        /// <param name="e"></param>
        public override void BeforeUpdateValue(BeforeUpdateValueEventArgs e)
        {
            switch (e.Key.ToUpperInvariant())
            {
                //case "FXXX":通过字段的Key[大写]来区分不同的控件的数据变化功能，如果要阻止该次变化，可以用e.Cancel = true;
                //    e.Cancel = true;
                //    break;
                case "":
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// 界面数据发生变化之后，需要处理的功能
        /// </summary>
        /// <param name="e"></param>
        public override void DataChanged(DataChangedEventArgs e)
        {
            switch (e.Field.Key.ToUpperInvariant())
            {
                case "":
                    break;
                default:
                    break;
            }
        }



        /// <summary>
        /// 单据持有事件发生前需要完成的功能
        /// </summary>
        /// <param name="e"></param>
        public override void BeforeDoOperation(BeforeDoOperationEventArgs e)
        {
            switch (e.Operation.FormOperation.Operation.ToUpperInvariant())
            {
                //case "SAVE": 表单定义的事件都可以在这里执行，需要通过事件的代码[大写]区分不同事件
                //break;
                case "":
                    break;
                default:
                    break;
            }


        }

        /// <summary>
        /// 单据持有事件发生后需要完成的功能
        /// </summary>
        /// <param name="e"></param>
        public override void AfterDoOperation(AfterDoOperationEventArgs e)
        {
            string aaa = e.Operation.Operation.ToUpperInvariant();
            switch (e.Operation.Operation.ToUpperInvariant())
            {
                //case "SAVE": 表单定义的事件都可以在这里执行，需要通过事件的代码[大写]区分不同事件
                //break;
                case "ALTERNATIVEMATERIAL":
                    AlternativeMaterial();
                    break;
                default:
                    break;
            }
        }
        public override void OnGetConvertRule(GetConvertRuleEventArgs e)
        {
            var curRow = this.View.Model.GetEntityDataObject(this.Model.BillBusinessInfo.GetEntity("FEntity"), rowIndex + 1);
            e.SelectedRows[0] = new ListSelectedRow("", curRow["Id"].ToString(), 0, "PUR_Requisition");
            e.SelectedRows[0].EntryEntityKey = "FEntity";
            base.OnGetConvertRule(e);
        }
        int rowIndex;
        /// <summary>
        /// 替代替代料
        /// </summary>
        private void AlternativeMaterial()
        {
            rowIndex = this.View.Model.GetEntryCurrentRowIndex("FEntity");


            DynamicObject obj = this.View.Model.GetValue("FMaterialId", rowIndex) as DynamicObject;
            var FMATERIALID = obj["Id"].ToString();
            string fid = this.View.Model.DataObject["Id"].ToString();
            var synum = this.View.Model.GetValue("FRemainQty", rowIndex).ToString();//剩余数量

            //弹出窗口，选择替代料（在弹出窗口找到对应的替代料）
            //显示动态表单
            //传入采购订单FID，明细信息的FMATERIALID
            DynamicFormShowParameter dynamicFormShowParameter = new DynamicFormShowParameter();
            dynamicFormShowParameter.FormId = "LQKJ_replace";
            dynamicFormShowParameter.CustomParams.Add("FID", fid);
            dynamicFormShowParameter.CustomParams.Add("FMATERIALID", FMATERIALID);
            dynamicFormShowParameter.CustomParams.Add("FREMAINQTY", synum);
            this.View.ShowForm(dynamicFormShowParameter, result =>
            {
                if (result != null && result.ReturnData != null)
                {
                    var returnData = (List<string>)result.ReturnData;//获取返回数据

                    //先判断申请数量-剩余数量 
                    var num = Convert.ToDouble(synum) - Convert.ToDouble(returnData[2]);
                    if (num != 0)//不为0，新增两行
                    {

                        //新增两行
                        this.Model.CopyEntryRowFollowCurrent("FEntity", rowIndex, rowIndex, false);
                        this.Model.SetValue("FReqQty", num, rowIndex+1);
                        this.View.InvokeFieldUpdateService("FReqQty", rowIndex+1);

                        this.Model.CopyEntryRowFollowCurrent("FEntity", rowIndex, rowIndex, false);

                        this.Model.SetValue("FSUGGESTSUPPLIERID", returnData[0], rowIndex + 1);//供应商
                        this.View.InvokeFieldUpdateService("FSUGGESTSUPPLIERID", rowIndex + 1);

                        this.Model.SetValue("FMATERIALID", returnData[1], rowIndex + 1);//物料
                        this.View.InvokeFieldUpdateService("FReqQty", rowIndex + 1);

                        this.Model.SetValue("FReqQty", returnData[2], rowIndex + 1);//申请数量
                        this.View.InvokeFieldUpdateService("FReqQty", rowIndex + 1);

                        this.Model.SetValue("FEVALUATEPRICE", returnData[3], rowIndex + 1);//单价
                        this.View.InvokeFieldUpdateService("FEVALUATEPRICE", rowIndex + 1);

                      
                    }
                    else
                    if (num == 0)//为0，新增一行
                    {
                        this.View.Model.CopyEntryRowFollowCurrent("FEntity", rowIndex, 1, false);

                        this.Model.SetValue("FSUGGESTSUPPLIERID", returnData[0], rowIndex + 1);//供应商
                        this.View.InvokeFieldUpdateService("FSUGGESTSUPPLIERID", rowIndex + 1);

                        this.Model.SetValue("FMATERIALID", returnData[1], rowIndex + 1);//物料
                        this.View.InvokeFieldUpdateService("FReqQty", rowIndex + 1);

                        this.Model.SetValue("FReqQty", returnData[2], rowIndex + 1);//申请数量
                        this.View.InvokeFieldUpdateService("FReqQty", rowIndex + 1);

                        this.Model.SetValue("FEVALUATEPRICE", returnData[3], rowIndex + 1);//单价
                        this.View.InvokeFieldUpdateService("FEVALUATEPRICE", rowIndex + 1);
                    }
                    this.View.InvokeFormOperation("Save");

                    //关闭当前选中行
                    this.View.InvokeFormOperation("MRPClose");

                    //触发特定下推操作
                    this.View.InvokeFormOperation("AlternativeMaterialT0PO");

                    this.View.UpdateView("FEntity");
                }
            });

        }



        /// <summary>
        /// queryservice取数方案，通过业务对象来获取数据，推荐使用
        /// </summary>
        /// <returns></returns>
        public DynamicObjectCollection GetQueryDatas()
        {
            QueryBuilderParemeter paramCatalog = new QueryBuilderParemeter()
            {
                FormId = "",//取数的业务对象
                FilterClauseWihtKey = "",//过滤条件，通过业务对象的字段Key拼装过滤条件
                SelectItems = SelectorItemInfo.CreateItems("", "", ""),//要筛选的字段【业务对象的字段Key】，可以多个，如果要取主键，使用主键名
            };

            DynamicObjectCollection dyDatas = Kingdee.BOS.ServiceHelper.QueryServiceHelper.GetDynamicObjectCollection(this.Context, paramCatalog);
            return dyDatas;
        }
    }


}
