王 垚
2021-03-05 c9c8ac9b6dd18ec40a52173924b2649b287b7aa6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using Demo.Model.Model;
using Kingdee.BOS;
using Kingdee.BOS.Core.Attachment;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Bill.PlugIn.Args;
using Kingdee.BOS.Core.CommonFilter;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.DiffCompare;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.BarElement;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Metadata.QueryElement;
using Kingdee.BOS.Core.Msg;
using Kingdee.BOS.Core.Permission;
using Kingdee.BOS.Log;
using Kingdee.BOS.Msg;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.Resource;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.SCM.Business;
using Kingdee.K3.SCM.Core.SCP;
using Kingdee.K3.SCM.ServiceHelper;
 
namespace Demo.BillView.PRD
{
 
    [Description("提料下推送货通知单")]
    [Kingdee.BOS.Util.HotUpdate]
    public class Pro_TlPush : AbstractBillPlugIn
    {
        private string InstockEntryTableNameAs;
        private string ReturnEntryTableNameAs;
        private string PoChangeEntryTableNameAs;
        public override void BarItemClick(BarItemClickEventArgs e)
        {
            string a;
            if ((a = e.BarItemKey.ToUpperInvariant()) != null)
            {
                if (a == "TBPUSH")
                {
                    try
                    {
                        PermissionAuthResult permissionAuthResult = PermissionServiceHelper.FuncPermissionAuth(base.Context, new BusinessObject
                        {
                            Id = "SCP_ReceiveBill"
                        }, "fce8b1aca2144beeb3c6655eaf78bc34");
                        if (!permissionAuthResult.Passed)
                        {
                            string msg = ResManager.LoadKDString("没有送货通知单的新增权限", "00444293030010485", SubSystemType.SCM, new object[0]);
                            base.View.ShowErrMessage(msg, "", MessageBoxType.Notice);
                            return;
                        }
                        DynamicObjectCollection source = this.Model.DataObject["FEntity"] as DynamicObjectCollection;
                        string[] selEntryIds = (from p in source
                                                select Convert.ToString(p["id"])).ToArray<string>();
                        InvokePushToRec(base.View, selEntryIds);
                        return;
                    }
                    catch (Exception ex)
                    {
                        if (ex.InnerException != null)
                        {
                            base.View.ShowErrMessage(ex.InnerException.Message, "", MessageBoxType.Notice);
                        }
                        else
                        {
                            base.View.ShowErrMessage(ex.Message, "", MessageBoxType.Notice);
                        }
                        return;
                    }
                }
                long num = Convert.ToInt64(this.Model.DataObject["id"]);
                string arg = Convert.ToString(this.Model.GetValue("fbillno"));
                ScpBillTrackInfo scpBillTrackInfo = new ScpBillTrackInfo();
                scpBillTrackInfo.IsUpTrack = false;
                scpBillTrackInfo.BillName = ResManager.LoadKDString("供应商协同采购订单", "00444293030009441", SubSystemType.SCM, new object[0]);
                TrackItem trackItem = new TrackItem();
                trackItem.FormId = "SCP_ReceiveBill";
                trackItem.FormName = ResManager.LoadKDString("送货通知单", "00444293030009436", SubSystemType.SCM, new object[0]);
                trackItem.Filter = string.Format("  FSRCFORMID='PUR_PurchaseOrder'  AND FSRCID={0} ", num);
                scpBillTrackInfo.TrackItems.Add(trackItem);
                TrackItem trackItem2 = new TrackItem();
                trackItem2.FormId = "SCP_MRAPP";
                trackItem2.FormName = ResManager.LoadKDString("退料通知单", "00444293030010278", SubSystemType.SCM, new object[0]);
                trackItem2.Filter = string.Format(" FSRCBILLTYPEID='PUR_PurchaseOrder' and FSRCBILLNO = '{0}' ", arg);
                if (string.IsNullOrWhiteSpace(this.InstockEntryTableNameAs))
                {
                    FormMetadata formMetadata = (FormMetadata)MetaDataServiceHelper.Load(base.Context, "SCP_InStock", true);
                    SelectField selectField = formMetadata.BusinessInfo.GetQueryInfo().GetSelectField("FMATERIALID");
                    this.InstockEntryTableNameAs = selectField.FullFieldName.Substring(0, selectField.FullFieldName.IndexOf('.'));
                }
                if (string.IsNullOrWhiteSpace(this.ReturnEntryTableNameAs))
                {
                    FormMetadata formMetadata2 = (FormMetadata)MetaDataServiceHelper.Load(base.Context, "SCP_MRB", true);
                    SelectField selectField2 = formMetadata2.BusinessInfo.GetQueryInfo().GetSelectField("FMATERIALID");
                    this.ReturnEntryTableNameAs = selectField2.FullFieldName.Substring(0, selectField2.FullFieldName.IndexOf('.'));
                }
                if (string.IsNullOrWhiteSpace(this.PoChangeEntryTableNameAs))
                {
                    FormMetadata formMetadata3 = (FormMetadata)MetaDataServiceHelper.Load(base.Context, "SCP_POChange", true);
                    SelectField selectField3 = formMetadata3.BusinessInfo.GetQueryInfo().GetSelectField("FMATERIALID");
                    this.PoChangeEntryTableNameAs = selectField3.FullFieldName.Substring(0, selectField3.FullFieldName.IndexOf('.'));
                }
                TrackItem trackItem3 = new TrackItem();
                trackItem3.FormId = "SCP_InStock";
                trackItem3.FormName = ResManager.LoadKDString("采购入库单", "00444293030010276", SubSystemType.SCM, new object[0]);
                TrackItem trackItem4 = new TrackItem();
                trackItem4.FormId = "SCP_MRB";
                trackItem4.FormName = ResManager.LoadKDString("采购退料单", "00444293030010277", SubSystemType.SCM, new object[0]);
                TrackItem trackItem5 = new TrackItem();
                trackItem5.FormId = "SCP_POChange";
                trackItem5.FormName = ResManager.LoadKDString("采购订单变更单", "00444293030010132", SubSystemType.SCM, new object[0]);
                List<long> list = new List<long>();
                list.Add(-1L);
                List<long> list2 = new List<long>();
                list2.Add(-1L);
                List<long> list3 = new List<long>();
                list3.Add(-1L);
                string item = Convert.ToString(base.View.Model.DataObject["id"]);
                List<string> list4 = new List<string>
                {
                    item
                };
                string[] trackIds = list4.ToArray();
                List<long> linkBillEntryIds = PurchaseNewServiceHelper.GetLinkBillEntryIds(base.Context, "T_STK_INSTOCKENTRY_lk", "t_PUR_POOrderEntry", trackIds, null, true);
                List<long> linkBillEntryIds2 = PurchaseNewServiceHelper.GetLinkBillEntryIds(base.Context, "T_PUR_MRBENTRY_lk", "t_PUR_POOrderEntry", trackIds, null, true);
                List<long> linkBillEntryIds3 = PurchaseNewServiceHelper.GetLinkBillEntryIds(base.Context, "T_PUR_POChangeEntry_LK", "t_PUR_POOrderEntry", trackIds, null, true);
                trackItem3.Filter = string.Format(" {1}.fentryid in ({0}) ", string.Join<long>(",", linkBillEntryIds), this.InstockEntryTableNameAs);
                trackItem4.Filter = string.Format(" {1}.fentryid in ({0}) ", string.Join<long>(",", linkBillEntryIds2), this.ReturnEntryTableNameAs);
                trackItem5.Filter = string.Format(" {1}.fentryid in ({0}) ", string.Join<long>(",", linkBillEntryIds3), this.PoChangeEntryTableNameAs);
                scpBillTrackInfo.TrackItems.Add(trackItem2);
                scpBillTrackInfo.TrackItems.Add(trackItem3);
                scpBillTrackInfo.TrackItems.Add(trackItem4);
                scpBillTrackInfo.TrackItems.Add(trackItem5);
                //base.View.ShowForm(scpBillTrackInfo);
 
                View.ShowForm(new DynamicFormShowParameter
                {
                    Height = 500,
                    Width = 1000,
                    FormId = "SCP_ScpBillTracker",
                    SyncCallBackAction = true,
                    ParentPageId = View.PageId,
                    PageId = SequentialGuid.NewGuid().ToString(),
                    CustomComplexParams =
                {
                    {
                        "ScpBillTrackInfo",
                        scpBillTrackInfo
                    }
                }
                });
                return;
            }
        }
 
