销售增值税

This commit is contained in:
2025-12-18 11:25:44 +08:00
13 changed files with 951 additions and 370 deletions

View File

@@ -9,7 +9,7 @@ using Kingdee.BOS.Util;
using System;
using System.ComponentModel;
namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.AR_SalesVATInvoice.ServicePlugIn
namespace Pilot_KD_Parino.AR_SalesVATInvoice.ServicePlugIn
{
[HotUpdate, Description("销售增值税专用发票_保存后事件")]
public class AfterSave : AbstractOperationServicePlugIn

View File

@@ -112,11 +112,11 @@ namespace Pilot_KD_Parino.Common
}
else if (FType == "SX-1" || FType == "SX-2")
{
#region SX类型线
// 存储过程返回的第3个结果集Tables[2])字段顺序:
// 0=fseq, 1=fname, 2=FSPECIFICATION, 3=F_103(品牌), 4=FLOOR(FQTY), 5=FNAME(单位),
// 6=FTAXPRICE, 7=FALLAMOUNT_LC, 8=FNOTE, 9=FType(F_Projecttype), 10=FALLAMOUNT, 11=FALLAMOUNT2
#region
// 假设模板中的表格是第一个表格
var table = document.Tables[2];
//// 清空表格中的所有行(除了表头,如果有的话)
//// 注意:这里假设第一行是表头,不删除
Row previousRowNew = (Row)table.Rows[1];
Row previousRowthreeNew = (Row)table.Rows[2];
Row previousRowfourNew = (Row)table.Rows[3];
@@ -125,140 +125,46 @@ namespace Pilot_KD_Parino.Common
table.Rows[i].Remove();
}
var datatable2 = data.Tables[2];
// 定义五大类及其名称顺序1-5对应F_Projecttype的值
List<string> categoryList = new List<string> { "设备层", "通讯层", "应用管理层", "线缆施工费用", "技术服务费" };
// 获取系统总价从第一行数据获取所有行的FALLAMOUNT值相同
string systemTotalAmount = "0.00";
if (datatable2.Rows.Count > 0)
// 使用LINQ来获取去重后的FType字段
var DistinctFTypes = datatable2.AsEnumerable()
.Select(row => row.Field<string>("FType"))
.Distinct()
.ToList();
int Index = DistinctFTypes.Count;
foreach (var item in DistinctFTypes)
{
systemTotalAmount = Convert.ToString(datatable2.Rows[0][10]); // FALLAMOUNT
}
// 按F_Projecttype分类处理从5到1倒序插入确保最终显示顺序为1→5
for (int categoryIndex = 5; categoryIndex >= 1; categoryIndex--)
{
// 筛选当前类别的数据FType字段对应F_Projecttype索引9
var Rows = datatable2.AsEnumerable()
.Where(t => Convert.ToInt32(t[9]) == categoryIndex) // FType字段索引9
.OrderBy(t => Convert.ToInt32(t[0])) // 按fseq排序
.ToList();
string categoryName = categoryList[categoryIndex - 1];
Row previousRow = previousRowNew;
var previousRowthree = previousRowthreeNew;
var previousRowfour = previousRowfourNew;
// 如果该类别没有数据,创建空行
if (Rows == null || Rows.Count == 0)
//插入组合中具体的数据行
var Rows = datatable2.AsEnumerable().Where(t => Convert.ToString(t["FType"]) == item).ToList();
//插入一个组合
#region
Row newRowfour = table.InsertRow(previousRowfour, 1);
newRowfour.Cells[1].ReplaceText("{9}", Convert.ToString(Rows[0][11]));
int j = 0;
foreach (var Row in Rows)
{
// 1. 插入小计行(显示"小计"和0.00
Row newRowfour = table.InsertRow(previousRowfour, 1);
SetRowBorder(newRowfour);
newRowfour.Cells[0].ReplaceText("{0}", "");
newRowfour.Cells[1].ReplaceText("{1}", "小计");
for (int i = 2; i < 7; i++)
{
if (i < newRowfour.Cells.Count)
{
newRowfour.Cells[i].ReplaceText("{" + i.ToString() + "}", "");
}
}
if (newRowfour.Cells.Count > 7)
{
newRowfour.Cells[7].ReplaceText("{7}", "0.00"); // 总价列显示0.00
}
if (newRowfour.Cells.Count > 8)
{
newRowfour.Cells[8].ReplaceText("{8}", "");
}
// 2. 插入空明细行(所有占位符清空)
Row newRowthree = table.InsertRow(previousRowthree, 1);
SetRowBorder(newRowthree);
Row newRowthree = table.InsertRow(previousRowthree, 1 + j);
for (int i = 0; i < 9; i++)
{
if (i < newRowthree.Cells.Count)
{
newRowthree.Cells[i].ReplaceText("{" + i.ToString() + "}", "");
}
}
// 3. 插入分类标题行
Row newRow = table.InsertRow(previousRow, 1);
SetRowBorder(newRow);
newRow.Cells[0].ReplaceText("{0}", string.Format("{0}、{1}", ConvertToChineseUppercase(categoryIndex), categoryName));
for (int i = 1; i < newRow.Cells.Count; i++)
{
if (i < newRow.Cells.Count)
{
newRow.Cells[i].ReplaceText("{" + i.ToString() + "}", "");
}
}
}
else
{
// 1. 插入小计行(显示"小计"和类别小计金额)
Row newRowfour = table.InsertRow(previousRowfour, 1);
SetRowBorder(newRowfour);
newRowfour.Cells[0].ReplaceText("{0}", "");
newRowfour.Cells[1].ReplaceText("{1}", "小计");
for (int i = 2; i < 7; i++)
{
if (i < newRowfour.Cells.Count)
{
newRowfour.Cells[i].ReplaceText("{" + i.ToString() + "}", "");
}
}
// 小计金额从FALLAMOUNT2获取索引11显示在总价列索引7
if (newRowfour.Cells.Count > 7)
{
string subtotalAmount = Convert.ToString(Rows[0][11]); // FALLAMOUNT2
newRowfour.Cells[7].ReplaceText("{7}", subtotalAmount);
}
if (newRowfour.Cells.Count > 8)
{
newRowfour.Cells[8].ReplaceText("{8}", "");
}
// 2. 插入明细行字段映射索引0-8对应模板占位符{0}-{8}
int j = 0;
foreach (var Row in Rows)
{
Row newRowthree = table.InsertRow(previousRowthree, 1 + j);
SetRowBorder(newRowthree);
for (int i = 0; i < 9; i++)
{
if (i < newRowthree.Cells.Count)
{
newRowthree.Cells[i].ReplaceText("{" + i.ToString() + "}", Convert.ToString(Row[i]));
}
}
j++;
}
// 3. 插入分类标题行
Row newRow = table.InsertRow(previousRow, 1);
SetRowBorder(newRow);
newRow.Cells[0].ReplaceText("{0}", string.Format("{0}、{1}", ConvertToChineseUppercase(categoryIndex), categoryName));
for (int i = 1; i < newRow.Cells.Count; i++)
{
if (i < newRow.Cells.Count)
{
newRow.Cells[i].ReplaceText("{" + i.ToString() + "}", "");
}
newRowthree.Cells[i].ReplaceText("{" + i.ToString() + "}", Convert.ToString(Row[i]));
}
document.ReplaceText("{10}", Convert.ToString(Row[10]));
j++;
}
Row newRow = table.InsertRow(previousRow, 1);
newRow.Cells[0].ReplaceText("{0}", string.Format("{0}、{1}", ConvertToChineseUppercase(Index), Convert.ToString(item)));
#endregion
Index--;
}
// 替换系统总价占位符(在文档中全局替换{10}
document.ReplaceText("{10}", systemTotalAmount);
#endregion
}
else if (!List.Contains(FType) && FType != "HH" && FType != "TH")
{
// 假设模板中的表格是第一个表格
var table = document.Tables[1];
Row previousRow = (Row)table.Rows[1];
//for (int i = table.Rows.Count - 4; i >= 1; i--) // 从最后一行开始删除,避免索引超出范围
@@ -273,7 +179,7 @@ namespace Pilot_KD_Parino.Common
foreach (var cell in newRow.Cells)
{
{
// 注意:如果单元格中有多个段落或更复杂的结构,你可能需要遍历它们并分别复制样式
Border Border = new Border() { Size = BorderSize.four, Color = Color.Black };
cell.SetBorder(TableCellBorderType.Left, Border);
cell.SetBorder(TableCellBorderType.Right, Border);
@@ -1113,7 +1019,7 @@ namespace Pilot_KD_Parino.Common
{
FBILLNO = "";
Id = "";
// 调用保存操作
IOperationResult saveResult = BusinessDataServiceHelper.Save(
ctx,
@@ -1152,10 +1058,10 @@ namespace Pilot_KD_Parino.Common
else if (saveResult.IsSuccess == false)
{
saveResult.IsShowMessage = true;
//billView.ShowErrMessage(saveResult.InteractionContext.SimpleMessage);
var dd=saveResult.ValidationErrors.FirstOrDefault();
var dd = saveResult.ValidationErrors.FirstOrDefault();
if (dd != null)
billView.ShowErrMessage(dd.Message);
else
@@ -1614,21 +1520,5 @@ namespace Pilot_KD_Parino.Common
CommonHelper.SaveBill(ctx, billView, saveOption, true, out FID, out FBILLNO);
return FBILLNO;
}
/// <summary>
/// 设置Word表格行的边框样式
/// </summary>
/// <param name="row">表格行</param>
private static void SetRowBorder(Row row)
{
foreach (var cell in row.Cells)
{
Border border = new Border() { Size = BorderSize.four, Color = Color.Black };
cell.SetBorder(TableCellBorderType.Left, border);
cell.SetBorder(TableCellBorderType.Right, border);
cell.SetBorder(TableCellBorderType.Top, border);
cell.SetBorder(TableCellBorderType.Bottom, border);
}
}
}
}

View File

@@ -7,6 +7,7 @@ using Kingdee.BOS.Log;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using NPOI.Util;
using Pilot_KD_Parino.Common;
using System;
using System.ComponentModel;
@@ -153,8 +154,11 @@ namespace Pilot_KD_Parino.Sal_Order
if (FSaleOrderEntry_Link.Count > 0)
{
var details = FSaleOrderEntry_Link[0]["FSaleOrderEntry_Link"] as DynamicObjectCollection;
//string sdas=JsonHelper.ToJson(details);
// Logger.Error("销售订单上游订单的xx ", sdas, new Exception());
string sdas = JsonHelper.ToJson(details);
Logger.Error("销售订单上游订单的xx ", sdas, new Exception());
//var details = this.View.BusinessInfo.GetEntity("FSaleOrderEntry_Link");
//var FbiLLNO = this.View.Model.GetValue("FID");
@@ -164,7 +168,7 @@ namespace Pilot_KD_Parino.Sal_Order
if (entrys != null && entrys.Count > 0)
{
string yuanF_contractnumber = FEntity["F_contractnumber"].ToString();
string yuanF_contractnumber = "";
int i = 0;
foreach (var entry in entrys)
{
@@ -173,14 +177,26 @@ namespace Pilot_KD_Parino.Sal_Order
i++;
var sBillId = entry == null ? 0 : entry["sBillId"].Long2Int();
//销售订单找到上游的销售订单
string getSourceSql = $@"/*dialect*/select F_CONTRACTNUMBER from T_SAL_ORDER where fid={sBillId} ";
var dt333 = DBServiceHelper.ExecuteDynamicObject(this.Context, getSourceSql);
if (dt333 == null || dt333.Count == 0)
{
return;
}
else
{
yuanF_contractnumber = dt333.FirstOrDefault()["F_CONTRACTNUMBER"].ToString();
}
//获取退货类型字段
var F_Returntype = FEntity["F_Returntype"];
//获取纸质合同号
string F_contractnumber = FEntity["F_contractnumber"].ToString();
Logger.Error("销售订单上游订单的合同号", yuanF_contractnumber, new Exception());
Logger.Error("销售订单上游订单的合同号"+ i.ToString(), yuanF_contractnumber, new Exception());
int dashPosition;
if (F_contractnumber.Contains("-TH"))
{