Ver código fonte

添加工具类判断节假日

wangzhinan 2 anos atrás
pai
commit
7367ff15d4

+ 2 - 2
business/base-service/src/main/java/com/yihu/jw/dailyReport/service/DailyReportUploadService.java

@ -5056,7 +5056,7 @@ public class DailyReportUploadService {
    }
    public JSONObject select(String doctorId,String startDate,String endDate,String dept) throws Exception {
   /* public JSONObject select(String doctorId,String startDate,String endDate,String dept) throws Exception {
        String sqlCondition = "";
        if (StringUtils.isNoneBlank(dept)){
            sqlCondition = " SELECT d.zt_id as ztId FROM base_doctor d LEFT JOIN base_doctor_hospital dh ON d.id=dh.doctor_code where dh.dept_code='"+dept+"' ";
@ -5093,5 +5093,5 @@ public class DailyReportUploadService {
    }
    }*/
}

+ 3 - 0
business/base-service/src/main/java/com/yihu/jw/hospital/prescription/service/PrescriptionService.java

@ -11777,6 +11777,9 @@ public class PrescriptionService extends BaseJpaService<WlyyPrescriptionDO, Pres
                try {
                    net.sf.json.JSONObject jsonObject = entranceService.BS10112(jsonData.toJSONString(), demoFlag);
                    wlyyHttpLogDO.setResponse(jsonObject.toString());
                    if(jsonObject.getString("@RESULT").equalsIgnoreCase("-1")){
                        return jsonObject.getString("@MSG");
                    }
                }catch (Exception e){
                    e.printStackTrace();
                    return "作废失败";

+ 55 - 8
business/base-service/src/main/java/com/yihu/jw/hospital/prescription/service/entrance/EntranceService.java

@ -43,6 +43,7 @@ import com.yihu.jw.hospital.prescription.service.entrance.util.WebserviceUtil;
import com.yihu.jw.order.dao.BusinessOrderDao;
import com.yihu.jw.order.dao.BusinessOrderRefundDao;
import com.yihu.jw.order.pay.ylz.YlzPayService;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.patient.dao.BasePatientMedicareCardDao;
import com.yihu.jw.restmodel.hospital.archive.ArchiveVO;
import com.yihu.jw.restmodel.hospital.prescription.*;
@ -51,7 +52,10 @@ import com.yihu.jw.util.common.PwdUtil;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.util.http.HttpClientUtil;
import com.yihu.jw.util.idcard.IdCardUtil;
import com.yihu.jw.utils.AES;
import com.yihu.jw.utils.SignUtil;
import com.yihu.jw.utils.encode.*;
import com.yihu.utils.security.MD5;
import com.ylzinfo.ehc.common.utils.DateUtils;
import com.ylzinfo.onepay.sdk.domain.ResponseParams;
import com.ylzinfo.onepay.sdk.domain.ext.RefundResult;
@ -64,6 +68,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.http.NameValuePair;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
@ -194,6 +199,8 @@ public class EntranceService {
    private YlzMedicailIcdDao  ylzMedicailIcdDao;
    @Autowired
    private YlzMedicailMxDao ylzMedicailMxDao;
    @Autowired
    private BasePatientDao patientDao;
    private static String entranceUrl="http://172.16.100.240:10023/mqsdk/";
//    private static String entranceUrl="http://localhost:10023/mqsdk/";
@ -656,26 +663,36 @@ public class EntranceService {
            //MessageHeader :固定值 消费方系统编号 S60,提供方系统编号 S01
            sbs.append("<MessageHeader><Fid>" + fid + "</Fid><MsgDate>" + DateUtil.dateToStr(new Date(), DateUtil.YYYY_MM_DD_HH_MM_SS) + "</MsgDate><SourceSysCode>" + sourceSysCode + "</SourceSysCode><TargetSysCode>" + targetSysCode + "</TargetSysCode></MessageHeader>");
            //查询信息拼接
            sbs.append("<MsgInfo><onceFlag>1</onceFlag><startNum>1</startNum><endNum>50000</endNum><Msg/>");
            sbs.append("<MsgInfo><onceFlag>1</onceFlag><startNum>1</startNum><endNum>50000</endNum><Msg>");
            if (StringUtils.isNotBlank(PAT_NO)) {
                sbs.append("<query compy=\"=\" item=\"PAT_NO\" splice=\"and\" value=\"'" + PAT_NO + "'\"/>");
                /*sbs.append("<query compy=\"=\" item=\"PAT_NO\" splice=\"and\" value=\"'" + PAT_NO + "'\"/>");*/
                sbs.append(" and PAT_NO = '"+PAT_NO+"' ");
            }
            if (StringUtils.isNotBlank(conNo)) {
                sbs.append("<query compy=\"=\" item=\"CON_NO\" splice=\"and\" value=\"'" + conNo + "'\"/>");
                /*sbs.append("<query compy=\"=\" item=\"CON_NO\" splice=\"and\" value=\"'" + conNo + "'\"/>");*/
                sbs.append(" and CON_NO = '"+conNo+"' ");
            }
            if (StringUtils.isNotBlank(startTime)) {
                sbs.append("<query compy=\"&gt;=\" item=\"CON_DATE\" splice=\"and\" value=\"'" + startTime + "'\"/>");
                /*sbs.append("<query compy=\"&gt;=\" item=\"CON_DATE\" splice=\"and\" value=\"'" + startTime + "'\"/>");*/
                sbs.append(" and CON_DATE &gt;= '"+startTime+"' ");
            }
            if (StringUtils.isNotBlank(endTime)) {
                sbs.append("<query compy=\"&lt;\" item=\"CON_DATE\" splice=\"and\" value=\"'" + endTime + "'\"/>");
                /*sbs.append("<query compy=\"&lt;\" item=\"CON_DATE\" splice=\"and\" value=\"'" + endTime + "'\"/>");*/
                sbs.append(" and CON_DATE &lt;= '"+endTime+"' ");
            }
            if (StringUtils.isNotBlank(ksdm)) {
          /*      sbs.append("<query compy=\"=\" item=\"ADM_SPEC\" splice=\"and\" value=\"'" + ksdm + "'\"/>");*/
                sbs.append("<query compy=\"=\" item=\"under_dept\" splice=\"and\" value=\"'" + ksdm + "'\"/>");
                /*sbs.append("<query compy=\"=\" item=\"under_dept\" splice=\"and\" value=\"'" + ksdm + "'\"/>");*/
                sbs.append(" and (ADM_SPEC = '"+ksdm+"' OR under_dept = '"+ksdm+"') ");
            }
            sbs.append("<query compy=\"\" item=\"icd_name\" splice=\"and\" value=\"is not null\"/>");
            sbs.append("<order item=\"CON_DATE\" sort=\"desc\"/>");
            /*sbs.append("<query compy=\"\" item=\"icd_name\" splice=\"and\" value=\"is not null\"/>");*/
            sbs.append(" and icd_name is not null ");
    /*        sbs.append("<order item=\"CON_DATE\" sort=\"desc\"/>");*/
            sbs.append(" order by CON_DATE desc ");
            //查询信息结束
            sbs.append("</Msg> ");
            sbs.append("</MsgInfo></ESBEntry>");
            resp = MqSdkUtil.putReqAndGetRespByQueryStr(sbs.toString(), fid);
            logger.info("resp===" + resp);
@ -3339,6 +3356,7 @@ public class EntranceService {
            if (StringUtils.isNotBlank(ghh000)) {
                sbs.append("<ghh000>"+ghh000+"</ghh000>");
            }
            sbs.append("<channelType>09</channelType>");
            sbs.append("</root>]]></Msg>");
            sbs.append("<Msg2>op_query_recipe</Msg2><startNum>1</startNum></MsgInfo></ESBEntry>");
            resp = MqSdkUtil.putReqAndGetRespByQueryStr(sbs.toString(), fid);
@ -4264,4 +4282,33 @@ public class EntranceService {
    }
   //=========================电子发票===========================================
    public String getCloudImageAccessToken(String patientId) throws Exception {
        BasePatientDO patientDO = patientDao.findById(patientId);
        WlyyHospitalSysDictDO hospitalSysDictDO = hospitalSysDictDao.findById("zsyyCloudImage");
        if (hospitalSysDictDO ==null){
            return "配置不存在";
        }
        String value = hospitalSysDictDO.getDictValue();
        JSONObject object = JSONObject.parseObject(value);
        String appId = object.getString("app_id");
        String appSecret = object.getString("app_secret");
        String url = object.getString("url");
        Long timestamp = new Date().getTime();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("app_id",appId);
        jsonObject.put("patient_id",patientDO.getIdcard());
        jsonObject.put("timestamp",timestamp);
        String sign = SignUtil.buildAESMd5Sign(jsonObject,appSecret,"0000000000000000");
        String requestUrl = url +"api/getAccessToken";
        List<NameValuePair> params = new ArrayList<>();
        params.add(new BasicNameValuePair("app_id", appId));
        params.add(new BasicNameValuePair("patient_id", patientDO.getIdcard()));
        params.add(new BasicNameValuePair("timestamp", timestamp+""));
        params.add(new BasicNameValuePair("sign", sign));
        String res =  httpClientUtil.post(requestUrl,params,"utf-8");
        return res;
    }
}

+ 8 - 0
business/base-service/src/main/java/com/yihu/jw/utils/AES.java

@ -139,6 +139,14 @@ public class AES {
        byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
        return new BASE64Encoder().encode(bytes);
    }
    public static String aesCbcEncrypt(String str, String key) throws Exception {
        if (str == null || key == null) return null;
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
        byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
        return new BASE64Encoder().encode(bytes);
    }
    /**
     * AES的解密函数
     * @param str 传入需要解密的字符

+ 461 - 0
business/base-service/src/main/java/com/yihu/jw/utils/AesUtil.java

@ -0,0 +1,461 @@
//package com.ylzb.fjsdermyy.modules.settleaccounts.util;
//
//import sun.misc.BASE64Decoder;
//import sun.misc.BASE64Encoder;
//
//import javax.crypto.BadPaddingException;
//import javax.crypto.Cipher;
//import javax.crypto.IllegalBlockSizeException;
//import javax.crypto.NoSuchPaddingException;
//import javax.crypto.spec.SecretKeySpec;
//import java.io.IOException;
//import java.io.UnsupportedEncodingException;
//import java.security.InvalidKeyException;
//import java.security.NoSuchAlgorithmException;
//
///**
// * @Description: AES算法封装
// */
//public class AesUtil {
//
//    /**
//     * 加密算法
//     */
//    private static final String ENCRY_ALGORITHM = "AES";
//
//    /**
//     * 加密算法/加密模式/填充类型
//     * 本例采用AES加密,ECB加密模式,PKCS5Padding填充
//     */
//    private static final String CIPHER_MODE = "AES/CBC/PKCS5Padding";
//
//    /**
//     * 设置iv偏移量
//     * 本例采用ECB加密模式,不需要设置iv偏移量
//     */
//    private static final String IV_ = "0102030405060708";
//
//    /**
//     * 设置加密字符集
//     * 本例采用 UTF-8 字符集
//     */
//    private static final String CHARACTER = "UTF-8";
//
//    /**
//     * 设置加密密码处理长度。
//     * 不足此长度补0;
//     */
//    private static final int PWD_SIZE = 16;
//
//    /**
//     * 密码处理方法
//     * 如果加解密出问题,
//     * 请先查看本方法,排除密码长度不足填充0字节,导致密码不一致
//     * @param password 待处理的密码
//     * @return
//     * @throws UnsupportedEncodingException
//     */
//    private static byte[] pwdHandler(String password) throws UnsupportedEncodingException {
//        byte[] data = null;
//        if (password != null) {
//            byte[] bytes = password.getBytes(CHARACTER);
//            if (password.length() < PWD_SIZE) {
//                System.arraycopy(bytes, 0, data = new byte[PWD_SIZE], 0, bytes.length);
//            } else {
//                data = bytes;
//            }
//        }
//        return data;
//    }
//
//    //======================>原始加密<======================
//
//    /**
//     * 原始加密
//     * @param clearTextBytes 明文字节数组,待加密的字节数组
//     * @param pwdBytes 加密密码字节数组
//     * @return 返回加密后的密文字节数组,加密错误返回null
//     */
//    public static byte[] encrypt(byte[] clearTextBytes, byte[] pwdBytes) {
//        try {
//            // 1 获取加密密钥
//            SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM);
//
//            // 2 获取Cipher实例
//            Cipher cipher = Cipher.getInstance(CIPHER_MODE);
//
//            // 查看数据块位数 默认为16(byte) * 8 =128 bit
////            System.out.println("数据块位数(byte):" + cipher.getBlockSize());
//
//            // 3 初始化Cipher实例。设置执行模式以及加密密钥
//            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
//
//            // 4 执行
//            byte[] cipherTextBytes = cipher.doFinal(clearTextBytes);
//
//            // 5 返回密文字符集
//            return cipherTextBytes;
//
//        } catch (NoSuchPaddingException e) {
//            e.printStackTrace();
//        } catch (NoSuchAlgorithmException e) {
//            e.printStackTrace();
//        } catch (BadPaddingException e) {
//            e.printStackTrace();
//        } catch (IllegalBlockSizeException e) {
//            e.printStackTrace();
//        } catch (InvalidKeyException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    /**
//     * 原始解密
//     * @param cipherTextBytes 密文字节数组,待解密的字节数组
//     * @param pwdBytes 解密密码字节数组
//     * @return 返回解密后的明文字节数组,解密错误返回null
//     */
//    public static byte[] decrypt(byte[] cipherTextBytes, byte[] pwdBytes) {
//
//        try {
//            // 1 获取解密密钥
//            SecretKeySpec keySpec = new SecretKeySpec(pwdBytes, ENCRY_ALGORITHM);
//
//            // 2 获取Cipher实例
//            Cipher cipher = Cipher.getInstance(CIPHER_MODE);
//
//            // 查看数据块位数 默认为16(byte) * 8 =128 bit
////            System.out.println("数据块位数(byte):" + cipher.getBlockSize());
//
//            // 3 初始化Cipher实例。设置执行模式以及加密密钥
//            cipher.init(Cipher.DECRYPT_MODE, keySpec);
//
//            // 4 执行
//            byte[] clearTextBytes = cipher.doFinal(cipherTextBytes);
//
//            // 5 返回明文字符集
//            return clearTextBytes;
//
//        } catch (NoSuchAlgorithmException e) {
//            e.printStackTrace();
//        } catch (InvalidKeyException e) {
//            e.printStackTrace();
//        } catch (NoSuchPaddingException e) {
//            e.printStackTrace();
//        } catch (BadPaddingException e) {
//            e.printStackTrace();
//        } catch (IllegalBlockSizeException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        // 解密错误 返回null
//        return null;
//    }
//
//    //======================>BASE64<======================
//
//    /**
//     * BASE64加密
//     * @param clearText 明文,待加密的内容
//     * @param password 密码,加密的密码
//     * @return 返回密文,加密后得到的内容。加密错误返回null
//     */
//    public static String encryptBase64(String clearText, String password) {
//        try {
//            // 1 获取加密密文字节数组
//            byte[] cipherTextBytes = encrypt(clearText.getBytes(CHARACTER), pwdHandler(password));
//
//            // 2 对密文字节数组进行BASE64 encoder 得到 BASE6输出的密文
//            BASE64Encoder base64Encoder = new BASE64Encoder();
//            String cipherText = base64Encoder.encode(cipherTextBytes);
//
//            // 3 返回BASE64输出的密文
//            return cipherText;
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        // 加密错误 返回null
//        return null;
//    }
//
//    /**
//     * BASE64解密
//     * @param cipherText 密文,带解密的内容
//     * @param password 密码,解密的密码
//     * @return 返回明文,解密后得到的内容。解密错误返回null
//     */
//    public static String decryptBase64(String cipherText, String password) {
//        try {
//            // 1 对 BASE64输出的密文进行BASE64 decodebuffer 得到密文字节数组
//            BASE64Decoder base64Decoder = new BASE64Decoder();
//            byte[] cipherTextBytes = base64Decoder.decodeBuffer(cipherText);
//
//            // 2 对密文字节数组进行解密 得到明文字节数组
//            byte[] clearTextBytes = decrypt(cipherTextBytes, pwdHandler(password));
//
//            // 3 根据 CHARACTER 转码,返回明文字符串
//            return new String(clearTextBytes, CHARACTER);
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        // 解密错误返回null
//        return null;
//    }
//
//    //======================>HEX<======================
//
//    /**
//     * HEX加密
//     * @param clearText 明文,待加密的内容
//     * @param password 密码,加密的密码
//     * @return 返回密文,加密后得到的内容。加密错误返回null
//     */
//    public static String encryptHex(String clearText, String password) {
//        try {
//            // 1 获取加密密文字节数组
//            byte[] cipherTextBytes = encrypt(clearText.getBytes(CHARACTER), pwdHandler(password));
//
//            // 2 对密文字节数组进行 转换为 HEX输出密文
//            String cipherText = byte2hex(cipherTextBytes);
//
//            // 3 返回 HEX输出密文
//            return cipherText;
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        // 加密错误返回null
//        return null;
//    }
//
//    /**
//     * HEX解密
//     * @param cipherText 密文,带解密的内容
//     * @param password 密码,解密的密码
//     * @return 返回明文,解密后得到的内容。解密错误返回null
//     */
//    public static String decryptHex(String cipherText, String password) {
//        try {
//            // 1 将HEX输出密文 转为密文字节数组
//            byte[] cipherTextBytes = hex2byte(cipherText);
//
//            // 2 将密文字节数组进行解密 得到明文字节数组
//            byte[] clearTextBytes = decrypt(cipherTextBytes, pwdHandler(password));
//
//            // 3 根据 CHARACTER 转码,返回明文字符串
//            return new String(clearTextBytes, CHARACTER);
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        // 解密错误返回null
//        return null;
//    }
//
//    /*字节数组转成16进制字符串  */
//    public static String byte2hex(byte[] bytes) { // 一个字节的数,
//        StringBuffer sb = new StringBuffer(bytes.length * 2);
//        String tmp = "";
//        for (int n = 0; n < bytes.length; n++) {
//            // 整数转成十六进制表示
//            tmp = (java.lang.Integer.toHexString(bytes[n] & 0XFF));
//            if (tmp.length() == 1) {
//                sb.append("0");
//            }
//            sb.append(tmp);
//        }
//        return sb.toString().toUpperCase(); // 转成大写
//    }
//
//    /*将hex字符串转换成字节数组 */
//    private static byte[] hex2byte(String str) {
//        if (str == null || str.length() < 2) {
//            return new byte[0];
//        }
//        str = str.toLowerCase();
//        int l = str.length() / 2;
//        byte[] result = new byte[l];
//        for (int i = 0; i < l; ++i) {
//            String tmp = str.substring(2 * i, 2 * i + 2);
//            result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
//        }
//        return result;
//    }
//
//    public static void main(String[] args) {
//        String test = encryptHex("test", "1234567800000000");
//        System.out.println(test);
//
//        System.out.println(decryptHex(test, "1234567800000000"));
//    }
//}
package com.yihu.jw.utils;
/**
 * Created by hdwang on 2019/1/17.
 */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
 *  加密工具类
 */
public class AesUtil {
    private static final Logger logger = LoggerFactory.getLogger(AesUtil.class);
    private static final String KEY_ALGORITHM = "AES";
    /**
     * 默认的加密算法
     */
    public static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
    /**
     * AES 加密操作
     *
     * @param content 待加密内容
     * @param password 加密密码
     * @param iv 使用CBC模式,需要一个向量iv,可增加加密算法的强度
     * @return 加密数据
     */
    public static String encrypt(String content, String password, String iv) {
        try {
            //创建密码器
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            //密码key(超过16字节即128bit的key,需要替换jre中的local_policy.jar和US_export_policy.jar,否则报错:Illegal key size)
            SecretKeySpec keySpec = new SecretKeySpec(password.getBytes("utf-8"),KEY_ALGORITHM);
            //向量iv
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));
            //初始化为加密模式的密码器
            cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
            //加密
            byte[] byteContent = content.getBytes("utf-8");
            byte[] result = cipher.doFinal(byteContent);
            // 2 对密文字节数组进行 转换为 HEX输出密文
            String cipherText = byte2hex(result);
            return cipherText;
        } catch (Exception ex) {
            logger.error(ex.getMessage(),ex);
        }
        return null;
    }
    /**
     * AES 解密操作
     *
     * @param content 密文
     * @param password 密码
     * @param iv 使用CBC模式,需要一个向量iv,可增加加密算法的强度
     * @return 明文
     */
    public static String decrypt(byte[] content, String password, String iv) {
        try {
            //创建密码器
            Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
            //密码key
            SecretKeySpec keySpec = new SecretKeySpec(password.getBytes("utf-8"),KEY_ALGORITHM);
            //向量iv
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));
            //初始化为解密模式的密码器
            cipher.init(Cipher.DECRYPT_MODE,keySpec,ivParameterSpec);
            //执行操作
            byte[] result = cipher.doFinal(content);
            return new String(result,"utf-8");
        } catch (Exception ex) {
            logger.error(ex.getMessage(),ex);
        }
        return null;
    }
    /**
     * 字节数组转成16进制字符串,不转为大写
     * @param bytes
     * @return
     */
    public static String byte2hex(byte[] bytes) {
        // 一个字节的数
        StringBuffer sb = new StringBuffer(bytes.length * 2);
        String tmp = "";
        for (int n = 0; n < bytes.length; n++) {
            // 整数转成十六进制表示
            tmp = (Integer.toHexString(bytes[n] & 0XFF));
            if (tmp.length() == 1) {
                sb.append("0");
            }
            sb.append(tmp);
        }
        return sb.toString();
    }
    /*将hex字符串转换成字节数组 */
    public static byte[] hex2byte(String str) {
        if (str == null || str.length() < 2) {
            return new byte[0];
        }
        str = str.toLowerCase();
        int l = str.length() / 2;
        byte[] result = new byte[l];
        for (int i = 0; i < l; ++i) {
            String tmp = str.substring(2 * i, 2 * i + 2);
            result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);
        }
        return result;
    }
    /**
     * Convert hex string to byte[]
     *
     * @param hexString the hex string
     * @return byte[]
     */
    public static byte[] hexStringToBytes(String hexString) {
        if (hexString == null || hexString.equals("")) {
            return null;
        }
        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }
        return d;
    }
    public static byte charToByte(char c) {
        return (byte)"0123456789ABCDEF".indexOf(c);
    }
}

