Django生成唯一流程单号

本文介绍了一个用于生成OA流程单号的Python类,通过维护日期和流水号状态,实现单号的自动递增和每日重置,确保了单号的唯一性和连续性,适用于高并发场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class AutoSerialNumber(object):
    """创建OA单号"""

    def __init__(self):
        # J201906120001
        # self.fd_apply_no = ApplicationBasicFormModel.delete_objects.filter(fd_apply_no__contains="J").order_by(
        #     "-fd_apply_no").first().fd_apply_no
        self.fd_apply_no = "J20196120001"
        self.date_str = self.fd_apply_no[1: 9]  # 日期字符串
        self._serial_number = self.fd_apply_no[9:]  # 流水号字符串
        self._serial_number = 0  # 流水号

    @property
    def serial_number(self):
        return self._serial_number

    @serial_number.setter
    def serial_number(self, value):
        if isinstance(value, int):
            self._serial_number = value
        else:
            self._serial_number = 1

    def __iter__(self):
        return self

    def __next__(self):
        self.serial_number += 1
        # 生成一个固定4位数的流水号
        return "{0:03d}".format(self.serial_number)

    def __call__(self, *args, **kwargs):
        # 返回生成序列号(日期加流水号)
        return "J" + self.date_str + next(self)

    # 时间格式化,最好是用定时器来调用该方法
    def timed_clear_serial_number(self):
        """用于每天定时清除流水号"""

        self.serial_number = 1
        self.date_str = time.strftime("%Y%m%d", time.localtime(time.time()))

以上是用于生成流程单号的类,目前测试使用在类视图无问题

使用方法:

1.在类视图中创建一个类属性,在请求方法中,需要的时候使用self.类属性的方法调用,

2.需要开启一个定时器,每天将serial_number和date_str重置更新一下,在定时器中更新时,需要使用类视图.类属性,否则第二天你会发你更新根本不是那个类属性的数值

 

在项目当中使用需要将你的需要生成流程单号的那个模型在流程单号类的初始化方法中进行一次最后一条数据的查询,拿出单号,进行分解

 

优点:仅仅在项目重启的时候进行一次数据库查询,无并发问题,不会出现什么单号重复导致数据存不进去,因为所有的请求对象使用的是一个流程单号生成对象

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值