diff --git a/ic/src/private/nc/bs/ic/m45/sign/SignBP.java b/ic/src/private/nc/bs/ic/m45/sign/SignBP.java index a52e3dd..3951916 100644 --- a/ic/src/private/nc/bs/ic/m45/sign/SignBP.java +++ b/ic/src/private/nc/bs/ic/m45/sign/SignBP.java @@ -4,7 +4,7 @@ import com.yonyou.cloud.ncc.plugin.entity.OperationInfo; import nc.bs.ic.general.sign.ISignBP; import nc.bs.ic.general.sign.ISignRuleProvider; import nc.bs.ic.general.sign.SignBPTemplate; -import nc.bs.ic.m45.sign.rule.AfterSigningSynchronizeRuleMES; +import nc.bs.ic.m45.sign.rule.PurchaseReceiptRuleMES; import nc.bs.ic.m45.base.BPPlugInPoint; import nc.bs.ic.m45.insert.rule.InsertOrSignRewritePayPlanInvoiceRule; import nc.bs.ic.m45.sign.rule.*; @@ -51,6 +51,7 @@ public class SignBP implements ISignBP, ISignRuleProvider { - private static final String PURCHASE_IN_URL = "/GTHINKING/AjaxService/N_CGSJJSA/102223002.ashx/CGSH_INSERT"; // 采购收货单同步接口 + + // MES接口URL + private static final String ADD_URL = "/GTHINKING/AjaxService/N_KCSJJS/101527010.ashx/gt_rec_api_cgrkdj"; + private static final String DELETE_URL = "/GTHINKING/AjaxService/N_KCSJJS/101527010.ashx/gt_rec_api_qxcgrkdj"; + private static final String logginfo = "OALOG"; private static final Log obmlog = Log.getInstance(logginfo); private static final BaseDAO dao = new BaseDAO(); @Override - public void process(PurchaseInVO[] purchaseInVOS) { + public void process(PurchaseInVO[] purchaseInVOs) { try { - if (purchaseInVOS == null || purchaseInVOS.length == 0) { - return; - } - - // 检查并筛选采购收货单 - List filteredPurchaseInVOS = checkAndFilterBills(purchaseInVOS); - if (filteredPurchaseInVOS.isEmpty()) { + if (purchaseInVOs == null || purchaseInVOs.length == 0) { return; } // 初始化HTTP请求工具类 IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); - // 处理每个采购收货单 - for (PurchaseInVO purchaseInVO : filteredPurchaseInVOS) { - PurchaseInHeadVO head = purchaseInVO.getHead(); - PurchaseInBodyVO[] bodys = purchaseInVO.getBodys(); - // 构建要发送的数据 - JSONObject syncData = buildSyncData(head, bodys); - // 发送数据到MES系统 - httpPostOtherSys.sendToExternalSystem(PURCHASE_IN_URL, syncData); + for (PurchaseInVO purchaseInVO : purchaseInVOs) { + // 判断是否需要同步到MES + if (!isSyncToMES(purchaseInVO)) { + continue; + } + + PurchaseInHeadVO hvo = (PurchaseInHeadVO) purchaseInVO.getParentVO(); + PurchaseInBodyVO[] bvos = (PurchaseInBodyVO[]) purchaseInVO.getChildrenVO(); + // 构建请求参数 + JSONObject requestParam = buildSyncData(hvo, bvos); + + if (requestParam != null) { + // 获取操作类型 + String operationType = (String) requestParam.get("operation_type"); + // 根据操作类型选择URL + String url = "I".equals(operationType) ? ADD_URL : DELETE_URL; + obmlog.debug("采购入库同步MES-开始处理单据: " + hvo.getVbillcode()); + obmlog.debug("采购入库同步MES-请求参数: " + requestParam.toJSONString()); + // 调用MES接口 + httpPostOtherSys.sendToExternalSystem(url, requestParam); + } } } catch (Exception e) { - obmlog.error("AfterSigningSynchronizeRuleMES-处理异常:" + e.getMessage(), e); + obmlog.error("采购入库同步MES-处理异常:" + e.getMessage(), e); ExceptionUtils.wrappException(e); } } /** - * 检查并筛选需要同步的单据 + * 判断是否需要同步到MES */ - private List checkAndFilterBills(PurchaseInVO[] purchaseInVOS) throws BusinessException { - List result = new ArrayList<>(); - - for (PurchaseInVO vo : purchaseInVOS) { - // 检查组织是否为电缆组织 - if (vo.getHead() != null && "0001A110000000000677".equals(vo.getHead().getPk_org())) { - result.add(vo); - } - } - - return result; - } - - /** - * 构建明细数据 - */ - private JSONArray buildDetailsData(PurchaseInBodyVO[] bodys) throws BusinessException { - JSONArray details = new JSONArray(); - if (bodys != null) { - for (PurchaseInBodyVO body : bodys) { - JSONObject detailItem = new JSONObject(); - // 收货单号(必填) - detailItem.put("orderNo", null); - // 收货单序号(必填)- 使用正确的表体字段crowno - detailItem.put("orderSn", body.getCrowno()); - // 事务类型(必填)- 使用表体字段cbodytranstypecode - detailItem.put("type", null); - // 分类(必填)- H:货款, F:费用, L:劳务 - detailItem.put("costOrder", null); - // 采购订单号 - 来源单据号vsourcebillcode - detailItem.put("poNo", body.getVsourcebillcode()); - // 采购订单序号 - 来源单据行号vsourcerowno - detailItem.put("poSn", body.getVsourcerowno()); - // 物料编码(必填) - String materialCode = transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, - MaterialVO.PK_MATERIAL, body.getCmaterialvid()); - detailItem.put("materialId", materialCode); - // 计量单位(必填)- 使用单位castunitid而不是主单位cunitid - detailItem.put("unit", transferCodeByPk(MeasdocVO.getDefaultTableName(), MeasdocVO.CODE, MeasdocVO.PK_MEASDOC, body.getCastunitid())); - // 物料批号 - detailItem.put("batchNum", null); - // 制令号 - 在PurchaseInBodyVO中没有直接对应字段,可以从vdef字段获取 - detailItem.put("productNum", null); // 假设vdef1存储制令号 - // 换算系数(必填) - String scaleFactor = body.getVchangerate(); - detailItem.put("scaleFactor", transferSpecialField(scaleFactor)); - // TODO 文档必填但是没有对应关系(必填) - UFDouble taxRate = body.getNtaxrate(); - detailItem.put("taxRate", taxRate != null ? taxRate.getDouble() : null); - // 应收数量(必填)- 使用nshouldassistnum - UFDouble recQty = body.getNshouldassistnum(); - detailItem.put("recQty", recQty != null ? recQty.getDouble() : null); - // 主应收数量(必填)- 使用nshouldnum - UFDouble mainRecQty = body.getNshouldnum(); - detailItem.put("mainRecQty", mainRecQty != null ? mainRecQty.getDouble() : null); - // 辅应收数量 - 这可能是自定义字段 - detailItem.put("assitRecQty", null); - // 原币含税价格 - - UFDouble priceIncludeTax = body.getNpickupnum(); - detailItem.put("priceIncludeTax", priceIncludeTax != null ? priceIncludeTax.getDouble() : null); - // 原币含税金额 - 使用norigtaxmny - UFDouble amountIncludeTax = body.getNorigtaxmny(); - detailItem.put("amountIncludeTax", amountIncludeTax != null ? amountIncludeTax.getDouble() : null); - // 原币无税价格 - - UFDouble priceNoTax = body.getNorigprice(); - detailItem.put("priceNoTax", priceNoTax != null ? priceNoTax.getDouble() : null); - // 原币无税金额 - 使用norigmny - UFDouble amountNoTax = body.getNqtnetprice(); - detailItem.put("amountNoTax", amountNoTax != null ? amountNoTax.getDouble() : null); - // 税额 - 使用ntax - UFDouble taxAmount = body.getNtax(); - detailItem.put("taxAmount", taxAmount != null ? taxAmount.getDouble() : null); - // 备注 - 使用vnotebody - detailItem.put("remark", body.getVnotebody()); - // 原收货单信息 - detailItem.put("oldOrderNo", null); - detailItem.put("oldOrderSn", null); - details.add(detailItem); - } - } - return details; + private boolean isSyncToMES(PurchaseInVO purchaseInVO) { + // 此处根据业务规则判断是否需要同步 + return true; } /** * 构建符合MES系统接口规范的请求数据 */ - private JSONObject buildSyncData(PurchaseInHeadVO head, PurchaseInBodyVO[] bodys) throws BusinessException { - // 创建请求数据 + private JSONObject buildSyncData(PurchaseInHeadVO hvo, PurchaseInBodyVO[] bvos) throws BusinessException { + obmlog.debug("采购入库同步MES-开始构建数据: " + hvo.getVbillcode()); + JSONObject requestData = new JSONObject(); - JSONObject data = new JSONObject(); + // 设置操作类型 + requestData.put("operation_type", "I"); // 签字为新增操作 - // 设置收货单主表信息 - // 收货单号(必填) - data.put("orderNo", head.getVbillcode()); - // 收货日期 - UFDate dbilldate = head.getDbilldate(); - data.put("orderDate", dbilldate != null ? dbilldate.toString().substring(0, 10) : null); - // 收货类型 - data.put("orderType", "P"); - // 事务类型 - data.put("type", null); - // 仓库编码 - String storeId = transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.CODE, - StordocVO.PK_STORDOC, head.getCwarehouseid()); - data.put("storeId", storeId); + // 构建data数组 + List dataList = new ArrayList<>(); - // 采购部门ID(必填)- 注意:根据字段字典,采购部门字段为cdptid而不是cdeptid - String departmentId = transferCodeByPk(DeptVersionVO.getDefaultTableName(), DeptVersionVO.CODE, - DeptVersionVO.PK_VID, head.getCdptvid()); - data.put("departmentId", departmentId); - // 采购员 - 采购员字段为cbizid - String purchaser = transferCodeByPk(PsndocVO.getDefaultTableName(), PsndocVO.CODE, - PsndocVO.PK_PSNDOC, head.getCbizid()); - data.put("purchaser", purchaser); - // 供应商编码(必填) - String supplyId = transferCodeByPk(SupplierVO.getDefaultTableName(), SupplierVO.CODE, - SupplierVO.PK_SUPPLIER, head.getCvendorid()); - data.put("supplyId", supplyId); - // 货币ID - data.put("currency", null); - // 汇率(必填) - data.put("rate", null); - // 结算方式 - data.put("settleType", null); - // 开票依据 - data.put("billBasis", null); - // 生成方式(必填)- P:按采购订单, Z:直接生成 - data.put("genType", "P"); - // 分类(必填)- N:货物, Y:费用 - data.put("costOrder", "N"); - // 是否退货(必填)- N:否, Y:是 - data.put("returned", head.getFreplenishflag()); - // 备注 - data.put("remark", head.getVnote()); - // 维护人信息 - data.put("creatorNo", null); // 创建人 - data.put("creator", head.getBillmaker()); // 制单人 - data.put("creatTime", head.getDmakedate() != null ? head.getCreationtime().toString() : null); // 创建时间 + JSONObject dataObj = new JSONObject(); - // 构建明细数据 - JSONArray details = buildDetailsData(bodys); - data.put("Details", details); - requestData.put("Data", data); + // 设置入库单基本信息 + UFDate billDate = hvo.getDbilldate(); + dataObj.put("orderDate", billDate != null ? billDate.toString().substring(0, 10) : ""); // 入库日期 - 格式yyyy-MM-dd + dataObj.put("originalOrderNo", hvo.getVbillcode()); // 采购收货单号 + // 仓库编码 - 使用正确的仓库字段(cwarehouseid) + dataObj.put("warehouseId", transferCodeByPk(StordocVO.getDefaultTableName(), + StordocVO.CODE, StordocVO.PK_STORDOC, hvo.getCwarehouseid())); // 仓库编码 - obmlog.debug("AfterSigningSynchronizeRuleMES-采购收货单请求数据: " + requestData.toJSONString()); + // 部门ID - 采购部门最新版本(cdptid)而非cdptvid,cdptvid是部门版本信息 + dataObj.put("departmentId", transferCodeByPk(DeptVersionVO.getDefaultTableName(), + DeptVersionVO.CODE, DeptVersionVO.PK_VID, hvo.getCdptvid())); // 部门编码 + // 保管员 + dataObj.put("creator", transferCodeByPk(PsndocVO.getDefaultTableName(), + PsndocVO.NAME, PsndocVO.PK_PSNDOC, hvo.getCwhsmanagerid())); // 保管员 + dataObj.put("remark", hvo.getVnote()); // 备注 + // 添加采购员信息 - 来自cbizid字段 + String purchaser = transferCodeByPk(PsndocVO.getDefaultTableName(), + PsndocVO.NAME, PsndocVO.PK_PSNDOC, hvo.getCbizid()); + if (purchaser != null && !purchaser.isEmpty()) { + dataObj.put("purchaser", purchaser); // 采购员 + } + // 添加供应商信息 - 来自cvendorid字段 + String supplier = transferCodeByPk(SupplierVO.getDefaultTableName(), + SupplierVO.CODE, SupplierVO.PK_SUPPLIER, hvo.getCvendorid()); + if (supplier != null && !supplier.isEmpty()) { + dataObj.put("supplierId", supplier); // 供应商编码 + } + // 构建明细 + List detailsList = new ArrayList<>(); + if (bvos != null) { + for (PurchaseInBodyVO bvo : bvos) { + JSONObject detailMap = new JSONObject(); + // TODO 没有字段 + detailMap.put("originalOrderNo", hvo.getVbillcode()); // 采购收货单号 + detailMap.put("sequenceNum", bvo.getCrowno()); // 采购收货单序号 + // 物料编码 - 必填 + detailMap.put("materialId", transferCodeByPk(MaterialVO.getDefaultTableName(), + MaterialVO.CODE, MaterialVO.PK_MATERIAL, bvo.getCmaterialoid())); // 物料编码 + // 库位编码 - 根据字段表使用clocationid而非cspaceid + detailMap.put("storageId", transferCodeByPk(RackVO.getDefaultTableName(), + RackVO.CODE, RackVO.PK_RACK, bvo.getClocationid())); // 库位编码 + detailMap.put("batchNum", bvo.getVbatchcode()); // 物料批号 + // 数量信息 - 根据字段表修正 + UFDouble assistNum = bvo.getNassistnum(); // 实收数量 + detailMap.put("quantity", assistNum != null ? assistNum.doubleValue() : null); // 入库数量 + UFDouble mainNum = bvo.getNnum(); // 实收主数量 + detailMap.put("mQuantity", mainNum != null ? mainNum.doubleValue() : null); // 主入库数量 + // 供应商编码 - 根据字段表使用cvendorid而非csupplierid + detailMap.put("supplierId", transferCodeByPk(SupplierVO.getDefaultTableName(), + SupplierVO.CODE, SupplierVO.PK_SUPPLIER, bvo.getCvendorid())); // 供应商编码 + // 生产日期 - 字段表确认为dproducedate + UFDate produceDate = bvo.getDproducedate(); + if (produceDate != null) { + detailMap.put("manufactureDate", produceDate.toString().substring(0, 10)); + } + detailsList.add(detailMap); + } + } + + dataObj.put("details", detailsList); + dataList.add(dataObj); + + requestData.put("data", dataList); return requestData; } /** - * 转换特殊字段 如 1/1 转换为小数 1.0 + * 根据主键查询对应的编码 */ - - private String transferSpecialField(String field) { - if (field == null || field.trim().isEmpty()) { - return null; - } - String[] split = field.split("/"); - if (split.length == 2) { - String numStr = split[0].trim(); - String denStr = split[1].trim(); - - if (denStr.equals("0")) { - return "0.00"; // 分母不能为零 - } - - try { - BigDecimal numerator = new BigDecimal(numStr); - BigDecimal denominator = new BigDecimal(denStr); - return numerator.divide(denominator, 2, RoundingMode.HALF_UP).toString(); - } catch (NumberFormatException e) { - return field; // 非法数字,返回原字段 - } - } - return field; - } - - /** - * 根据主键查询编码 - */ - private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException { - if (StringUtils.isEmpty(pk)) { + private String transferCodeByPk(String tableName, String selectField, String pkField, Object pk) throws BusinessException { + if (pk == null || "".equals(pk.toString().trim())) { return null; } SqlBuilder sqlBuilder = new SqlBuilder(); sqlBuilder.append(" select " + selectField); sqlBuilder.append(" from " + tableName); sqlBuilder.append(" where "); - sqlBuilder.append(pkField, pk); + sqlBuilder.append(pkField, pk.toString()); Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor()); if (o == null) { - throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】"); + obmlog.warn("未查询到编码信息,sql【" + sqlBuilder + "】"); + return null; } return o.toString(); } diff --git a/ic/src/private/nc/bs/ic/m45/sign/rule/PurchaseReceiptRuleMES.java b/ic/src/private/nc/bs/ic/m45/sign/rule/PurchaseReceiptRuleMES.java new file mode 100644 index 0000000..b4d364b --- /dev/null +++ b/ic/src/private/nc/bs/ic/m45/sign/rule/PurchaseReceiptRuleMES.java @@ -0,0 +1,312 @@ +package nc.bs.ic.m45.sign.rule; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.jdbc.framework.processor.ColumnProcessor; +import nc.vo.bd.material.MaterialVO; +import nc.vo.bd.material.measdoc.MeasdocVO; +import nc.vo.bd.psn.PsndocVO; +import nc.vo.bd.stordoc.StordocVO; +import nc.vo.bd.supplier.SupplierVO; +import nc.vo.cmp.util.StringUtils; +import nc.vo.ic.m45.entity.PurchaseInVO; +import nc.vo.ic.m45.entity.PurchaseInBodyVO; +import nc.vo.ic.m45.entity.PurchaseInHeadVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.pub.SqlBuilder; +import nc.vo.vorg.DeptVersionVO; +import nccloud.pubift.commen.itf.utils.IHttpPostOtherSys; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; + +/** + * (前置)采购收货单推送MES系统,后续调用采购入库 + */ +public class PurchaseReceiptRuleMES implements IRule { + private static final String PURCHASE_IN_URL = "/GTHINKING/AjaxService/N_CGSJJSA/102223002.ashx/CGSH_INSERT"; // 采购收货单同步接口 + private static final String PURCHASE_DELETE_URL = "/GTHINKING/AjaxService/N_CGSJJSA/102223002.ashx/CGSH_DELETE"; // 采购收货单删除接口 + private static final String logginfo = "OALOG"; + private static final Log obmlog = Log.getInstance(logginfo); + private static final BaseDAO dao = new BaseDAO(); + + @Override + public void process(PurchaseInVO[] purchaseInVOS) { + try { + if (purchaseInVOS == null || purchaseInVOS.length == 0) { + return; + } + + // 检查并筛选采购收货单 + List filteredPurchaseInVOS = checkAndFilterBills(purchaseInVOS); + if (filteredPurchaseInVOS.isEmpty()) { + return; + } + + // 初始化HTTP请求工具类 + IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); + + // 处理每个采购收货单 + for (PurchaseInVO purchaseInVO : filteredPurchaseInVOS) { + PurchaseInHeadVO head = purchaseInVO.getHead(); + PurchaseInBodyVO[] bodys = purchaseInVO.getBodys(); + + // 每次新增采购收货单前,先删除第三方系统中已有的数据,再进行新增 + String orderNo = head.getVbillcode(); + boolean deleteSuccess = deletePurchaseReceipt(orderNo); + if (deleteSuccess) { + // 构建要发送的数据 + JSONObject syncData = buildSyncData(head, bodys); + // 发送数据到MES系统 + obmlog.debug("PurchaseReceiptRuleMES-准备发送采购收货单数据: " + orderNo); + httpPostOtherSys.sendToExternalSystem(PURCHASE_IN_URL, syncData); + } + } + } catch (Exception e) { + obmlog.error("AfterSigningSynchronizeRuleMES-处理异常:" + e.getMessage(), e); + ExceptionUtils.wrappException(e); + } + } + + /** + * 删除第三方系统中的采购收货单 + * + * @param orderNo 要删除的采购收货单号 + * @return 删除操作是否成功 + * @throws BusinessException 业务异常 + */ + public boolean deletePurchaseReceipt(String orderNo) throws BusinessException { + try { + if (orderNo == null || orderNo.trim().isEmpty()) { + throw new BusinessException("采购收货单号不能为空"); + } + + obmlog.debug("PurchaseReceiptRuleMES-准备删除第三方系统采购收货单: " + orderNo); + + // 构建请求数据 + JSONObject requestData = new JSONObject(); + JSONObject dataObj = new JSONObject(); + dataObj.put("orderNo", orderNo); + requestData.put("Data", dataObj); + + // 初始化HTTP请求工具类 + IHttpPostOtherSys httpPostOtherSys = NCLocator.getInstance().lookup(IHttpPostOtherSys.class); + + // 发送删除请求 + String response = httpPostOtherSys.callMes(PURCHASE_DELETE_URL, requestData); + obmlog.debug("PurchaseReceiptRuleMES-删除请求返回结果: " + response); + + // 解析返回结果 + JSONObject jsonResponse = JSONObject.parseObject(response); + boolean isSuccess = jsonResponse.getBooleanValue("Success"); + String errorMessage = jsonResponse.getString("ErrorMessage"); + + if (!isSuccess) { + obmlog.error("PurchaseReceiptRuleMES-删除采购收货单失败: " + orderNo + ", 错误信息: " + errorMessage); + throw new BusinessException("删除采购收货单失败: " + (errorMessage != null ? errorMessage : "未知错误")); + } + + obmlog.debug("PurchaseReceiptRuleMES-成功删除采购收货单: " + orderNo); + return true; + } catch (Exception e) { + obmlog.error("PurchaseReceiptRuleMES-删除采购收货单异常:" + e.getMessage(), e); + throw new BusinessException("删除采购收货单时发生异常: " + e.getMessage(), e); + } + } + + /** + * 检查并筛选需要同步的单据 + */ + private List checkAndFilterBills(PurchaseInVO[] purchaseInVOS) throws BusinessException { + List result = new ArrayList<>(); + + for (PurchaseInVO vo : purchaseInVOS) { + // 检查组织是否为电缆组织 + if (vo.getHead() != null && "0001A110000000000677".equals(vo.getHead().getPk_org())) { + result.add(vo); + } + } + + return result; + } + + + /** + * 构建符合MES系统接口规范的请求数据 + */ + private JSONObject buildSyncData(PurchaseInHeadVO head, PurchaseInBodyVO[] bodys) throws BusinessException { + // 创建请求数据 + JSONObject requestData = new JSONObject(); + JSONObject data = new JSONObject(); + // 设置收货单主表信息 + // 收货单号(必填)- 映射为vbillcode + data.put("orderNo", head.getVbillcode()); + // 收货日期 - 映射为dbilldate (格式:yyyy-MM-dd) + UFDate dbilldate = head.getDbilldate(); + data.put("orderDate", dbilldate != null ? dbilldate.toString().substring(0, 10) : null); + // 收货类型 - 默认为"P"(外购) + data.put("orderType", "P"); + // 事务类型 + data.put("type", "WGRK"); + // 仓库编码 - 映射为cwarehouseid + data.put("storeId", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.CODE, + StordocVO.PK_STORDOC, head.getCwarehouseid())); + // 采购部门ID(必填)- 映射为cdptvid + data.put("departmentId", transferCodeByPk(DeptVersionVO.getDefaultTableName(), DeptVersionVO.CODE, + DeptVersionVO.PK_VID, head.getCdptvid())); + // 采购员 - 映射为cbizid + String purchaser = transferCodeByPk(PsndocVO.getDefaultTableName(), PsndocVO.CODE, + PsndocVO.PK_PSNDOC, head.getCbizid()); + data.put("purchaser", purchaser); + // 供应商编码(必填)- 映射为cvendorid + String supplyId = transferCodeByPk(SupplierVO.getDefaultTableName(), SupplierVO.CODE, + SupplierVO.PK_SUPPLIER, head.getCvendorid()); + data.put("supplyId", supplyId); + // 货币ID - 暂无明确映射 + data.put("currency", null); + //汇率(必填) + data.put("rate", 1); + // 结算方式 - 默认为"S"(转账) + data.put("settleType", "S"); + // 开票依据 - 默认为"S"(实收数) + data.put("billBasis", "S"); + // 生成方式(必填)- 默认为"P"(按采购订单) + data.put("genType", "P"); + // 分类(必填)- 默认为"N"(货物) + data.put("costOrder", "N"); + // 是否退货(必填)- 映射为freplenishflag,如果为Y则为退货 + data.put("returned", head.getFreplenishflag()); + // 备注 - 映射为vnote + data.put("remark", head.getVnote()); + // 维护人信息 + data.put("creatorNo", null); // 创建人工号 + data.put("creator", head.getBillmaker()); // 制单人 + data.put("creatTime", head.getDmakedate() != null ? head.getDmakedate().toString() : null); // 创建时间 + // 构建明细数据 + JSONArray details = new JSONArray(); + if (bodys != null) { + for (PurchaseInBodyVO body : bodys) { + JSONObject detailItem = new JSONObject(); + // 收货单号(必填)- 在buildSyncData方法中设置 + detailItem.put("orderNo", dbilldate != null ? dbilldate.toString().substring(0, 10) : null); + // 收货单序号(必填)- 映射为行号(crowno) + detailItem.put("orderSn", body.getCrowno()); + // 事务类型(必填)- 使用表体字段cbodytranstypecode + detailItem.put("type", "WGRK"); + // 分类(必填)- 默认设置为"H" - H:货款, F:费用, L:劳务 + detailItem.put("costOrder", "H"); + // 采购订单号 - 来源单据号(vsourcebillcode) + detailItem.put("poNo", body.getVsourcebillcode()); + // 采购订单序号 - 来源单据行号(vsourcerowno) + detailItem.put("poSn", body.getVsourcerowno()); + // 物料编码(必填)- 映射为cmaterialvid + String materialCode = transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, + MaterialVO.PK_MATERIAL, body.getCmaterialvid()); + detailItem.put("materialId", materialCode); + // 计量单位(必填)- 映射为castunitid而不是cunitid + detailItem.put("unit", transferCodeByPk(MeasdocVO.getDefaultTableName(), MeasdocVO.CODE, + MeasdocVO.PK_MEASDOC, body.getCastunitid())); + // 物料批号 - 映射为vbatchcode + detailItem.put("batchNum", body.getVbatchcode()); + // 制令号 - 在BIP系统中没有对应字段,可以从自定义字段获取 + detailItem.put("productNum", body.getVbdef1()); // 假设存储在自定义字段1中 + // 换算系数(必填)- 映射为vchangerate + String scaleFactor = body.getVchangerate(); + detailItem.put("scaleFactor", transferSpecialField(scaleFactor)); + // 税率(必填)- 映射为ntaxrate + UFDouble taxRate = body.getNtaxrate(); + detailItem.put("taxRate", taxRate != null ? taxRate.doubleValue() : null); + // 应收数量(必填)- 映射为nshouldassistnum + UFDouble recQty = body.getNshouldassistnum(); + detailItem.put("recQty", recQty != null ? recQty.doubleValue() : null); + // 主应收数量(必填)- 映射为nshouldnum + UFDouble mainRecQty = body.getNshouldnum(); + detailItem.put("mainRecQty", mainRecQty != null ? mainRecQty.doubleValue() : null); + // 辅应收数量 - 在BIP系统中没有明确对应字段 + detailItem.put("assitRecQty", null); + // 原币含税价格 - 映射为npickupnum + UFDouble priceIncludeTax = body.getNpickupnum(); + detailItem.put("priceIncludeTax", priceIncludeTax != null ? priceIncludeTax.doubleValue() : null); + // 原币含税金额 - 映射为norigtaxmny + UFDouble amountIncludeTax = body.getNorigtaxmny(); + detailItem.put("amountIncludeTax", amountIncludeTax != null ? amountIncludeTax.doubleValue() : null); + // 原币无税价格 - 映射为norigprice + UFDouble priceNoTax = body.getNorigprice(); + detailItem.put("priceNoTax", priceNoTax != null ? priceNoTax.doubleValue() : null); + // 原币无税金额 - 映射为nqtnetprice + UFDouble amountNoTax = body.getNqtnetprice(); + detailItem.put("amountNoTax", amountNoTax != null ? amountNoTax.doubleValue() : null); + // 税额 - 映射为ntax + UFDouble taxAmount = body.getNtax(); + detailItem.put("taxAmount", taxAmount != null ? taxAmount.doubleValue() : null); + // 备注 - 映射为vnotebody + detailItem.put("remark", body.getVnotebody()); + // 原收货单信息 - 如果是退货单,需要设置原单信息 + detailItem.put("oldOrderNo", null); + detailItem.put("oldOrderSn", null); + details.add(detailItem); + } + } + data.put("Details", details); + requestData.put("Data", data); + obmlog.debug("PurchaseReceiptRuleMES-采购收货单请求数据: " + requestData.toJSONString()); + + return requestData; + } + + /** + * 转换特殊字段 如 1/1 转换为小数 1.0 + */ + + private String transferSpecialField(String field) { + if (field == null || field.trim().isEmpty()) { + return null; + } + String[] split = field.split("/"); + if (split.length == 2) { + String numStr = split[0].trim(); + String denStr = split[1].trim(); + + if (denStr.equals("0")) { + return "0.00"; // 分母不能为零 + } + + try { + BigDecimal numerator = new BigDecimal(numStr); + BigDecimal denominator = new BigDecimal(denStr); + return numerator.divide(denominator, 2, RoundingMode.HALF_UP).toString(); + } catch (NumberFormatException e) { + return field; // 非法数字,返回原字段 + } + } + return field; + } + + /** + * 根据主键查询编码 + */ + private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException { + if (StringUtils.isEmpty(pk)) { + return null; + } + SqlBuilder sqlBuilder = new SqlBuilder(); + sqlBuilder.append(" select " + selectField); + sqlBuilder.append(" from " + tableName); + sqlBuilder.append(" where "); + sqlBuilder.append(pkField, pk); + Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor()); + if (o == null) { + throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】"); + } + return o.toString(); + } +} diff --git a/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleMES.java b/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleMES.java index b38d1d0..5aa473b 100644 --- a/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleMES.java +++ b/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleMES.java @@ -74,10 +74,10 @@ public class AfterSigningSynchronizeRuleMES implements IRule { */ private JSONObject buildSyncData(SaleOutHeadVO hvo, SaleOutBodyVO[] bvos) throws BusinessException { obmlog.debug("AfterSigningSynchronizeRule-开始处理销售出库单: " + hvo.getVbillcode()); - if (!hvo.getPk_org().equals("0001A110000000000677")) { - obmlog.debug("AfterSigningSynchronizeRule-跳过处理销售出库单,因为此单据组织非电缆: " + hvo.getVbillcode()); - return null; - } +// if (!hvo.getPk_org().equals("0001A110000000000677")) { +// obmlog.debug("AfterSigningSynchronizeRule-跳过处理销售出库单,因为此单据组织非电缆: " + hvo.getVbillcode()); +// return null; +// } JSONObject requestData = new JSONObject(); JSONObject dataObj = new JSONObject(); @@ -90,18 +90,17 @@ public class AfterSigningSynchronizeRuleMES implements IRule { dataObj.put("actureDate", dbilldate.toString().substring(0, 10)); // 实际日期 - 单据日期(dbilldate),格式:yyyy-MM-dd dataObj.put("orderType", null); // 收货类型 - 无对应字段 dataObj.put("type", "XSCK"); // 事务类型 - 销售出库 + // 汇率 默认为1 + dataObj.put("exRate", 1); // 部门ID - 部门(cdptvid) dataObj.put("departmentId", transferCodeByPk(DeptVO.getDefaultTableName(), DeptVO.CODE, DeptVO.PK_DEPT, hvo.getCdptvid())); // 采购部门ID // 仓库编码 - 仓库(cwarehouseid) dataObj.put("storeId", transferCodeByPk(RackVO.getDefaultTableName(), RackVO.CODE, RackVO.PK_RACK, hvo.getCwarehouseid())); // 仓库编码 - - // 采购员 - 业务员(cbizpersonid) dataObj.put("purchaser", transferCodeByPk(PsndocVO.getDefaultTableName(), PsndocVO.CODE, PsndocVO.PK_PSNDOC, hvo.getCbizid())); - // 客户ID - 订单客户(ccustomerid),这里因为是采购所以用供应商映射 dataObj.put("supplyId", transferCodeByPk(CustomerVO.getDefaultTableName(), CustomerVO.CODE, CustomerVO.PK_CUSTOMER, hvo.getCcustomerid())); @@ -126,58 +125,45 @@ public class AfterSigningSynchronizeRuleMES implements IRule { //客户ID dataObj.put("customId", transferCodeByPk(CustomerVO.getDefaultTableName(), CustomerVO.CODE, CustomerVO.PK_CUSTOMER, hvo.getCcustomerid())); //生成标志 - dataObj.put("mark", "Y"); + dataObj.put("mark", "W"); //备注 dataObj.put("remark", hvo.getVnote()); - - // 构建Details明细数组 JSONArray details = new JSONArray(); if (bvos != null) { for (SaleOutBodyVO bvo : bvos) { - // 汇率 - dataObj.put("exRate", bvo.getNchangestdrate()); - JSONObject detail = new JSONObject(); detail.put("orderNo", hvo.getVbillcode()); // 提货单ID - 单据号(vbillcode) - 必填 detail.put("sequenceNum", bvo.getCrowno()); // 提货单序号 - 行号(crowno) - 必填 detail.put("type", "XSCK"); // 事务类型 - 默认XSCK - // 来源单据信息 detail.put("saleOrderNo", bvo.getVsourcebillcode()); // SOID - 来源单据号(vsourcebillcode) detail.put("saleSequenceNum", bvo.getVsourcerowno()); // SO序号 - 来源单据行号(vsourcerowno) detail.put("allocationNum", null); // 分配号 - // 物料信息 - 必填 detail.put("materialId", transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, MaterialVO.PK_MATERIAL, bvo.getCmaterialoid())); // 物料ID - 必填 detail.put("unit", transferCodeByPk(MeasdocVO.getDefaultTableName(), MeasdocVO.CODE, MeasdocVO.PK_MEASDOC, bvo.getCunitid())); // 计量单位 - 必填 - detail.put("productNum", null); // 制令号 - // 库位 - 必填 detail.put("storageId", transferCodeByPk(RackVO.getDefaultTableName(), RackVO.CODE, RackVO.PK_RACK, bvo.getClocationid())); // 库位 - 必填 - detail.put("batchNum", bvo.getVbatchcode()); // 物料批号 - 必填 detail.put("scaleFactor", transferSpecialField(bvo.getVchangerate())); // 换算系数 - 必填 - // 数量信息 - 必填 detail.put("issuedQty", bvo.getNshouldassistnum()); // 应发数量 - 必填 detail.put("mIssuedQty", bvo.getNshouldnum()); // 主应发数量 - 必填 detail.put("actQry", bvo.getNassistnum()); // 实发数量 - 必填 detail.put("mActQry", bvo.getNnum()); // 主实发数量 - 必填 detail.put("assistActQry", bvo.getNassistnum()); // 辅助实发数量 - 必填 - // 客户和供应商信息 detail.put("customId", transferCodeByPk(CustomerVO.getDefaultTableName(), CustomerVO.CODE, CustomerVO.PK_CUSTOMER, bvo.getCasscustid())); // 客户ID detail.put("supplierId", transferCodeByPk(SupplierVO.getDefaultTableName(), SupplierVO.CODE, SupplierVO.PK_SUPPLIER, bvo.getCvendorid())); // 供应商ID - detail.put("manufactureDate", bvo.getDproducedate()); // 生产日期 detail.put("color", null); // 颜色 detail.put("properties", null); diff --git a/ic/src/private/nc/bs/ic/m4c/sign/rule/SalesDeliveryOrderRuleMES.java b/ic/src/private/nc/bs/ic/m4c/sign/rule/SalesDeliveryOrderRuleMES.java index eef5f1c..03b0cce 100644 --- a/ic/src/private/nc/bs/ic/m4c/sign/rule/SalesDeliveryOrderRuleMES.java +++ b/ic/src/private/nc/bs/ic/m4c/sign/rule/SalesDeliveryOrderRuleMES.java @@ -12,12 +12,10 @@ import nc.vo.bd.cust.CustomerVO; import nc.vo.bd.material.MaterialVO; import nc.vo.bd.material.measdoc.MeasdocVO; import nc.vo.bd.psn.PsndocVO; -import nc.vo.bd.rack.RackVO; -import nc.vo.bd.supplier.SupplierVO; +import nc.vo.bd.stordoc.StordocVO; import nc.vo.ic.m4c.entity.SaleOutBodyVO; import nc.vo.ic.m4c.entity.SaleOutHeadVO; import nc.vo.ic.m4c.entity.SaleOutVO; -import nc.vo.org.DeptVO; import nc.vo.pub.BusinessException; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.pubapp.pattern.pub.SqlBuilder; @@ -29,12 +27,12 @@ import java.math.RoundingMode; /** - * 销售交货单(BIP无) 推送至MES + * (前置)销售交货单(BIP无) 推送至MES */ public class SalesDeliveryOrderRuleMES implements IRule { private static final BaseDAO dao = new BaseDAO(); // MES系统API接口地址 - private static final String MES_API_URL = "/GTHINKING/AjaxService/N_MISPRO/SalesDeliveryOrder.ashx/SaveData"; + private static final String MES_API_URL = "/GTHINKING/AjaxService/N_XSSJJSA/102397002.ashx/SOTH_INSERT"; // 删除销售交货单接口地址 private static final String MES_DELETE_API_URL = "/GTHINKING/AjaxService/N_XSSJJSA/102397002.ashx/SOTH_DELETE"; private static final Log obmlog = Log.getInstance("OALOG"); @@ -80,10 +78,10 @@ public class SalesDeliveryOrderRuleMES implements IRule { obmlog.debug("SalesDeliveryOrderRuleMES-开始处理销售交货单: " + hvo.getVbillcode()); // 检查组织是否符合条件 - if (!hvo.getPk_org().equals("0001A110000000000677")) { - obmlog.debug("SalesDeliveryOrderRuleMES-跳过处理销售交货单,因为此单据组织非电缆: " + hvo.getVbillcode()); - return null; - } +// if (!hvo.getPk_org().equals("0001A110000000000677")) { +// obmlog.debug("SalesDeliveryOrderRuleMES-跳过处理销售交货单,因为此单据组织非电缆: " + hvo.getVbillcode()); +// return null; +// } JSONObject requestData = new JSONObject(); JSONObject info = new JSONObject(); @@ -106,9 +104,10 @@ public class SalesDeliveryOrderRuleMES implements IRule { info.put("invoicingBasis", "S"); // 必填:开票依据 info.put("settlementType", "S"); // 必填:结算方式 // 仓库编码 - info.put("warehouseId", transferCodeByPk(RackVO.getDefaultTableName(), - RackVO.CODE, RackVO.PK_RACK, hvo.getCwarehouseid())); // 必填:仓库编码 - info.put("type", "XSJH"); // 必填:事务类型,销售交货 + info.put("warehouseId", transferCodeByPk(StordocVO.getDefaultTableName(), + StordocVO.CODE, StordocVO.PK_STORDOC, hvo.getCwarehouseid())); // 必填:仓库编码 + // 必填:事务类型 + info.put("type", "XSCK"); // 必填:生成方式 info.put("genType", "S"); // 必填:是否退货 @@ -123,18 +122,16 @@ public class SalesDeliveryOrderRuleMES implements IRule { info.put("creatorNo", null); // 维护人工号 info.put("creator", null); // 维护人 info.put("creatTime", null); // 维护时间 - + // 表头字段需要表体字段 + // 必填:汇率 + info.put("exchangeRate", 1); + // 必填:货币编码 + info.put("currency", "CNY"); // 构建明细数组 JSONArray details = new JSONArray(); if (bvos != null) { for (SaleOutBodyVO bvo : bvos) { JSONObject detail = new JSONObject(); - // 表头字段需要表体字段 - // 必填:汇率 - info.put("exchangeRate", bvo.getNchangestdrate()); - // 必填:货币编码 - info.put("currency", transferCodeByPk(CurrtypeVO.getDefaultTableName(), - CurrtypeVO.CODE, CurrtypeVO.PK_CURRTYPE, bvo.getCorigcurrencyid())); // 必填字段 detail.put("orderNo", hvo.getVbillcode()); // 必填:交货单号 detail.put("orderSn", bvo.getCrowno()); // 必填:交货单序号 @@ -148,10 +145,9 @@ public class SalesDeliveryOrderRuleMES implements IRule { detail.put("unit", transferCodeByPk(MeasdocVO.getDefaultTableName(), MeasdocVO.CODE, MeasdocVO.PK_MEASDOC, bvo.getCunitid())); // 必填:计量单位 detail.put("scaleFactor", transferSpecialField(bvo.getVchangerate())); // 必填:换算系数 - detail.put("taxRate", bvo.getNtaxrate()); // 必填:税率 - detail.put("recQty", bvo.getNshouldassistnum()); // 必填:应收数量 - detail.put("mainRecQty", bvo.getNnum()); // 必填:主应收数量 - + detail.put("taxRate", bvo.getNtaxrate().getDouble()); // 必填:税率 + detail.put("recQty", bvo.getNshouldassistnum().getDouble()); // 必填:应收数量 + detail.put("mainRecQty", bvo.getNnum().getDouble()); // 必填:主应收数量 // 非必填字段 detail.put("batchNum", null); // 物料批号 detail.put("productNum", null); // 制令号