返回列表 上一筆 下一筆

📄 資料內容

import org.apache.axis.message.MessageElement;

import org.w3c.dom.*;

import java.rmi.RemoteException;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

import java.time.format.DateTimeParseException;

import java.util.*;



/** same formatter as transformTree */

private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

private static final DateTimeFormatter FMT_FALLBACK = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");



/**

 * iftSid:

 *   0 = content only

 *   1 = content + attachments (attachments will be appended after content)

 *   2 = attachments only   (here we still parse as SearchHitBean with sfq_name/ifq_sid if service returns them)

 */

public List<SearchHitBean> getSearchContent(Integer iftSid, String strTxt, String userType) throws RemoteException {

    List<SearchHitBean> out = new ArrayList<>();



    WsGetFullTextSearchResponseWsGetFullTextSearchResult result = null;

    WsGetAttachSearchResponseWsGetAttachSearchResult attachResult = null;



    switch (iftSid) {

        case 0:

            result = service.wsGetFullTextSearch(strValidCode, 1, channelMap.get(userType), 100, strTxt, 0, "fq_hit");

            LOGGER.info(vaildLog("### method:getSearchContent, webservice:wsGetFullTextSearch"));

            LOGGER.info(vaildLog("### req:" + "wsGetFullTextSearch(" + strValidCode + ", 1, "

                    + channelMap.get(userType) + ", 100, " + strTxt + ", 0, fq_hit)"));

            break;

        case 1:

            result = service.wsGetFullTextSearch(strValidCode, 1, channelMap.get(userType), 100, strTxt, 0, "fq_hit");

            LOGGER.info(vaildLog("### method:getSearchContent, webservice:wsGetFullTextSearch"));

            LOGGER.info(vaildLog("### req:" + "wsGetFullTextSearch(" + strValidCode + ", 1, "

                    + channelMap.get(userType) + ", 100, " + strTxt + ", 0, fq_hit)"));



            attachResult = service.wsGetAttachSearch(strValidCode, 1, channelMap.get(userType), 100, strTxt, 0);

            LOGGER.info(vaildLog("### method:getSearchContent, webservice:wsGetAttachSearch"));

            LOGGER.info(vaildLog("### req:" + "wsGetAttachSearch(" + strValidCode + ", 1, "

                    + channelMap.get(userType) + ", 100, " + strTxt + ", 0)"));

            break;

        case 2:

            attachResult = service.wsGetAttachSearch(strValidCode, 1, channelMap.get(userType), 100, strTxt, 0);

            LOGGER.info(vaildLog("### method:getSearchContent, webservice:wsGetAttachSearch"));

            LOGGER.info(vaildLog("### req:" + "wsGetAttachSearch(" + strValidCode + ", 1, "

                    + channelMap.get(userType) + ", 100, " + strTxt + ", 0)"));

            break;

        default:

            return out;

    }



    // Use a set to de-dup by ifq_sid (like your original "seen" map)

    Set<String> seen = new HashSet<>();



    // --- content results: iterate in REVERSE order (to mimic your previous UI ordering) ---

    if (result != null) {

        MessageElement[] anyArr = result.get_any();

        LOGGER.info(vaildLog("### data:" + (anyArr != null && anyArr.length > 0 ? anyArr[0] : "null")));



        Element diffgram = pickDiffgram(anyArr);

        if (diffgram != null) {

            Element dataRoot = firstChildElementByLocalName(diffgram, "IQKB");

            if (dataRoot == null) dataRoot = diffgram;



            NodeList rows = dataRoot.getElementsByTagName("FullTextSearch");

            for (int i = rows.getLength() - 1; i >= 0; i--) { // reverse

                Element row = (Element) rows.item(i);



                String ifqSid   = getChildText(row, "ifq_sid");

                if (ifqSid.isBlank() || seen.contains(ifqSid)) continue;



                SearchHitBean hit = new SearchHitBean.Builder()

                        .ifqSid(ifqSid)

                        .iftSid(getChildText(row, "ift_sid"))

                        .sftName(getChildText(row, "sft_name"))

                        .sfqName(getChildText(row, "sfq_name"))

                        .ifqHit(parseIntOrNull(getChildText(row, "ifq_hits")))

                        .initTime(parseDateTimeSafely(getChildText(row, "dinit_time")))

                        .modiTime(parseDateTimeSafely(getChildText(row, "dmodi_time")))

                        .build();



                seen.add(ifqSid);

                out.add(hit);

            }

        }

    }



    // --- attachment results (if required): normal order append ---

    if (attachResult != null) {

        MessageElement[] anyArr = attachResult.get_any();

        Element diffgram = pickDiffgram(anyArr);

        if (diffgram != null) {

            Element dataRoot = firstChildElementByLocalName(diffgram, "IQKB");

            if (dataRoot == null) dataRoot = diffgram;



            // Some attach search responses also return <FullTextSearch>-like rows with ifq_sid/sfq_name

            // If your schema differs, adjust the row tag & fields accordingly.

            NodeList rows = dataRoot.getElementsByTagName("FullTextSearch");

            for (int i = 0; i < rows.getLength(); i++) {

                Element row = (Element) rows.item(i);



                String ifqSid = getChildText(row, "ifq_sid");

                if (ifqSid.isBlank() || seen.contains(ifqSid)) continue;



                SearchHitBean hit = new SearchHitBean.Builder()

                        .ifqSid(ifqSid)

                        .iftSid(getChildText(row, "ift_sid"))

                        .sftName(getChildText(row, "sft_name"))

                        .sfqName(getChildText(row, "sfq_name"))

                        .ifqHit(parseIntOrNull(getChildText(row, "ifq_hits")))

                        .initTime(parseDateTimeSafely(getChildText(row, "dinit_time")))

                        .modiTime(parseDateTimeSafely(getChildText(row, "dmodi_time")))

                        .build();



                seen.add(ifqSid);

                out.add(hit);

            }

        }

    }



    return out;

}

