228 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| 
 | |
| from apps.hrm.models import Certificate, Employee
 | |
| from apps.hrm.services import HrmService
 | |
| from apps.system.models import Post, User, UserPost
 | |
| from apps.utils.sms import send_sms
 | |
| from apps.utils.tools import get_info_from_id, ranstr
 | |
| from apps.wf.models import Ticket, Transition
 | |
| from apps.rpm.models import Remployee, Rfile, Rparty, Rpj, Rpjcertificate, Rpjfile, Rpjmember
 | |
| from django.contrib.auth.hashers import make_password
 | |
| from rest_framework.exceptions import ParseError
 | |
| from dateutil import tz
 | |
| from django.utils import timezone
 | |
| from datetime import datetime, timedelta
 | |
| from django.db.models import Max, Min
 | |
| 
 | |
| 
 | |
| def sync_to_rep(ep: Employee):
 | |
|     # 个人信息完善时同步到rep表
 | |
|     Remployee.objects.filter(employee=ep).update(name=ep.name, phone=ep.phone, id_number=ep.id_number, photo=ep.photo)
 | |
|     if ep.user:
 | |
|         rps = Rparty.objects.filter(admin=ep.user)
 | |
|         # 如果是管理员账户
 | |
|         for i in rps:
 | |
|             Remployee.objects.get_or_create(employee=ep, defaults={
 | |
|                 'employee': ep,
 | |
|                 'name': ep.name,
 | |
|                 'phone': ep.phone,
 | |
|                 'id_number': ep.id_number,
 | |
|                 'photo': ep.photo,
 | |
|                 'rparty': i
 | |
|             })
 | |
| 
 | |
| 
 | |
| def bind_rpj(ticket: Ticket, transition: Transition, new_ticket_data: dict):
 | |
|     rpj = Rpj.objects.get(id=new_ticket_data['rpj'])
 | |
|     if rpj.ticket and rpj.ticket.id!=ticket.id:
 | |
|         raise ParseError('重复创建工单')
 | |
|     if not Rpjmember.objects.filter(rpj=rpj).exists():
 | |
|         raise ParseError('请至少选择一位入厂人员')
 | |
|     ticket_data = ticket.ticket_data
 | |
|     ticket_data.update({'belong_dept': rpj.belong_dept.id if rpj.belong_dept else '0'})
 | |
|     ticket.ticket_data = ticket_data
 | |
|     ticket.belong_dept = rpj.belong_dept
 | |
|     ticket.create_by = rpj.create_by
 | |
|     ticket.save()
 | |
|     if rpj.ticket is None:
 | |
|         rpj.ticket = ticket
 | |
|         rpj.state = Rpj.RPJ_AUDIT
 | |
|         rpj.save()
 | |
|     
 | |
| 
 | |
| def rpj_member_leave(i: Rpjmember):
 | |
|     """人员离开项目
 | |
|     """
 | |
|     rpj = i.rpj
 | |
|     rep = i.remployee
 | |
|     ep = rep.employee
 | |
| 
 | |
|     # 查找本人除此之外还在的项目
 | |
|     rpj_qs = Rpj.objects.filter(remployees=rep, state__in = [Rpj.RPJ_WORKING, Rpj.RPJ_ENTER]).exclude(id=rpj.id)
 | |
|     if rpj_qs.exists():
 | |
|         leave_time__max = rpj_qs.aggregate(Max('leave_time'))['leave_time__max']
 | |
|         come_time_min = rpj_qs.aggregate(Min('come_time'))['come_time__min']
 | |
|         rpj_ = rpj_qs.order_by('-create_time').first()
 | |
|         rep.rpj = rpj_  # 更新当前入厂项目
 | |
|         rep.save()
 | |
|         rpj_dept = rpj_.rparty.dept
 | |
|         if ep:
 | |
|             ep.belong_dept = rpj_dept
 | |
|             ep.save()
 | |
|             if ep.user:
 | |
|                 ep.user.belong_dept = rpj_dept
 | |
|                 ep.user.save()
 | |