        public static void InvokePushToRec(IDynamicFormView formView, string[] selEntryIds)
        {
            if (CheckPoHasPushRec(formView.Context, selEntryIds))
            {
                formView.ShowWarnningMessage(ResManager.LoadKDString("采购订单有暂存的关联送货单据,再次生成会造成单据重复下推,是否继续生成送货通知单?", "00444293030037168", SubSystemType.SCM, new object[0]), "", MessageBoxOptions.YesNoCancel, delegate (MessageBoxResult selRst)
                {
                    if (MessageBoxResult.Yes == selRst)
                    {
                        InnerInvokePushToRec(formView, selEntryIds);
                    }
                }, MessageBoxType.Advise);
                return;
            }
            InnerInvokePushToRec(formView, selEntryIds);
        }
 
        public static bool CheckPoHasPushRec(Context ctx, string[] billEntryIds)
        {
            string strSql = string.Format("select 1 from T_PUR_RECEIVE TH\r\nINNER JOIN T_PUR_RECEIVEENTRY TE ON TE.FID=TH.FID\r\nINNER JOIN T_PUR_RECEIVEENTRY_LK TELK ON TE.FENTRYID=TELK.FENTRYID\r\ninner join (select /*+ cardinality(b1 {0})*/FID from TABLE(fn_StrSplit(@FID,',',1)) b1) b on TELK.FSID=b.fid  \r\nwhere TH.FDOCUMENTSTATUS='Z' ", billEntryIds.Length);
            int num = DBServiceHelper.ExecuteScalar<int>(ctx, strSql, 0, new List<SqlParam>
            {
                new SqlParam("@FID", KDDbType.udt_inttable, billEntryIds)
            }.ToArray());
            return num == 1;
        }
 