🔐 Base64 編碼內容

aW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5tZXNzYWdlLk1lc3NhZ2VFbGVtZW50OwoKaW1wb3J0IG9yZy53M2MuZG9tLio7CgppbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwoKaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOwoKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CgppbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZVBhcnNlRXhjZXB0aW9uOwoKaW1wb3J0IGphdmEudXRpbC4qOwoKCgovKiogc2FtZSBmb3JtYXR0ZXIgYXMgdHJhbnNmb3JtVHJlZSAqLwoKcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZVRpbWVGb3JtYXR0ZXIgRk9STUFUVEVSID0gRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ5eXl5L01NL2RkIEhIOm1tOnNzIik7Cgpwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRlVGltZUZvcm1hdHRlciBGTVRfRkFMTEJBQ0sgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oInl5eXktTU0tZGQgSEg6bW06c3MiKTsKCgoKLyoqCgogKiBpZnRTaWQ6CgogKiAgIDAgPSBjb250ZW50IG9ubHkKCiAqICAgMSA9IGNvbnRlbnQgKyBhdHRhY2htZW50cyAoYXR0YWNobWVudHMgd2lsbCBiZSBhcHBlbmRlZCBhZnRlciBjb250ZW50KQoKICogICAyID0gYXR0YWNobWVudHMgb25seSAgIChoZXJlIHdlIHN0aWxsIHBhcnNlIGFzIFNlYXJjaEhpdEJlYW4gd2l0aCBzZnFfbmFtZS9pZnFfc2lkIGlmIHNlcnZpY2UgcmV0dXJucyB0aGVtKQoKICovCgpwdWJsaWMgTGlzdDxTZWFyY2hIaXRCZWFuPiBnZXRTZWFyY2hDb250ZW50KEludGVnZXIgaWZ0U2lkLCBTdHJpbmcgc3RyVHh0LCBTdHJpbmcgdXNlclR5cGUpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewoKICAgIExpc3Q8U2VhcmNoSGl0QmVhbj4gb3V0ID0gbmV3IEFycmF5TGlzdDw+KCk7CgoKCiAgICBXc0dldEZ1bGxUZXh0U2VhcmNoUmVzcG9uc2VXc0dldEZ1bGxUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCA9IG51bGw7CgogICAgV3NHZXRBdHRhY2hTZWFyY2hSZXNwb25zZVdzR2V0QXR0YWNoU2VhcmNoUmVzdWx0IGF0dGFjaFJlc3VsdCA9IG51bGw7CgoKCiAgICBzd2l0Y2ggKGlmdFNpZCkgewoKICAgICAgICBjYXNlIDA6CgogICAgICAgICAgICByZXN1bHQgPSBzZXJ2aWNlLndzR2V0RnVsbFRleHRTZWFyY2goc3RyVmFsaWRDb2RlLCAxLCBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSksIDEwMCwgc3RyVHh0LCAwLCAiZnFfaGl0Iik7CgogICAgICAgICAgICBMT0dHRVIuaW5mbyh2YWlsZExvZygiIyMjIG1ldGhvZDpnZXRTZWFyY2hDb250ZW50LCB3ZWJzZXJ2aWNlOndzR2V0RnVsbFRleHRTZWFyY2giKSk7CgogICAgICAgICAgICBMT0dHRVIuaW5mbyh2YWlsZExvZygiIyMjIHJlcToiICsgIndzR2V0RnVsbFRleHRTZWFyY2goIiArIHN0clZhbGlkQ29kZSArICIsIDEsICIKCiAgICAgICAgICAgICAgICAgICAgKyBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSkgKyAiLCAxMDAsICIgKyBzdHJUeHQgKyAiLCAwLCBmcV9oaXQpIikpOwoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMToKCiAgICAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2Uud3NHZXRGdWxsVGV4dFNlYXJjaChzdHJWYWxpZENvZGUsIDEsIGNoYW5uZWxNYXAuZ2V0KHVzZXJUeXBlKSwgMTAwLCBzdHJUeHQsIDAsICJmcV9oaXQiKTsKCiAgICAgICAgICAgIExPR0dFUi5pbmZvKHZhaWxkTG9nKCIjIyMgbWV0aG9kOmdldFNlYXJjaENvbnRlbnQsIHdlYnNlcnZpY2U6d3NHZXRGdWxsVGV4dFNlYXJjaCIpKTsKCiAgICAgICAgICAgIExPR0dFUi5pbmZvKHZhaWxkTG9nKCIjIyMgcmVxOiIgKyAid3NHZXRGdWxsVGV4dFNlYXJjaCgiICsgc3RyVmFsaWRDb2RlICsgIiwgMSwgIgoKICAgICAgICAgICAgICAgICAgICArIGNoYW5uZWxNYXAuZ2V0KHVzZXJUeXBlKSArICIsIDEwMCwgIiArIHN0clR4dCArICIsIDAsIGZxX2hpdCkiKSk7CgoKCiAgICAgICAgICAgIGF0dGFjaFJlc3VsdCA9IHNlcnZpY2Uud3NHZXRBdHRhY2hTZWFyY2goc3RyVmFsaWRDb2RlLCAxLCBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSksIDEwMCwgc3RyVHh0LCAwKTsKCiAgICAgICAgICAgIExPR0dFUi5pbmZvKHZhaWxkTG9nKCIjIyMgbWV0aG9kOmdldFNlYXJjaENvbnRlbnQsIHdlYnNlcnZpY2U6d3NHZXRBdHRhY2hTZWFyY2giKSk7CgogICAgICAgICAgICBMT0dHRVIuaW5mbyh2YWlsZExvZygiIyMjIHJlcToiICsgIndzR2V0QXR0YWNoU2VhcmNoKCIgKyBzdHJWYWxpZENvZGUgKyAiLCAxLCAiCgogICAgICAgICAgICAgICAgICAgICsgY2hhbm5lbE1hcC5nZXQodXNlclR5cGUpICsgIiwgMTAwLCAiICsgc3RyVHh0ICsgIiwgMCkiKSk7CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAyOgoKICAgICAgICAgICAgYXR0YWNoUmVzdWx0ID0gc2VydmljZS53c0dldEF0dGFjaFNlYXJjaChzdHJWYWxpZENvZGUsIDEsIGNoYW5uZWxNYXAuZ2V0KHVzZXJUeXBlKSwgMTAwLCBzdHJUeHQsIDApOwoKICAgICAgICAgICAgTE9HR0VSLmluZm8odmFpbGRMb2coIiMjIyBtZXRob2Q6Z2V0U2VhcmNoQ29udGVudCwgd2Vic2VydmljZTp3c0dldEF0dGFjaFNlYXJjaCIpKTsKCiAgICAgICAgICAgIExPR0dFUi5pbmZvKHZhaWxkTG9nKCIjIyMgcmVxOiIgKyAid3NHZXRBdHRhY2hTZWFyY2goIiArIHN0clZhbGlkQ29kZSArICIsIDEsICIKCiAgICAgICAgICAgICAgICAgICAgKyBjaGFubmVsTWFwLmdldCh1c2VyVHlwZSkgKyAiLCAxMDAsICIgKyBzdHJUeHQgKyAiLCAwKSIpKTsKCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgoKICAgICAgICAgICAgcmV0dXJuIG91dDsKCiAgICB9CgoKCiAgICAvLyBVc2UgYSBzZXQgdG8gZGUtZHVwIGJ5IGlmcV9zaWQgKGxpa2UgeW91ciBvcmlnaW5hbCAic2VlbiIgbWFwKQoKICAgIFNldDxTdHJpbmc+IHNlZW4gPSBuZXcgSGFzaFNldDw+KCk7CgoKCiAgICAvLyAtLS0gY29udGVudCByZXN1bHRzOiBpdGVyYXRlIGluIFJFVkVSU0Ugb3JkZXIgKHRvIG1pbWljIHlvdXIgcHJldmlvdXMgVUkgb3JkZXJpbmcpIC0tLQoKICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewoKICAgICAgICBNZXNzYWdlRWxlbWVudFtdIGFueUFyciA9IHJlc3VsdC5nZXRfYW55KCk7CgogICAgICAgIExPR0dFUi5pbmZvKHZhaWxkTG9nKCIjIyMgZGF0YToiICsgKGFueUFyciAhPSBudWxsICYmIGFueUFyci5sZW5ndGggPiAwID8gYW55QXJyWzBdIDogIm51bGwiKSkpOwoKCgogICAgICAgIEVsZW1lbnQgZGlmZmdyYW0gPSBwaWNrRGlmZmdyYW0oYW55QXJyKTsKCiAgICAgICAgaWYgKGRpZmZncmFtICE9IG51bGwpIHsKCiAgICAgICAgICAgIEVsZW1lbnQgZGF0YVJvb3QgPSBmaXJzdENoaWxkRWxlbWVudEJ5TG9jYWxOYW1lKGRpZmZncmFtLCAiSVFLQiIpOwoKICAgICAgICAgICAgaWYgKGRhdGFSb290ID09IG51bGwpIGRhdGFSb290ID0gZGlmZmdyYW07CgoKCiAgICAgICAgICAgIE5vZGVMaXN0IHJvd3MgPSBkYXRhUm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRnVsbFRleHRTZWFyY2giKTsKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSByb3dzLmdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsgLy8gcmV2ZXJzZQoKICAgICAgICAgICAgICAgIEVsZW1lbnQgcm93ID0gKEVsZW1lbnQpIHJvd3MuaXRlbShpKTsKCgoKICAgICAgICAgICAgICAgIFN0cmluZyBpZnFTaWQgICA9IGdldENoaWxkVGV4dChyb3csICJpZnFfc2lkIik7CgogICAgICAgICAgICAgICAgaWYgKGlmcVNpZC5pc0JsYW5rKCkgfHwgc2Vlbi5jb250YWlucyhpZnFTaWQpKSBjb250aW51ZTsKCgoKICAgICAgICAgICAgICAgIFNlYXJjaEhpdEJlYW4gaGl0ID0gbmV3IFNlYXJjaEhpdEJlYW4uQnVpbGRlcigpCgogICAgICAgICAgICAgICAgICAgICAgICAuaWZxU2lkKGlmcVNpZCkKCiAgICAgICAgICAgICAgICAgICAgICAgIC5pZnRTaWQoZ2V0Q2hpbGRUZXh0KHJvdywgImlmdF9zaWQiKSkKCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZnROYW1lKGdldENoaWxkVGV4dChyb3csICJzZnRfbmFtZSIpKQoKICAgICAgICAgICAgICAgICAgICAgICAgLnNmcU5hbWUoZ2V0Q2hpbGRUZXh0KHJvdywgInNmcV9uYW1lIikpCgogICAgICAgICAgICAgICAgICAgICAgICAuaWZxSGl0KHBhcnNlSW50T3JOdWxsKGdldENoaWxkVGV4dChyb3csICJpZnFfaGl0cyIpKSkKCiAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0VGltZShwYXJzZURhdGVUaW1lU2FmZWx5KGdldENoaWxkVGV4dChyb3csICJkaW5pdF90aW1lIikpKQoKICAgICAgICAgICAgICAgICAgICAgICAgLm1vZGlUaW1lKHBhcnNlRGF0ZVRpbWVTYWZlbHkoZ2V0Q2hpbGRUZXh0KHJvdywgImRtb2RpX3RpbWUiKSkpCgogICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKCgoKICAgICAgICAgICAgICAgIHNlZW4uYWRkKGlmcVNpZCk7CgogICAgICAgICAgICAgICAgb3V0LmFkZChoaXQpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgfQoKCgogICAgLy8gLS0tIGF0dGFjaG1lbnQgcmVzdWx0cyAoaWYgcmVxdWlyZWQpOiBub3JtYWwgb3JkZXIgYXBwZW5kIC0tLQoKICAgIGlmIChhdHRhY2hSZXN1bHQgIT0gbnVsbCkgewoKICAgICAgICBNZXNzYWdlRWxlbWVudFtdIGFueUFyciA9IGF0dGFjaFJlc3VsdC5nZXRfYW55KCk7CgogICAgICAgIEVsZW1lbnQgZGlmZmdyYW0gPSBwaWNrRGlmZmdyYW0oYW55QXJyKTsKCiAgICAgICAgaWYgKGRpZmZncmFtICE9IG51bGwpIHsKCiAgICAgICAgICAgIEVsZW1lbnQgZGF0YVJvb3QgPSBmaXJzdENoaWxkRWxlbWVudEJ5TG9jYWxOYW1lKGRpZmZncmFtLCAiSVFLQiIpOwoKICAgICAgICAgICAgaWYgKGRhdGFSb290ID09IG51bGwpIGRhdGFSb290ID0gZGlmZmdyYW07CgoKCiAgICAgICAgICAgIC8vIFNvbWUgYXR0YWNoIHNlYXJjaCByZXNwb25zZXMgYWxzbyByZXR1cm4gPEZ1bGxUZXh0U2VhcmNoPi1saWtlIHJvd3Mgd2l0aCBpZnFfc2lkL3NmcV9uYW1lCgogICAgICAgICAgICAvLyBJZiB5b3VyIHNjaGVtYSBkaWZmZXJzLCBhZGp1c3QgdGhlIHJvdyB0YWcgJiBmaWVsZHMgYWNjb3JkaW5nbHkuCgogICAgICAgICAgICBOb2RlTGlzdCByb3dzID0gZGF0YVJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZ1bGxUZXh0U2VhcmNoIik7CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd3MuZ2V0TGVuZ3RoKCk7IGkrKykgewoKICAgICAgICAgICAgICAgIEVsZW1lbnQgcm93ID0gKEVsZW1lbnQpIHJvd3MuaXRlbShpKTsKCgoKICAgICAgICAgICAgICAgIFN0cmluZyBpZnFTaWQgPSBnZXRDaGlsZFRleHQocm93LCAiaWZxX3NpZCIpOwoKICAgICAgICAgICAgICAgIGlmIChpZnFTaWQuaXNCbGFuaygpIHx8IHNlZW4uY29udGFpbnMoaWZxU2lkKSkgY29udGludWU7CgoKCiAgICAgICAgICAgICAgICBTZWFyY2hIaXRCZWFuIGhpdCA9IG5ldyBTZWFyY2hIaXRCZWFuLkJ1aWxkZXIoKQoKICAgICAgICAgICAgICAgICAgICAgICAgLmlmcVNpZChpZnFTaWQpCgogICAgICAgICAgICAgICAgICAgICAgICAuaWZ0U2lkKGdldENoaWxkVGV4dChyb3csICJpZnRfc2lkIikpCgogICAgICAgICAgICAgICAgICAgICAgICAuc2Z0TmFtZShnZXRDaGlsZFRleHQocm93LCAic2Z0X25hbWUiKSkKCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZnFOYW1lKGdldENoaWxkVGV4dChyb3csICJzZnFfbmFtZSIpKQoKICAgICAgICAgICAgICAgICAgICAgICAgLmlmcUhpdChwYXJzZUludE9yTnVsbChnZXRDaGlsZFRleHQocm93LCAiaWZxX2hpdHMiKSkpCgogICAgICAgICAgICAgICAgICAgICAgICAuaW5pdFRpbWUocGFyc2VEYXRlVGltZVNhZmVseShnZXRDaGlsZFRleHQocm93LCAiZGluaXRfdGltZSIpKSkKCiAgICAgICAgICAgICAgICAgICAgICAgIC5tb2RpVGltZShwYXJzZURhdGVUaW1lU2FmZWx5KGdldENoaWxkVGV4dChyb3csICJkbW9kaV90aW1lIikpKQoKICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CgoKCiAgICAgICAgICAgICAgICBzZWVuLmFkZChpZnFTaWQpOwoKICAgICAgICAgICAgICAgIG91dC5hZGQoaGl0KTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgIH0KCgoKICAgIHJldHVybiBvdXQ7Cgp9Cg==
返回列表 上一筆 下一筆