+ 187 - 0
business/base-service/src/main/java/com/yihu/jw/utils/SignUtil.java

@ -0,0 +1,187 @@
package com.yihu.jw.utils;
import com.alibaba.fastjson.JSONObject;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;
/**
 * @author: wangzh
 * @date: Created in 2021/10/25 9:40
 * @description:
 * @modified By:
 * @version: 0.1
 */
public class SignUtil {
    /**
     * description:
     * 1. 将jsonObject对象转换为键值以ascii值正序排列的treeMap集合,,
     * 以key1=value1,key2=value2密钥的形式拼接
     * 2. 以app_secret为key 0000000000000000为iv(向量) 进行aes-128-cbc加密 输出hex的密文(hex密文不要转成大写)
     * 3. 密文进行md5后就是sign值
     * create by: wangzh<br>
     * create time: 2022/3/18 10:50<br>
     * @param:
     * @return:
     */
    public static String buildAESMd5Sign(JSONObject jsonObject, String key, String iv){
        try {
            Map<String, Object> map = objectToMap(jsonObject);
            StringBuffer stringBuffer = new StringBuffer();
            for (Map.Entry<String, Object> entry : map.entrySet()){
                String k = entry.getKey();
                Object v = entry.getValue();
                //空值不传递,不参与签名组串
                if (null != v && !"".equals(v)) {
                    stringBuffer.append(k).append("=").append(v).append(",");
                }
            }
            // 去掉末尾的,
            String content = stringBuffer.toString();
            content = content.substring(0, content.length() - 1);
            String signAes = AesUtil.encrypt(content, key, iv);
            return toMd5(signAes);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }
    /**
     * description:
     * 1. 遍历map集合,以key1=value1&key2=value2&...&key=密钥的形式拼接
     * 2. MD5加密,转换大写
     * create by: wangzh<br>
     * create time: 2021/11/4 13:45<br>
     * @param: key :
     * @return:
     */
    public static String buildSign(Map<String, Object> map, String key) {
        StringBuffer stringBuffer = new StringBuffer();
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String k = entry.getKey();
            Object v = entry.getValue();
            //空值不传递,不参与签名组串
            if (null != v && !"".equals(v)) {
                stringBuffer.append(k).append("=").append(v).append("&");
            }
        }
        stringBuffer.append("key=").append(key);
        // MD5加密,结果转换为大写字符
        return toMd5(stringBuffer.toString()).toUpperCase();
    }
    /**
     * 对字符串进行MD5加密
     * @param str 需要加密的字符串
     * @return 小写MD5字符串 32位
     */
    public static String toMd5(String str) {
        String re = null;
        byte[] encrypt;
        try {
            byte[] tem = str.getBytes();
            MessageDigest md5 = MessageDigest.getInstance("md5");
            md5.reset();
            md5.update(tem);
            encrypt = md5.digest();
            StringBuilder sb = new StringBuilder();
            for (byte t : encrypt) {
                String s = Integer.toHexString(t & 0xFF);
                if (s.length() == 1) {
                    s = "0" + s;
                }
                sb.append(s);
            }
            re = sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return re;
    }
    /**
     * description:
     * 1.将对象转换为键值从小到大的treeMap集合<br>
     * create by: wangzh<br>
     * create time: 2021/10/25 10:13<br>
     * @param:
     * @return:
     */
    public static Map<String, Object> objectToMap(Object obj) throws Exception {
        if (obj == null){
            return null;
        }
        TreeMap<String, Object> map = new TreeMap<>();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            String key = property.getName();
            if (key.compareToIgnoreCase("class") == 0) {
                continue;
            }
            Method getter = property.getReadMethod();
            Object value = getter != null ? getter.invoke(obj) : null;
            map.put(key, value);
        }
        return map;
    }
    
    /**
     * description: 
     * 1. 将JSONObject对象转换为键值从小到大的treeMap集合<br>
     * 2. 若JSONObject对象里还有JSONObject对象,则递归将值按key值从小到大顺序,拼接起来
     * create by: wangzh<br>
     * create time: 2021/10/25 10:18<br>
     * @param: 
     * @return: 
     */
    public static Map<String, Object> objectToMap(JSONObject obj) throws Exception {
        if (obj == null){
            return null;
        }
        TreeMap<String, Object> map = new TreeMap<>();
        for (Map.Entry<String, Object> entry : obj.getInnerMap().entrySet()) {
            map.put(entry.getKey(), getJSONObjectItemJoinValue(entry.getValue()));
        }
        return map;
    }
    /**
     * description:
     * 1. 判断jsonObject对应key值的value是否是jsonObject类型<br>
     *     1.1 是,则递归获取value对象已排列属性的值,并拼接起来
     *     1.2 不是,则直接返回value的值
     * create by: wangzh<br>
     * create time: 2021/10/28 9:59<br>
     * @param:
     * @return:
     */
    private static Object getJSONObjectItemJoinValue(Object value){
        if (value instanceof JSONObject) {
            JSONObject objectItem = (JSONObject) value;
            StringBuilder itemValue = new StringBuilder();
            // 将JSONObject对象转换为键值从小到大的treeMap集合
            TreeMap<String, Object> treeMap = new TreeMap<>();
            for (Map.Entry<String, Object> entry : objectItem.entrySet()) {
                treeMap.put(entry.getKey(), entry.getValue());
            }
            // 遍历treeMap,递归获取JSONObject对象属性的值,并拼接起来
            treeMap.values().forEach(val -> itemValue.append(getJSONObjectItemJoinValue(val)));
            return itemValue.toString();
        }else{
            return value;
        }
    }
}

