2025-04-30 16:12:36 +08:00

503 lines
27 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 Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Const;
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.Globalization.Tax;
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.FieldElement;
using Kingdee.BOS.Core.Metadata.Util;
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.ComponentModel;
using System.Data;
using System.Linq;
using static Kingdee.K3.SCM.Common.BusinessEntity.Sales.SaleOrder;
namespace Pilot_KD_Parino.Sal_Order
{
[Description("销售单下推生成跨组织的采购申请单的插件"), HotUpdate]
public class PushSaleBillPlugIn : AbstractDynamicFormPlugIn // AbstractListPlugIn
{
long sScrId = 0;
string sScrBillNo = "";
public override void AfterBarItemClick(AfterBarItemClickEventArgs e)
{
base.AfterBarItemClick(e);
//this.View.ShowMessage("669977");
if (e.BarItemKey.Equals("tbSaleBill333", StringComparison.OrdinalIgnoreCase))
{
var FEntity = this.View.Model.DataObject;
var json = JsonUtil.Serialize(FEntity);
Logger.Error("采购订单信息", json, new Exception());
//var id = FEntity["id"];
//string formid = FEntity["FFormId"].ToString();
}
if (e.BarItemKey.Equals("tbSaleBill222", StringComparison.OrdinalIgnoreCase))
{
var FEntity = this.View.Model.DataObject;
var json = JsonUtil.Serialize(FEntity);
//Logger.Error("FEntity", json, new Exception());
var id = FEntity["id"];
string formid = FEntity["FFormId"].ToString();
int stockId = 0;
//IOperationResult result = Invoke("SAL_SaleOrder", "d124a6be-5f97-4d1f-b5fd-e20e53e0ed2a", id.ToString(), "83d822ca3e374b4ab01e5dd46a0062bd", ref stockId);
//IOperationResult result = Invoke("SAL_SaleOrder", "PUR_PurchaseOrder", id.ToString(), "83d822ca3e374b4ab01e5dd46a0062bd", ref stockId, FEntity, null);
//var sheet = result.SuccessDataEnity.FirstOrDefault();
var result = Invoke("SAL_SaleOrder", "SAL_SaleOrder", id.ToString(), "eacb50844fc84a10b03d7b841f3a6278", ref stockId, null, FEntity);
//sheet = result.SuccessDataEnity.FirstOrDefault();
//result = Invoke("SAL_DELIVERYNOTICE", "SAL_OUTSTOCK", sheet["id"].ToString(), "ad0779a4685a43a08f08d2e42d7bf3e9", ref stockId);
this.View.ShowMessage("跨组织下推订单完成");
}
}
/// <summary>
///
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
/// <param name="tempFid"></param>
/// <param name="sargetBillTypeId"></param>
/// <param name="stockId"></param>
/// <param name="FEntity">本次操作页面的对象</param>
/// <param name="FEntity2">最开始的销售单对象</param>
/// <returns></returns>
private IOperationResult Invoke(string source, string target, string tempFid, string sargetBillTypeId, ref int stockId, DynamicObject FEntity, DynamicObject FEntity2)
{
try
{
IOperationResult result = new OperationResult();
//获取单据转换规则
ConvertRuleElement ruleElement;
if (target == "PUR_PurchaseOrder")
{
var ruleMetaData = ConvertServiceHelper.GetConvertRule(this.Context, "d124a6be-5f97-4d1f-b5fd-e20e53e0ed2a");
ruleElement = ruleMetaData.Rule;
}
else if (target == "SAL_SaleOrder")
{
var ruleMetaData = ConvertServiceHelper.GetConvertRule(this.Context, "8ee74811-5784-40a8-80c4-a94cd43eed70");
ruleElement = ruleMetaData.Rule;
}
else
ruleElement = ServiceHelper.GetService<IConvertService>().GetConvertRules(this.Context, source, target).FirstOrDefault();
//如下代码 直接通过查询数据库获取单据转换源单数据
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());
if (target == "SAL_SaleOrder")
pushArgs.TargetOrgId =long.Parse( FEntity2["F_SaleOrgId_Id"].ToString());
//OperateOption pushOption = OperateOption.Create();
//pushOption.SetVariableValue(ConvertConst., false);
pushArgs.TargetBillTypeId = sargetBillTypeId;//单据类型
//转换生成目标单
ConvertOperationResult convertResult = ServiceHelper.GetService<IConvertService>().Push(this.Context, pushArgs);
////目标单据数据集合
DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
var orderSheet = destObjs[0];
var sdsas = JsonHelper.ToJson(destObjs);
Logger.Error("目标单据数据集合", sdsas, new Exception());
int temStockId = stockId;
//采购订单 1 采购类型=02 生产物资采购 供应商=珠海兴诺能源技术有限公司
string SupplierId_Id = "";
string number = "";
string name = "";
if (target == "PUR_PurchaseOrder")
{
var beiHuoName1 = FEntity["F_SaleOrgId"] as DynamicObject;
string SaleOrgId_Id = FEntity["SaleOrgId_Id"].ToString();
if (beiHuoName1 != null)
{
var beiHuoName2 = beiHuoName1["MultiLanguageText"] as DynamicObjectCollection;
if (beiHuoName2 != null && beiHuoName2.Count() > 0)
{
var beiHuoName3 = beiHuoName2[0]["Name"].ToString();
string sqltemp1 = $@"/*dialect*/ SELECT FUseOrgId,a.FNUMBER,b.FNAME,a.FSUPPLIERID FROM T_BD_SUPPLIER a
LEFT JOIN T_BD_SUPPLIER_L b ON a.FSUPPLIERID=b.FSUPPLIERID
WHERE FUseOrgId={SaleOrgId_Id} AND FNAME LIKE '%{beiHuoName3}%' ";
var supplierList = DBServiceHelper.ExecuteDynamicObject(this.Context, sqltemp1, null, null, CommandType.Text, null);
if (supplierList != null && supplierList.Count > 0)
{
DynamicObject supplierObj = null;//.Select(t => t["FSUPPLIERID"].ToString())
if (beiHuoName3 == "珠海兴诺")
{
supplierObj = supplierList.Where(t => t["FNAME"].ToString() == "珠海兴诺能源技术有限公司").FirstOrDefault();
}
if (beiHuoName3 == "珠海派诺")
{
supplierObj = supplierList.Where(t => t["FNAME"].ToString() == "珠海派诺科技股份有限公司").FirstOrDefault();
}
else
{
supplierObj = supplierList.FirstOrDefault();
}
SupplierId_Id = supplierObj["FSUPPLIERID"].ToString();
orderSheet["SupplierId_Id"] = SupplierId_Id;
number = supplierObj["FNUMBER"].ToString();
name = supplierObj["FNAME"].ToString();
SupplierClass supplier = new SupplierClass();
supplier.Id = int.Parse(SupplierId_Id);
supplier.Number = number;
supplier.UseOrgId_Id = int.Parse(SaleOrgId_Id);
//string json2= JsonHelper.ToJson(supplier);
//采购类型
/**
* SELECT * FROM dbo.T_BAS_ASSISTANTDATAENTRY_l
WHERE FENTRYID IN ( SELECT FENTRYID FROM dbo.T_BAS_ASSISTANTDATAENTRY
WHERE fid='6736e9ea1d1dcb')
*/
orderSheet["F_Procurementtype_Id"] = "6736ea151d1dcf"; //采购类型
//明细价税合计 AllAmount_LC 税率 TaxRate POOrderEntry
var detailList = (orderSheet["POOrderEntry"] as DynamicObjectCollection).ToList();
var saleDetailList = (FEntity["SaleOrderEntry"] as DynamicObjectCollection).ToList();
if (detailList != null && detailList.Count > 0)
{
detailList.ForEach(t =>
{
var dasda = t["Qty"].ToString();
decimal qty = decimal.Parse(dasda);
var tempOne = saleDetailList.Where(h => h["MaterialId_Id"].ToString() == t["MaterialId_Id"].ToString()
&& decimal.Parse(h["Qty"].ToString()) == qty).FirstOrDefault();
if (tempOne != null)
{
t["Price"] = tempOne["Price"];
t["AllAmount_LC"] = tempOne["AllAmount_LC"];
t["AllAmount"] = tempOne["AllAmount"];
t["TaxPrice"] = tempOne["TaxPrice"];
t["TaxRate"] = tempOne["TaxRate"];
t["TaxAmount"] = tempOne["TaxAmount"];
t["Amount"] = tempOne["Amount"];
}
});
}
//this.View.ShowMessage($@"{beiHuoName3}备货组织跨组织下推订单完成");
}
else
{
throw new KDBusinessException("", $@"{beiHuoName3}备货组织没有对应的同名供应商,无法跨组织推送采购订单");
}
}
else
{
throw new KDBusinessException("", $@"备货组织没有值");
}
}
else
throw new KDBusinessException("", "推送跨组织采购订单必须选择备货组织");
}
if (target == "SAL_SaleOrder")
{
orderSheet["BusinessType"] = FEntity2["BusinessType"];
//客户,销售员,是否海外
var beiHuoName1 = FEntity2["SaleOrgId"] as DynamicObject;
string SaleOrgId_Id = FEntity2["F_SaleOrgId_Id"].ToString();
SupplierId_Id = orderSheet["SaleOrgId_Id"].ToString();
if (beiHuoName1 != null)
{
//通过上游销售单的销售组织找到对应的客户
var beiHuoName2 = beiHuoName1["MultiLanguageText"] as DynamicObjectCollection;
if (beiHuoName2 != null && beiHuoName2.Count() > 0)
{
var beiHuoName3 = beiHuoName2[0]["Name"].ToString();
//未知原因导致自动保存失败原因:字段“销售员”是必填项; 字段“结算币别”是必填项;
//第1行分录交货明细的数量与订单明细的数量不一致请检查.; 第2行分录交货明细的数量与订单明细的数量不一致请检查.;
//第3行分录交货明细的数量与订单明细的数量不一致请检查.; 整单收款计划应收金额合计不等于整单价税合计,不允许保存。
//orderSheet["SaleOrderFinance"] = FEntity2["SaleOrderFinance"];
//orderSheet["ExchangeTypeId_Id"] = FEntity2["ExchangeTypeId_Id"];
//orderSheet["ExchangeTypeId"] = FEntity2["ExchangeTypeId"];
//orderSheet["SaleOrderPlan"] = FEntity2["SaleOrderPlan"];
orderSheet["F_SFHW"] = "2";
var entryDetailList = (orderSheet["SaleOrderEntry"] as DynamicObjectCollection).ToList();
entryDetailList.ForEach(t =>
{
t["SettleOrgId"] = orderSheet["SaleOrgId"];
t["SettleOrgId_Id"] = orderSheet["SaleOrgId_Id"];
});
var SaleOrderFinanceList = (orderSheet["SaleOrderFinance"] as DynamicObjectCollection).ToList();
var SaleOrderFinanceList2 = (FEntity2["SaleOrderFinance"] as DynamicObjectCollection).ToList();
SaleOrderFinanceList.ForEach(t =>
{
var tempOne1 = SaleOrderFinanceList2.FirstOrDefault();
//t["SettleOrgId"] = orderSheet["SaleOrgId"];
//t["SettleOrgId_Id"] = orderSheet["SaleOrgId_Id"];
t["ExchangeTypeId_Id"] = tempOne1["ExchangeTypeId_Id"];
t["ExchangeTypeId"] = tempOne1["ExchangeTypeId"];
t["SettleCurrId_Id"] = tempOne1["SettleCurrId_Id"];
t["SettleCurrId"] = tempOne1["SettleCurrId"];
});
this.View.ShowMessage("更新了1");
string sqltemp1 = $@"/*dialect*/ SELECT FUseOrgId,a.FNUMBER,b.FNAME,a.FCUSTID FROM T_BD_CUSTOMER a
LEFT JOIN T_BD_CUSTOMER_L b ON a.FCUSTID=b.FCUSTID
WHERE FUseOrgId={SupplierId_Id} AND FNAME LIKE '%{beiHuoName3}%' ";
var keHuList = DBServiceHelper.ExecuteDynamicObject(this.Context, sqltemp1, null, null, CommandType.Text, null);
if (keHuList != null && keHuList.Count > 0)
{
DynamicObject supplierObj = null;//.Select(t => t["FSUPPLIERID"].ToString())
if (beiHuoName3 == "珠海兴诺")
{
supplierObj = keHuList.Where(t => t["FNAME"].ToString() == "珠海兴诺国际能源有限公司").FirstOrDefault();
}
if (beiHuoName3 == "珠海派诺")
{
supplierObj = keHuList.Where(t => t["FNAME"].ToString() == "珠海派诺科技股份有限公司").FirstOrDefault();
}
else
{
supplierObj = keHuList.FirstOrDefault();
}
SupplierId_Id = supplierObj["FCUSTID"].ToString();
orderSheet["CustId_Id"] = SupplierId_Id;
number = supplierObj["FNUMBER"].ToString();
name = supplierObj["FNAME"].ToString();
}
orderSheet["F_PaymentMethod"] = "款到发货";
}
}
}
if (target == "PUR_ReceiveBill")//收料通知单,强制没有配置仓库的物料进成品仓库
{
//var sheet = destObjs.FirstOrDefault(); PUR_ReceiveEntry
string pur = ("PUR_ReceiveEntry");
var stocks3 = destObjs[0];
if (temStockId == 0)
{
string sql2 = $@"/*dialect*/
SELECT FUseOrgId,fname, a.FSTOCKID,FForbidStatus,FDocumentStatus FROM T_BD_STOCK a
LEFT JOIN T_BD_STOCK_L b ON a.FSTOCKID=b.FSTOCKID
WHERE fname like '%成品仓%' AND FForbidStatus='A' AND FDocumentStatus='C' AND FUseOrgId={stocks3["StockOrgId_Id"]}";
var stockList = DBServiceHelper.ExecuteDynamicObject(this.Context, sql2, null, null, CommandType.Text, null);
if (stockList == null || stockList.Count == 0)
{
throw new KDBusinessException("", "所涉及的跨组织单位没有配置成品仓");
}
temStockId = stockList.Select(t => int.Parse(t["FSTOCKID"].ToString())).FirstOrDefault();
stockId = temStockId;
}
var stocks333 = stocks3[pur];
var stocks = stocks333 as DynamicObjectCollection;
var stock0 = stocks.ToList();
stock0.ForEach(t =>
{
t["StockID_Id"] = temStockId;
});
//if (stock0.Count > 0)
//{
// var others= stocks.Where(t => int.Parse(t["StockID_Id"].ToString()) != 0).ToList();
// if (others.Count == 0)
// {
// throw new KDBusinessException("", "上查关联的跨组织的采购订单明细全部没有配置仓库" );
// }
// var other2 = others.Select(t => t["StockId"]).ToList();
// var json1 = JsonHelper.ToJson(other2);
// List<PUR_ReceiveEntryStockId> other3 = JsonHelper.ToObject<List<PUR_ReceiveEntryStockId>>(json1);
// var other4 = other3.Where(t => t.Name.FirstOrDefault().Value.Contains("成品仓")).ToList();
// if (other4.Count > 0)
// {
// stockId = other4.Select(t => t.Id).FirstOrDefault();
// }
// else
// {
// stockId = other3.Select(t => t.Id).FirstOrDefault();
// }
// stock0.ForEach(t =>
// {
// t["StockID_Id"] = stockId;
// });
//}
}
if (target == "SAL_DELIVERYNOTICE")//采购入库单,强制没有配置仓库的物料进成品仓库
{
//throw new KDBusinessException("","还没开发好");
//var sheet = destObjs.FirstOrDefault(); PUR_ReceiveEntry
string pur = ("SAL_DELIVERYNOTICEENTRY");
var stocks3 = destObjs[0];
var stocks333 = stocks3[pur];
var stocks = stocks333 as DynamicObjectCollection;
var stock0 = stocks.ToList();
stock0.ForEach(t =>
{
t["StockID_Id"] = temStockId;
});
}
////目标单元数据
FormMetadata destFormMetadata = ServiceHelper.GetService<IMetaDataService>().Load(this.Context, target, orderSheet["id"].ToString(),true) as FormMetadata;
//sdsas = JsonHelper.ToJson(destObjs);
//Logger.Error("目标单据数据集合3", sdsas, new Exception());
//destFormMetadata.BusinessInfo.Entrys.ForEach(t => );
if (target == "PUR_PurchaseOrder")
{
destObjs[0]["SupplierId"] = BusinessDataServiceHelper.LoadSingle(this.Context, SupplierId_Id, (destFormMetadata.BusinessInfo.GetField("FSupplierId") as BaseDataField).RefFormDynamicObjectType);
}
if (target == "SAL_SaleOrder")
{
//var ddsdsdsds= BusinessDataServiceHelper.LoadSingle(this.Context, SupplierId_Id, (destFormMetadata.BusinessInfo.GetField("FCustId") as BaseDataField).RefFormDynamicObjectType);
//destObjs[0]["SaleOrgId"] = BusinessDataServiceHelper.LoadSingle(this.Context, FEntity2["SaleOrgId_Id"].ToString(), (destFormMetadata.BusinessInfo.GetField("FSaleOrgId") as BaseDataField).RefFormDynamicObjectType);
destObjs[0]["CustId"] = BusinessDataServiceHelper.LoadSingle(this.Context, SupplierId_Id, (destFormMetadata.BusinessInfo.GetField("FCustId") as BaseDataField).RefFormDynamicObjectType);
orderSheet["SalerId"] = FEntity2["SalerId"];
var xiaoShouName1 = FEntity2["SalerId"] as DynamicObject;
if (xiaoShouName1 != null)
{
var beiHuoName2 = xiaoShouName1["MultiLanguageText"] as DynamicObjectCollection;
if (beiHuoName2 != null && beiHuoName2.Count() > 0)
{
var beiHuoName3 = beiHuoName2[0]["Name"].ToString();
string sqltemp1 = $@"/*dialect*/ SELECT FBizOrgId,a.FNUMBER,b.FNAME,a.fid FROM V_BD_SALESMAN a
LEFT JOIN V_BD_SALESMAN_L b ON a.fid=b.fid
WHERE FBizOrgId={orderSheet["SaleOrgId_Id"].ToString()} AND FNAME = '{beiHuoName3}' AND a.FFORBIDSTATUS='A' AND a.FFORBIDDENSTATUS=0";
var xiaoShouList = DBServiceHelper.ExecuteDynamicObject(this.Context, sqltemp1, null, null, CommandType.Text, null);
if (xiaoShouList != null && xiaoShouList.Count > 0)
{
var xiao = xiaoShouList.FirstOrDefault();
destObjs[0]["SalerId_Id"] = xiao["fid"];
destObjs[0]["SalerId"] = BusinessDataServiceHelper.LoadSingle(this.Context, xiao["fid"], (destFormMetadata.BusinessInfo.GetField("FSalerId") as BaseDataField).RefFormDynamicObjectType);
}
}
}
}
//Logger.Error("目标单据数据集合3", sdsas, new Exception());
IOperationResult saveResult2 = BusinessDataServiceHelper.Draft(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
//var ddd = (from p in destObjs select p[0]).ToArray();
//var ddd = saveResult2.SuccessDataEnity.Select(t => t).ToArray();
//sdsas = JsonHelper.ToJson(ddd);
//Logger.Error("目标单据数据集合4", sdsas, new Exception());
////保存目标单据
IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().Save(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
////合并保存操作结果
//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;
}
}
}
}