views.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. from django.http import HttpResponse, HttpResponseRedirect
  2. from django.db import transaction
  3. from django.shortcuts import render
  4. from .models import ECN, EcnSignOff, Vendor, Part
  5. from .model_handler import BOMHandler, EcnHandler, EcnSignOffHandler, PartHandler, VendorAttachmentHandler, VendorHandler, PartAttachmentHandler
  6. from Info.model_handler import CompanyHandler, UserHandler
  7. from .func import overall_ecn_signoff
  8. from Info.func import send_message
  9. # Create your views here.
  10. @transaction.atomic
  11. def new_vendor(request):
  12. if request.method == 'GET':
  13. return render(request, 'BOM/new_vendor.html')
  14. if request.method == 'POST':
  15. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  16. # 搜索重名的公司
  17. same_name_vendor = VendorHandler.search_by_name(request.POST.get('name'), company)
  18. if len(same_name_vendor) > 0:
  19. return render(request, 'BOM/directPage.html', {'alertMsg': '系统已经存在同名的供应商了', 'dirLink': '/BOM/vendor/create/'})
  20. # 检索vendor code是否已经被使用过了
  21. exist_vendor = VendorHandler.get_by_code(request.GET.get('code'), company)
  22. if exist_vendor:
  23. return render(request, 'BOM/directPage.html', {'alertMsg': '供应商编号已经使用过了', 'dirLink': '/BOM/vendor/create/'})
  24. new_vendor = Vendor()
  25. new_vendor.code = request.POST.get('code')
  26. new_vendor.name = request.POST.get('name')
  27. new_vendor.contact = request.POST.get('contact')
  28. new_vendor.phone = request.POST.get('phone')
  29. new_vendor.email = request.POST.get('email')
  30. new_vendor.address = request.POST.get('address')
  31. new_vendor.comment = request.POST.get('comment')
  32. new_vendor.save()
  33. attachments = eval(request.POST.get('attachment'))
  34. for attachment in attachments:
  35. v_file = VendorAttachmentHandler.get_by_id(attachment['id'])
  36. v_file.vendor = new_vendor
  37. v_file.save()
  38. return render(request, 'BOM/directPage.html', {'alertMsg': '供应商添加成功', 'dirLink': '/home/'})
  39. def new_part(request):
  40. if request.method == 'GET':
  41. return render(request, 'BOM/new_part.html')
  42. if request.method == 'POST':
  43. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  44. user = UserHandler.get_by_id(request.session.get('user_id'))
  45. if request.POST.get('id') == 0: # 0表示是全新提交的料号,非0表示是编辑以前的草稿
  46. # 搜索重复PN
  47. same_part_number = PartHandler.exist_pn(request.POST.get('part_number'), company)
  48. if same_part_number:
  49. return render(request, 'BOM/directPage.html', {'alertMsg': '系统已经存在同样的料号了', 'dirLink': '/home/'})
  50. new_part = Part()
  51. else:
  52. new_part = PartHandler.get_by_id(request.POST.get('id'))
  53. new_part.company = company
  54. new_part.part_number= request.POST.get('part_number')
  55. new_part.description= request.POST.get('description')
  56. new_part.comment= request.POST.get('comment')
  57. # new_part.version= 0
  58. new_part.creator= user
  59. new_part.owner= user
  60. new_part.source_type= request.POST.get('source_type')
  61. new_part.vendor_part_number= request.POST.get('vendor_part_number')
  62. if new_part.source_type=='purchase': # vendor detail可能提交上来内容是空的,主要是自产物料
  63. vendor_post_data = eval(request.POST.get('vendor_detail'))
  64. vendor = VendorHandler.get_by_code(vendor_post_data['code'], company)
  65. new_part.vendor = vendor
  66. new_part.sub_parts= eval(request.POST.get('sub_parts'))
  67. new_part.save()
  68. # PartAttachmentHandler.flush_by_part(new_part) # 先清掉之前保存在数据库里面的附件
  69. attachments = eval(request.POST.get('attachment'))
  70. for attachment in attachments:
  71. p_file = PartAttachmentHandler.get_by_id(attachment['id'])
  72. p_file.part = new_part
  73. p_file.save()
  74. if BOMHandler.flush_and_save_BOM(parent_part=new_part, sub_parts=new_part.sub_parts): # 将BOM保存到数据库里
  75. if 'save' in request.POST: # POST上来保存指令
  76. return render(request, 'BOM/directPage.html', {'alertMsg': '保存成功', 'dirLink': '/home/'})
  77. if 'create' in request.POST: # POST上来创建指令,指引下一步去ECN签核
  78. # request.session['ECN_new_part_id'] = new_part.id
  79. return render(request, 'BOM/directPage.html', {'dirLink': '/BOM/part/ecn/create/?part_id={}'.format(new_part.id)})
  80. else:
  81. return render(request, 'BOM/directPage.html', {'alertMsg': '添加失败,系统错误,请联系管理员', 'dirLink': '/home/'})
  82. @transaction.atomic
  83. def new_part_ECN(request):
  84. if request.method == 'GET':
  85. part = PartHandler.get_by_id(request.GET.get('part_id'))
  86. if part.life_cycle != 'draft':
  87. return render(request, 'BOM/directPage.html', {'alertMsg': '料号状态错误', 'dirLink': '/home/'})
  88. return render(request, 'BOM/new_ecn.html', {'part':part})
  89. if request.method == 'POST':
  90. part = PartHandler.get_by_id(request.POST.get('part_id'))
  91. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  92. user = UserHandler.get_by_id(request.session.get('user_id'))
  93. ecn = ECN()
  94. ecn.creator = user
  95. ecn.company = company
  96. ecn.comment = request.POST.get('comment')
  97. ecn.category = request.POST.get('category')
  98. ecn.target_part = part
  99. ecn.number = EcnHandler.generate_ecn_number(company=company)
  100. ecn.save()
  101. sign_off_list = eval(request.POST.get('sign_off_owners').replace('null','None'))
  102. for owner in sign_off_list:
  103. ecn_sign_off = EcnSignOff()
  104. ecn_sign_off.company = company
  105. ecn_sign_off.ecn = ecn
  106. ecn_sign_off.owner = UserHandler.get_by_id(owner['id'])
  107. ecn_sign_off.save()
  108. part.life_cycle = 'sign-off'
  109. part.save()
  110. return render(request, 'BOM/directPage.html', {'alertMsg': 'ECN{},提交成功。'.format(ecn.number), 'dirLink': '/home/'})
  111. def my_draft_parts(request):
  112. if request.method == 'GET':
  113. user = UserHandler.get_by_id(request.session.get('user_id'))
  114. draft_parts = PartHandler.my_draft_parts(creator=user)
  115. return render(request, 'BOM/draft_parts.html', {'draft_parts':draft_parts})
  116. return HttpResponse('new my_draft_parts page')
  117. def my_ECN_signoff_list(request):
  118. user = UserHandler.get_by_id(request.session.get('user_id'))
  119. if request.method == 'GET':
  120. if request.GET.get('ECN_type')=='all':
  121. sign_off_list = EcnSignOffHandler.my_ECN(user=user)
  122. else:
  123. sign_off_list = EcnSignOffHandler.my_ECN(user=user, status='签核中')
  124. return render(request, 'BOM/my_ECN_signoff_list.html', {'sign_off_list':sign_off_list})
  125. def my_ECN_list(request):
  126. user = UserHandler.get_by_id(request.session.get('user_id'))
  127. if request.method == 'GET':
  128. my_ecn_list = EcnHandler.my_ecn(user=user)
  129. return render(request, 'BOM/my_ECN_list.html', {'ecn_list':my_ecn_list})
  130. def ECN_detail(request):
  131. user = UserHandler.get_by_id(request.session.get('user_id'))
  132. if request.method == 'GET':
  133. ECN_id = request.GET.get('ecn_id')
  134. if ECN_id:
  135. ecn = EcnHandler.get_by_id(ECN_id)
  136. # 判断是否是签核人
  137. this_sign_off = EcnSignOffHandler.get_by_owner_ecn(user=user, ecn=ecn)
  138. if this_sign_off:
  139. is_ecn_signoff = True
  140. else:
  141. is_ecn_signoff = False
  142. # 判断是否是ECN owner,直接取消ECN
  143. is_ecn_creator = False
  144. if ecn.creator == user:
  145. is_ecn_creator = True
  146. # 获取当前ECN签核状态
  147. sign_offs = EcnSignOffHandler.search_by_ecn(ecn=ecn)
  148. return render(request, 'BOM/ECN_part_detail.html',{'is_ecn_signoff': is_ecn_signoff, 'is_ecn_creator': is_ecn_creator, 'sign_offs': sign_offs})
  149. else:
  150. return render(request, 'BOM/directPage.html', {'alertMsg': 'ECN号码缺失', 'dirLink': '/home/'})
  151. if request.method == 'POST':
  152. ECN_id = request.POST.get('ecn_id')
  153. ecn = EcnHandler.get_by_id(ECN_id)
  154. # 批准ECN
  155. if 'approve' in request.POST:
  156. this_sign_off = EcnSignOffHandler.get_by_owner_ecn(user=user, ecn=ecn)
  157. if not this_sign_off:
  158. return render(request, 'BOM/directPage.html', {'alertMsg': '非ECN签核人', 'dirLink': '/home/'})
  159. else:
  160. this_sign_off.comment = request.POST.get('sign_off_comment')
  161. this_sign_off.status = '批准'
  162. this_sign_off.save()
  163. overall_ecn_signoff(ECN_id) # 检查是否所有签核都完成了
  164. return render(request, 'BOM/directPage.html', {'alertMsg': '签核完成', 'dirLink': '/home/'})
  165. # 拒接ECN
  166. if 'reject' in request.POST:
  167. this_sign_off = EcnSignOffHandler.get_by_owner_ecn(user=user, ecn=ecn)
  168. if not this_sign_off:
  169. return render(request, 'BOM/directPage.html', {'alertMsg': '非ECN签核人', 'dirLink': '/home/'})
  170. else:
  171. this_sign_off.comment = request.POST.get('sign_off_comment')
  172. this_sign_off.status = '拒绝'
  173. this_sign_off.save()
  174. ecn.status = '拒绝'
  175. ecn.save()
  176. send_message(from_user=None, to_user=ecn.owner, company=ecn.company, title='ECN'+ecn.number+'签核被拒绝')
  177. return render(request, 'BOM/directPage.html', {'alertMsg': '签核完成', 'dirLink': '/home/'})
  178. # 取消ECN,只有创建者可以操作
  179. if 'cancel' in request.POST:
  180. ecn.status = '取消'
  181. ecn.delete()
  182. return render(request, 'BOM/directPage.html', {'alertMsg': 'ECN取消成功', 'dirLink': '/home/'})
  183. def part_detail(request):
  184. user = UserHandler.get_by_id(request.session.get('user_id'))
  185. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  186. if request.method == 'GET':
  187. part_number = request.GET.get('pn')
  188. if not part_number:
  189. return render(request, 'BOM/directPage.html', {'alertMsg': '料号不能为空', 'dirLink': '/home/'})
  190. version = request.GET.get('ver')
  191. if version:
  192. part = PartHandler.get_by_pn(pn=part_number, company=company, ver=version)
  193. else:
  194. part = PartHandler.get_by_pn(pn=part_number, company=company)
  195. if not part:
  196. return render(request, 'BOM/directPage.html', {'alertMsg': '料号没有查询到', 'dirLink': '/home/'})
  197. else:
  198. part_version = part.version
  199. part_CHN = PartHandler.part_local_CHN(part=part)
  200. bom = BOMHandler.retrieve_BOM(parent_part=part, company=company)
  201. attachments = PartAttachmentHandler.search_by_part(part=part)
  202. part_all_ver = PartHandler.all_ver_by_pn(part_number, company)
  203. ver_list = []
  204. for p in part_all_ver:
  205. if p.version != part.version: # 不重复计算当前现实的版本
  206. v_display = part.version_display
  207. # if p.version <10: # 显示的版本号,如果不超过10,需要补零
  208. # v_display = '0' + str(p.version)
  209. # else:
  210. # v_display = p.version
  211. if p.version < part_version:
  212. ver_list.append({'ver':p.version, 'ver_display':v_display})
  213. is_owner = False # 判断是否是part管理员
  214. if user == part.owner:
  215. is_owner = True
  216. return render(request, 'BOM/part_detail.html', {'part':part_CHN, 'BOM':bom, 'attachments': attachments, 'ver_list': ver_list, 'is_owner': is_owner})
  217. def my_part_list(request):
  218. user = UserHandler.get_by_id(request.session.get('user_id'))
  219. if request.method == 'GET':
  220. if request.GET.get('life_cycle'):
  221. my_part_list = PartHandler.my_part(user=user, life_cycle=request.GET.get('life_cycle'))
  222. else:
  223. my_part_list = PartHandler.my_part(user=user)
  224. my_part_list = PartHandler.part_list_local_CHN(my_part_list)
  225. return render(request, 'BOM/my_part_list.html', {'part_list':my_part_list})
  226. def part_upgrade(request):
  227. user = UserHandler.get_by_id(request.session.get('user_id'))
  228. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  229. if request.method == 'GET':
  230. part_number = request.GET.get('pn')
  231. if not part_number:
  232. return render(request, 'BOM/directPage.html', {'alertMsg': '料号不能为空', 'dirLink': '/home/'})
  233. part = PartHandler.get_by_pn(pn=part_number, company=company)
  234. if not part:
  235. return render(request, 'BOM/directPage.html', {'alertMsg': '料号没有查询到', 'dirLink': '/home/'})
  236. all_parts = PartHandler.all_ver_by_pn(part_number, company)
  237. # 检索是否存在已有的draft状态的料号,如果有的话,直接跳转
  238. for part in all_parts:
  239. if part.life_cycle == 'draft':
  240. return HttpResponseRedirect('/BOM/part/create/?edit_id={}'.format(part.id))
  241. # 如果不存在就创建新的part
  242. new_part = PartHandler.new_ver(part, company, user)
  243. return HttpResponseRedirect('/BOM/part/create/?edit_id={}'.format(new_part.id))
  244. def part_search(request):
  245. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  246. if request.method == 'GET':
  247. return render(request, 'BOM/part_search.html')
  248. if request.method == 'POST':
  249. part_number = request.POST.get('part_number').strip()
  250. description = request.POST.get('description').strip()
  251. owner = request.POST.get('owner').strip()
  252. if request.POST.get('include_EOL_parts'):
  253. include_EOL = True
  254. else:
  255. include_EOL = False
  256. parts = PartHandler.part_search(company, part_number, description, owner, include_EOL)
  257. return render(request, 'BOM/part_search_result.html', {'part_list': parts})
  258. def part_whereused(request):
  259. company = CompanyHandler.get_by_id(request.session.get('company_id'))
  260. if request.method == 'GET':
  261. return render(request, 'BOM/part_whereused.html')
  262. if request.method == 'POST':
  263. child_pn = request.POST.get('part_number').strip()
  264. if request.POST.get('include_EOL_parts'):
  265. include_EOL = True
  266. else:
  267. include_EOL = False
  268. child_part = PartHandler.get_by_pn(child_pn, company)
  269. if child_part:
  270. parent_parts = BOMHandler.where_used(child_pn, include_EOL)
  271. return render(request, 'BOM/part_search_result.html', {'part_list': parent_parts})
  272. else:
  273. return render(request, 'BOM/directPage.html', {'alertMsg': '料号没有查询到', 'dirLink': '/home/'})