// 将两个订购XML片断合并 // 当旧的和新的都是全管辖范围内,就允许新的全部替换旧的;否则只允许替换<distribute>元素内容 // parameters: // strLibraryCodeList 当前用户管辖的分馆代码列表 // strMergedXml [out]范围订购<root>元素的InnerXml // return: // -1 出错 // 0 正常 // 1 发生了超越范围的修改 public static int MergeOrderNode(XmlNode exist_node, XmlNode new_node, string strLibraryCodeList, out string strMergedXml, out string strError) { strError = ""; strMergedXml = ""; int nRet = 0; Debug.Assert(SessionInfo.IsGlobalUser(strLibraryCodeList) == false, "全局用户不应调用函数 MergeOrderNode()"); string strExistDistribute = DomUtil.GetElementText(exist_node, "distribute"); string strNewDistribute = DomUtil.GetElementText(new_node, "distribute"); bool bExistControlled = true; bool bNewControlled = true; if (string.IsNullOrEmpty(strExistDistribute) == false) { // 观察一个馆藏分配字符串,看看是否在当前用户管辖范围内 // return: // -1 出错 // 0 超过管辖范围。strError中有解释 // 1 在管辖范围内 nRet = DistributeInControlled(strExistDistribute, strLibraryCodeList, out strError); if (nRet == -1) { return(-1); } if (nRet == 0) { bExistControlled = false; } } if (string.IsNullOrEmpty(strNewDistribute) == false) { // 观察一个馆藏分配字符串,看看是否在当前用户管辖范围内 // return: // -1 出错 // 0 超过管辖范围。strError中有解释 // 1 在管辖范围内 nRet = DistributeInControlled(strNewDistribute, strLibraryCodeList, out strError); if (nRet == -1) { return(-1); } if (nRet == 0) { bNewControlled = false; } } if (bExistControlled == true && bNewControlled == true) { // 当旧的和新的都是全管辖范围内,就允许新的全部替换旧的 strMergedXml = new_node.InnerXml; return(0); } string strExistCopy = DomUtil.GetElementText(exist_node, "copy"); string strExistPrice = DomUtil.GetElementText(exist_node, "price"); string strChangedCopy = DomUtil.GetElementText(new_node, "copy"); string strChangedPrice = DomUtil.GetElementText(new_node, "price"); // 比较两个复本字符串 { ParseOldNewValue(strExistCopy, out string strExistOldValue, out string strExistNewValue); ParseOldNewValue(strChangedCopy, out string strChangedOldValue, out string strChangedNewValue); if (strExistOldValue != strChangedOldValue) { strError = "订购套数(方括号左边的部分)不允许修改。(原来='" + strExistCopy + "',新的='" + strChangedCopy + "')"; return(1); } // 检查验收套数的改变,是否正好和distribute字符串内的改变吻合 } // 比较两个价格字符串 { ParseOldNewValue(strExistPrice, out string strExistOldValue, out string strExistNewValue); ParseOldNewValue(strChangedPrice, out string strChangedOldValue, out string strChangedNewValue); // 避免用 == 判断。用 IsEqual 判断,可以把 CNY10.00 和 10.00 视作等同 if (PriceUtil.IsEqual(strExistOldValue, strChangedOldValue) == false) { strError = "订购价(方括号左边的部分)不允许修改。(原来='" + strExistPrice + "',新的='" + strChangedPrice + "')"; return(1); } if (PriceUtil.IsEqual(strExistNewValue, strChangedNewValue) == false) { strError = "验收价(方括号中的部分)不允许修改。(原来='" + strExistPrice + "',新的='" + strChangedPrice + "')"; return(1); } } LocationCollection new_locations = new LocationCollection(); nRet = new_locations.Build(strNewDistribute, out strError); if (nRet == -1) { strError = "馆藏分配字符串 '" + strNewDistribute + "' 格式不正确"; return(-1); } LocationCollection exist_locations = new LocationCollection(); nRet = exist_locations.Build(strExistDistribute, out strError); if (nRet == -1) { strError = "馆藏分配字符串 '" + strExistDistribute + "' 格式不正确"; return(-1); } if (exist_locations.Count != new_locations.Count) { strError = "馆藏分配事项个数发生了改变(原来=" + exist_locations.Count.ToString() + ",新的=" + new_locations.Count.ToString() + ")"; return(1); } for (int i = 0; i < exist_locations.Count; i++) { Location exist_location = exist_locations[i]; Location new_location = new_locations[i]; if (exist_location.Name != new_location.Name) { // 进一步检查是否馆代码部分改变了 // 解析 LibraryApplication.ParseCalendarName(exist_location.Name, out string strCode1, out string strPureName); LibraryApplication.ParseCalendarName(new_location.Name, out string strCode2, out strPureName); // 只要馆代码部分不改变即可 if (strCode1 != strCode2) { strError = "第 " + (i + 1).ToString() + " 个馆藏分配事项的名字(的馆代码部分)发生改变 (原来='" + exist_location.Name + "',新的='" + new_location.Name + "')"; return(1); } } if (exist_location.RefID != new_location.RefID) { // 解析 LibraryApplication.ParseCalendarName(exist_location.Name, out string strLibraryCode, out string strPureName); if (StringUtil.IsInList(strLibraryCode, strLibraryCodeList) == false) { strError = "馆代码 '" + strLibraryCode + "' 不在范围 '" + strLibraryCodeList + "' 内,不允许进行收登操作。"; return(1); } } } // 将旧的XML片断装入,只修改里面的三个元素值。这样可以保证三个元素以外的原记录内容不被修改 XmlDocument dom = new XmlDocument(); try { dom.LoadXml(exist_node.OuterXml); } catch (Exception ex) { strError = "exist_node.OuterXml装入XMLDOM失败: " + ex.Message; return(-1); } DomUtil.SetElementText(dom.DocumentElement, "copy", strChangedCopy); DomUtil.SetElementText(dom.DocumentElement, "price", strChangedPrice); DomUtil.SetElementText(dom.DocumentElement, "distribute", strNewDistribute); strMergedXml = dom.DocumentElement.InnerXml; return(0); }