diff --git a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInbPurchaseApplyPlugin.java b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInbPurchaseApplyPlugin.java index cc97047..82bba8c 100644 --- a/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInbPurchaseApplyPlugin.java +++ b/code/zcdev/zcgj-zcdev-zcdev-pr/src/main/java/zcgj/zcdev/zcdev/pr/plugin/form/MaterialInbPurchaseApplyPlugin.java @@ -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; } - - /** - * 查找或创建运费行 - * - * @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 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 费用汇总集合 */ 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 expenseItemRateMap = new HashMap<>(); 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 freightItemRateMap = new HashMap<>(); // 运费行映射 + Map 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类型 *