Django生成唯一流程單號

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重置更新一下,在定時器中更新時,需要使用類視圖.類屬性,否則第二天你會發你更新根本不是那個類屬性的數值

 

在項目當中使用需要將你的需要生成流程單號的那個模型在流程單號類的初始化方法中進行一次最後一條數據的查詢,拿出單號,進行分解

 

優點:僅僅在項目重啓的時候進行一次數據庫查詢,無併發問題,不會出現什麼單號重複導致數據存不進去,因爲所有的請求對象使用的是一個流程單號生成對象

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章