        public static void InnerInvokePushToRec(IDynamicFormView formView, string[] selEntryIds)
        {
            DynamicFormShowParameter dynamicFormShowParameter = new DynamicFormShowParameter();
            dynamicFormShowParameter.FormId = "SCP_PushParamFrom";
            dynamicFormShowParameter.ParentPageId = formView.PageId;
            dynamicFormShowParameter.OpenStyle.ShowType = ShowType.Modal;
            //dynamicFormShowParameter.CustomComplexParams.Add("SrcFormId", "paez_PODemandPlan");
            //dynamicFormShowParameter.CustomComplexParams.Add("TargetFormId", "SCP_ReceiveBill");
            dynamicFormShowParameter.CustomComplexParams.Add("SrcFormId", "PUR_PurchaseOrder");
            dynamicFormShowParameter.CustomComplexParams.Add("TargetFormId", "PUR_ReceiveBill");
 
            formView.ShowForm(dynamicFormShowParameter, delegate (FormResult results)
            {
                if (results != null && results.ReturnData != null)
                {
                    DynamicObject dynamicObject = results.ReturnData as DynamicObject;
                    string CbConvertRule = Convert.ToString(dynamicObject["CbConvertRule"]);
                    List<ConvertRuleElement> convertRules = ConvertServiceHelper.GetConvertRules(formView.Context, "PUR_PurchaseOrder", "PUR_ReceiveBill");
                    //List<ConvertRuleElement> convertRules = ConvertServiceHelper.GetConvertRules(formView.Context, "paez_PODemandPlan", "SCP_ReceiveBill");
                    ConvertRuleElement rule = convertRules.FirstOrDefault((ConvertRuleElement t) => t.Id == CbConvertRule);
                    PushPurOrderToRec(formView, selEntryIds, rule);
                }
            });
        }
 
