fix:exam 修改考试的证书

This commit is contained in:
zty 2024-07-29 16:06:25 +08:00
parent aa37c99ac4
commit 03b273d6cd
2 changed files with 41 additions and 53 deletions

View File

@ -688,33 +688,38 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G
courese_ids = [i.id for i in course] courese_ids = [i.id for i in course]
current_date = now_data.strftime('%Y-%m-%d') current_date = now_data.strftime('%Y-%m-%d')
cer_number = now_data.strftime('%Y%m%d') cer_number = now_data.strftime('%Y%m%d')
# redis 连接并获取锁 # 获取锁
cache.set("certificate", str(uuid.uuid4()), timeout=60) iden = acquire_lock('certificate')
# 查询证明编号创建时间为最后一个 if iden is None:
cer = Certificate.objects.latest('证书编号') raise ParseError("系统忙,请稍后再试。", status=503)
if cer: try:
cer_number = int(cer.证书编号[5:]) + 1 # 查询证明编号创建时间为最后一个
cer_number = 'CTCZL' + str(cer_number) cer = Certificate.objects.latest('证书编号')
data_dict = { if cer:
'姓名': request.user.name, cer_number = int(cer.证书编号[5:]) + 1
'用户ID': request.user.id, cer_number = 'CTCZL' + str(cer_number)
'证书编号': cer_number, data_dict = {
'证书方案': '202312', '姓名': request.user.name,
'单位名称': request.user.dept.full_name, '用户ID': request.user.id,
'所属单位': '国检测试控股集团'+request.user.dept.name, '证书编号': cer_number,
'发证日期': current_date, '证书方案': '202312',
'培训日期':current_date, '单位名称': request.user.dept.full_name,
'培训结束日期': current_date, '所属单位': '国检测试控股集团'+request.user.dept.name,
'课程列表': courese_ids, '发证日期': current_date,
'examrecord': er.id, '培训日期':current_date,
} '培训结束日期': current_date,
serializer = CertificateSerializer(data=data_dict) '课程列表': courese_ids,
serializer.is_valid(raise_exception=True) 'examrecord': er.id,
serializer.save() }
val = cache.get("certificate") serializer = CertificateSerializer(data=data_dict)
if val: # 如果存在,则删除 serializer.is_valid(raise_exception=True)
# 释放锁 serializer.save()
cache.delete("certificate") except Exception as e:
import traceback
raise ParseError(traceback.print_exc())
finally:
release_lock('certificate', iden)
er.took = (now - er.create_time).total_seconds() er.took = (now - er.create_time).total_seconds()
er.end_time = now er.end_time = now
er.belong_dept=request.user.dept er.belong_dept=request.user.dept
@ -723,31 +728,14 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G
return Response(ExamRecordListSerializer(instance=er).data) return Response(ExamRecordListSerializer(instance=er).data)
def acquire_lock(redis_conn, lock_name, ttl): def acquire_lock(lock_name, timeout=60):
identifier = str(uuid.uuid4()) identifier = str(uuid.uuid4())
lock = redis_conn.set(lock_name, identifier, nx=True, ex=ttl) lock = cache.add(lock_name, identifier, timeout=timeout, nx=True)
return identifier if lock else None return identifier if lock else None
def release_lock(lock_name, identifier):
import redis if cache.get(lock_name) == identifier:
def release_lock(redis_conn, lock_name, identifier): cache.delete(lock_name)
with redis_conn.pipeline() as pipe: return True
try: else:
while True: raise ParseError('Lock identifier does not match')
try:
pipe.watch(lock_name)
# 使用 multi/exec 模式来确保原子性
if pipe.get(lock_name) == identifier:
pipe.multi()
pipe.delete(lock_name)
pipe.execute()
return True
# 如果锁已经被修改,取消监视
pipe.unwatch()
return False
except redis.exceptions.WatchError:
# 如果在监视期间锁被修改,重试
continue
except redis.exceptions.RedisError as e:
print(f"Error releasing lock: {e}")
return False

View File

@ -1,5 +1,5 @@
from .settings import * from .settings import *
DEBUG = True DEBUG = False
DATABASES = { DATABASES = {
# 'default': { # 'default': {
# 'ENGINE': 'django.db.backends.postgresql', # 'ENGINE': 'django.db.backends.postgresql',