Java生成独一无二的工单号(Demo)

目录

前言

涉及的相关知识推荐阅读:

  1. Java关于RedisTemplate的使用分析 附代码
  2. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

此文主要以Demo为例,对此直奔主题
以下Demo有参考价值

Demo

接口文件:

/**
 * 使用redis生成分布式ID
 */
public interface IdGeneratorService {

	/**
	 * @param biz 业务名称
	 */
	long generatorId(String biz);

	/**
	 *
	 * @return
	 */
	long generatorId();

	/**
	 * 返回工单号 customizerStr-日期-序号
	 * @param customizerStr 自定义参数
	 */
	String  generatorOrderNo(String customizerStr);
}

其生成的工单函数如下:

import com.google.common.base.Strings;

import org.springblade.equipment.service.IdGeneratorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;

import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class RedisIdGeneratorService implements IdGeneratorService {

	private static final String keyPrefix = "smart";

	/**
	 * JedisClient对象
	 */
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;


	/**
	 * @Description
	 * @author butterfly
	 */
	private String getIDPrefix() {
		Date date = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int year = c.get(Calendar.YEAR);
		int day = c.get(Calendar.DAY_OF_YEAR); // 今天是第多少天
		int hour = c.get(Calendar.HOUR_OF_DAY);
		int minute = c.get(Calendar.MINUTE);
		int second = c.get(Calendar.SECOND);
		String dayFmt = String.format("%1$03d", day); // 0补位操作 必须满足三位
		String hourFmt = String.format("%1$02d", hour);  // 0补位操作 必须满足2位
		String minuteFmt = String.format("%1$02d", minute);  // 0补位操作 必须满足2位
		String secondFmt = String.format("%1$02d", second);  // 0补位操作 必须满足2位
		StringBuffer prefix = new StringBuffer();
		prefix.append((year - 2000)).append(dayFmt).append(hourFmt).append(minuteFmt).append(secondFmt);
		return prefix.toString();
	}

	/**
	 * 自定义工单前缀
	 */
	private String getOrderNoPrefix(String customizerStr){
		StringBuffer prefix = new StringBuffer();
		LocalDate now = LocalDate.now();
		prefix.append(customizerStr).append("-").append(now.getYear()).append(now.getMonthValue()).append(now.getDayOfMonth());
		return prefix.toString();
	}

	/**
	 * @author butterfly
	 */
	private long incrDistrId(String biz) {
		String prefix = getIDPrefix();
		String orderId = null;
		String key = "#{biz}:id:".replace("#{biz}", biz).concat(prefix); // 00001
		try {
			ValueOperations<String, Object> valueOper = redisTemplate.opsForValue();
			Long index = valueOper.increment(key, 1);
			orderId = prefix.concat(String.format("%1$05d", index)); // 补位操作 保证满足5位
		} catch (Exception ex) {
			log.error("分布式订单号生成失败异常。。。。。", ex);
		} finally {
			redisTemplate.expire(key, 600, TimeUnit.SECONDS);//保留10分钟内的key
		}
		if (Strings.isNullOrEmpty(orderId)) return 0;
		return Long.parseLong(orderId);
	}

	/**
	 * @Description 生成分布式ID
	 * @author butterfly
	 */
	@Override
	public long generatorId(String biz) {
		// 转成数字类型,可排序
		return incrDistrId(biz);
	}

	@Override
	public long generatorId() {
		return incrDistrId(keyPrefix);
	}

	/**
	 * 获得前缀
	 * 去redis查看是否有对应的值
	 * 有的话取回来新增 001-》002
	 * 没有的直接插入,值为001
	 * 设置过期时间24小时
	 * @param customizerStr 自定义参数
	 * @return
	 */
	@Override
	public String generatorOrderNo(String customizerStr) {
		String orderNoPrefix = this.getOrderNoPrefix(customizerStr);
		String key = orderNoPrefix;
		String value ="";
		try{
			ValueOperations<String, Object> valueOper = redisTemplate.opsForValue();
			Object o = valueOper.get(key);
			//没有的直接插入,值为001
			if(o==null){
				valueOper.set(key,1);
				value="001";
			}else{
				//有的话取回来新增 001-》002
				Integer oldValue = Integer.valueOf(o.toString());
				int newValue = oldValue + 1;
				valueOper.set(key,newValue);
				//其中0表示补零而不是补空格,6表示至少6位
				value=String.format("%03d",newValue);
			}
		}catch (Exception e){
			log.error("工单no生成失败,reason:"+e);
		}finally {
			redisTemplate.expire(key,24,TimeUnit.HOURS);
		}
		return key+"-"+value;
	}


}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,让我来回答你的问题。在对接钉钉单时,你需要先进行授权认证,然后调用钉钉提供的接口实现单的创建、查询、更新等操作。以下是一个简单的Java代码示例,用于创建单: ``` import java.util.HashMap; import java.util.Map; import com.alibaba.fastjson.JSONObject; import com.dingtalk.open.client.ServiceFactory; import com.dingtalk.open.client.api.service.corp.CorpService; import com.dingtalk.open.client.api.service.corp.CorpService.CreateCorpTagRequest; import com.dingtalk.open.client.common.ServiceException; import com.dingtalk.open.client.api.model.corp.CorpTagModel; import com.dingtalk.open.client.api.service.corp.CorpTagService; public class CreateDingTalkWorkOrder { public static void main(String[] args) { try { // 填写企业应用信息 String corpid = "你的企业corpid"; String appkey = "你的企业应用appkey"; String appsecret = "你的企业应用appsecret"; //创建Service实例,然后通过Service实例获取各种API的实现类对象 ServiceFactory serviceFactory = ServiceFactory.getInstance(); CorpService corpService = serviceFactory.getOpenService(CorpService.class); String accessToken = corpService.getCorpToken(corpid, appkey, appsecret); //调用单创建接口,设置请求参数 String url = "https://oapi.dingtalk.com/topapi/workorder/create?access_token=" + accessToken; Map<String, Object> workOrder = new HashMap<String, Object>(); workOrder.put("title", "新单测试"); workOrder.put("description", "单描述"); workOrder.put("originator_userid", "创建者userid"); workOrder.put("process_code", "钉钉单流程模板process_code"); workOrder.put("form_content", "{\"字段名称1\":\"字段值1\",\"字段名称2\":\"字段值2\",\"字段名称3\":\"字段值3\"}"); JSONObject response = HttpHelper.httpPost(url, JSONObject.toJSONString(workOrder)); if (response.getInteger("errcode") == 0) { System.out.println("创建钉钉单成功!"); } else { System.out.println("创建钉钉单失败,错误码:" + response.getInteger("errcode") + ",错误描述:" + response.getString("errmsg")); } } catch (ServiceException e) { e.printStackTrace(); } } static class HttpHelper { static JSONObject httpPost(String url, String body) { //... return jsonObject; } } } ``` 这段代码的具体实现需要参考钉钉提供的开发文档,根据自己企业应用的实际情况进行调整。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值