        public static void PushPurOrderToRec(IDynamicFormView formView, string[] billEntryIds, ConvertRuleElement rule)
        {
            ConvertPolicyElement convertPolicyElement = rule.Policies[6];
            Collection<BillTypeMapElement> billTypeMaps = ((BillTypeMapPolicyElement)convertPolicyElement).BillTypeMaps;
            Dictionary<string, string> dictionary = new Dictionary<string, string>();
            foreach (BillTypeMapElement billTypeMapElement in billTypeMaps)
            {
                if (!dictionary.ContainsKey(billTypeMapElement.SourceBillTypeId))
                {
                    dictionary.Add(billTypeMapElement.SourceBillTypeId, billTypeMapElement.TargetBillTypeId);
                }
            }
            List<ScpOrderPushInfo> list = new List<ScpOrderPushInfo>();
            string strSQL = string.Format(" select tr.FentryID, t.fbilltypeid,ts.FMASTERID as fsupmasterid,t.fbillNO,TR.FID AS FBILLID  \r\n                        from Cg_PODemandPlanBillMain t\r\n                        inner join T_BD_SUPPLIER ts on ts.FSUPPLIERID=t.FSUPPLIERID\r\n                        inner join Cg_PODemandPlanBillSub TR ON TR.FID=T.FID \r\n                        inner join  (select /*+ cardinality(b {0})*/ fid from table(fn_StrSplit(@FID, ',',1)) b) tb on TR.fentryid=tb.fid \r\n                      ", billEntryIds.Length);
            List<SqlParam> list2 = new List<SqlParam>
            {
                new SqlParam("@FID", KDDbType.udt_inttable, billEntryIds)
            };
            DynamicObjectCollection dynamicObjectCollection = DBServiceHelper.ExecuteDynamicObject(formView.Context, strSQL, null, null, CommandType.Text, list2.ToArray());
            if (dynamicObjectCollection == null || dynamicObjectCollection.Count == 0)
            {
                throw new KDException("", ResManager.LoadKDString("受源单所选单据类型限制,不允许下推目标单!", "00444293030009439", SubSystemType.SCM, new object[0]));
            }
            long supplierMasterIdByUserId = SupplierServiceHelper.GetSupplierMasterIdByUserId(formView.Context, formView.Context.UserId);
            string format = ResManager.LoadKDString("您没有权限操作单据{0}", "00444293030009639", SubSystemType.SCM, new object[0]);
            foreach (DynamicObject dynamicObject in dynamicObjectCollection)
            {
                if (supplierMasterIdByUserId != Convert.ToInt64(dynamicObject["fsupmasterid"]))
                {
                    throw new KDException("", string.Format(format, Convert.ToString(dynamicObject["fbillNO"])));
                }
                list.Add(new ScpOrderPushInfo
                {
                    EntryId = Convert.ToString(dynamicObject["FentryID"]),
                    BillId = Convert.ToString(dynamicObject["FBILLID"]),
                    BilltypeId = Convert.ToString(dynamicObject["fbilltypeid"])
                });
            }
            IEnumerable<IGrouping<string, ScpOrderPushInfo>> enumerable = from g in list
                                                                          group g by g.BilltypeId;
            List<DynamicObject> list3 = new List<DynamicObject>();
            StringBuilder stringBuilder = new StringBuilder();
            foreach (IGrouping<string, ScpOrderPushInfo> grouping in enumerable)
            {
                string key = grouping.Key;
                List<ListSelectedRow> list4 = new List<ListSelectedRow>();
                int num = 0;
                foreach (ScpOrderPushInfo scpOrderPushInfo in grouping)
                {
                    list4.Add(new ListSelectedRow(scpOrderPushInfo.BillId, scpOrderPushInfo.EntryId, num++, "paez_PODemandPlan")
                    {
                        EntryEntityKey = "FEntity"
                    });
                }
                ListSelectedRow[] selectedRows = list4.ToArray();
                PushArgs pushArgs = new PushArgs(rule, selectedRows);
                if (dictionary.ContainsKey(key))
                {
                    pushArgs.TargetBillTypeId = dictionary[key];
                }
                try
                {
                    ConvertOperationResult convertOperationResult = ConvertServiceHelper.Push(formView.Context, pushArgs, false);
                    list3.AddRange(from p in convertOperationResult.TargetDataEntities
                                   select p.DataEntity);
                }
                catch (Exception ex)
                {
                    stringBuilder.AppendLine(ex.Message);
                }
            }
            if (list3.Count == 0)
            {
                if (stringBuilder.Length > 0)
                {
                    formView.ShowErrMessage(stringBuilder.ToString(), "", MessageBoxType.Notice);
                    return;
                }
                formView.ShowErrMessage(ResManager.LoadKDString("没有可下推数据!", "00444293030009360", SubSystemType.SCM, new object[0]), "", MessageBoxType.Notice);
                return;
            }
            else
            {
                DynamicObject[] array = list3.ToArray();
                Dictionary<string, object> dictionary2 = new Dictionary<string, object>();
                dictionary2["CodeTime"] = 0;
                dictionary2["UpdateMaxNum"] = 1;
                FormMetadata formMetadata = (FormMetadata)MetaDataServiceHelper.Load(formView.Context, "PUR_ReceiveBill", true);
                List<BillNoInfo> billNo = BusinessDataServiceHelper.GetBillNo(formView.Context, formMetadata.BusinessInfo, array, dictionary2, "");
                for (int i = 0; i < array.Count<DynamicObject>(); i++)
                {
                    array[i]["BillNo"] = billNo[i].BillNo;
                    array[i]["IsInsideBill"] = true;
                }
                OperateOption option = OperateOption.Create();
                IOperationResult operationResult = BusinessDataServiceHelper.Draft(formView.Context, formMetadata.BusinessInfo, array, option, "");
                if (!operationResult.IsSuccess)
                {
                    formView.ShowMessage(ResManager.LoadKDString("下推失败!", "00444293030009440", SubSystemType.SCM, new object[0]), MessageBoxType.Notice);
                    return;
                }
                if (operationResult.SuccessDataEnity.Count<DynamicObject>() == 1)
                {
                    DynamicObject dynamicObject2 = operationResult.SuccessDataEnity.FirstOrDefault<DynamicObject>();
                    formView.ShowForm(new BillShowParameter
                    {
                        FormId = "SCP_ReceiveBill",
                        PKey = Convert.ToString(dynamicObject2["id"]),
                        Status = OperationStatus.EDIT,
                        OpenStyle =
                        {
                            ShowType = ShowType.MainNewTabPage
                        },
                        CustomComplexParams =
                        {
                            {
                                "FromScpOrderPushRecs",
                                true
                            }
                        }
                    });
                    return;
                }
                DynamicObjectType dynamicObjectType = new DynamicObjectType("ScpRecBillDatas", null, null, DataEntityTypeFlag.Class, new object[0]);
                dynamicObjectType.RegisterSimpleProperty("BillNo", typeof(string), null, false, new object[0]);
                dynamicObjectType.RegisterSimpleProperty("DocumentStatus", typeof(string), null, false, new object[0]);
                dynamicObjectType.RegisterSimpleProperty("BillId", typeof(long), null, false, new object[0]);
                DynamicObjectCollection dynamicObjectCollection2 = new DynamicObjectCollection(dynamicObjectType, null);
                foreach (DynamicObject dynamicObject3 in operationResult.SuccessDataEnity)
                {
                    DynamicObject dynamicObject4 = new DynamicObject(dynamicObjectType);
                    dynamicObject4["BillNo"] = dynamicObject3["BillNo"];
                    dynamicObject4["DocumentStatus"] = dynamicObject3["DocumentStatus"];
                    dynamicObject4["BillId"] = dynamicObject3["id"];
                    dynamicObjectCollection2.Add(dynamicObject4);
                }
                formView.ShowForm(new DynamicFormShowParameter
                {
                    FormId = "SCP_GENRECRSTFORM",
                    PageId = SequentialGuid.NewGuid().ToString(),
                    OpenStyle =
                    {
                        ShowType = ShowType.MainNewTabPage
                    },
                    CustomComplexParams =
                    {
                        {
                            "ScpRecBillDatas",
                            dynamicObjectCollection2
                        }
                    }
                });
                return;
            }
        }
    }
}