入库单优化费用汇总逻辑
This commit is contained in:
parent
9551c4f70b
commit
800dae855e
|
|
@ -760,38 +760,6 @@ public class MaterialInbPurchaseApplyPlugin extends AbstractBillPlugIn implement
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取运费对应的费用项目
|
|
||||||
*
|
|
||||||
* @param entryEntity 入库单明细实体
|
|
||||||
* @return 费用项目对象
|
|
||||||
*/
|
|
||||||
private DynamicObject getExpenseItemForFreight(DynamicObject entryEntity) {
|
|
||||||
DynamicObject expenseItem = null;
|
|
||||||
DynamicObject material = entryEntity.getDynamicObject("material");//入库单分录-资源编码
|
|
||||||
if (material != null) {
|
|
||||||
DynamicObject resource = material.getDynamicObject("resource");//入库单分录-资源编码-清单分类
|
|
||||||
if (resource != null) {
|
|
||||||
String resourceNumber = resource.getString("number");//资源编码-清单分类-编码
|
|
||||||
DynamicObject ecbd_resource = BusinessDataServiceHelper.loadSingle("ecbd_resource",
|
|
||||||
"id,zcgj_expenseitem", new QFilter[]{new QFilter("number", QCP.equals, resourceNumber)});//清单分类
|
|
||||||
expenseItem = ecbd_resource.getDynamicObject("zcgj_expenseitem");//费用项目
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果没有找到对应的费用项目,使用默认的运费费用项目
|
|
||||||
if (expenseItem == null) {
|
|
||||||
DynamicObject ecbd_resource = BusinessDataServiceHelper.loadSingle("ecbd_resource",
|
|
||||||
"id,zcgj_expenseitem", new QFilter[]{new QFilter("number", QCP.equals, "ZCKS07")});//清单分类-固定运费
|
|
||||||
if (ecbd_resource != null) {
|
|
||||||
expenseItem = ecbd_resource.getDynamicObject("zcgj_expenseitem");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return expenseItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理发票号码汇总逻辑
|
* 处理发票号码汇总逻辑
|
||||||
*
|
*
|
||||||
|
|
@ -890,74 +858,31 @@ public class MaterialInbPurchaseApplyPlugin extends AbstractBillPlugIn implement
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查找或创建运费行
|
|
||||||
*
|
|
||||||
* @param expenseSummaryCollection 费用汇总分录集合
|
|
||||||
* @return 运费行对象
|
|
||||||
*/
|
|
||||||
private DynamicObject findOrCreateFreightLine(DynamicObjectCollection expenseSummaryCollection) {
|
|
||||||
// 查找现有的运费行
|
|
||||||
for (DynamicObject line : expenseSummaryCollection) {
|
|
||||||
if (Boolean.TRUE.equals(line.getBoolean("zcgj_isfreightline"))) {
|
|
||||||
return line;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果没有找到,创建新的运费行
|
|
||||||
DynamicObjectType expenseSummaryType = expenseSummaryCollection.getDynamicObjectType();
|
|
||||||
DynamicObject freightLine = new DynamicObject(expenseSummaryType);
|
|
||||||
freightLine.set("zcgj_isfreightline", true); // 标识为运费行
|
|
||||||
return freightLine;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清除除运费行外的所有行
|
|
||||||
*
|
|
||||||
* @param expenseSummaryCollection 费用汇总分录集合
|
|
||||||
*/
|
|
||||||
private void clearNonFreightLines(DynamicObjectCollection expenseSummaryCollection) {
|
|
||||||
Iterator<DynamicObject> iterator = expenseSummaryCollection.iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
DynamicObject line = iterator.next();
|
|
||||||
if (!Boolean.TRUE.equals(line.getBoolean("zcgj_isfreightline"))) {
|
|
||||||
iterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新运费行数据
|
|
||||||
*
|
|
||||||
* @param freightLine 运费行对象
|
|
||||||
*/
|
|
||||||
private void updateFreightLineData(DynamicObject freightLine) {
|
|
||||||
freightLine.set("zcgj_pa_amount", getModel().getValue("transoftaxamount"));//价税合计-含税总运费
|
|
||||||
freightLine.set("zcgj_amountnotax", getModel().getValue("transamount"));//不含税金额-总运费
|
|
||||||
DynamicObject entryTaxRate = (DynamicObject) getModel().getValue("taxrate");
|
|
||||||
if (entryTaxRate != null) {
|
|
||||||
freightLine.set("zcgj_rateval", entryTaxRate.get("taxrate"));//税率(%)-运费税率
|
|
||||||
}
|
|
||||||
freightLine.set("zcgj_taxamt", getModel().getValue("transtaxamount"));//税额-运费总税额
|
|
||||||
|
|
||||||
DynamicObject ecbd_resource = BusinessDataServiceHelper.loadSingle("ecbd_resource",
|
|
||||||
"id,zcgj_expenseitem", new QFilter[]{new QFilter("number", QCP.equals, "ZCKS07")});//清单分类-固定运费
|
|
||||||
|
|
||||||
if (ecbd_resource != null) {
|
|
||||||
DynamicObject expenseItem = ecbd_resource.getDynamicObject("zcgj_expenseitem");//运费对应费用项目
|
|
||||||
freightLine.set("zcgj_shippingcostitem", expenseItem);//运费费用项目
|
|
||||||
freightLine.set("zcgj_expenseitem", expenseItem);//费用项目-对应费用项目
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按费用项目和税率组合合并费用汇总条目
|
* 按费用项目和税率组合合并费用汇总条目
|
||||||
*
|
*
|
||||||
* @param expenseSummaryCollection 费用汇总集合
|
* @param expenseSummaryCollection 费用汇总集合
|
||||||
*/
|
*/
|
||||||
private void mergeExpenseSummaryEntriesByExpenseItemAndRate(DynamicObjectCollection expenseSummaryCollection) {
|
private void mergeExpenseSummaryEntriesByExpenseItemAndRate(DynamicObjectCollection expenseSummaryCollection) {
|
||||||
// 使用Map来存储已存在的费用项目+税率组合,避免嵌套循环
|
// 获取是否合并结算的设置
|
||||||
|
Boolean combinedSettlement = (Boolean) this.getModel().getValue("zcgj_combinedsettlemen");//物资及运费同时结算
|
||||||
|
|
||||||
|
if (combinedSettlement != null && combinedSettlement) {
|
||||||
|
// 如果zcgj_combinedsettlemen为true,允许运费行和非运费行合并
|
||||||
|
mergeAllEntriesByExpenseItemAndRate(expenseSummaryCollection);
|
||||||
|
} else {
|
||||||
|
// 如果zcgj_combinedsettlemen为false,运费行和非运费行分开处理
|
||||||
|
mergeEntriesSeparatelyByExpenseItemAndRate(expenseSummaryCollection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并所有条目(不区分运费行和非运费行)
|
||||||
|
*
|
||||||
|
* @param expenseSummaryCollection 费用汇总集合
|
||||||
|
*/
|
||||||
|
private void mergeAllEntriesByExpenseItemAndRate(DynamicObjectCollection expenseSummaryCollection) {
|
||||||
|
// 使用Map来存储已存在的费用项目+税率组合
|
||||||
Map<String, DynamicObject> expenseItemRateMap = new HashMap<>();
|
Map<String, DynamicObject> expenseItemRateMap = new HashMap<>();
|
||||||
|
|
||||||
for (int i = 0; i < expenseSummaryCollection.size(); i++) {
|
for (int i = 0; i < expenseSummaryCollection.size(); i++) {
|
||||||
|
|
@ -999,6 +924,90 @@ public class MaterialInbPurchaseApplyPlugin extends AbstractBillPlugIn implement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分开合并条目(区分运费行和非运费行)
|
||||||
|
*
|
||||||
|
* @param expenseSummaryCollection 费用汇总集合
|
||||||
|
*/
|
||||||
|
private void mergeEntriesSeparatelyByExpenseItemAndRate(DynamicObjectCollection expenseSummaryCollection) {
|
||||||
|
// 使用Map来存储已存在的费用项目+税率组合,避免嵌套循环
|
||||||
|
// 分别处理运费行和非运费行
|
||||||
|
Map<String, DynamicObject> freightItemRateMap = new HashMap<>(); // 运费行映射
|
||||||
|
Map<String, DynamicObject> nonFreightItemRateMap = new HashMap<>(); // 非运费行映射
|
||||||
|
|
||||||
|
for (int i = 0; i < expenseSummaryCollection.size(); i++) {
|
||||||
|
DynamicObject currentEntry = expenseSummaryCollection.get(i);
|
||||||
|
Boolean isFreightLine = currentEntry.getBoolean("zcgj_isfreightline"); // 是否是运费行
|
||||||
|
|
||||||
|
Object currentExpenseItem = currentEntry.get("zcgj_expenseitem"); // 费用项目
|
||||||
|
Object currentRate = currentEntry.get("zcgj_rateval"); // 税率
|
||||||
|
|
||||||
|
// 创建唯一键值:费用项目ID + 税率值
|
||||||
|
String key = (currentExpenseItem != null ? currentExpenseItem.toString() : "null") +
|
||||||
|
"_" +
|
||||||
|
(currentRate != null ? currentRate.toString() : "null");
|
||||||
|
|
||||||
|
if (Boolean.TRUE.equals(isFreightLine)) {
|
||||||
|
// 处理运费行
|
||||||
|
if (freightItemRateMap.containsKey(key)) {
|
||||||
|
// 如果已存在相同组合的运费行,则合并数值
|
||||||
|
DynamicObject existingEntry = freightItemRateMap.get(key);
|
||||||
|
|
||||||
|
// 合并价税合计
|
||||||
|
BigDecimal currentAmount = toBigDecimal(existingEntry.get("zcgj_pa_amount"));
|
||||||
|
BigDecimal nextAmount = toBigDecimal(currentEntry.get("zcgj_pa_amount"));
|
||||||
|
existingEntry.set("zcgj_pa_amount", currentAmount.add(nextAmount));
|
||||||
|
|
||||||
|
// 合并不含税金额
|
||||||
|
BigDecimal currentAmountNoTax = toBigDecimal(existingEntry.get("zcgj_amountnotax"));
|
||||||
|
BigDecimal nextAmountNoTax = toBigDecimal(currentEntry.get("zcgj_amountnotax"));
|
||||||
|
existingEntry.set("zcgj_amountnotax", currentAmountNoTax.add(nextAmountNoTax));
|
||||||
|
|
||||||
|
// 合并税额
|
||||||
|
BigDecimal currentTaxAmt = toBigDecimal(existingEntry.get("zcgj_taxamt"));
|
||||||
|
BigDecimal nextTaxAmt = toBigDecimal(currentEntry.get("zcgj_taxamt"));
|
||||||
|
existingEntry.set("zcgj_taxamt", currentTaxAmt.add(nextTaxAmt));
|
||||||
|
|
||||||
|
// 移除当前条目
|
||||||
|
expenseSummaryCollection.remove(i);
|
||||||
|
i--; // 调整索引
|
||||||
|
} else {
|
||||||
|
// 如果不存在相同组合的运费行,则添加到Map中
|
||||||
|
freightItemRateMap.put(key, currentEntry);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 处理非运费行
|
||||||
|
if (nonFreightItemRateMap.containsKey(key)) {
|
||||||
|
// 如果已存在相同组合的非运费行,则合并数值
|
||||||
|
DynamicObject existingEntry = nonFreightItemRateMap.get(key);
|
||||||
|
|
||||||
|
// 合并价税合计
|
||||||
|
BigDecimal currentAmount = toBigDecimal(existingEntry.get("zcgj_pa_amount"));
|
||||||
|
BigDecimal nextAmount = toBigDecimal(currentEntry.get("zcgj_pa_amount"));
|
||||||
|
existingEntry.set("zcgj_pa_amount", currentAmount.add(nextAmount));
|
||||||
|
|
||||||
|
// 合并不含税金额
|
||||||
|
BigDecimal currentAmountNoTax = toBigDecimal(existingEntry.get("zcgj_amountnotax"));
|
||||||
|
BigDecimal nextAmountNoTax = toBigDecimal(currentEntry.get("zcgj_amountnotax"));
|
||||||
|
existingEntry.set("zcgj_amountnotax", currentAmountNoTax.add(nextAmountNoTax));
|
||||||
|
|
||||||
|
// 合并税额
|
||||||
|
BigDecimal currentTaxAmt = toBigDecimal(existingEntry.get("zcgj_taxamt"));
|
||||||
|
BigDecimal nextTaxAmt = toBigDecimal(currentEntry.get("zcgj_taxamt"));
|
||||||
|
existingEntry.set("zcgj_taxamt", currentTaxAmt.add(nextTaxAmt));
|
||||||
|
|
||||||
|
// 移除当前条目
|
||||||
|
expenseSummaryCollection.remove(i);
|
||||||
|
i--; // 调整索引
|
||||||
|
} else {
|
||||||
|
// 如果不存在相同组合的非运费行,则添加到Map中
|
||||||
|
nonFreightItemRateMap.put(key, currentEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将对象转换为BigDecimal类型
|
* 将对象转换为BigDecimal类型
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue