精华内容
下载资源
问答
  • java流水单号生成

    千次阅读 2019-07-25 20:40:55
    在开发中几乎所用的系统都会涉及到唯一单号的生成,通常分为两种:一种是有序的生成带有一定规则的单号,另一种是无序的随机生成唯一的单号。这里主要是介绍怎么才能在不同场景下生成有序带有一定规则的单号。 1....

           在开发中几乎所用的系统都会涉及到唯一单号的生成,通常分为两种:一种是有序的生成带有一定规则的单号,另一种是无序的随机生成唯一的单号。这里主要是介绍怎么才能在不同场景下生成有序带有一定规则的单号。

    1.synchronized 同步获取单号

    创建一个表来存储单号,使用唯一索引确保获得的每一个单号都是唯一的。

    CREATE TABLE `generate_no` (
      `tid` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
      `serial_no` varchar(50) NOT NULL COMMENT '流水号',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后修改时间',
      PRIMARY KEY (`tid`),
      UNIQUE KEY `uk_serial_no` (`serial_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4
    

    先通过SQL获取单号,再把单号存到表里保证表里的单号是最新,加synchronized是防止并发的时候生成相同的单号,相同的单号在插入数据库触发唯一索引报错。

    	/**
    	 * 获取单号
    	 * @param prefix 前缀
    	 * @return
    	 */
    	public synchronized String getSerialNo(String prefix) {
    		String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
    		String param = prefix + dateStr;
    		String serialNo = baseMapper.getSerialNo(param);
    		GenerateNo generateNo = new GenerateNo();
    		generateNo.setSerialNo(serialNo);
    		this.save(generateNo);
    		return serialNo;
    	}

    获取单号SQL

    SELECT CONCAT(#{param},LPAD(SUBSTR(IFNULL(MAX(serial_no),1),-4)+1,4,0))
    FROM generate_no
    WHERE serial_no LIKE CONCAT(#{param}, '%')

    2.利用redis生成单号

    没啥说的直接上代码。

            @Autowired
    	private JedisCluster jedis;
    
    	/**
    	 * 从redis获取最新单号
    	 * 生成规则 前缀 + 日期 + 流水码(五位)
    	 * @param prefix  前缀
    	 * @return
    	 */
    	public String getAutoNumber(String prefix) {
    		String dateStr = new SimpleDateFormat("yyMMdd").format(new Date());
    		//redis 存储的 key
    		String autoKey = prefix + dateStr;
    		//校验key是否存在
    		if (jedis.exists(autoKey)) {
    			//key值不存在插入,如果存在即操作失败,不会覆盖value值
    			jedis.setnx(autoKey, String.valueOf(0));
    		}
    		//获取流水号
    		String autoNumber = String.valueOf(jedis.incr(autoKey));
    		DecimalFormat df = new DecimalFormat("00000");
    		//流水号不足5位补充成5位
    		autoNumber = df.format(Integer.parseInt(autoNumber));
    		//前缀 + 时间 + 流水码
    		String number = autoKey + autoNumber;
    		return number;
    	}

    3.乐观锁获取单号

    3.1 创建单号表

    将单号拆分成三个字段(前缀+日期+流水号),避免表数据太多,所以表里面只存最大的单号。

    CREATE TABLE `generate_no` (
      `tid` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
      `prefix` varchar(100) NOT NULL COMMENT '单号前缀',
      `serial_no` int(5) NOT NULL COMMENT '流水号',
      `create_date` varchar(8) NOT NULL DEFAULT '' COMMENT '创建日期',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后修改时间',
      PRIMARY KEY (`tid`),
      UNIQUE KEY `uk_prefix_serial_no` (`prefix`,`serial_no`,`create_date`)
    ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4
    

    3.2 获取单号的流程图

    代码就不写了,画个流程图吧,按照流程图codeing就可以了,编码过程中注意异常的catch和版本控制。

    4.mysql + redis + 分布式锁生 成单号

    4.1 创建单号表

    将单号拆分成三个字段(前缀+日期+流水号),避免表数据太多,所以表里面只存最大的单号。

    CREATE TABLE `generate_no` (
      `tid` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
      `prefix` varchar(100) NOT NULL COMMENT '单号前缀',
      `serial_no` int(5) NOT NULL COMMENT '流水号',
      `create_date` varchar(8) NOT NULL DEFAULT '' COMMENT '创建日期',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后修改时间',
      PRIMARY KEY (`tid`),
      UNIQUE KEY `uk_prefix_serial_no` (`prefix`,`serial_no`,`create_date`)
    ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4
    

    4.2 获取单号流程图

    任性不写代码,看流程图吧。

    redis存储的单号使用List结构,通过lpop命令来弹出头部元素并返回来实现取单号。

    5.总结

    上面介绍了4种单号的生成方法,它们有个字的优缺点和使用场景。

    第一种使用同步方法代码简洁,实现方便,但是效率低,只适合访问量较小的单体应用系统。

    第二种使用redis生成单号代码简洁、实现方便、满足高并发,但是在用于redis数据存储在内存中,有key值丢失的风险。

    第三种使用乐观锁生成单号是第一种的改良版,能满足高并发环境,由于每次生成单号都需要访问最少两次数据库,同样存在性能问题,适合访问量小的系统。

    由于单独使用mysql或者redis都存在一些问题,也就产生了mysql结合redis的方案,也就是第四种方案,每次访问mysql都生成1000个单号存放在redis里面,将最大单号存放在mysql中,解决了mysql性能瓶颈和redis特殊情况下key值丢失问题,适用于大部分高并发、分布式系统使用。

    展开全文
  • java 生成单号

    2019-06-28 09:24:05
       单号的生成,好像在做项目的时候无所不在。这个生成单号是从数据库里面查询出来,然后再判断是否是今天的日期,如果是今天的日期在后面加一,否则又从001开始。 Servletl的代码: //生成一个单号 Date ...

       单号的生成,好像在做项目的时候无处不在。这个生成单号是从数据库里面查询出来,然后再判断是否是今天的日期,如果是今天的日期在后面加一,否则又从001开始。

    Servletl的代码:

    //生成一个单号
    Date RegisterDate=new Date();
    SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
    String presentTime =sdf.format(RegisterDate);//获取当前时间
    UserinfoService userinfoservice=new UserinfoServiceImpl();//查询数据库中最大id的字段,这样就可以查到最新的订单编号
    String ReturnTicketNumber=userinfoservice.SelectNumber();//获取数据库最新的编号
    String SQLTime=ReturnTicketNumber.substring(2,10);//拆分得到日期
    String number=ReturnTicketNumber.substring(10,13);//拆分得到编号
    String Number="";
    //数据库的时间和当前时间比较(当天已有数据就增加编号,没有就是新的一条编号 为00)
    if(SQLTime.equals(presentTime)){
    //判断日期是否是今天的,如果是今天的i+1否则从001
     int i=Integer.parseInt(number);
     Number="TP"+SQLTime+0+0+(i+1);//单号格式TP20190628001
    }else{
     Number="TP"+presentTime+"001";
    }
    

    dao的实现类

     public String SelectNumber() {
    //最大ID的单号就是最新的单号
     	String sql="SELECT ReturnTicketNumber FROM SYS_ReturnTicket WHERE ReturnTicketID = (SELECT MAX(ReturnTicketID) FROM SYS_ReturnTicket)";
     	String ReturnTicketNumber="";
     	try {
     		con=DbUtil.getConnection();
     		ps=con.prepareStatement(sql);
     		rs=ps.executeQuery();
     		while (rs.next()) {
     			ReturnTicketNumber=rs.getString("ReturnTicketNumber");
     		}
     	} catch (Exception e) {
     		e.printStackTrace();
     	}finally{
     		DbUtil.close(con, ps, rs);
     	}
     	return ReturnTicketNumber;
     }
    
    展开全文
  • java根据物流单号查询物流详细

    千次阅读 2020-11-04 17:35:28
    java根据物流单号查询物流信息 package com.yoyo.expressage.controller; import com.alibaba.fastjson.JSON; import com.yoyo.expressage.resquest.KdNiaoDto; import com.yoyo.expressage.util.KdNiaoUtil; import...

    java根据物流单号查询物流信息

    package com.yoyo.expressage.controller;
    import com.alibaba.fastjson.JSON;
    import com.yoyo.expressage.resquest.KdNiaoDto;
    import com.yoyo.expressage.util.KdNiaoUtil;
    import io.swagger.annotations.ApiImplicitParam;
    import io.swagger.annotations.ApiImplicitParams;
    import io.swagger.annotations.ApiOperation;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.HashMap;
    import java.util.Map;
    @RestController
    public class KDNiao {
    //以圆通快递测试
        static  final  String fastId ="YTO";
        static  final  String fastName="圆通快递";
        @ApiOperation(value = "获取的物流跟踪数据")
        @ApiImplicitParams({
                @ApiImplicitParam(name = "traceId", paramType = "query", value = "快递单号", required = true, dataType = "String"), })
        @GetMapping(value = "/getKdNiaoFastList")
        public Object getKdNiao( @RequestParam(value = "traceId") String traceId) throws Exception {
            if(StringUtils.isEmpty(traceId)){
                return new Exception("快递单号不能为空");
            }
            //接入第三方快递鸟 获取物流状态
            String  json = KdNiaoUtil.getOrderTracesByJson(fastId,traceId);
            if (json == null)
                throw new Exception("物流信息不存在");
            KdNiaoDto kdNiaoDto = JSON.parseObject(json, KdNiaoDto.class);
            // 物流状态(0:无轨迹 ,1已揽收 2在途中 3签收 4问题件)
            if ("false".equals(kdNiaoDto.getSuccess()))
                throw new Exception("不支持该运单号,请到官网查询");
    
            Map<String, Object> map = new HashMap<>();
            map.put("fastName",fastName);
            map.put("traceId", traceId);
            map.put("state", kdNiaoDto.getState());
            map.put("success", kdNiaoDto.getSuccess());
            map.put("dataList", kdNiaoDto.getTraces());
            return map;
    
        }
    }
    
    
    package com.yoyo.expressage.util;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.security.MessageDigest;
    import java.util.HashMap;
    import java.util.Map;
    
    
    /**
     * 整合第三方物流(快递鸟)接口的工具类
     */
    public class KdNiaoUtil {
    
    //快递鸟官网自己申请一个账号
        private static String URL = "";
    
        private static String EBUSINESSID = "";
    
        private static String APPKEY = "";
    
    
        /**
         * 即时查询工具
         */
    
        /**
         * Json方式 查询订单物流轨迹
         * expCode: 快递公司的id
         * expNo:运单id
         * @throws Exception
         */
        public static String getOrderTracesByJson(String expCode, String expNo) throws Exception {
            String requestData = "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";
    
            Map<String, String> params = new HashMap<String, String>();
            params.put("RequestData", urlEncoder(requestData, "UTF-8"));
            params.put("EBusinessID", EBUSINESSID);
            params.put("RequestType", "1002");
           // params.put("CustomerName","徐少彬");
            String dataSign = null;
            try {
                dataSign = encrypt(requestData,APPKEY, "UTF-8");
                params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
                params.put("DataType", "2");
                String result = sendPost(URL, params);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
    
    
            //根据公司业务处理返回的信息......
    
            return null;
        }
    
        /**
         *
         * @param content
         * @param keyValue
         * @param charset
         * @return
         */
        private static  String encrypt(String content, String keyValue, String charset) throws Exception {
            if (keyValue != null)
            {
                return base64(MD5(content + keyValue, charset), charset);
            }
            return base64(MD5(content, charset), charset);
        }
    
        /**
         * @param str
         * @param charset
         * @return
         */
        private static String urlEncoder(String str, String charset) throws Exception {
    
            String result = null;
            try {
                result = URLEncoder.encode(str, charset);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        private static String sendPost(String url, Map<String, String> params) {
            OutputStreamWriter out = null;
            BufferedReader in = null;
            StringBuilder result = new StringBuilder();
            try {
                java.net.URL realUrl = new URL(url);
                HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // POST方法
                conn.setRequestMethod("POST");
                // 设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.connect();
                // 获取URLConnection对象对应的输出流
                out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
                // 发送请求参数
                if (params != null) {
                    StringBuilder param = new StringBuilder();
                    for (Map.Entry<String, String> entry : params.entrySet()) {
                        if(param.length()>0){
                            param.append("&");
                        }
                        param.append(entry.getKey());
                        param.append("=");
                        param.append(entry.getValue());
                        //System.out.println(entry.getKey()+":"+entry.getValue());
                    }
                    //System.out.println("param:"+param.toString());
                    out.write(param.toString());
                }
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result.append(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result.toString();
    
        }
    
        /**
         * 物流跟踪查询工具
         */
        private static String base64(String str, String charset) throws UnsupportedEncodingException{
            String encoded = base64Encode(str.getBytes(charset));
            return encoded;
        }
    
        private static char[] base64EncodeChars = new char[] {
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
                'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
                'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
                'w', 'x', 'y', 'z', '0', '1', '2', '3',
                '4', '5', '6', '7', '8', '9', '+', '/' };
    
        public static String base64Encode(byte[] data) {
            StringBuffer sb = new StringBuffer();
            int len = data.length;
            int i = 0;
            int b1, b2, b3;
            while (i < len) {
                b1 = data[i++] & 0xff;
                if (i == len)
                {
                    sb.append(base64EncodeChars[b1 >>> 2]);
                    sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
                    sb.append("==");
                    break;
                }
                b2 = data[i++] & 0xff;
                if (i == len)
                {
                    sb.append(base64EncodeChars[b1 >>> 2]);
                    sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
                    sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
                    sb.append("=");
                    break;
                }
                b3 = data[i++] & 0xff;
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
                sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
                sb.append(base64EncodeChars[b3 & 0x3f]);
            }
            return sb.toString();
        }
    
    
        private static String MD5(String str, String charset) throws Exception {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes(charset));
            byte[] result = md.digest();
            StringBuffer sb = new StringBuffer(32);
            for (int i = 0; i < result.length; i++) {
                int val = result[i] & 0xff;
                if (val <= 0xf) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(val));
            }
            return sb.toString().toLowerCase();
        }
    
    }
    
    
    
    package com.yoyo.expressage.resquest;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.List;
    
    @Data
    @ApiModel(value = "跟踪物流信息")
    public class KdNiaoDto implements Serializable {
    
        /**
         * 快递单号
         */
        @ApiModelProperty("快递单号")
        private String LogisticCode;
    
        /**
         * 物流状态(0:无轨迹 ,1已揽收 2在途中 3签收 4问题件)
         */
        @ApiModelProperty("物流状态(0:无轨迹 ,1已揽收 2在途中 3签收 4问题件)")
        private String State;
    
        /**
         * 公司快递鸟账号
         */
        @ApiModelProperty("快递鸟账号")
        private String EBusinessID;
    
        /**
         * 返回状态
         */
        @ApiModelProperty("返回状态")
        private String Success;
    
        /**
         * 快递的轨迹数据
         */
        @ApiModelProperty("快递的轨迹数据")
        private List<TraceDto> Traces;
    
        /**
         * 原因
         */
        @ApiModelProperty("失败的原因")
        private String Reason;
    
    
    }
    
    
    package com.yoyo.expressage.resquest;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import java.io.Serializable;
    /**
     * 订单对应的快递轨迹信息
     */
    @Data
    @ApiModel(value = "快递轨迹信息")
    public class TraceDto implements Serializable {
        /**
         * 快递的轨迹
         */
        @ApiModelProperty("快递的轨迹")
        private String AcceptStation;
    
        /**
         * 轨迹对应的时间
         */
        @ApiModelProperty("轨迹对应的时间")
        private String AcceptTime;
    }
    
    
    package com.yoyo.expressage;
    
    import com.spring4all.swagger.EnableSwagger2Doc;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    @EnableSwagger2Doc
    @SpringBootApplication
    public class ExpressageApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ExpressageApplication.class, args);
        }
    
    }
    
    
    server:
      port: 8080
    #swagger配置
    swagger:
      base-package: com.yoyo.expressage
      title: center
      version: 1.0.0
      exclude-path: /ops/**, /error
      contact:
        name: yoyo
        email: 619296212@qq.com
    
    展开全文
  • import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpUR...
    import java.io.BufferedReader;
    
    import java.io.IOException;
    
    import java.io.InputStreamReader;
    
    import java.io.OutputStreamWriter;
    
    import java.io.UnsupportedEncodingException;
    
    import java.net.HttpURLConnection;
    
    import java.net.URL;
    
    import java.net.URLEncoder;
    
    import java.security.MessageDigest;
    
    import java.util.HashMap;
    
    import java.util.Map;
    
    public class KdniaoTrackQueryAPI {
    
    //DEMO
    
    public static void main(String[] args) {
    
    KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();
    
    try {
    
    String result = api.getOrderTracesByJson("ANE", "210001633605");
    
    System.out.print(result);
    
    } catch (Exception e) {
    
    e.printStackTrace();
    
    }
    
    }
    
    //电商ID
    
    private String EBusinessID="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
    
    //电商加密私钥,快递鸟提供,注意保管,不要泄漏
    
    private String AppKey="test";
    
    //请求url
    
    private String ReqURL="http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
    
    /**
    
    * Json方式 查询订单物流轨迹
    
    * @throws Exception
    
    */
    
    public String getOrderTracesByJson(String expCode, String expNo) throws Exception{
    
    String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";
    
    Map<String, String> params = new HashMap<String, String>();
    
    params.put("RequestData", urlEncoder(requestData, "UTF-8"));
    
    params.put("EBusinessID", EBusinessID);
    
    params.put("RequestType", "1002");
    
    String dataSign=encrypt(requestData, AppKey, "UTF-8");
    
    params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
    
    params.put("DataType", "2");
    
    String result=sendPost(ReqURL, params);
    
    //根据公司业务处理返回的信息......
    
    return result;
    
    }
    
    /**
    
    * MD5加密
    
    * @param str 内容
    
    * @param charset 编码方式
    
    * @throws Exception
    
    */
    
    @SuppressWarnings("unused")
    
    private String MD5(String str, String charset) throws Exception {
    
    MessageDigest md = MessageDigest.getInstance("MD5");
    
    md.update(str.getBytes(charset));
    
    byte[] result = md.digest();
    
    StringBuffer sb = new StringBuffer(32);
    
    for (int i = 0; i < result.length; i++) {
    
    int val = result[i] & 0xff;
    
    if (val <= 0xf) {
    
    sb.append("0");
    
    }
    
    sb.append(Integer.toHexString(val));
    
    }
    
    return sb.toString().toLowerCase();
    
    }
    
    /**
    
    * base64编码
    
    * @param str 内容
    
    * @param charset 编码方式
    
    * @throws UnsupportedEncodingException
    
    */
    
    private String base64(String str, String charset) throws UnsupportedEncodingException{
    
    String encoded = base64Encode(str.getBytes(charset));
    
    return encoded;
    
    }
    
    @SuppressWarnings("unused")
    
    private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
    
    String result = URLEncoder.encode(str, charset);
    
    return result;
    
    }
    
    /**
    
    * 电商Sign签名生成
    
    * @param content 内容
    
    * @param keyValue Appkey
    
    * @param charset 编码方式
    
    * @throws UnsupportedEncodingException ,Exception
    
    * @return DataSign签名
    
    */
    
    @SuppressWarnings("unused")
    
    private String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception
    
    {
    
    if (keyValue != null)
    
    {
    
    return base64(MD5(content + keyValue, charset), charset);
    
    }
    
    return base64(MD5(content, charset), charset);
    
    }
    
    /**
    
    * 向指定 URL 发送POST方法的请求
    
    * @param url 发送请求的 URL
    
    * @param params 请求的参数集合
    
    * @return 远程资源的响应结果
    
    */
    
    @SuppressWarnings("unused")
    
    private String sendPost(String url, Map<String, String> params) {
    
    OutputStreamWriter out = null;
    
    BufferedReader in = null;
    
    StringBuilder result = new StringBuilder();
    
    try {
    
    URL realUrl = new URL(url);
    
    HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
    
    // 发送POST请求必须设置如下两行
    
    conn.setDoOutput(true);
    
    conn.setDoInput(true);
    
    // POST方法
    
    conn.setRequestMethod("POST");
    
    // 设置通用的请求属性
    
    conn.setRequestProperty("accept", "*/*");
    
    conn.setRequestProperty("connection", "Keep-Alive");
    
    conn.setRequestProperty("user-agent",
    
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
    
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    
    conn.connect();
    
    // 获取URLConnection对象对应的输出流
    
    out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
    
    // 发送请求参数
    
    if (params != null) {
    
    StringBuilder param = new StringBuilder();
    
    for (Map.Entry<String, String> entry : params.entrySet()) {
    
    if(param.length()>0){
    
    param.append("&");
    
    }
    
    param.append(entry.getKey());
    
    param.append("=");
    
    param.append(entry.getValue());
    
    //System.out.println(entry.getKey()+":"+entry.getValue());
    
    }
    
    //System.out.println("param:"+param.toString());
    
    out.write(param.toString());
    
    }
    
    // flush输出流的缓冲
    
    out.flush();
    
    // 定义BufferedReader输入流来读取URL的响应
    
    in = new BufferedReader(
    
    new InputStreamReader(conn.getInputStream(), "UTF-8"));
    
    String line;
    
    while ((line = in.readLine()) != null) {
    
    result.append(line);
    
    }
    
    } catch (Exception e) {
    
    e.printStackTrace();
    
    }
    
    //使用finally块来关闭输出流、输入流
    
    finally{
    
    try{
    
    if(out!=null){
    
    out.close();
    
    }
    
    if(in!=null){
    
    in.close();
    
    }
    
    }
    
    catch(IOException ex){
    
    ex.printStackTrace();
    
    }
    
    }
    
    return result.toString();
    
    }
    
    private static char[] base64EncodeChars = new char[] {
    
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
    
    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    
    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    
    'w', 'x', 'y', 'z', '0', '1', '2', '3',
    
    '4', '5', '6', '7', '8', '9', '+', '/' };
    
    public static String base64Encode(byte[] data) {
    
    StringBuffer sb = new StringBuffer();
    
    int len = data.length;
    
    int i = 0;
    
    int b1, b2, b3;
    
    while (i < len) {
    
    b1 = data[i++] & 0xff;
    
    if (i == len)
    
    {
    
    sb.append(base64EncodeChars[b1 >>> 2]);
    
    sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
    
    sb.append("==");
    
    break;
    
    }
    
    b2 = data[i++] & 0xff;
    
    if (i == len)
    
    {
    
    sb.append(base64EncodeChars[b1 >>> 2]);
    
    sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
    
    sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
    
    sb.append("=");
    
    break;
    
    }
    
    b3 = data[i++] & 0xff;
    
    sb.append(base64EncodeChars[b1 >>> 2]);
    
    sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);
    
    sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);
    
    sb.append(base64EncodeChars[b3 & 0x3f]);
    
    }
    
    return sb.toString();
    
    }
    
    }
    
    展开全文
  • 废话不多说,直接上代码 ... * @description: 自动生成单号工具类 格式 : yyyyMMdd0001,每日从0001开始自增长 * @date 2021/9/16 11:07 */ public class GenerateOddNumbersUtil { /** * 功能描述: 自动
  • Java 生成有规则的工单单号

    千次阅读 2020-04-22 11:19:29
    Java 生成有规则的工单单号 public static String getFormateDate(Date date, String pattern) { SimpleDateFormat dateFormat = setFormat(pattern); String timeString = dateFormat.format(date); ...
  • JAVA快递单号查询接口Demo源码,登录快递鸟获得用户ID和APIKey对应各demo中的EBusinessID、AppKey。
  • 快递单号自动识别查询接口DemoJAVA版下载,登录快递鸟官网获得用户ID和APIKey对应各demo中的EBusinessID、AppKey。
  • java自动生成物流单号

    千次阅读 2012-06-28 12:17:36
    public class DeliveryNum { /** * //宅急送物流单 和 雅玛多物流单...* @param deliverynum 物流单号 * @return 后一个物流单号 */ public static String getOneNum(String deliverynum) { String deliveryvalue="";
  • java之流水单号的生成

    2021-03-16 16:23:18
    } //如果没有流水单号,以当前日期重新开始生成流水单号 }else { int number = 1; Express express = new Express(); express.setOdd("LL"+getBody(number)); nowOdd = express.getOdd(); } return nowOdd; } }
  • java根据日期生成单号

    2021-08-15 09:31:23
    import java.time.LocalDateTime; public class Test1 { public static void main(String[] args) { String electronFlowNo = "210814124"; String oldPrefix = electronFlowNo.substring(0, 6); String ...
  • 顺丰、EMS 单号算法 delphi 写的,里面部分变量可能是多余的,主要是当时定义为以后用的,可以删掉或整合。两个方法,直接调用即可,第一个参数为开头第一个快递单单号,第二个参数为要生成的个数。 本程序 2010-09...
  • import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 订单号生成器 * * @author Yaphis ...
  • public class OrderNoUtil { /** * 获取订单号 * @return */ public static String getOrderNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String newDate = sdf.format(new Date...
  • Java 生成随机订单号

    千次阅读 2020-11-18 14:53:33
    Java 生成随机订单号 /** 根据时间生成随机订单号 */ public class GenerateNum { // 全局自增数 private static int count = 0; // 每毫秒秒最多生成多少订单(最好是像9999这种准备进位的值) private static ...
  • 在项目开发的过程中,如果一个系统存在多种不同类型的单据,单号生成就比较难以处理,为此,创造出一个单号生成的工具类就很有必要。直接上代码: 实体类:(数据库字段同下) public class SerialNumber { @...
  • importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjava.text.DecimalFormat;importjava.text.S...
  • 希望对大家有JAVA快递单号查询课题报告 是多发发顺风萨法防守打法反电动势范德萨发放的
  • 电商平台及ISV商家对物流api接口的需求有很多,今天我们主要分享的就是快递鸟快递单号查询接口的对接指南,快递单号查询接口对接的应用场景有很多,很多场景会遇到,最主要的就是电商网站用户打开“我的订单”时调用...
  • importjava.text.SimpleDateFormat;importjava.util.Date;publicclassOrderID{inti=0;publicStringgenOrderID(){intn=0;StringDateStr;Stringistr;//设置流水号,...package com.zxd.base;import java...
  • java订单号怎么做

    2021-03-10 02:58:22
    看你加了Java话题,我没正经用过Java,就只说一下伪代码哈哈:class Order {//存储订单的各项信息}//这个类要作为一个抽象类abstract class Filter {//构造函数什么的 //对订单o执行操作 abstract Order apply(Order...
  • 这里介绍的是订单号或者流水号的生成,用的方法是时间戳+随机数,如果你要严谨的算法生成的订单号,请勿下载,下载前,可以看下这篇文章介绍【https://blog.csdn.net/qq_27471405/article/details/82887786】
  • Java自动生成订单号

    千次阅读 2020-04-07 13:38:40
    java生成订单号/出库单号/入库单号java自动生成唯一出库单号 /** * @author: * @date: 2019/12/27 * @time: 16:54 * @description: */ public class TimeNumberUtils { public static void main(String[] ...
  • 简介:本文将使用Java中String.format()函数、Date()类进行编写流水订单号。关于String.format()函数的相关知识,可参考我的博客:Java--String.format()函数博客收录示例代码如下:package com.example.test;import...
  • @Autowired RedisTemplate<... * 单号每天从1开始 * @return */ public synchronized String createBillNumber(){ //获取当前年月日 String year = new SimpleDateFormat("yyyyMMdd").format(new...
  • 简单的方式基于数据库 auto_increment_increment 来获取 ID。首先在数据库中创建一张 sequence 表,其中 seq_name 用以区分不同业务标识,从而实现支持多种业务场景下的自增 ID, current_value 为当前值, _...
  • java 使用流水单号 生成订单编号

    千次阅读 2018-04-25 20:27:52
    有一个流水表,四个字段自增主键存单子的日期 单子号guid 与订单关联的guidselect ROW_NUMBER() OVER (order by id) as rowid , releaseTime,guid from zx_serialNumber_table order by cast(releaseTime as DATETIME...
  • JAVA中取顺序号 (转)

    2021-03-10 00:59:50
    JAVA中取顺序号 (转)[@more@]在写系统的时候,经常会遇到用一个唯一的键值去票识一个对象,如数据库中一条记录的主键,文件的文件名等。常用的做法将这个键值从1,2,3……这样一值递加下去,但这样会比较费时。如在...
  • Java实现的订单号生成工具,生成非重复订单号,可设置每毫秒生成的订单最大值。用到了对象锁。import java.text.SimpleDateFormat;import java.util.Date;/*** @ClassName: MakeOrderNum* @CreateTime 2015年9月13日...
  • java生成订单号思路

    2020-12-04 06:44:04
    业务场景 比如说我们在秒杀中需要按天生成的订单号 但是此时只是生成这个订单号不需要做到将订单号入库 可以采用redis 实现 @Override public String createOrderNo() { try { //默认1500,redis分布式基于不同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,252
精华内容 2,900
关键字:

java单据号

java 订阅