From 92059e36b16e375b28b99170f1d82fd82a0d4b06 Mon Sep 17 00:00:00 2001 From: weiyunlong Date: Tue, 4 Mar 2025 14:27:27 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E5=90=88=E5=90=8C=E6=B8=85?= =?UTF-8?q?=E5=8D=95=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S --- .../recon/formplugin/ContractFormPlugin.java | 240 ++++++++++-------- 1 file changed, 136 insertions(+), 104 deletions(-) diff --git a/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java b/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java index c6e2879..dda6987 100644 --- a/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java +++ b/main/java/shkd/repc/recon/formplugin/ContractFormPlugin.java @@ -60,20 +60,19 @@ import java.util.regex.Pattern; * qeug_recon_supplyconb_ext 补充合同 * qeug_recon_temptofixb_ext 暂转固 */ -public class ContractFormPlugin extends AbstractFormPlugin implements UploadListener, BasedataEditListener, IDataModelChangeListener { +public class ContractFormPlugin extends AbstractFormPlugin implements UploadListener, BasedataEditListener, IDataModelChangeListener { private static final Log logger = LogFactory.getLog(ContractFormPlugin.class); private static final String BASEDATA_FIELD = "multitypepartya"; - @Override public void initialize() { super.initialize(); this.getModel().addDataModelChangeListener(this); BasedataEdit mulEdit = this.getControl(BASEDATA_FIELD); - if (mulEdit!=null){ + if (mulEdit != null) { mulEdit.addBasedataEditListener(this); } } @@ -83,7 +82,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis BasedataEdit edit = (BasedataEdit) afterBindingDataEvent.getSource(); DynamicObject dataEntity = this.getModel().getDataEntity(true); DynamicObject basedata_field = dataEntity.getDynamicObject(BASEDATA_FIELD); - if (!basedata_field.getDynamicObjectType().getName().equals("bos_org")){ + if (!basedata_field.getDynamicObjectType().getName().equals("bos_org")) { return; } Object v = afterBindingDataEvent.getDataEntity(); @@ -117,8 +116,8 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis Object pkValue = basedata_field.getPkValue(); String name = dt.getName(); DynamicObject single = BusinessDataServiceHelper.loadSingle(pkValue, name); - if (!single.getString(nameKey).isEmpty()){ - displayProp = String.format("%s", single.getString(nameKey)); + if (!single.getString(nameKey).isEmpty()) { + displayProp = String.format("%s", single.getString(nameKey)); } //设置显示属性 afterBindingDataEvent.setDisplayProp(displayProp.toString()); @@ -164,15 +163,16 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis // } } } + /** * 删除汇总明细并且删除清单明细 */ - private boolean deleteList(){ + private boolean deleteList() { boolean result = true; //合同清单汇总分录 DynamicObjectCollection qeug_invoiceentryinfos = this.getView().getModel().getEntryEntity("qeug_invoiceentryinfo"); //删除对应明细数据 - long pkValue = (long)this.getModel().getDataEntity().getPkValue(); + long pkValue = (long) this.getModel().getDataEntity().getPkValue(); if (0 == pkValue) { result = false; return result; @@ -182,9 +182,9 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis for (DynamicObject qeug_invoiceentryinfo : qeug_invoiceentryinfos) { String qeugSummarycontent = qeug_invoiceentryinfo.getString("qeug_summarycontent");//分录中的汇总内容(sheet名字) q2 = new QFilter("qeug_sheetname", QCP.equals, qeugSummarycontent); - DynamicObject qeug_contractsummarylist = BusinessDataServiceHelper.loadSingle("qeug_contractsummarylist", new QFilter[]{q1,q2}); + DynamicObject qeug_contractsummarylist = BusinessDataServiceHelper.loadSingle("qeug_contractsummarylist", new QFilter[]{q1, q2}); if (null != qeug_contractsummarylist) { - int qeug_contractsummarylist1 = DeleteServiceHelper.delete("qeug_contractsummarylist", new QFilter[]{q1,q2}); + int qeug_contractsummarylist1 = DeleteServiceHelper.delete("qeug_contractsummarylist", new QFilter[]{q1, q2}); //失败 if (0 == qeug_contractsummarylist1) { this.getView().showTipNotification("删除失败:请联系管理员"); @@ -196,7 +196,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis int size = qeug_invoiceentryinfos.size(); //删除单据体数据 for (int i = 0; i < size; i++) { - this.getView().getModel().deleteEntryRow("qeug_invoiceentryinfo",0); + this.getView().getModel().deleteEntryRow("qeug_invoiceentryinfo", 0); } // SaveServiceHelper.save(new DynamicObject[]{this.getModel().getDataEntity(true)}); this.getView().invokeOperation("save"); @@ -211,7 +211,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis super.propertyChanged(e); String name = e.getProperty().getName();//字段名称 - if("qeug_chmentpanel_f".equals(name)){ + if ("qeug_chmentpanel_f".equals(name)) { Object qeugChmentpanelF = this.getModel().getValue("qeug_chmentpanel_f"); if (qeugChmentpanelF instanceof Number) { int pkLongValue = ((Number) qeugChmentpanelF).intValue(); // 转换为 long @@ -220,14 +220,14 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis this.getView().updateView("qeug_invoiceentryinfo"); } } - }else if("qeug_marginlevel".equals(name)){ + } else if ("qeug_marginlevel".equals(name)) { int qeug_bondentry = this.getModel().getEntryCurrentRowIndex("qeug_bondentry"); - BigDecimal qeug_marginlevel = (BigDecimal)this.getModel().getValue("qeug_marginlevel", qeug_bondentry); + BigDecimal qeug_marginlevel = (BigDecimal) this.getModel().getValue("qeug_marginlevel", qeug_bondentry); DynamicObjectCollection qeugBondentrys = this.getModel().getEntryEntity("qeug_bondentry");//保证金明细 BigDecimal qeugMarginlevel = BigDecimal.ZERO; if (qeugBondentrys.size() > 0) { for (DynamicObject qeugBondentry : qeugBondentrys) { - qeugMarginlevel = qeugMarginlevel.add(qeugBondentry.getBigDecimal("qeug_marginlevel")) ; + qeugMarginlevel = qeugMarginlevel.add(qeugBondentry.getBigDecimal("qeug_marginlevel")); } } if (qeugMarginlevel.compareTo(BigDecimal.valueOf(100)) > 0) { @@ -287,6 +287,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis InputStream in = urlConnection.getInputStream(); // FileInputStream in = new FileInputStream(fileUrl); Workbook workbook = WorkbookFactory.create(in); + FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); /** * --------------------------------------明细------------------------------------------------ @@ -296,7 +297,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis ArrayList dynamicObjects = new ArrayList<>(); Map amounttotalMap = new HashMap<>(); for (Sheet sheet : workbook) { - int rowNum = 0; + int rowNum = 0; // 获取总行数 int rowCountsheet = sheet.getPhysicalNumberOfRows();//总行数 for (Row cells : sheet) { @@ -310,7 +311,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis break; } } - BigDecimal amounttotal =BigDecimal.ZERO; + BigDecimal amounttotal = BigDecimal.ZERO; for (int j = rowNum; j <= rowCountsheet - 2; j++) { Row row = sheet.getRow(j); //第一列断号 @@ -329,121 +330,118 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis //合同明细清单 qeug_contractsummarylist // 存合同id,sheet名字 DynamicObject contractsummarylist = BusinessDataServiceHelper.newDynamicObject("qeug_contractsummarylist"); - contractsummarylist.set("enable","1");//使用状态 - contractsummarylist.set("status","A");//数据状态 - contractsummarylist.set("qeug_contractid",this.getModel().getDataEntity().getPkValue().toString());//合同id - contractsummarylist.set("qeug_sheetname",sheet.getSheetName());//sheet名字 + contractsummarylist.set("enable", "1");//使用状态 + contractsummarylist.set("status", "A");//数据状态 + contractsummarylist.set("qeug_contractid", this.getModel().getDataEntity().getPkValue().toString());//合同id + contractsummarylist.set("qeug_sheetname", sheet.getSheetName());//sheet名字 for (Cell cell : row) { int columnIndex = cell.getColumnIndex(); - switch (columnIndex){ + switch (columnIndex) { case 0: double num = Double.parseDouble(cell.toString()); - int result = (int)num; - contractsummarylist.set("qeug_seqs",result);//序号 + int result = (int) num; + contractsummarylist.set("qeug_seqs", result);//序号 break; case 1: - contractsummarylist.set("qeug_projectnumber",cell);//项目编码 + contractsummarylist.set("qeug_projectnumber", cell);//项目编码 break; case 2: - contractsummarylist.set("qeug_projectname",cell);//项目名称 + contractsummarylist.set("qeug_projectname", cell);//项目名称 break; case 3: - contractsummarylist.set("qeug_featuredescript",cell);//项目特征描述 + contractsummarylist.set("qeug_featuredescript", cell);//项目特征描述 break; case 4: - contractsummarylist.set("qeug_engincontent",cell);//工程内容 + contractsummarylist.set("qeug_engincontent", cell);//工程内容 break; case 5: - contractsummarylist.set("qeug_unit",cell);//计量单位 + contractsummarylist.set("qeug_unit", cell);//计量单位 break; case 6: - if (StringUtils.isNotEmpty(cell.toString())) { - String expression = cell.toString(); - ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); + String value6 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value6)) { try { - BigDecimal results =BigDecimal.valueOf(Double.parseDouble(engine.eval(expression).toString())); + BigDecimal results = new BigDecimal(value6); contractsummarylist.set("qeug_decimalqty", results); - } catch (Exception e) { - this.getView().showErrorNotification("清单汇总识别--生成明细失败:"+e.getMessage()); - return ; - // 处理计算失败的情况 + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 数量列格式错误"); + return; } } break; case 7: - if (StringUtils.isNotEmpty(cell.toString())) { - String expression = cell.toString(); - ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); + String value7 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value7)) { try { - BigDecimal results =BigDecimal.valueOf(Double.parseDouble(engine.eval(expression).toString())); - contractsummarylist.set("qeug_unitprice",results);//综合单价 - } catch (Exception e) { - this.getView().showErrorNotification("清单汇总识别--生成明细失败:"+e.getMessage()); - return ; - // 处理计算失败的情况 + BigDecimal results = new BigDecimal(value7); + contractsummarylist.set("qeug_unitprice", results);// 综合单价 + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 单价列格式错误"); + return; } } break; case 8: - //todo:保留几位有效数字 - Cell cell1 = row.getCell(6); - Cell cell2 = row.getCell(7); - if (cell1 != null && cell2 != null && StringUtils.isNotEmpty(cell1.toString()) && StringUtils.isNotEmpty(cell2.toString())) { - BigDecimal results = BigDecimal.ZERO; + String value8 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value8)) { try { - double value1 = cell1.getNumericCellValue(); - double value2 = cell2.getNumericCellValue(); - results = BigDecimal.valueOf(value1 * value2).setScale(3, RoundingMode.HALF_UP); + BigDecimal results = new BigDecimal(value8); + // 保留三位小数,采用四舍五入的舍入模式 + results = results.setScale(3, RoundingMode.HALF_UP); contractsummarylist.set("qeug_amounttotal", results); // 合计金额 - } catch (Exception e) { - this.getView().showErrorNotification("清单汇总识别--生成明细失败:" + e.getMessage()); + amounttotal = amounttotal.add(results); + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 合计金额列格式错误"); return; } - amounttotal = amounttotal.add(results); } break; -// case 8: -// Cell cell1 = row.getCell(6); -// Cell cell2 = row.getCell(7); -// if (StringUtils.isNotEmpty(cell.toString())) { -// String expression = cell.toString(); -// ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); -// BigDecimal results = BigDecimal.ZERO; -// try { -// results =BigDecimal.valueOf(Double.parseDouble(engine.eval(expression).toString())); -// contractsummarylist.set("qeug_amounttotal",results);//综合单价 -// } catch (Exception e) { -// this.getView().showErrorNotification("清单汇总识别--生成明细失败:"+e.getMessage()); -// return ; -// // 处理计算失败的情况 -// } -// amounttotal = amounttotal.add(results); -// } -// break; case 9: - if (StringUtils.isNotEmpty(cell.toString())) { - contractsummarylist.set("qeug_artificial",BigDecimal.valueOf(Double.parseDouble(cell.toString())));//人工单价 + String value9 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value9)) { + try { + contractsummarylist.set("qeug_artificial", new BigDecimal(value9));// 人工单价 + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 人工单价列格式错误"); + return; + } } break; case 10: - if (StringUtils.isNotEmpty(cell.toString())) { - contractsummarylist.set("qeug_provisional",BigDecimal.valueOf(Double.parseDouble(cell.toString())));//辅材单价 + String value10 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value10)) { + try { + contractsummarylist.set("qeug_provisional", new BigDecimal(value10));// 辅材单价 + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 辅材单价列格式错误"); + return; + } } break; case 11: - if (StringUtils.isNotEmpty(cell.toString())) { - contractsummarylist.set("qeug_unitpriceofmainmater",BigDecimal.valueOf(Double.parseDouble(cell.toString())));//主材单价 + String value11 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value11)) { + try { + contractsummarylist.set("qeug_unitpriceofmainmater", new BigDecimal(value11));// 主材单价 + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 主材单价列格式错误"); + return; + } } break; case 12: - if (StringUtils.isNotEmpty(cell.toString())) { - contractsummarylist.set("qeug_mechanicalunitprice",BigDecimal.valueOf(Double.parseDouble(cell.toString())));//机械,设备单价 + String value12 = getCellValueAsString(cell, evaluator); + if (StringUtils.isNotEmpty(value12)) { + try { + contractsummarylist.set("qeug_mechanicalunitprice", new BigDecimal(value12));// 机械,设备单价 + } catch (NumberFormatException e) { + this.getView().showErrorNotification("清单汇总识别--生成明细失败: 机械设备单价列格式错误"); + return; + } } break; case 13: - if (StringUtils.isNotEmpty(cell.toString())) { - contractsummarylist.set("qeug_remarks",cell);//备注 - } + contractsummarylist.set("qeug_remarks", getCellValueAsString(cell, evaluator));// 备注 break; default: break; @@ -451,7 +449,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis } dynamicObjects.add(contractsummarylist); } - amounttotalMap.put(sheet.getSheetName(),amounttotal);//一个sheet一个总金额 + amounttotalMap.put(sheet.getSheetName(), amounttotal);//一个sheet一个总金额 // this.getView().showSuccessNotification("清单汇总识别--生产明细成功"); } for (DynamicObject dynamicObject : dynamicObjects) { @@ -469,15 +467,15 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis Sheet sheet = workbook.getSheetAt(i); qeugInvoiceentryinfo.addNew(); - this.getModel().setValue("qeug_seq", i+1,i);//序号 - this.getModel().setValue("qeug_summarycontent", sheet.getSheetName(),i);//汇总内容 + this.getModel().setValue("qeug_seq", i + 1, i);//序号 + this.getModel().setValue("qeug_summarycontent", sheet.getSheetName(), i);//汇总内容 BigDecimal bigDecimal = amounttotalMap.get(sheet.getSheetName()); - this.getModel().setValue("qeug_amount", bigDecimal,i);//金额(元) - this.getModel().setValue("qeug_isnew", false,i);//是否新增行 + this.getModel().setValue("qeug_amount", bigDecimal, i);//金额(元) + this.getModel().setValue("qeug_isnew", false, i);//是否新增行 DynamicObject bd_currency = BusinessDataServiceHelper.loadSingle("bd_currency", new QFilter[]{new QFilter("number", QCP.equals, "CNY")}); if (null != bd_currency) { - this.getModel().setValue("qeug_currencylist", bd_currency,i);//清单币别 + this.getModel().setValue("qeug_currencylist", bd_currency, i);//清单币别 } } @@ -491,7 +489,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis } break; - //下载清单模板 + //下载清单模板 case "downloadlist": DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("qeug_downloadlist", new QFilter[]{new QFilter("number", QCP.equals, "MB-0001")}); if (null != dynamicObject) { @@ -510,12 +508,45 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis } } + private String getCellValueAsString(Cell cell, FormulaEvaluator evaluator) { + if (cell == null) { + return ""; + } + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + // 如果是日期格式,可根据需要进行处理 + return cell.getDateCellValue().toString(); + } else { + return String.valueOf(cell.getNumericCellValue()); + } + case BOOLEAN: + return String.valueOf(cell.getBooleanCellValue()); + case FORMULA: + CellValue cellValue = evaluator.evaluate(cell); + switch (cellValue.getCellType()) { + case NUMERIC: + return String.valueOf(cellValue.getNumberValue()); + case STRING: + return cellValue.getStringValue(); + case BOOLEAN: + return String.valueOf(cellValue.getBooleanValue()); + default: + return ""; + } + default: + return ""; + } + } + private static boolean isRowEmpty(Row row) { if (row == null) { return true; } for (Cell cell : row) { - if (cell!= null && cell.getCellType()!= CellType.BLANK) { + if (cell != null && cell.getCellType() != CellType.BLANK) { return false; } } @@ -525,7 +556,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis private static String[] getRowData(Row row) { List rowDataList = new ArrayList<>(); for (Cell cell : row) { - if (cell!= null) { + if (cell != null) { if (cell.getCellType() == CellType.STRING) { rowDataList.add(cell.getStringCellValue()); } else if (cell.getCellType() == CellType.NUMERIC) { @@ -562,7 +593,7 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis //分录--查看合同清单明细按钮 case "operationcolumnap": int index = this.getModel().getEntryCurrentRowIndex("qeug_invoiceentryinfo"); - boolean qeugIsnew = (boolean)this.getModel().getValue("qeug_isnew", index); + boolean qeugIsnew = (boolean) this.getModel().getValue("qeug_isnew", index); if (qeugIsnew) { this.getView().showTipNotification("新增行无法查看明细"); return; @@ -571,22 +602,22 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis break; case "deleteentry1": //用户在删除汇总明细时,如果当前汇总已经生成清单,一并删除掉 - EntryGrid qeug_invoiceentryinfo = (EntryGrid)this.getView().getControl("qeug_invoiceentryinfo"); + EntryGrid qeug_invoiceentryinfo = (EntryGrid) this.getView().getControl("qeug_invoiceentryinfo"); int[] selectRows = qeug_invoiceentryinfo.getSelectRows(); if (selectRows.length > 0) { for (int i = 0; i < selectRows.length; i++) { int selectRow = selectRows[i]; - long pkValue = (long)this.getModel().getDataEntity().getPkValue(); + long pkValue = (long) this.getModel().getDataEntity().getPkValue(); if (0 == pkValue) { return; } - String qeug_summarycontent = (String)this.getModel().getValue("qeug_summarycontent",selectRow);//分录中的汇总内容(sheet名字) + String qeug_summarycontent = (String) this.getModel().getValue("qeug_summarycontent", selectRow);//分录中的汇总内容(sheet名字) QFilter q1 = new QFilter("qeug_sheetname", QCP.equals, qeug_summarycontent); QFilter q2 = new QFilter("qeug_contractid", QCP.equals, String.valueOf(pkValue)); - DynamicObject qeug_contractsummarylist = BusinessDataServiceHelper.loadSingle("qeug_contractsummarylist", new QFilter[]{q1,q2}); + DynamicObject qeug_contractsummarylist = BusinessDataServiceHelper.loadSingle("qeug_contractsummarylist", new QFilter[]{q1, q2}); if (null != qeug_contractsummarylist) { - int qeug_contractsummarylist1 = DeleteServiceHelper.delete("qeug_contractsummarylist", new QFilter[]{q1,q2}); + int qeug_contractsummarylist1 = DeleteServiceHelper.delete("qeug_contractsummarylist", new QFilter[]{q1, q2}); //失败 if (0 == qeug_contractsummarylist1) { this.getView().showTipNotification("删除失败:请联系管理员"); @@ -604,8 +635,9 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis /** * 打开列表展示清单详情页 + * * @param formView 页面 - * @param model 模型 + * @param model 模型 */ private void getListShowParamer(IFormView formView, IDataModel model) { @@ -624,8 +656,8 @@ public class ContractFormPlugin extends AbstractFormPlugin implements UploadLis Object pkValue = formView.getModel().getDataEntity().getPkValue();//合同ID QFilter q1 = new QFilter("qeug_sheetname", QCP.equals, qeug_summarycontent); - QFilter q2 = new QFilter("qeug_contractid",QCP.equals, String.valueOf(pkValue)); - QFilter q3 = new QFilter("qeug_workloadcfmid",QCP.equals, ""); + QFilter q2 = new QFilter("qeug_contractid", QCP.equals, String.valueOf(pkValue)); + QFilter q3 = new QFilter("qeug_workloadcfmid", QCP.equals, ""); List listQF = Lists.newArrayList(); listQF.add(q1.and(q2).and(q3)); parameter.setListFilterParameter(new ListFilterParameter(listQF, null));