2025-07-31 09:52:50 +08:00

214 lines
9.7 KiB
C#

using GZ_KD_Parino.Common;
using GZ_KD_Parino.Services;
using GZ_KD_Parino.SQL;
using Kingdee.BOS.App;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.ComponentModel;
using System.Data;
namespace GZ_KD_Parino.Sal_Order
{
[Description("销售订单--更新纸质合同号"), HotUpdate]
public class Save : AbstractOperationServicePlugIn
{
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
//订单类别#
e.FieldKeys.Add("F_Ordercategory");
//日期
e.FieldKeys.Add("FDATE");
//纸质合同号
e.FieldKeys.Add("F_CONTRACTNUMBER");
//商机名称
e.FieldKeys.Add("F_BON");
//销售组织
e.FieldKeys.Add("FSaleOrgId");
//备用组织
e.FieldKeys.Add("F_SaleOrgId");
//退货类型
e.FieldKeys.Add("FBILLTYPEID");
}
/// <summary>
/// 保存后事件,保存事务结束后
/// </summary>
/// <param name="e"></param>
/// <exception cref="Exception"></exception>
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
base.AfterExecuteOperationTransaction(e);
foreach (var rows in e.SelectedRows)
{
var Billobj = rows.DataEntity;
// 更新纸质合同号
var result = SqlManage.UpdateFlexNumber(this.Context, Convert.ToString(Billobj["Id"]));
// 获取商机名称
var F_BON = Billobj["F_BON"] as DynamicObject;
//
//获取销售组织
var SalZZFid = Billobj["SaleOrgId_Id"].ToString();
var FBILLTYPEID = Convert.ToString(Billobj["BILLTYPEID_Id"]);
if (F_BON == null)
{
continue;
}
//获取纸质合同号
var FlexNumber = SqlManage.GetFlexNumber(this.Context, Convert.ToString(Billobj["Id"]));
//如果已经存在纸质合同号,则不继续执行操作
if (FlexNumber == "")
{
return;
}
//退货订单不需要创建工程项目
if (FBILLTYPEID != "eacb50844fc84a10b03d7b841f3a6278")
{
continue;
}
//创建上下文变量,默认为administrator
var ctx = this.Context;
//获取当前用户名 和 用户ID
ctx.UserId = Convert.ToInt32(this.Context.UserId);
ctx.UserName = Convert.ToString(this.Context.UserName);
string fid = "";
if (SqlManage.CheckItem(this.Context, FlexNumber, "1").Count == 0)
{
//创建工程项目
fid = CommonHelper.CreateItemData(ctx, "1", FlexNumber, Convert.ToString(F_BON["Name"]));
}
else
{
string sql = string.Format(@"SELECT A.FID AS FID,A.FNUMBER AS FNUMBER FROM T_BAS_PREBDONE A LEFT JOIN T_BAS_PREBDONE_L B on A.FID = B.FID WHERE FNUMBER = '{0}' AND A.FUSEORGID = '1' AND B.FNAME = '{1}'", FlexNumber, Convert.ToString(Convert.ToString(F_BON["Name"])));
var sqlDS = DBUtils.ExecuteDynamicObject(this.Context, sql);
if (sqlDS.Count != 0)
{
fid = sqlDS[0]["FID"].ToString();
}
else
{
string sql1 = string.Format(@"SELECT FID FROM T_BAS_PREBDONE WHERE FNUMBER = '{0}' AND FUSEORGID = '{1}'", FlexNumber, SalZZFid);
var sqlDS1 = DBUtils.ExecuteDynamicObject(this.Context, sql1);
if (sqlDS1.Count == 0)
{
throw new Exception($"商机名称:{F_BON["Name"].ToString()},不存在对应的工程项目。");
}
fid = sqlDS1[0]["FID"].ToString();
// 更新项目名称
string F_contractnumberSQL1 = string.Format(@"UPDATE T_BAS_PREBDONE_L SET FNAME = '{0}' WHERE fid in (SELECT FID FROM T_BAS_PREBDONE WHERE FNUMBER = '{1}' AND FUSEORGID = '{2}' )", Convert.ToString(F_BON["Name"]), FlexNumber, SalZZFid);
DBUtils.ExecuteDynamicObject(ctx, F_contractnumberSQL1.ToString(), null, null, CommandType.Text, null);
// 更新项目状态
var F_contractnumberSQL2 = string.Format(@"UPDATE T_BAS_PREBDONE SET F_CXSFBG = 1 WHERE FNUMBER = '{0}' AND FUSEORGID = '{1}'", FlexNumber, SalZZFid);
DBUtils.ExecuteDynamicObject(ctx, F_contractnumberSQL2.ToString(), null, null, CommandType.Text, null);
//获取元数据服务
IMetaDataService metaDataService = ServiceHelper.GetService<IMetaDataService>();
//获取保存服务
ISaveService saveService = ServiceHelper.GetService<ISaveService>();
//获取加载数据服务
IViewService viewService = ServiceHelper.GetService<IViewService>();
//获取物料元数据
FormMetadata materialMetadata = metaDataService.Load(this.Context, "BAS_PreBaseDataOne") as FormMetadata;
//获取ID的工程项目数据
DynamicObject[] objs = viewService.Load(
this.Context,
new object[] { fid },
materialMetadata.BusinessInfo.GetDynamicObjectType()
);
//调用保存工程项目数据的保存服务
saveService.Save(this.Context, objs);
saveService.Save(this.Context, materialMetadata.BusinessInfo, objs);
}
}
//判断该销售组织是否存在工程项目
if (SqlManage.CheckItem(this.Context, FlexNumber, Convert.ToString((Billobj["SaleOrgId"] as DynamicObject)["Id"])).Count == 0)
{
var SaleOrgId = Billobj["SaleOrgId"] as DynamicObject;
CommonHelper.Allocate(ctx, fid, "BAS_PreBaseDataOne", Convert.ToString(SaleOrgId["Id"]), Convert.ToString(SaleOrgId["Name"]));
}
//判断该备货组织是否存在工程项目
if (SqlManage.CheckItem(this.Context, FlexNumber, Convert.ToString((Billobj["F_SaleOrgId"] as DynamicObject)["Id"])).Count == 0)
{
var F_SaleOrgId = Billobj["F_SaleOrgId"] as DynamicObject;
//分配工程项目
CommonHelper.Allocate(ctx, fid, "BAS_PreBaseDataOne", Convert.ToString(F_SaleOrgId["Id"]), Convert.ToString(F_SaleOrgId["Name"]));
}
//反写工程项目
SqlManage.UpdateItemData(this.Context, Convert.ToString(Billobj["Id"]), FlexNumber);
}
}
/// <summary>
/// 开始保存插件
/// </summary>
/// <param name="e"></param>
public override void BeforeDoSaveExecute(BeforeDoSaveExecuteEventArgs e)
{
base.BeforeDoSaveExecute(e);
foreach (var billObj in e.DataEntities)
{
var cust = billObj["CustId"] as DynamicObject;
var saleOrg = billObj["SaleOrgId"] as DynamicObject;
var F_BON = billObj["F_BON"] as DynamicObject;
// 如果商机为空,直接跳过,不用带出历史单价
if (F_BON == null)
{
continue;
}
// 客户
var custId = cust["Id"].ToString();
// 销售组织
var saleOrgId = saleOrg["Id"].ToString();
// 商机项目
var F_BONId = F_BON["Id"].ToString();
var createDate = billObj["CreateDate"];
var date = DateTime.Now;
if (createDate != null)
{
date = Convert.ToDateTime(createDate);
}
var saleEntryList = billObj["SaleOrderEntry"] as DynamicObjectCollection;
var saleOrderService = new SaleOrderService(this.Context);
// TODO 销售订单,根据组织+客户+商机名称#+物料代码带出最近一次历史销售含税单价,取当前日期前,
// 审核日期最大的销售订单含税单价,日期越大表示离当前日期越近
foreach (var item in saleEntryList)
{
var material = item["MaterialId"] as DynamicObject;
var materialId = material["Id"].ToString();
var historyOrder = saleOrderService.GetHistoryOrder(saleOrgId, custId, F_BONId, materialId, date);
if (historyOrder == null)
{
continue;
}
var historyUnitPrice = Convert.ToDecimal(historyOrder["FTAXPRICE"]);
// 更新历史单价
item["F_LSDJ"] = historyUnitPrice;
}
}
}
}
}