123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- 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/'})
|