from django.http import HttpResponse, HttpResponseRedirect from django.db import transaction from django.shortcuts import render from .models import ECN, EcnSignOff, Vendor, Part from .model_handler import BOMHandler, EcnHandler, EcnSignOffHandler, PartHandler, VendorAttachmentHandler, VendorHandler, PartAttachmentHandler from Info.model_handler import CompanyHandler, UserHandler from .func import overall_ecn_signoff from Info.func import send_message # Create your views here. @transaction.atomic def new_vendor(request): if request.method == 'GET': return render(request, 'BOM/new_vendor.html') if request.method == 'POST': company = CompanyHandler.get_by_id(request.session.get('company_id')) # 搜索重名的公司 same_name_vendor = VendorHandler.search_by_name(request.POST.get('name'), company) if len(same_name_vendor) > 0: return render(request, 'BOM/directPage.html', {'alertMsg': '系统已经存在同名的供应商了', 'dirLink': '/BOM/vendor/create/'}) # 检索vendor code是否已经被使用过了 exist_vendor = VendorHandler.get_by_code(request.GET.get('code'), company) if exist_vendor: return render(request, 'BOM/directPage.html', {'alertMsg': '供应商编号已经使用过了', 'dirLink': '/BOM/vendor/create/'}) new_vendor = Vendor() new_vendor.code = request.POST.get('code') new_vendor.name = request.POST.get('name') new_vendor.contact = request.POST.get('contact') new_vendor.phone = request.POST.get('phone') new_vendor.email = request.POST.get('email') new_vendor.address = request.POST.get('address') new_vendor.comment = request.POST.get('comment') new_vendor.save() attachments = eval(request.POST.get('attachment')) for attachment in attachments: v_file = VendorAttachmentHandler.get_by_id(attachment['id']) v_file.vendor = new_vendor v_file.save() return render(request, 'BOM/directPage.html', {'alertMsg': '供应商添加成功', 'dirLink': '/home/'}) def new_part(request): if request.method == 'GET': return render(request, 'BOM/new_part.html') if request.method == 'POST': company = CompanyHandler.get_by_id(request.session.get('company_id')) user = UserHandler.get_by_id(request.session.get('user_id')) if request.POST.get('id') == 0: # 0表示是全新提交的料号,非0表示是编辑以前的草稿 # 搜索重复PN same_part_number = PartHandler.exist_pn(request.POST.get('part_number'), company) if same_part_number: return render(request, 'BOM/directPage.html', {'alertMsg': '系统已经存在同样的料号了', 'dirLink': '/home/'}) new_part = Part() else: new_part = PartHandler.get_by_id(request.POST.get('id')) new_part.company = company new_part.part_number= request.POST.get('part_number') new_part.description= request.POST.get('description') new_part.comment= request.POST.get('comment') # new_part.version= 0 new_part.creator= user new_part.owner= user new_part.source_type= request.POST.get('source_type') new_part.vendor_part_number= request.POST.get('vendor_part_number') if new_part.source_type=='purchase': # vendor detail可能提交上来内容是空的,主要是自产物料 vendor_post_data = eval(request.POST.get('vendor_detail')) vendor = VendorHandler.get_by_code(vendor_post_data['code'], company) new_part.vendor = vendor new_part.sub_parts= eval(request.POST.get('sub_parts')) new_part.save() # PartAttachmentHandler.flush_by_part(new_part) # 先清掉之前保存在数据库里面的附件 attachments = eval(request.POST.get('attachment')) for attachment in attachments: p_file = PartAttachmentHandler.get_by_id(attachment['id']) p_file.part = new_part p_file.save() if BOMHandler.flush_and_save_BOM(parent_part=new_part, sub_parts=new_part.sub_parts): # 将BOM保存到数据库里 if 'save' in request.POST: # POST上来保存指令 return render(request, 'BOM/directPage.html', {'alertMsg': '保存成功', 'dirLink': '/home/'}) if 'create' in request.POST: # POST上来创建指令,指引下一步去ECN签核 # request.session['ECN_new_part_id'] = new_part.id return render(request, 'BOM/directPage.html', {'dirLink': '/BOM/part/ecn/create/?part_id={}'.format(new_part.id)}) else: return render(request, 'BOM/directPage.html', {'alertMsg': '添加失败,系统错误,请联系管理员', 'dirLink': '/home/'}) @transaction.atomic def new_part_ECN(request): if request.method == 'GET': part = PartHandler.get_by_id(request.GET.get('part_id')) if part.life_cycle != 'draft': return render(request, 'BOM/directPage.html', {'alertMsg': '料号状态错误', 'dirLink': '/home/'}) return render(request, 'BOM/new_ecn.html', {'part':part}) if request.method == 'POST': part = PartHandler.get_by_id(request.POST.get('part_id')) company = CompanyHandler.get_by_id(request.session.get('company_id')) user = UserHandler.get_by_id(request.session.get('user_id')) ecn = ECN() ecn.creator = user ecn.company = company ecn.comment = request.POST.get('comment') ecn.category = request.POST.get('category') ecn.target_part = part ecn.number = EcnHandler.generate_ecn_number(company=company) ecn.save() sign_off_list = eval(request.POST.get('sign_off_owners').replace('null','None')) for owner in sign_off_list: ecn_sign_off = EcnSignOff() ecn_sign_off.company = company ecn_sign_off.ecn = ecn ecn_sign_off.owner = UserHandler.get_by_id(owner['id']) ecn_sign_off.save() part.life_cycle = 'sign-off' part.save() return render(request, 'BOM/directPage.html', {'alertMsg': 'ECN{},提交成功。'.format(ecn.number), 'dirLink': '/home/'}) def my_draft_parts(request): if request.method == 'GET': user = UserHandler.get_by_id(request.session.get('user_id')) draft_parts = PartHandler.my_draft_parts(creator=user) return render(request, 'BOM/draft_parts.html', {'draft_parts':draft_parts}) return HttpResponse('new my_draft_parts page') def my_ECN_signoff_list(request): user = UserHandler.get_by_id(request.session.get('user_id')) if request.method == 'GET': if request.GET.get('ECN_type')=='all': sign_off_list = EcnSignOffHandler.my_ECN(user=user) else: sign_off_list = EcnSignOffHandler.my_ECN(user=user, status='签核中') return render(request, 'BOM/my_ECN_signoff_list.html', {'sign_off_list':sign_off_list}) def my_ECN_list(request): user = UserHandler.get_by_id(request.session.get('user_id')) if request.method == 'GET': my_ecn_list = EcnHandler.my_ecn(user=user) return render(request, 'BOM/my_ECN_list.html', {'ecn_list':my_ecn_list}) def ECN_detail(request): user = UserHandler.get_by_id(request.session.get('user_id')) if request.method == 'GET': ECN_id = request.GET.get('ecn_id') if ECN_id: ecn = EcnHandler.get_by_id(ECN_id) # 判断是否是签核人 this_sign_off = EcnSignOffHandler.get_by_owner_ecn(user=user, ecn=ecn) if this_sign_off: is_ecn_signoff = True else: is_ecn_signoff = False # 判断是否是ECN owner,直接取消ECN is_ecn_creator = False if ecn.creator == user: is_ecn_creator = True # 获取当前ECN签核状态 sign_offs = EcnSignOffHandler.search_by_ecn(ecn=ecn) return render(request, 'BOM/ECN_part_detail.html',{'is_ecn_signoff': is_ecn_signoff, 'is_ecn_creator': is_ecn_creator, 'sign_offs': sign_offs}) else: return render(request, 'BOM/directPage.html', {'alertMsg': 'ECN号码缺失', 'dirLink': '/home/'}) if request.method == 'POST': ECN_id = request.POST.get('ecn_id') ecn = EcnHandler.get_by_id(ECN_id) # 批准ECN if 'approve' in request.POST: this_sign_off = EcnSignOffHandler.get_by_owner_ecn(user=user, ecn=ecn) if not this_sign_off: return render(request, 'BOM/directPage.html', {'alertMsg': '非ECN签核人', 'dirLink': '/home/'}) else: this_sign_off.comment = request.POST.get('sign_off_comment') this_sign_off.status = '批准' this_sign_off.save() overall_ecn_signoff(ECN_id) # 检查是否所有签核都完成了 return render(request, 'BOM/directPage.html', {'alertMsg': '签核完成', 'dirLink': '/home/'}) # 拒接ECN if 'reject' in request.POST: this_sign_off = EcnSignOffHandler.get_by_owner_ecn(user=user, ecn=ecn) if not this_sign_off: return render(request, 'BOM/directPage.html', {'alertMsg': '非ECN签核人', 'dirLink': '/home/'}) else: this_sign_off.comment = request.POST.get('sign_off_comment') this_sign_off.status = '拒绝' this_sign_off.save() ecn.status = '拒绝' ecn.save() send_message(from_user=None, to_user=ecn.owner, company=ecn.company, title='ECN'+ecn.number+'签核被拒绝') return render(request, 'BOM/directPage.html', {'alertMsg': '签核完成', 'dirLink': '/home/'}) # 取消ECN,只有创建者可以操作 if 'cancel' in request.POST: ecn.status = '取消' ecn.delete() return render(request, 'BOM/directPage.html', {'alertMsg': 'ECN取消成功', 'dirLink': '/home/'}) def part_detail(request): user = UserHandler.get_by_id(request.session.get('user_id')) company = CompanyHandler.get_by_id(request.session.get('company_id')) if request.method == 'GET': part_number = request.GET.get('pn') if not part_number: return render(request, 'BOM/directPage.html', {'alertMsg': '料号不能为空', 'dirLink': '/home/'}) version = request.GET.get('ver') if version: part = PartHandler.get_by_pn(pn=part_number, company=company, ver=version) else: part = PartHandler.get_by_pn(pn=part_number, company=company) if not part: return render(request, 'BOM/directPage.html', {'alertMsg': '料号没有查询到', 'dirLink': '/home/'}) else: part_version = part.version part_CHN = PartHandler.part_local_CHN(part=part) bom = BOMHandler.retrieve_BOM(parent_part=part, company=company) attachments = PartAttachmentHandler.search_by_part(part=part) part_all_ver = PartHandler.all_ver_by_pn(part_number, company) ver_list = [] for p in part_all_ver: if p.version != part.version: # 不重复计算当前现实的版本 v_display = part.version_display # if p.version <10: # 显示的版本号,如果不超过10,需要补零 # v_display = '0' + str(p.version) # else: # v_display = p.version if p.version < part_version: ver_list.append({'ver':p.version, 'ver_display':v_display}) is_owner = False # 判断是否是part管理员 if user == part.owner: is_owner = True return render(request, 'BOM/part_detail.html', {'part':part_CHN, 'BOM':bom, 'attachments': attachments, 'ver_list': ver_list, 'is_owner': is_owner}) def my_part_list(request): user = UserHandler.get_by_id(request.session.get('user_id')) if request.method == 'GET': if request.GET.get('life_cycle'): my_part_list = PartHandler.my_part(user=user, life_cycle=request.GET.get('life_cycle')) else: my_part_list = PartHandler.my_part(user=user) my_part_list = PartHandler.part_list_local_CHN(my_part_list) return render(request, 'BOM/my_part_list.html', {'part_list':my_part_list}) def part_upgrade(request): user = UserHandler.get_by_id(request.session.get('user_id')) company = CompanyHandler.get_by_id(request.session.get('company_id')) if request.method == 'GET': part_number = request.GET.get('pn') if not part_number: return render(request, 'BOM/directPage.html', {'alertMsg': '料号不能为空', 'dirLink': '/home/'}) part = PartHandler.get_by_pn(pn=part_number, company=company) if not part: return render(request, 'BOM/directPage.html', {'alertMsg': '料号没有查询到', 'dirLink': '/home/'}) all_parts = PartHandler.all_ver_by_pn(part_number, company) # 检索是否存在已有的draft状态的料号,如果有的话,直接跳转 for part in all_parts: if part.life_cycle == 'draft': return HttpResponseRedirect('/BOM/part/create/?edit_id={}'.format(part.id)) # 如果不存在就创建新的part new_part = PartHandler.new_ver(part, company, user) return HttpResponseRedirect('/BOM/part/create/?edit_id={}'.format(new_part.id)) def part_search(request): company = CompanyHandler.get_by_id(request.session.get('company_id')) if request.method == 'GET': return render(request, 'BOM/part_search.html') if request.method == 'POST': part_number = request.POST.get('part_number').strip() description = request.POST.get('description').strip() owner = request.POST.get('owner').strip() if request.POST.get('include_EOL_parts'): include_EOL = True else: include_EOL = False parts = PartHandler.part_search(company, part_number, description, owner, include_EOL) return render(request, 'BOM/part_search_result.html', {'part_list': parts}) def part_whereused(request): company = CompanyHandler.get_by_id(request.session.get('company_id')) if request.method == 'GET': return render(request, 'BOM/part_whereused.html') if request.method == 'POST': child_pn = request.POST.get('part_number').strip() if request.POST.get('include_EOL_parts'): include_EOL = True else: include_EOL = False child_part = PartHandler.get_by_pn(child_pn, company) if child_part: parent_parts = BOMHandler.where_used(child_pn, include_EOL) return render(request, 'BOM/part_search_result.html', {'part_list': parent_parts}) else: return render(request, 'BOM/directPage.html', {'alertMsg': '料号没有查询到', 'dirLink': '/home/'})