c462811cd33e81a80bc089e3677975c069d9cda5..36bf25f295b11d6cbebd51473e9288e4afe23c86
13 小时以前 陈昶聿
【市一】湖滨短信发送
36bf25 对比 | 目录
20 小时以前 liusheng
代码提交
28446c 对比 | 目录
已添加5个文件
534 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ShiyiSmsController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/ShiyiSmsUtil.java 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ShiyiSmsRequest.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/ShiyiSmsResponse.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/domain/TemplateDeptVO.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
 * å¯¹åº”《HIS æœåŠ¡å¹³å°æŽ¥å£è¯´æ˜Žæ–‡æ¡£ V1.1》5.2 çŸ­ä¿¡ä¸šåŠ¡(FASONGDX)。
 * æœ¬æŽ¥å£é¢å‘第三方调用,已通过 {@link Anonymous} æ”¾å¼€é‰´æƒï¼Œç”Ÿäº§çŽ¯å¢ƒå»ºè®®ç”±ç½‘å…³/IP ç™½åå•做访问控制。
 */
@Api(tags = "市一 æœåŠ¡å¹³å°å¯¹æŽ¥")
@RestController
@RequestMapping("/shiyi/sms")
public class ShiyiSmsController extends BaseController {
    @Autowired
    private ShiyiSmsUtil shiyiSmsUtil;
    /**
     * ç¬¬ä¸‰æ–¹è°ƒç”¨ï¼šé€šè¿‡ HIS æœåŠ¡å¹³å°ä¸‹å‘çŸ­ä¿¡ (FASONGDX)
     */
    @Anonymous
    @ApiOperation(value = "市一 çŸ­ä¿¡ä¸‹å‘", notes = "对接《HIS æœåŠ¡å¹³å°æŽ¥å£è¯´æ˜Žæ–‡æ¡£ 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);
    }
}
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>
 * æŒ‰ã€ŠHIS æœåŠ¡å¹³å°æŽ¥å£è¯´æ˜Žæ–‡æ¡£ 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";
    /** é»˜è®¤åˆ†é™¢ä»£ç  */
    private String defaultFenyuandm = "1";
    /** é»˜è®¤æœºæž„代码 */
    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 æŽ¥å£ã€‚SOAP 1.1 åŸºç¡€é‰´æƒæŒ‰æ–‡æ¡£ä¸è¦æ±‚。
     *
     * @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("解析 HIS çŸ­ä¿¡å“åº”失败, xml={}, err={}", xml, e.getMessage(), e);
            resp.setErrno("-1");
            resp.setErrmsg("解析响应失败: " + e.getMessage());
        }
        return resp;
    }
    private String buildSoapEnvelope(String tradeType, String tradeMsg) {
        // WCF é»˜è®¤ BasicHttpBinding ä¸‹æŽ¥å£æ–¹æ³•以 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 + "\"";
    }
}
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;
    /** åˆ†é™¢ä»£ç  */
    @ApiModelProperty(value = "分院代码")
    private String fenyuandm;
    /** æœºæž„代码 */
    @ApiModelProperty(value = "机构代码")
    private String jigoudm;
    /** æœºæž„名称 */
    @ApiModelProperty(value = "机构名称")
    private String jigoumc;
    /** æœºæž„验证码 */
    @ApiModelProperty(value = "机构验证码")
    private String jigouyzm;
    /** æŽ¥æ”¶æœºæž„代码 */
    @ApiModelProperty(value = "接收机构代码")
    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;
    /** æŽ¥å…¥åœºæ‰€ä»£ç  */
    @ApiModelProperty(value = "接入场所代码")
    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;
}
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);
    }
}
smartor/src/main/java/com/smartor/domain/TemplateDeptVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.smartor.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * æ¨¡æ¿ç§‘室关联对象 template_dept
 *
 * @author lihu
 * @date 2024-09-18
 */
@Data
@ApiModel("模板科室关联")
public class TemplateDeptVO extends BaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * 1 : é—®å·æ¨¡æ¿åº“id、11:问卷任务模板库id;2 :语音问卷库id、21:语音任务模板库id,3 : å®£æ•™æ¨¡æ¿åº“id,33:宣教任务模板库id
     */
    @ApiModelProperty("1 : é—®å·æ¨¡æ¿åº“id (默认)、11:问卷任务模板库id;2 :语音问卷库id、21:语音任务模板库id,3 : å®£æ•™æ¨¡æ¿åº“id,33:宣教任务模板库id")
    @Excel(name = "1 : é—®å·æ¨¡æ¿åº“id、11:问卷任务模板库id;2 :语音问卷库id、21:语音任务模板库id,3 : å®£æ•™æ¨¡æ¿åº“id,33:宣教任务模板库id")
    private Long type;
    /**
     * æ¨¡æ¿id
     */
    @ApiModelProperty("模板id")
    @Excel(name = "模板id")
    private Long tempid;
    /**
     * éƒ¨é—¨ç¼–码
     */
    @ApiModelProperty("部门编码")
    @Excel(name = "部门编码")
    private String deptCode;
    /**
     * éƒ¨é—¨ç±»åž‹ï¼š1科室,2病区
     */
    @ApiModelProperty("部门类型:1科室(默认),2病区")
    @Excel(name = "部门类型:1科室,2病区")
    private String deptType;
    /**
     * åˆ é™¤æ ‡å¿—(0:未删除 1:已删除)
     */
    @ApiModelProperty("删除标志(0:未删除 1:已删除)")
    private Integer delFlag;
}