2025-08-28 19:23:07 +08:00

445 lines
24 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Castle.Core.Internal;
using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Pilot_KD_Parino.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.K3.SCM.Common.BusinessEntity.Sales;
namespace Pilot_KD_Parino.Sal_Order
{
[Description("A组织的发货通知单自动推B组织的发货通知单服务插件"), HotUpdate]
public class SalDeliveryNoticeAudit : AbstractOperationServicePlugIn
{
string ADDRESS = "";
string date = "";
string fid = "0";
DynamicObject sheet = null;
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
//throw new KDBusinessException("", "至少进来了");
base.AfterExecuteOperationTransaction(e);
foreach (var rows in e.SelectedRows)
{
var Billobj = rows.DataEntity;
sheet = Billobj;
var sdsas = JsonHelper.ToJson(Billobj);
Logger.Error("目标单据数据集合", sdsas, new Exception());
string id = Convert.ToString(Billobj["Id"]);
fid = id;
string addressSql = $@"/*dialect*/SELECT F_Shippingaddress, FDate FROM dbo.T_SAL_DELIVERYNOTICE WHERE fid={id}";
var dan = DBServiceHelper.ExecuteDynamicObject(this.Context, addressSql);
ADDRESS = dan.Select(t => t["F_Shippingaddress"]).FirstOrDefault()?.ToString();
date = dan.Select(t => t["FDate"]).FirstOrDefault()?.ToString();
//发货通知单找到源头销售订单
string getSourceSql = $@"/*dialect*/SELECT FSTABLENAME,FSBILLID FROM T_SAL_DELIVERYNOTICEENTRY_LK
WHERE FENTRYID IN ( SELECT FENTRYID FROM dbo.T_SAL_DELIVERYNOTICEENTRY WHERE FID = {id})";
var dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
if (dt == null || dt.Count == 0)
{
//throw new KDBusinessException("", "没有找到源头销售订单:" );
return;
}
int tempFid = int.Parse(dt.Select(t => t["FSBILLID"]).FirstOrDefault().ToString());
string tablename = dt.Select(t => t["FSTABLENAME"]).FirstOrDefault().ToString();
//销售订单找到跨组织的销售订单
getSourceSql = $@"/*dialect*/SELECT FSTABLENAME,FSBILLID,FENTRYID FROM T_SAL_ORDERENTRY_LK
WHERE FSBILLID = {tempFid} and FSTABLENAME='T_SAL_ORDERENTRY' ";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
//throw new KDBusinessException("", "1:" + getSourceSql);
string fentryid = "";
if (dt == null || dt.Count == 0)
{
//如果不是小公司的订单,是珠海派诺--珠海兴诺的订单,则按 销售订单--采购申请单--采购订单--兴诺的销售订单 逻辑找订单
//采购申请单
getSourceSql = $@"/*dialect*/SELECT FSTABLENAME,FSBILLID,FENTRYID FROM T_PUR_ReqEntry_LK
WHERE FSBILLID = {tempFid} and FSTABLENAME='T_SAL_ORDERENTRY' ";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
if (dt == null || dt.Count == 0 || dt.Count>1)
{
//throw new KDBusinessException("", "没有找到跨组织的采购申请单:" + getSourceSql);
return;
}
else
{
//采购订单
tempFid = int.Parse(dt.Select(t => t["FSBILLID"]).FirstOrDefault().ToString());
tablename = dt.Select(t => t["FSTABLENAME"]).FirstOrDefault().ToString();
fentryid = dt.Select(t => t["FENTRYID"]).FirstOrDefault().ToString();
getSourceSql = $@"/*dialect*/ SELECT FID FROM T_PUR_ReqEntry WHERE FENTRYID ={fentryid}";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
tempFid = int.Parse(dt.FirstOrDefault()["FID"].ToString());
getSourceSql = $@"/*dialect*/SELECT FSTABLENAME,FSBILLID,FENTRYID FROM t_PUR_POOrderEntry_LK
WHERE FSBILLID = {tempFid} and FSTABLENAME='T_PUR_ReqEntry' ";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
if (dt == null || dt.Count == 0 || dt.Count > 1)
{
//throw new KDBusinessException("", "没有找到跨组织的采购订单:" + getSourceSql);
return;
}
else
{
//兴诺的销售订单
tempFid = int.Parse(dt.Select(t => t["FSBILLID"]).FirstOrDefault().ToString());
tablename = dt.Select(t => t["FSTABLENAME"]).FirstOrDefault().ToString();
fentryid = dt.Select(t => t["FENTRYID"]).FirstOrDefault().ToString();
getSourceSql = $@"/*dialect*/ SELECT FID FROM t_PUR_POOrderEntry WHERE FENTRYID ={fentryid}";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
tempFid = int.Parse(dt.FirstOrDefault()["FID"].ToString());
getSourceSql = $@"/*dialect*/SELECT FSTABLENAME,FSBILLID,FENTRYID FROM T_SAL_ORDERENTRY_LK
WHERE FSBILLID = {tempFid} and FSTABLENAME='t_PUR_POOrderEntry' ";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
if (dt == null || dt.Count == 0 || dt.Count > 1)
{
//throw new KDBusinessException("", "没有找到跨组织的销售订单:" + getSourceSql);
return;
}
}
}
//throw new KDBusinessException("", "没有找到跨组织的销售订单:"+ getSourceSql);
}
tempFid = int.Parse(dt.Select(t => t["FSBILLID"]).FirstOrDefault().ToString());
tablename = dt.Select(t => t["FSTABLENAME"]).FirstOrDefault().ToString();
fentryid = dt.Select(t => t["FENTRYID"]).FirstOrDefault().ToString();
//找到跨组织的销售订单主键ID
getSourceSql = $@"/*dialect*/ SELECT FID FROM T_SAL_ORDERENTRY WHERE FENTRYID ={fentryid}";
dt = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
//throw new KDBusinessException("", "2:" + getSourceSql);
if (dt == null || dt.Count == 0)
{
//throw new KDBusinessException("", "没有找到跨组织的销售订单明细");
return;
}
else
{
tempFid = int.Parse(dt.FirstOrDefault()["FID"].ToString());
int stockId = 0;
var result = Invoke("SAL_SaleOrder", "SAL_DELIVERYNOTICE", tempFid.ToString(), "193822715afc48aa9fa6d6beca7700ab", ref stockId);
}
//throw new KDBusinessException("", "3:" + getSourceSql);
}
}
private IOperationResult Invoke(string source, string target, string tempFid, string sargetBillTypeId,ref int stockId)
{
try
{
IOperationResult result = new OperationResult();
//获取单据转换规则
ConvertRuleElement ruleElement;
var ruleElementList = ServiceHelper.GetService<IConvertService>().GetConvertRules(this.Context, source, target).ToList();
var akdos = JsonHelper.ToJson(ruleElementList);
Logger.Error("获取单据转换规则", akdos, new Exception());
ruleElement = ruleElementList.Where(t => t.OriginKey == "9090ab67-7255-4a33-a457-a70fa2d90536").FirstOrDefault();
//var ruleMetaData = ConvertServiceHelper.GetConvertRule(this.Context, "9090ab67-7255-4a33-a457-a70fa2d90536");
//ruleElement = ruleMetaData.Rule;
//如下代码 直接通过查询数据库获取单据转换源单数据 9090ab67-7255-4a33-a457-a70fa2d90536
ListSelectedRowCollection rows = new ListSelectedRowCollection();
int i = 0;
ListSelectedRow row = new ListSelectedRow(tempFid, string.Empty, i++, source);
rows.Add(row);
PushArgs pushArgs = new PushArgs(ruleElement, rows.ToArray());
pushArgs.TargetBillTypeId = sargetBillTypeId;//单据类型
//转换生成目标单
ConvertOperationResult convertResult = ServiceHelper.GetService<IConvertService>().Push(this.Context, pushArgs);
////合并转换操作结果
//result.MergeResult(convertResult);
////目标单据数据集合
DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
//var sdsas = JsonHelper.ToJson(destObjs);
//Logger.Error("目标单据数据集合", sdsas, new Exception());
////目标单元数据
FormMetadata destFormMetadata = ServiceHelper.GetService<IMetaDataService>().Load(this.Context, target) as FormMetadata;
////保存目标单据
IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
if (target == "SAL_DELIVERYNOTICE")
{
var stocks3 = destObjs[0];
var sdsas = JsonHelper.ToJson(stocks3);
Logger.Error("跨组织的发货通知单", sdsas, new Exception());
if (ADDRESS != "")
{
string addressSql = $@"/*dialect*/update T_SAL_DELIVERYNOTICE set F_Shippingaddress=bb.F_Shippingaddress
from (select F_Shippingaddress from dbo.T_SAL_DELIVERYNOTICE bb where fid={fid}) bb
WHERE T_SAL_DELIVERYNOTICE.fid={stocks3["Id"]} ";
DBServiceHelper.ExecuteDynamicObject(this.Context, addressSql);
}
if (date != "")
{
string addressSql = $@"/*dialect*/update T_SAL_DELIVERYNOTICE set FDate='{date}' WHERE fid={stocks3["Id"]}";
DBServiceHelper.ExecuteDynamicObject(this.Context, addressSql);
}
var itemList = sheet["SAL_DELIVERYNOTICEENTRY"] as DynamicObjectCollection;
var newItemlist = stocks3["SAL_DELIVERYNOTICEENTRY"] as DynamicObjectCollection;
Dictionary<string, decimal> MaterialCode = new Dictionary<string, decimal>();
foreach (var item in itemList)
{
var Material = item["MaterialID"] as DynamicObject;
if (Material != null)
{
string code2 = (Material["Number"].ToString());
decimal qty = decimal.Parse(item["Qty"].ToString());
if (!MaterialCode.ContainsKey(code2))
{
MaterialCode.Add(code2, qty);
}
else
MaterialCode[code2] = MaterialCode[code2] + qty;
}
}
List<DynamicObject> deleteItem = new List<DynamicObject>();
foreach (var item in newItemlist)
{
var Material = item["MaterialID"] as DynamicObject;
if (Material != null)
{
string code2 = (Material["Number"].ToString());
decimal qty = decimal.Parse(item["Qty"].ToString());
if (MaterialCode.ContainsKey(code2))
{
if (MaterialCode[code2] != qty)
{
item["Qty"] = MaterialCode[code2];
item["BaseOutMaxQty"] = MaterialCode[code2];
item["BaseOutMinQty"] = MaterialCode[code2];
item["RemainOutQty"] = MaterialCode[code2];
item["OutMaxQty"] = MaterialCode[code2];
item["OutMinQty"] = MaterialCode[code2];
}
}
else
{
deleteItem.Add(item);
}
}
}
if (deleteItem.Count > 0)
{
deleteItem.ForEach(t =>
{
newItemlist.Remove(t);
});
//saveResult = ServiceHelper.GetService<ISaveService>().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
}
saveResult = ServiceHelper.GetService<ISaveService>().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
//调用Qty字段值更新服务
InvokeFieldUpdate(Convert.ToString(stocks3["Id"]));
//插入自动生成记录
string insertSql = $@"/*dialect*/INSERT INTO zz_zTuiSongLog
(Fid,FromType,TargetType,TFid,Creater,CreateTime)
VALUES
({fid},'SAL_DELIVERYNOTICE','SAL_DELIVERYNOTICE',{Convert.ToString(stocks3["Id"])},'{this.Context.UserName}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')";
DBServiceHelper.Execute(this.Context, insertSql);
;
}
////合并保存操作结果
//result.MergeResult(saveResult);
//根据操作结果构造返回结果
if ((saveResult.ValidationErrors != null && saveResult.ValidationErrors.Count > 0))
//|| (result.OperateResult != null && result.OperateResult.Count > 0))
{
var errorInfo = string.Join(";", saveResult.ValidationErrors.Select(x => x.Message));
//this.View.ShowErrMessage("调用下推, 导致自动保存失败 原因:" + errorInfo);
//result.IsSuccess = false;
//this.View.ShowErrMessage("调用下推, 导致自动保存失败 原因:" + saveResult.ValidationErrors[0].Message.ToString());
throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + errorInfo);
}
result = saveResult;
//this.View.ShowMessage("1");
// 取到需要自动提交、审核的单据内码
object[] pkArray = (from p in destObjs select p[0]).ToArray();
//设置提交参数
IOperationResult submitResult = ServiceHelper.GetService<ISubmitService>().Submit(this.Context, destFormMetadata.BusinessInfo, pkArray, "Submit", OperateOption.Create());
// 判断提交结果,如果失败,则内部会抛出错误,回滚代码
if (submitResult.IsSuccess == false)
{
throw new KDBusinessException("", "未知原因导致自动提交失败!");
}
//设置审核参数
IOperationResult auditResult = ServiceHelper.GetService<IAuditService>().Audit(this.Context, destFormMetadata.BusinessInfo, pkArray, OperateOption.Create());
// 判断提交结果,如果失败,则内部会抛出错误,回滚代码
if (auditResult.IsSuccess == false)
{
throw new KDBusinessException("", "未知原因导致自动审核失败!");
}
//显示下推后的单据
//ShowPushResult("k0f9e182dbc5247fcabc9479ddb300fa3", convertResult, destObjs);
return result;
}
catch (Exception ex)
{
Logger.Error("跨组织下推订单报错", "跨组织下推订单报错 error:" + ex.Message + ex.StackTrace, ex);
throw ex;
}
}
/// <summary>
/// 调用字段值更新服务
/// </summary>
/// <param name="FID"></param>
private void InvokeFieldUpdate(string FID)
{
// 构建一个IBillView实例通过此实例可以方便的填写补卡申请单各属性
IBillView billView = this.CreateBillView("SAL_DELIVERYNOTICE");
// 加载一个发货通知单
((IBillViewService)billView).LoadData();
// 触发插件的OnLoad事件
// 组织控制基类插件在OnLoad事件中对主业务组织改变是否提示选项进行初始化。
// 如果不触发OnLoad事件会导致主业务组织赋值不成功
DynamicFormViewPlugInProxy eventProxy = billView.GetService<DynamicFormViewPlugInProxy>();
eventProxy.FireOnLoad();
ModifyBill(billView, FID);
int Rowcount = billView.Model.GetEntryRowCount("FEntity");
for (int j = 0; j < Rowcount; j++)
{
billView.InvokeFieldUpdateService("FQty", j);
billView.UpdateView("FEntity");
}
// 保存补卡申请单
OperateOption saveOption = OperateOption.Create();
this.SaveBill(billView, saveOption);
}
public IBillView CreateBillView(string FKEY)
{
// 读取商品类型的元数据
FormMetadata meta = MetaDataServiceHelper.Load(this.Context, FKEY) as FormMetadata;
Form form = meta.BusinessInfo.GetForm();
// 创建用于引入数据的单据view
Type type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
var billView = (IDynamicFormViewService)Activator.CreateInstance(type);
// 开始初始化billView
// 创建视图加载参数对象指定各种参数如FormId, 视图(LayoutId)等
BillOpenParameter openParam = this.CreateOpenParameter(meta);
// 动态领域模型服务提供类通过此类构建MVC实例
var provider = form.GetFormServiceProvider();
billView.Initialize(openParam, provider);
return billView as IBillView;
}
private BillOpenParameter CreateOpenParameter(FormMetadata meta)
{
Form form = meta.BusinessInfo.GetForm();
// 指定FormId, LayoutId
BillOpenParameter openParam = new BillOpenParameter(form.Id, meta.GetLayoutInfo().Id);
// 数据库上下文
openParam.Context = this.Context;
// 本单据模型使用的MVC框架
openParam.ServiceName = form.FormServiceName;
// 随机产生一个不重复的PageId作为视图的标识
openParam.PageId = Guid.NewGuid().ToString();
// 元数据
openParam.FormMetaData = meta;
// 界面状态:新增 (修改、查看)
openParam.Status = OperationStatus.ADDNEW;
// 单据主键:本案例演示新建商品类型,不需要设置主键
openParam.PkValue = null;
// 界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等)
openParam.CreateFrom = CreateFrom.Default;
// 基础资料分组维度:基础资料允许添加多个分组字段,每个分组字段会有一个分组维度
// 具体分组维度Id请参阅 form.FormGroups 属性
openParam.GroupId = "";
// 基础资料分组:如果需要为新建的基础资料指定所在分组,请设置此属性
openParam.ParentId = 0;
// 单据类型
openParam.DefaultBillTypeId = "";
// 业务流程
openParam.DefaultBusinessFlowId = "";
// 主业务组织改变时,不用弹出提示界面
openParam.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false);
// 插件
List<AbstractDynamicFormPlugIn> plugs = form.CreateFormPlugIns();
openParam.SetCustomParameter(FormConst.PlugIns, plugs);
PreOpenFormEventArgs args = new PreOpenFormEventArgs(this.Context, openParam);
foreach (var plug in plugs)
{// 触发插件PreOpenForm事件供插件确认是否允许打开界面
plug.PreOpenForm(args);
}
if (args.Cancel == true)
{// 插件不允许打开界面
// 本案例不理会插件的诉求,继续....
}
// 返回
return openParam;
}
public void SaveBill(IBillView billView, OperateOption saveOption)
{
saveOption.SetIgnoreInteractionFlag(true);
//获取发货通知单表单结构
Form form = billView.BillBusinessInfo.GetForm();
if (form.FormIdDynamicProperty != null)
{
form.FormIdDynamicProperty.SetValue(billView.Model.DataObject, form.Id);
}
// 调用保存操作
IOperationResult saveResult = BusinessDataServiceHelper.Save(
this.Context,
billView.BillBusinessInfo,
billView.Model.DataObject,
saveOption, "Save");
billView.CommitNetworkCtrl();
billView.Close();
}
/// <summary>
/// 修改单据
/// </summary>
/// <param name="billView"></param>
/// <param name="pkValue"></param>
private void ModifyBill(IBillView billView, string pkValue)
{
billView.OpenParameter.Status = OperationStatus.EDIT;
billView.OpenParameter.CreateFrom = CreateFrom.Default;
billView.OpenParameter.PkValue = pkValue;
billView.OpenParameter.DefaultBillTypeId = string.Empty;
((IDynamicFormViewService)billView).LoadData();
}
}
}