From 36bf25f295b11d6cbebd51473e9288e4afe23c86 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期一, 11 五月 2026 18:05:09 +0800
Subject: [PATCH] 【市一】湖滨短信发送

---
 smartor/src/main/java/com/smartor/domain/ShiyiSmsResponse.java                     |   41 +++++
 smartor/src/main/java/com/smartor/domain/ShiyiSmsRequest.java                      |   82 ++++++++++
 smartor/src/main/java/com/smartor/common/ShiyiSmsUtil.java                         |  300 +++++++++++++++++++++++++++++++++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ShiyiSmsController.java |   53 ++++++
 4 files changed, 476 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ShiyiSmsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ShiyiSmsController.java
new file mode 100644
index 0000000..5b1050c
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ShiyiSmsController.java
@@ -0,0 +1,53 @@
+package com.ruoyi.web.controller.smartor;
+
+import com.ruoyi.common.annotation.Anonymous;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.smartor.common.ShiyiSmsUtil;
+import com.smartor.domain.ShiyiSmsRequest;
+import com.smartor.domain.ShiyiSmsResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 甯備竴 鏈嶅姟骞冲彴瀵规帴 Controller (鏉窞甯備竴)
+ * <p>
+ * 瀵瑰簲銆奌IS 鏈嶅姟骞冲彴鎺ュ彛璇存槑鏂囨。 V1.1銆�5.2 鐭俊涓氬姟(FASONGDX)銆�
+ * 鏈帴鍙i潰鍚戠涓夋柟璋冪敤锛屽凡閫氳繃 {@link Anonymous} 鏀惧紑閴存潈锛岀敓浜х幆澧冨缓璁敱缃戝叧/IP 鐧藉悕鍗曞仛璁块棶鎺у埗銆�
+ */
+@Api(tags = "甯備竴 鏈嶅姟骞冲彴瀵规帴")
+@RestController
+@RequestMapping("/shiyi/sms")
+public class ShiyiSmsController extends BaseController {
+
+    @Autowired
+    private ShiyiSmsUtil shiyiSmsUtil;
+
+    /**
+     * 绗笁鏂硅皟鐢細閫氳繃 HIS 鏈嶅姟骞冲彴涓嬪彂鐭俊 (FASONGDX)
+     */
+    @Anonymous
+    @ApiOperation(value = "甯備竴 鐭俊涓嬪彂", notes = "瀵规帴銆奌IS 鏈嶅姟骞冲彴鎺ュ彛璇存槑鏂囨。 V1.1銆�5.2 鐭俊涓氬姟")
+    @Log(title = "甯備竴 鐭俊涓嬪彂", businessType = BusinessType.OTHER)
+    @PostMapping("/send")
+    public AjaxResult send(@RequestBody ShiyiSmsRequest request) {
+        ShiyiSmsResponse response = shiyiSmsUtil.sendSms(request);
+        if (response == null) {
+            return AjaxResult.error("甯備竴 鐭俊涓嬪彂 鏃犲搷搴�");
+        }
+        if (!response.isSuccess()) {
+            AjaxResult fail = AjaxResult.error(
+                    "甯備竴 鐭俊涓嬪彂澶辫触: " + response.getErrmsg());
+            fail.put("data", response);
+            return fail;
+        }
+        return AjaxResult.success("鍙戦�佹垚鍔�", response);
+    }
+}
diff --git a/smartor/src/main/java/com/smartor/common/ShiyiSmsUtil.java b/smartor/src/main/java/com/smartor/common/ShiyiSmsUtil.java
new file mode 100644
index 0000000..724ffd6
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/common/ShiyiSmsUtil.java
@@ -0,0 +1,300 @@
+package com.smartor.common;
+
+import com.smartor.domain.ShiyiSmsRequest;
+import com.smartor.domain.ShiyiSmsResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 鏉窞甯備竴 HIS 鏈嶅姟骞冲彴瀵规帴宸ュ叿绫汇��
+ * <p>
+ * 鎸夈�奌IS 鏈嶅姟骞冲彴鎺ュ彛璇存槑鏂囨。 V1.1銆�3.1 鑺傜害瀹氾紝HIS 瀵瑰浠� WCF Web Service 褰㈠紡鍙戝竷锛�
+ * 缁熶竴鍏ュ彛锛歿@code int RunService(string TradeType, string TradeMsg, ref string TradeOut)}锛�
+ * 鍏朵腑 {@code TradeType} 鏍囪瘑涓氬姟缂栫爜锛寋@code TradeMsg} 涓� UTF-8 缂栫爜鐨� XML 鎶ユ枃銆�
+ * 鏈伐鍏风被鐩墠瀹炵幇 5.2 鐭俊涓氬姟 (TradeType=FASONGDX)銆�
+ */
+@Slf4j
+@Component
+public class ShiyiSmsUtil {
+
+    /** 5.2 鐭俊涓氬姟 TradeType */
+    public static final String TRADE_TYPE_FASONGDX = "FASONGDX";
+
+    /** WCF 鍛藉悕绌洪棿锛岄粯璁ら殢鏂囨。绀轰緥 */
+    private String namespace = "http://tempuri.org/";
+
+    /** 榛樿鎿嶄綔鍛樹唬鐮� */
+    @Value("${his.service.defaultCaozuoydm:}")
+    private String defaultCaozuoydm;
+
+    /** 榛樿鎿嶄綔鍛樺鍚� */
+    @Value("${his.service.defaultCaozuoyxm:}")
+    private String defaultCaozuoyxm;
+
+    /** 榛樿绯荤粺鏍囪瘑 */
+    private String defaultXitongbs = "0";
+
+    /** 榛樿鍒嗛櫌浠g爜 */
+    private String defaultFenyuandm = "1";
+
+    /** 榛樿鏈烘瀯浠g爜 */
+    private String defaultJigoudm = "1";
+
+    private final RestTemplate restTemplate = new RestTemplate();
+
+    /**
+     * 鍙戦�佺煭淇� (FASONGDX)
+     */
+    public ShiyiSmsResponse sendSms(ShiyiSmsRequest request) {
+        if (request == null) {
+            throw new IllegalArgumentException("鐭俊璇锋眰涓嶈兘涓虹┖");
+        }
+        if (StringUtils.isBlank(request.getShoujihao())) {
+            throw new IllegalArgumentException("鎵嬫満鍙蜂笉鑳戒负绌�");
+        }
+        if (StringUtils.isBlank(request.getDuanxinnr())) {
+            throw new IllegalArgumentException("鐭俊鍐呭涓嶈兘涓虹┖");
+        }
+
+        applyDefaults(request);
+
+        String tradeMsg = buildFasongdxXml(request);
+        log.info("甯備竴 鐭俊璇锋眰, TradeType={}, TradeMsg={}", TRADE_TYPE_FASONGDX, tradeMsg);
+
+        String tradeOut = invokeRunService(TRADE_TYPE_FASONGDX, tradeMsg);
+        log.info("甯備竴 鐭俊鍝嶅簲, TradeOut={}", tradeOut);
+
+        return parseFasongdxResponse(tradeOut);
+    }
+
+    /**
+     * 璋冪敤 甯備竴 WCF RunService 鎺ュ彛銆係OAP 1.1 鍩虹閴存潈鎸夋枃妗d笉瑕佹眰銆�
+     *
+     * @return TradeOut 鎶ユ枃锛堟湇鍔$ ref 鍙傛暟锛�
+     */
+    public String invokeRunService(String tradeType, String tradeMsg) {
+        String soapEnvelope = buildSoapEnvelope(tradeType, tradeMsg);
+        String hisServiceUrl = "http://192.200.54.57:7790/MediInfoHis.svc";
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(new MediaType("text", "xml", StandardCharsets.UTF_8));
+        headers.set("SOAPAction", joinNamespace(namespace, "IMediInfoHis/RunService"));
+
+        HttpEntity<String> entity = new HttpEntity<>(soapEnvelope, headers);
+        try {
+            ResponseEntity<String> response = restTemplate.postForEntity(hisServiceUrl, entity, String.class);
+            String body = response.getBody();
+            if (StringUtils.isBlank(body)) {
+                throw new RuntimeException("HIS 杩斿洖绌哄搷搴�");
+            }
+            return extractTradeOut(body);
+        } catch (Exception e) {
+            log.error("璋冪敤 HIS RunService 澶辫触, url={}, tradeType={}, err={}", hisServiceUrl, tradeType, e.getMessage(), e);
+            throw new RuntimeException("璋冪敤 HIS RunService 澶辫触: " + e.getMessage(), e);
+        }
+    }
+
+    private void applyDefaults(ShiyiSmsRequest request) {
+        if (StringUtils.isBlank(request.getCaozuoydm())) {
+            request.setCaozuoydm(defaultCaozuoydm);
+        }
+        if (StringUtils.isBlank(request.getCaozuoyxm())) {
+            request.setCaozuoyxm(defaultCaozuoyxm);
+        }
+        if (StringUtils.isBlank(request.getCaozuorq())) {
+            request.setCaozuorq(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        }
+        if (StringUtils.isBlank(request.getXitongbs())) {
+            request.setXitongbs(defaultXitongbs);
+        }
+        if (StringUtils.isBlank(request.getFenyuandm())) {
+            request.setFenyuandm(defaultFenyuandm);
+        }
+        if (StringUtils.isBlank(request.getJigoudm())) {
+            request.setJigoudm(defaultJigoudm);
+        }
+        if (StringUtils.isBlank(request.getDuanxinlx())) {
+            request.setDuanxinlx("0");
+        }
+    }
+
+    private String buildFasongdxXml(ShiyiSmsRequest r) {
+        StringBuilder sb = new StringBuilder(512);
+        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        sb.append("<FASONGDX_IN>");
+        sb.append("<BASEINFO>");
+        appendTag(sb, "CAOZUOYDM", r.getCaozuoydm());
+        appendTag(sb, "CAOZUOYXM", r.getCaozuoyxm());
+        appendTag(sb, "CAOZUORQ", r.getCaozuorq());
+        appendTag(sb, "XITONGBS", r.getXitongbs());
+        appendTag(sb, "FENYUANDM", r.getFenyuandm());
+        appendTag(sb, "JIGOUDM", r.getJigoudm());
+        appendTag(sb, "JIGOUMC", r.getJigoumc());
+        appendTag(sb, "JIGOUYZM", r.getJigouyzm());
+        appendTag(sb, "JIESHOUJGDM", r.getJieshoujgdm());
+        appendTag(sb, "ZHONGDUANJB", r.getZhongduanjb());
+        appendTag(sb, "ZHONGDUANLS", r.getZhongduanls());
+        appendTag(sb, "IPADDRESS", r.getIpaddress());
+        appendTag(sb, "YEWULX", r.getYewulx());
+        appendTag(sb, "JIERUCSDM", r.getJierucsdm());
+        sb.append("</BASEINFO>");
+        appendTag(sb, "DUANXINLX", r.getDuanxinlx());
+        appendTag(sb, "SHOUJIHAO", r.getShoujihao());
+        appendTag(sb, "DUANXINNR", r.getDuanxinnr());
+        sb.append("</FASONGDX_IN>");
+        return sb.toString();
+    }
+
+    private ShiyiSmsResponse parseFasongdxResponse(String xml) {
+        ShiyiSmsResponse resp = new ShiyiSmsResponse();
+        resp.setRawXml(xml);
+        if (StringUtils.isBlank(xml)) {
+            resp.setErrno("-1");
+            resp.setErrmsg("HIS 杩斿洖绌� TradeOut");
+            return resp;
+        }
+        try {
+            Document doc = parseXml(xml);
+            resp.setErrno(readTag(doc, "ERRNO"));
+            resp.setErrmsg(readTag(doc, "ERRMSG"));
+            resp.setErrmsgex(readTag(doc, "ERRMSGEX"));
+            resp.setMessageId(readTag(doc, "MessageID"));
+            resp.setDuanxinid(readTag(doc, "DUANXINID"));
+        } catch (Exception e) {
+            log.error("瑙f瀽 HIS 鐭俊鍝嶅簲澶辫触, xml={}, err={}", xml, e.getMessage(), e);
+            resp.setErrno("-1");
+            resp.setErrmsg("瑙f瀽鍝嶅簲澶辫触: " + e.getMessage());
+        }
+        return resp;
+    }
+
+    private String buildSoapEnvelope(String tradeType, String tradeMsg) {
+        // WCF 榛樿 BasicHttpBinding 涓嬫帴鍙f柟娉曚互 Message Contract 褰㈠紡鍙戝竷锛屽弬鏁拌妭鐐瑰悕涓� C# 鏂规硶绛惧悕涓�鑷淬��
+        // TradeOut 涓� ref 鍙傛暟锛屽叆鍙備篃闇�浼犵┖鍏冪礌鍗犱綅銆�
+        return "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                + "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:t=\"" + namespace + "\">"
+                + "<s:Body>"
+                + "<t:RunService>"
+                + "<t:TradeType>" + escapeXml(tradeType) + "</t:TradeType>"
+                + "<t:TradeMsg>" + escapeXml(tradeMsg) + "</t:TradeMsg>"
+                + "<t:TradeOut></t:TradeOut>"
+                + "</t:RunService>"
+                + "</s:Body>"
+                + "</s:Envelope>";
+    }
+
+    private String extractTradeOut(String soapResponse) throws Exception {
+        Document doc = parseXml(soapResponse);
+        // TradeOut 鑺傜偣 (甯﹀懡鍚嶇┖闂�)
+        String tradeOut = readTagIgnoreNs(doc, "TradeOut");
+        if (StringUtils.isBlank(tradeOut)) {
+            // 鏈変簺 WCF 瀹炵幇浼氭妸 ref 鍙傛暟杈撳嚭鑺傜偣鍛藉悕涓� RunServiceResult 鐨勫悓绾� TradeOut
+            tradeOut = readTagIgnoreNs(doc, "tradeOut");
+        }
+        return tradeOut;
+    }
+
+    private Document parseXml(String xml) throws Exception {
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setNamespaceAware(false);
+        factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
+        factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
+        factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
+        DocumentBuilder builder = factory.newDocumentBuilder();
+        return builder.parse(new InputSource(new StringReader(xml)));
+    }
+
+    private String readTag(Document doc, String name) {
+        NodeList list = doc.getElementsByTagName(name);
+        if (list.getLength() == 0) {
+            return null;
+        }
+        return list.item(0).getTextContent();
+    }
+
+    private String readTagIgnoreNs(Document doc, String localName) {
+        NodeList all = doc.getElementsByTagName("*");
+        for (int i = 0; i < all.getLength(); i++) {
+            Node node = all.item(i);
+            if (node instanceof Element) {
+                Element el = (Element) node;
+                String local = el.getLocalName() != null ? el.getLocalName() : el.getNodeName();
+                if (local.equalsIgnoreCase(localName) || local.endsWith(":" + localName)) {
+                    return el.getTextContent();
+                }
+                if (el.getNodeName().endsWith(":" + localName) || el.getNodeName().equalsIgnoreCase(localName)) {
+                    return el.getTextContent();
+                }
+            }
+        }
+        return null;
+    }
+
+    private void appendTag(StringBuilder sb, String tag, String value) {
+        sb.append('<').append(tag).append('>');
+        if (StringUtils.isNotBlank(value)) {
+            sb.append(escapeXml(value));
+        }
+        sb.append("</").append(tag).append('>');
+    }
+
+    private String escapeXml(String input) {
+        if (input == null) {
+            return "";
+        }
+        StringBuilder out = new StringBuilder(input.length());
+        for (int i = 0; i < input.length(); i++) {
+            char c = input.charAt(i);
+            switch (c) {
+                case '&':
+                    out.append("&amp;");
+                    break;
+                case '<':
+                    out.append("&lt;");
+                    break;
+                case '>':
+                    out.append("&gt;");
+                    break;
+                case '"':
+                    out.append("&quot;");
+                    break;
+                case '\'':
+                    out.append("&apos;");
+                    break;
+                default:
+                    out.append(c);
+            }
+        }
+        return out.toString();
+    }
+
+    private String joinNamespace(String ns, String op) {
+        if (ns == null) {
+            return "\"" + op + "\"";
+        }
+        if (ns.endsWith("/")) {
+            return "\"" + ns + op + "\"";
+        }
+        return "\"" + ns + "/" + op + "\"";
+    }
+}
diff --git a/smartor/src/main/java/com/smartor/domain/ShiyiSmsRequest.java b/smartor/src/main/java/com/smartor/domain/ShiyiSmsRequest.java
new file mode 100644
index 0000000..96d90a7
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/domain/ShiyiSmsRequest.java
@@ -0,0 +1,82 @@
+package com.smartor.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鏉窞甯備竴 HIS 鏈嶅姟骞冲彴 5.2 鐭俊涓氬姟 璇锋眰瀵硅薄 (FASONGDX)
+ * 瀵瑰簲 TradeMsg XML 鏍硅妭鐐� FASONGDX_IN
+ */
+@Data
+@ApiModel(value = "ShiyiSmsRequest", description = "HIS 鐭俊涓氬姟璇锋眰(FASONGDX)")
+public class ShiyiSmsRequest {
+
+    /** 鎿嶄綔鍛樹唬鐮� */
+    @ApiModelProperty(value = "鎿嶄綔鍛樹唬鐮�")
+    private String caozuoydm;
+
+    /** 鎿嶄綔鍛樺鍚� */
+    @ApiModelProperty(value = "鎿嶄綔鍛樺鍚�")
+    private String caozuoyxm;
+
+    /** 鎿嶄綔鏃ユ湡 yyyy-MM-dd HH:mm:ss */
+    @ApiModelProperty(value = "鎿嶄綔鏃ユ湡 yyyy-MM-dd HH:mm:ss")
+    private String caozuorq;
+
+    /** 绯荤粺鏍囪瘑 */
+    @ApiModelProperty(value = "绯荤粺鏍囪瘑")
+    private String xitongbs;
+
+    /** 鍒嗛櫌浠g爜 */
+    @ApiModelProperty(value = "鍒嗛櫌浠g爜")
+    private String fenyuandm;
+
+    /** 鏈烘瀯浠g爜 */
+    @ApiModelProperty(value = "鏈烘瀯浠g爜")
+    private String jigoudm;
+
+    /** 鏈烘瀯鍚嶇О */
+    @ApiModelProperty(value = "鏈烘瀯鍚嶇О")
+    private String jigoumc;
+
+    /** 鏈烘瀯楠岃瘉鐮� */
+    @ApiModelProperty(value = "鏈烘瀯楠岃瘉鐮�")
+    private String jigouyzm;
+
+    /** 鎺ユ敹鏈烘瀯浠g爜 */
+    @ApiModelProperty(value = "鎺ユ敹鏈烘瀯浠g爜")
+    private String jieshoujgdm;
+
+    /** 缁堢绾у埆 */
+    @ApiModelProperty(value = "缁堢绾у埆")
+    private String zhongduanjb;
+
+    /** 缁堢娴佹按 */
+    @ApiModelProperty(value = "缁堢娴佹按")
+    private String zhongduanls;
+
+    /** IP 鍦板潃 */
+    @ApiModelProperty(value = "IP 鍦板潃")
+    private String ipaddress;
+
+    /** 涓氬姟绫诲瀷 */
+    @ApiModelProperty(value = "涓氬姟绫诲瀷")
+    private String yewulx;
+
+    /** 鎺ュ叆鍦烘墍浠g爜 */
+    @ApiModelProperty(value = "鎺ュ叆鍦烘墍浠g爜")
+    private String jierucsdm;
+
+    /** 鐭俊绫诲瀷 0锛氭櫘閫氱煭淇� */
+    @ApiModelProperty(value = "鐭俊绫诲瀷,榛樿 0 鏅�氱煭淇�", required = true)
+    private String duanxinlx;
+
+    /** 鎵嬫満鍙� */
+    @ApiModelProperty(value = "鎵嬫満鍙�", required = true)
+    private String shoujihao;
+
+    /** 鐭俊鍐呭 */
+    @ApiModelProperty(value = "鐭俊鍐呭", required = true)
+    private String duanxinnr;
+}
\ No newline at end of file
diff --git a/smartor/src/main/java/com/smartor/domain/ShiyiSmsResponse.java b/smartor/src/main/java/com/smartor/domain/ShiyiSmsResponse.java
new file mode 100644
index 0000000..5c4dcf0
--- /dev/null
+++ b/smartor/src/main/java/com/smartor/domain/ShiyiSmsResponse.java
@@ -0,0 +1,41 @@
+package com.smartor.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 鏉窞甯備竴 HIS 鏈嶅姟骞冲彴 5.2 鐭俊涓氬姟 鍝嶅簲瀵硅薄 (FASONGDX_OUT)
+ */
+@Data
+@ApiModel(value = "ShiyiSmsResponse", description = "HIS 鐭俊涓氬姟鍝嶅簲(FASONGDX_OUT)")
+public class ShiyiSmsResponse {
+
+    /** 閿欒鍙凤紝0 鎴愬姛锛�1 澶辫触锛�2 HIS 寮傚父锛�99 鍙傛暟寮傚父锛�<0 绯荤粺寮傚父 */
+    @ApiModelProperty(value = "閿欒鍙� 0 鎴愬姛锛涘叾浠栧け璐�")
+    private String errno;
+
+    /** 閿欒鎻忚堪 */
+    @ApiModelProperty(value = "閿欒鎻忚堪")
+    private String errmsg;
+
+    /** 鎵╁睍閿欒鎻忚堪 */
+    @ApiModelProperty(value = "鎵╁睍閿欒鎻忚堪")
+    private String errmsgex;
+
+    /** HIS 渚ф秷鎭� ID */
+    @ApiModelProperty(value = "HIS 渚ф秷鎭� ID")
+    private String messageId;
+
+    /** 鐭俊 ID */
+    @ApiModelProperty(value = "鐭俊 ID")
+    private String duanxinid;
+
+    /** 鍘熷鍝嶅簲 XML锛堣皟璇曠敤锛� */
+    @ApiModelProperty(value = "鍘熷鍝嶅簲 XML")
+    private String rawXml;
+
+    public boolean isSuccess() {
+        return "0".equals(errno);
+    }
+}

--
Gitblit v1.9.3