+ 38 - 5
business/sms-service/src/main/java/com/yihu/jw/sms/service/ZhongShanSMSService.java

@ -1,11 +1,18 @@
package com.yihu.jw.sms.service;
import com.alibaba.fastjson.JSONObject;
import com.jasson.im.api.APIClient;
import com.yihu.jw.sms.util.ykyy.util.HttpClient;
import com.yihu.jw.util.common.PwdUtil;
import com.yihu.jw.util.http.HttpClientUtil;
import com.yihu.utils.security.MD5;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.*;
/**
 * 中山医院短信网关
@ -20,7 +27,9 @@ public class ZhongShanSMSService {
	private String name = "jkzl";
	private String pwd = "jkzl";
	private APIClient handler = new APIClient();
	
	@Autowired
	private HttpClientUtil httpClientUtil;
	public void init()
	{
		int connectRe = handler.init(host, name, pwd, apiId,dbName);
@ -43,7 +52,7 @@ public class ZhongShanSMSService {
	 * @param content 短信内容
	 * @return
	 */
	public int ZhongShangSendSMS (String mobileStr,String content){
	public int ZhongShangSendSMS1 (String mobileStr,String content){
		init();
		
		int result = 0;
@ -100,6 +109,30 @@ public class ZhongShanSMSService {
		
		return result;
	}
	public int ZhongShangSendSMS(String destNum,String content){
		String url = "http://192.1.33.242:9010/api/singlesmshl.do";
		String appid="zjxl";
		String appSecret = "zjxl@7210";
		String salt = PwdUtil.randomString(5);
		String signStr = appid+salt+appSecret+destNum+content;
		String sign = MD5.md5Hex(signStr).toLowerCase();
		List<NameValuePair> params = new ArrayList<>();
		params.add(new BasicNameValuePair("destNum", destNum));
		params.add(new BasicNameValuePair("content", content));
		params.add(new BasicNameValuePair("appid", appid));
		params.add(new BasicNameValuePair("salt",salt));
		params.add(new BasicNameValuePair("sign",sign));
		String res = httpClientUtil.get(url,params,"GBK");
		System.out.println("res==="+res);
		if (StringUtils.isNoneBlank(res)){
			JSONObject object = JSONObject.parseObject(res);
			return object.getInteger("smsCode");
		}else {
			return 0;
		}
	}
	
	public void info(Object obj)
	{

+ 12 - 0
svr/svr-internet-hospital/src/main/java/com/yihu/jw/hospital/endpoint/prescription/PrescriptionEndpoint.java

@ -3752,5 +3752,17 @@ public class PrescriptionEndpoint extends EnvelopRestEndpoint {
        }
    }
    @PostMapping("/getZsyyCloudImageToken")
    @ApiOperation(value = "获取云影像token", notes = "获取云影像token")
    public Envelop getZsyyCloudImageToken(
            @ApiParam(name = "patientId", value = "patientId")
            @RequestParam(value = "patientId", required = false) String patientId) {
        try {
            return success("操作成功", entranceService.getCloudImageAccessToken(patientId));
        } catch (Exception e) {
            return Envelop.getError(e.getMessage());
        }
    }
}