|         # 同步至大华人员库并下发人脸
 | |
|         HrmService.sync_dahua_employee(ep, ep.photo, come_time_min, leave_time__max)
 | |
|     else:
 | |
|         if ep:
 | |
|             ep.job_state = Employee.JOB_OFF
 | |
|             ep.save()
 | |
|             HrmService.sync_dahua_employee(ep, ep.photo, rpj.come_time, timezone.now() + timedelta(hours=8))
 | |
|             if ep.user:
 | |
|                 ep.user.is_deleted = True
 | |
|                 ep.user.save()
 | |
| 
 | |
| def rpj_member_come(i: Rpjmember):
 | |
|     """人员入厂
 | |
|     """
 | |
|     # tzinfo = tz.gettz('Asia/Shanghai')
 | |
|     rep = i.remployee
 | |
|     rpj = i.rpj
 | |
|     rpj_dept = rpj.rparty.dept
 | |
|     post = Post.objects.get(code='remployee')
 | |
|     # 尝试找到人员
 | |
|     ep = Employee.objects.get_queryset(all=True).filter(id_number=rep.id_number).first()
 | |
|     ep2 = Employee.objects.get_queryset(all=True).filter(phone=rep.phone).first()
 | |
|     if ep:
 | |
|         pass
 | |
|     elif ep2:
 | |
|         ep = ep2
 | |
|     else:
 | |
|         ep = Employee()
 | |
|         ep.id_number = rep.id_number
 | |
|     
 | |
|     ep.name = rep.name
 | |
|     ep.id_number = rep.id_number
 | |
|     ep.gender = get_info_from_id(rep.id_number).get('gender', '男')
 | |
|     ep.phone = rep.phone
 | |
|     old_photo = ep.photo
 | |
|     ep.photo = rep.photo
 | |
|     ep.job_state = Employee.JOB_ON
 | |
|     ep.type = 'remployee'
 | |
|     ep.belong_dept = rpj_dept
 | |
|     ep.is_deleted = False
 | |
|     ep.job_state = 10
 | |
|     ep.save()
 | |
|     # 给相关方人员创建账户
 | |
|     user_e = ep.user
 | |
|     if user_e:  # 如果该人员有账户
 | |
|         user_e.is_active = True
 | |
|         user_e.is_deleted = False
 | |
|         user_e.save()
 | |
|     else:
 | |
|         user_e = User.objects.get_queryset(all=True).filter(phone=rep.phone).first()  # 看看有没有存在的账户
 | |
|         if user_e:
 | |
|             user_e.is_deleted = False
 | |
|         else:
 | |
|             user_e = User()
 | |
|             user_e.username = 'RE_' + ranstr(6)
 | |
|             user_e.password = make_password('0000')
 | |
|         user_e.name = rep.name
 | |
|         user_e.phone = rep.phone
 | |
|         user_e.type = 'remployee'
 | |
|         user_e.belong_dept = rpj_dept
 | |
|         user_e.post = post
 | |
|         user_e.save()
 | |
|     # 账号划给部门
 | |
|     UserPost.objects.get_or_create(user=user_e, dept=rpj_dept,
 | |
|                                     defaults={
 | |
|                                         'user': user_e,
 | |
|                                         'dept': rpj_dept,
 | |
|                                         'post': post
 | |
|                                     })
 | |
|     ep.user = user_e
 | |
|     ep.save()
 | |
|     # 回写
 | |
|     rep.employee = ep
 | |
|     rep.rpj = rpj  # 更新当前入厂项目
 | |
|     rep.save()
 | |
|     
 | |
|     # come_time = rpj.come_time
 | |
|     # leave_time = rpj.leave_time
 | |
|     # dh_face_card_start = ep.third_info.get('dh_face_card_start', None)
 | |
|     # dh_face_card_end = ep.third_info.get('dh_face_card_end', None)
 | |
|     # if dh_face_card_start:
 | |
|     #     dh_face_card_start = datetime.strptime(dh_face_card_start, "%Y-%m-%d %H:%M:%S").replace(tzinfo=tzinfo)
 | |
