diff --git a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncDeleteQcQmsRule.java b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncDeleteQcQmsRule.java index d4824fd3..6b68c180 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncDeleteQcQmsRule.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncDeleteQcQmsRule.java @@ -49,8 +49,10 @@ public class SyncDeleteQcQmsRule implements IRule { throw new BusinessException("箱变的QMS接口缺少配置"); } Set firstIds = new HashSet<>(); - List cfirstbids =new ArrayList<>(); - // 查询上游到货单的数据 + List cfirstbids = new ArrayList<>(); + // 收集被删除的质检报告明细(关键优化:直接从删除的VO中获取,避免查库丢失) + List deletedItems = new ArrayList<>(); + for (ReportVO vo : reportVOS) { ReportItemVO[] bvo = vo.getBVO(); if (bvo == null) { @@ -59,13 +61,15 @@ public class SyncDeleteQcQmsRule implements IRule { for (ReportItemVO itemVO : bvo) { firstIds.add(itemVO.getCfirstid()); cfirstbids.add(itemVO.getCfirstbid()); + deletedItems.add(itemVO); // 保存被删除的明细 } } if (!firstIds.isEmpty()) { - // 上游到货单 + // 查询上游到货单 BillQuery billquery = new BillQuery(ArriveVO.class); ArriveVO[] arriveVOS = billquery.query(firstIds.toArray(new String[0])); - buildSyncData(arriveVOS,cfirstbids); + // 传递删除的明细到构建方法 + buildSyncData(arriveVOS, cfirstbids, deletedItems); } } catch (Exception e) { logger.error("SyncQcQmsRule-exp:" + e.getMessage(), e); @@ -74,21 +78,21 @@ public class SyncDeleteQcQmsRule implements IRule { } /** - * 构建同步数据 - * - * @param arriveVOS 到货单VO + * 构建同步数据(新增deletedItems参数,接收被删除的明细) */ - private void buildSyncData(ArriveVO[] arriveVOS,List cfirstbids) throws BusinessException { + private void buildSyncData(ArriveVO[] arriveVOS, List cfirstbids, List deletedItems) throws BusinessException { for (ArriveVO arriveVO : arriveVOS) { ArriveHeaderVO hvo = arriveVO.getHVO(); ArriveItemVO[] bvo = arriveVO.getBVO(); String pk_arriveorder = hvo.getPk_arriveorder(); String pkOrg = hvo.getPk_org(); - // 判断物料的业务单元是否是箱变公司,不是则跳过 + + // 判断业务单元是否为箱变公司,不是则跳过 String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); if (checkIfOrg(orgCode, configParams)) { continue; } + // 查询供应商信息 String pk_supplier_v = hvo.getPk_supplier_v(); SupplierVersionVO supplierVersionVO = new SupplierVersionVO(); @@ -96,49 +100,76 @@ public class SyncDeleteQcQmsRule implements IRule { ISupplierBaseInfoQryService baseQryService = NCLocator.getInstance().lookup(ISupplierBaseInfoQryService.class); supplierVersionVO = baseQryService.querySupplierVersionByVID(pk_supplier_v); } + // 制单人名称 String creatorName = MyHelper.getStrValByCondition("sm_user", UserVO.USER_NAME, UserVO.CUSERID + " = '" + hvo.getBillmaker() + "'"); JSONObject singleObj = new JSONObject(); // 采购合同号 String cghth = getCghthVal(hvo, bvo); - // 启源送检单主表 + + // 组装主表数据 long cts = System.currentTimeMillis(); singleObj.put("batchid", cts); - singleObj.put("csdh", hvo.getVbillcode());// 送检单号,BIP到货单号 - singleObj.put("sjrq", hvo.getDmakedate().toString());// 送检日期,格式建议为 yyyy-MM-dd + singleObj.put("csdh", hvo.getVbillcode());// 送检单号(到货单号) + singleObj.put("sjrq", hvo.getDmakedate().toString());// 送检日期 singleObj.put("wlgysid", supplierVersionVO.getCode());// 供应商编码 singleObj.put("wlgysmc", supplierVersionVO.getName());// 供应商名称 - singleObj.put("sjr", creatorName);// 送检人,BIP制单人 - singleObj.put("cghth", cghth);// 采购合同号,关联对应的采购合同 - singleObj.put("bz", hvo.getVmemo());// 摘要备注,用于填写送检单的补充说明信息 - // 查询关联的质检报告-传入启源送检单的明细 + singleObj.put("sjr", creatorName);// 送检人(制单人) + singleObj.put("cghth", cghth);// 采购合同号 + singleObj.put("bz", hvo.getVmemo());// 备注 + + // 合并:数据库现存明细 + 被删除的明细(关键优化:确保删除的记录被包含) HYPubBO hybo = new HYPubBO(); - ReportItemVO[] reportItemVOS = (ReportItemVO[]) hybo.queryByCondition(ReportItemVO.class, " cfirstid = '" + pk_arriveorder + "'"); + // 查询数据库中现存的明细 + ReportItemVO[] dbItems = (ReportItemVO[]) hybo.queryByCondition(ReportItemVO.class, " cfirstid = '" + pk_arriveorder + "'"); + // 筛选被删除的明细中属于当前到货单的记录 + List currentDeletedItems = new ArrayList<>(); + for (ReportItemVO delItem : deletedItems) { + if (pk_arriveorder.equals(delItem.getCfirstid())) { + currentDeletedItems.add(delItem); + } + } + // 合并为总明细列表 + List allItems = new ArrayList<>(); + if (dbItems != null) { + allItems.addAll(Arrays.asList(dbItems)); + } + allItems.addAll(currentDeletedItems); + + // 处理明细数据 JSONArray contentArray = new JSONArray(); - for (ReportItemVO reportItemVO : reportItemVOS) { + for (ReportItemVO reportItemVO : allItems) { String pkReportbill = reportItemVO.getPk_reportbill(); ReportHeaderVO reportHeaderVO = (ReportHeaderVO) hybo.queryByPrimaryKey(ReportHeaderVO.class, pkReportbill); + // 若质检单已删除,可能查不到header,做非空保护 + if (reportHeaderVO == null) { + reportHeaderVO = new ReportHeaderVO(); + } + String pkMaterial = reportHeaderVO.getPk_material(); Map materialMap = MyHelper.getMapValByCondition(MaterialVO.getDefaultTableName(), "code,name,materialspec,materialtype", "pk_material = '" + pkMaterial + "'"); String cunitid = reportHeaderVO.getCunitid();// 主单位 String cunitname = MyHelper.getStrValByCondition(MeasdocVO.getDefaultTableName(), MeasdocVO.NAME, MeasdocVO.PK_MEASDOC + " = '" + cunitid + "'"); + JSONObject itemObj = new JSONObject(); itemObj.put("wlbh", materialMap.getOrDefault("code", "")); // 物料编码 itemObj.put("wlmc", materialMap.getOrDefault("name", "")); // 物料名称 String materialtype = skipNull(materialMap.get("materialtype")); String materialspec = skipNull(materialMap.get("materialspec")); itemObj.put("wlxhgg", materialtype + materialspec); // 物料型号规格 - if(cfirstbids.contains(reportItemVO.getCfirstbid())){ - itemObj.put("sjsl", "0"); // 送检数量(设计单位),按设计计量单位统计的送检数量 - }else{ - itemObj.put("sjsl", reportHeaderVO.getNapplynum().toString()); // 送检数量(设计单位),按设计计量单位统计的送检数量 + + // 被删除的明细标记为0(关键逻辑) + if (cfirstbids.contains(reportItemVO.getCfirstbid())) { + itemObj.put("sjsl", "0"); // 删除的记录数量设为0 + } else { + itemObj.put("sjsl", reportHeaderVO.getNapplynum() != null ? reportHeaderVO.getNapplynum().toString() : "0"); } itemObj.put("jldw", cunitname); // 计量单位 - itemObj.put("bz", reportItemVO.getVbdef1()); // 明细备注,用于填写该送检物料的补充说明 + itemObj.put("bz", reportItemVO.getVbdef1()); // 明细备注 itemObj.put("bipzyid", pkReportbill); // 质检报告ID itemObj.put("bipqdid", reportItemVO.getPk_reportbill_b()); // 质检报告明细ID contentArray.add(itemObj); @@ -148,10 +179,10 @@ public class SyncDeleteQcQmsRule implements IRule { } } + // 以下方法与原逻辑一致,未做修改 private String getCghthVal(ArriveHeaderVO hvo, ArriveItemVO[] bvo) throws BusinessException { String cghth = ""; String pkPupsndoc = hvo.getPk_pupsndoc(); - // 查询采购员名称 String name = ""; if (pkPupsndoc != null && !pkPupsndoc.isEmpty() && !"~".equals(pkPupsndoc)) { name = MyHelper.getStrValByCondition(PsndocVO.getDefaultTableName(), PsndocVO.NAME, @@ -177,94 +208,7 @@ public class SyncDeleteQcQmsRule implements IRule { return cghth; } - private void buildSyncData1(ReportVO[] useVOs) throws BusinessException { - for (ReportVO vo : useVOs) { - ReportHeaderVO hvo = vo.getHVO(); - ReportItemVO[] bvo = vo.getBVO(); - // 判断物料的业务单元是否是箱变公司,不是则跳过 - String pkOrg = hvo.getPk_org(); - String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); - if (checkIfOrg(orgCode, configParams)) { - continue; - } - // 查询供应商信息 - String pk_supplier_v = hvo.getPk_supplier_v(); - SupplierVersionVO supplierVersionVO = new SupplierVersionVO(); - if (pk_supplier_v != null && !pk_supplier_v.isEmpty() && !"~".equals(pk_supplier_v)) { - ISupplierBaseInfoQryService baseQryService = NCLocator.getInstance().lookup(ISupplierBaseInfoQryService.class); - supplierVersionVO = baseQryService.querySupplierVersionByVID(pk_supplier_v); - } - // 查询人员信息 - String pkApplyer = hvo.getPk_applyer(); - String applyerName = MyHelper.getStrValByCondition(PsndocVO.getDefaultTableName(), PsndocVO.NAME, - PsndocVO.PK_PSNDOC + " = '" + pkApplyer + "'"); - String bz = "", cghth = ""; - if (bvo != null && bvo.length > 0) { - bz = bvo[0].getVbdef1(); // BOM备注 - cghth = bvo[0].getVbdef2(); // 采购单号 - } - // 组装数据 - JSONObject singleObj = new JSONObject(); - long cts = System.currentTimeMillis(); - singleObj.put("batchid", cts); - singleObj.put("csdh", hvo.getVapplybillcode());// 送检单号,采购送检单的唯一标识编号 - singleObj.put("sjrq", hvo.getDapplydate().toString());// 送检日期,格式建议为 yyyy-MM-dd - singleObj.put("wlgysid", supplierVersionVO.getCode());// 供应商编码 - singleObj.put("wlgysmc", supplierVersionVO.getName());// 供应商名称 - singleObj.put("sjr", applyerName);// 送检人,负责提交送检单的人员姓名 - singleObj.put("cghth", cghth);// 采购合同号,关联对应的采购合同 - singleObj.put("bz", hvo.getVmemo());// 摘要备注,用于填写送检单的补充说明信息 - - String pkMaterial = hvo.getPk_material(); - Map materialMap = MyHelper.getMapValByCondition(MaterialVO.getDefaultTableName(), "code,name,materialspec,materialtype", - "pk_material = '" + pkMaterial + "'"); - String cunitid = hvo.getCunitid();// 主单位 - String cunitname = MyHelper.getStrValByCondition(MeasdocVO.getDefaultTableName(), MeasdocVO.NAME, - MeasdocVO.PK_MEASDOC + " = '" + cunitid + "'"); - // 处理Content数组 - JSONArray contentArray = new JSONArray(); - JSONObject itemObj = new JSONObject(); - itemObj.put("wlbh", materialMap.getOrDefault("code", "")); // 物料编码 - itemObj.put("wlmc", materialMap.getOrDefault("name", "")); // 物料名称 - String materialtype = skipNull(materialMap.get("materialtype")); - String materialspec = skipNull(materialMap.get("materialspec")); - itemObj.put("wlxhgg", materialtype + materialspec); // 物料型号规格 - itemObj.put("sjsl", "0"); // 送检数量(设计单位),按设计计量单位统计的送检数量 - itemObj.put("jldw", cunitname); // 计量单位 - itemObj.put("bz", bz); // 明细备注,用于填写该送检物料的补充说明 - contentArray.add(itemObj); - - singleObj.put("Content", contentArray); -/* { - "batchid": "10002", - "csdh": "SJ202405001", - "sjrq": "2024-05-20", - "wlgysid": "GY001", - "wlgysmc": "XX 金属材料有限公司", - "sjr": "张三", - "cghth": "HT202405003", - "bz": "紧急送检,需优先检测", - "Content": [ - { - "wlbh": "ACC26711", - "wlmc": "铜排", - "wlxhgg": "15558190831", - "jldw": "米", - "sjsl": "50", - "bz": "无特殊要求" - } - ] - }*/ - pushData(singleObj); - } - } - - /** - * 推送同步数据 - */ private void pushData(JSONObject param) throws BusinessException { - // String jsonString = param.toJSONString(); - // 转json字符串的时候保留null值 String jsonStr = JSON.toJSONString(param, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty @@ -306,4 +250,4 @@ public class SyncDeleteQcQmsRule implements IRule { return value.toString().trim(); } -} +} \ No newline at end of file