|     #     if dh_face_card_start < come_time:
 | |
|     #         come_time = dh_face_card_start
 | |
|     # if dh_face_card_end:
 | |
|     #     dh_face_card_end = datetime.strptime(dh_face_card_end, "%Y-%m-%d %H:%M:%S").replace(tzinfo=tzinfo)
 | |
|     #     if dh_face_card_end > leave_time:
 | |
|     #         leave_time = dh_face_card_end
 | |
|     rpj_qs = Rpj.objects.filter(remployees=rep, state__in = [Rpj.RPJ_WORKING, Rpj.RPJ_ENTER])|Rpj.objects.filter(id=rpj.id)
 | |
|     leave_time__max = rpj_qs.aggregate(Max('leave_time'))['leave_time__max']
 | |
|     come_time__min = rpj_qs.aggregate(Min('come_time'))['come_time__min']
 | |
|     # 同步至大华人员库并下发人脸
 | |
|     HrmService.sync_dahua_employee(ep, old_photo, come_time__min, leave_time__max)
 | |
|         
 | |
| 
 | |
| def rpj_certificate_in(rpjm: Rpjmember):
 | |
|     for i in Rpjcertificate.objects.filter(rpj_member=rpjm):
 | |
|         ct = Certificate.objects.filter(number=i.number, name=i.name).first()
 | |
|         if ct:
 | |
|             pass
 | |
|         else:
 | |
|             ct = Certificate()
 | |
|             ctm = i.rpj_member.remployee.employee
 | |
|             if ctm:
 | |
|                 ct.employee = ctm
 | |
|         ct.name = i.name
 | |
|         ct.number = i.number
 | |
|         ct.type = i.type
 | |
|         ct.issue_date = i.issue_date
 | |
|         ct.expiration_date = i.expiration_date
 | |
|         ct.review_date = i.review_date
 | |
|         ct.file = i.file
 | |
|         ct.save()
 | |
| 
 | |
| def rpj_audit_end(ticket):
 | |
|     rpj = Rpj.objects.get(ticket=ticket)
 | |
|     # 更新入厂项目人员库
 | |
|     for i in Rpjmember.objects.filter(rpj=rpj):
 | |
|         rpj_member_come(i)
 | |
|     # 更新入厂项目人员证书库
 | |
|     for i in Rpjcertificate.objects.filter(rpj_member__rpj=rpj):
 | |
|         ct = Certificate.objects.filter(number=i.number, name=i.name).first()
 | |
|         if ct:
 | |
|             pass
 | |
|         else:
 | |
|             ct = Certificate()
 | |
|             ct.employee = i.rpj_member.remployee.employee
 | |
|         ct.name = i.name
 | |
|         ct.number = i.number
 | |
|         ct.type = i.type
 | |
|         ct.issue_date = i.issue_date
 | |
|         ct.expiration_date = i.expiration_date
 | |
|         ct.review_date = i.review_date
 | |
|         ct.file = i.file
 | |
|         ct.save()
 | |
|     # 更新相关方资料库后续可从资料库里选择
 | |
|     for i in Rpjfile.objects.filter(rpj=rpj):
 | |
|         rf = Rfile.objects.filter(file_cate=i.file_cate, rparty=i.rpj.rparty).first()
 | |
|         if rf:
 | |
|             pass
 | |
|         else:
 | |
|             rf = Rfile()
 | |
|             rf.rparty = i.rpj.rparty
 | |
|             rf.file_cate = i.file_cate
 | |
|             rf.belong_dept = i.rpj.rparty.dept
 | |
|         rf.save()
 | |
|         for m in i.files.all():
 | |
|             rf.files.add(m)
 | |
|     rpj.state = Rpj.RPJ_ENTER
 | |
|     rpj.save()
 | |
|     # 发送通知?
 | |
|     phone = rpj.create_by.phone if rpj.create_by else None
 | |
|     if phone:
 | |
|         send_sms(phone=phone, template_code=1004, template_param={'name': '相关方项目'})
 |