views.py 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573
  1. # coding=utf-8
  2. import traceback
  3. import json
  4. from django.conf import settings
  5. from django.db.models import ProtectedError, Q, F, Sum
  6. from django.utils import timezone
  7. from django.views.decorators.csrf import csrf_exempt
  8. from django.db import transaction, IntegrityError, connection
  9. from apps.purchase.models import GodownEntryDetail
  10. from libs.utils import strftime, strfdate
  11. from apps.account.decorators import token_required, permission_required, valid_permission, isHasPermissions
  12. from apps.base import Formater
  13. from apps.customer.models import Customer
  14. from apps.foundation.models import BizLog, Option
  15. from apps.goods.models import Goods
  16. from apps.material.filters import MaterialFilter, ConsumableFilter, DeliverFilter, InventoryFilter, DeliverReturnFilter
  17. from apps.material.models import Material, Consumable, Deliver, DeliverDetail, DeliverReturn, DeliverReturnDetail
  18. from apps.material.resources import MaterialResource, ConsumableResource, ConsumableImporter, MaterialImporter, \
  19. DeliverResource, DeliverDetailResource, InventoryResource, InventoryDetailResource, DeliverQueryResource, \
  20. DeliverReturnQueryResource
  21. from apps.material.serializers import MaterialSerializer, ConsumableSerializer, DeliverSerializer, \
  22. DeliverDetailSerializer, InventorySerializer, InventoryDetailSerializer, DeliverReturnSerializer, \
  23. DeliverReturnViewSerializer, DeliverReturnDetailSerializer
  24. from apps.product.models import ProductBase
  25. from apps.product.serializers import ProductBaseSerializer
  26. from apps.warehouse.models import WarehouseStock, Inventory, InventoryDetail, Warehouse,WarehouseRecord
  27. from django.conf import settings
  28. from apps.warehouse.biz import BizWarehouse, GetWarehouseSrockRecord
  29. from apps.goods.models import GoodsGodownEntry,GoodsGodownEntryDetail
  30. from apps.purchase.models import GodownEntry,GodownEntryDetail
  31. from libs.http import JSONResponse, JSONError, DataGridJSONResponse
  32. from libs import utils
  33. from apps.exceptions import CustomError, ExportChange
  34. @permission_required('material.view_material')
  35. def material_list(request):
  36. f = MaterialFilter(request.GET, queryset=Material.objects.filter())
  37. rows, total = utils.get_page_data(request, f.qs)
  38. serializer = MaterialSerializer(rows, many=True)
  39. return DataGridJSONResponse(serializer.data, total)
  40. @permission_required('material.export_material')
  41. def material_export(request):
  42. f = MaterialFilter(request.GET, queryset=Material.objects.filter())
  43. serializer = MaterialSerializer(f.qs, many=True)
  44. export_data = ExportChange.dict_to_obj(serializer)
  45. export_data = MaterialResource().export(export_data)
  46. filename = utils.attachment_save(export_data)
  47. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出原料单")
  48. return JSONResponse({'filename': filename})
  49. @csrf_exempt
  50. @permission_required('material.add_material')
  51. def material_save(request):
  52. id = request.GET.get('id')
  53. data = json.loads(request.body)
  54. try:
  55. with transaction.atomic():
  56. product_base_id = None
  57. data['type'] = ProductBase.MATERIAL
  58. serializer = MaterialSerializer.factory(request.user, data, id)
  59. if serializer.instance:
  60. product_base_id = serializer.instance.product_base_id
  61. pb = ProductBaseSerializer.factory(request.user, data, product_base_id)
  62. pb = pb.validSave()
  63. data['product_base'] = pb.id
  64. serializer.validSave()
  65. except CustomError, e:
  66. return JSONError(e.get_error_msg())
  67. except Exception, e:
  68. traceback.print_exc()
  69. return JSONError(u'保存失败!')
  70. return JSONResponse()
  71. @permission_required('material.delete_material')
  72. def material_delete(request):
  73. id = int(request.GET.get('id'))
  74. try:
  75. with transaction.atomic():
  76. material = Material.getById(id)
  77. product_base_id = material.product_base.id
  78. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除原料[%s],id=%d" % (material.product_base.name, material.id))
  79. material.delete()
  80. WarehouseStock.removeStockByProduct(material.product_base)
  81. ProductBase.objects.filter(id=product_base_id).delete()
  82. except CustomError, e:
  83. return JSONError(e.get_error_msg())
  84. except ProtectedError:
  85. return JSONError(u'该原料已被使用,禁止删除!')
  86. except IntegrityError:
  87. return JSONError(u'该原料已被使用,禁止删除!')
  88. except Exception, e:
  89. traceback.print_exc()
  90. return JSONError(u'删除失败!')
  91. return JSONResponse({})
  92. @csrf_exempt
  93. @token_required
  94. def material_options(request):
  95. data = {}
  96. data['suggest'] = Material.SUGGEST_CHOICES
  97. return JSONResponse(data)
  98. @csrf_exempt
  99. @permission_required('material.import_material')
  100. def material_import(request):
  101. file = request.FILES.get('excel_file')
  102. try:
  103. line = 2
  104. importer = MaterialImporter()
  105. excel_rows = importer.getExcelData(file)
  106. with transaction.atomic():
  107. for excel_row in excel_rows:
  108. try:
  109. row = importer.validRow(excel_row)
  110. option = Option.getByName(row[u'类别'], Option.MATERIAL_MODE)
  111. data = {
  112. 'name': row[u'名称'],
  113. 'model': row[u'代码'],
  114. 'option_type': option.id,
  115. 'unit': row[u'单位'],
  116. 'standard': row[u'规格'],
  117. 'warehouse_place': row[u'库位'],
  118. 'htc_identification': row[u'产品标识'],
  119. 'purchase_suggest': Material.getPurchaseSuggestValue(row[u'库存预警']),
  120. 'stock_upper_limit': row[u'库存上限'],
  121. 'stock_lower_limit': row[u'库存下限'],
  122. 'notes': row[u'备注'],
  123. 'enabled': 1,
  124. }
  125. data['type'] = ProductBase.MATERIAL
  126. pb = ProductBaseSerializer.factory(request.user, data)
  127. pb = pb.validSave()
  128. data['product_base'] = pb.id
  129. serializer = MaterialSerializer.factory(request.user, data)
  130. serializer.validSave()
  131. except CustomError,e:
  132. raise CustomError(u'第%d行:%s' % (line,e.get_error_msg()))
  133. except Exception,e:
  134. raise CustomError(u'第%d行:%s' %(line,unicode(e)))
  135. line += 1
  136. BizLog.objects.addnew(request.user, BizLog.IMPORT, u"导入原料数据[%s]条" % (line - 2))
  137. except CustomError, e:
  138. return JSONError(e.get_error_msg())
  139. except Exception, e:
  140. traceback.print_exc()
  141. return JSONError(u'导入失败!')
  142. return JSONResponse()
  143. @token_required
  144. def material_select(request):
  145. param = request.GET.get('param')
  146. supplier = request.GET.get('supplier')
  147. warehouse = request.GET.get('warehouse')
  148. rows = Material.objects.filter(product_base__enabled=True)
  149. if param:
  150. rows = rows.filter(
  151. Q(product_base__name__icontains=param) | Q(product_base__model__icontains=param)
  152. )
  153. rows, total = utils.get_page_data(request, rows)
  154. data = []
  155. for row in rows:
  156. record_data = []
  157. if supplier and warehouse:
  158. record_data = GetWarehouseSrockRecord.getRecord(row.product_base.id, warehouse, supplier)
  159. item = {
  160. 'id': row.id,
  161. 'product_id': row.product_base.id,
  162. 'name': row.product_base.name,
  163. 'model': row.product_base.model,
  164. 'option_type': row.product_base.option_type.name,
  165. 'unit': row.product_base.unit,
  166. 'warehouse_place': row.product_base.warehouse_place,
  167. 'record_data': record_data,
  168. 'standard': row.product_base.standard
  169. }
  170. data.append(item)
  171. return DataGridJSONResponse(data, total)
  172. @permission_required('material.view_consumable')
  173. def consumable_list(request):
  174. f = ConsumableFilter(request.GET, queryset=Consumable.objects.filter())
  175. rows, total = utils.get_page_data(request, f.qs)
  176. serializer = ConsumableSerializer(rows, many=True)
  177. return DataGridJSONResponse(serializer.data, total)
  178. @permission_required('material.export_consumable')
  179. def consumable_export(request):
  180. f = ConsumableFilter(request.GET, queryset=Consumable.objects.filter())
  181. serializer = ConsumableSerializer(f.qs, many=True)
  182. export_data = ExportChange.dict_to_obj(serializer)
  183. export_data = ConsumableResource().export(export_data)
  184. filename = utils.attachment_save(export_data)
  185. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出耗材单")
  186. return JSONResponse({'filename': filename})
  187. @csrf_exempt
  188. @permission_required('material.add_consumable')
  189. def consumable_save(request):
  190. id = request.GET.get('id')
  191. data = json.loads(request.body)
  192. try:
  193. with transaction.atomic():
  194. product_base_id = None
  195. data['type'] = ProductBase.CONSUMABLE
  196. serializer = ConsumableSerializer.factory(request.user, data, id)
  197. if serializer.instance:
  198. product_base_id = serializer.instance.product_base_id
  199. pb = ProductBaseSerializer.factory(request.user, data, product_base_id)
  200. pb = pb.validSave()
  201. data['product_base'] = pb.id
  202. serializer.validSave()
  203. except CustomError, e:
  204. return JSONError(e.get_error_msg())
  205. except Exception, e:
  206. traceback.print_exc()
  207. return JSONError(u'保存失败!')
  208. return JSONResponse()
  209. @permission_required('material.delete_consumable')
  210. def consumable_delete(request):
  211. id = int(request.GET.get('id'))
  212. try:
  213. with transaction.atomic():
  214. consumable = Consumable.getById(id)
  215. product_base_id = consumable.product_base.id
  216. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除耗材[%s],id=%d" % (consumable.product_base.name, consumable.id))
  217. consumable.delete()
  218. WarehouseStock.removeStockByProduct(consumable.product_base)
  219. ProductBase.objects.filter(id=product_base_id).delete()
  220. except CustomError, e:
  221. return JSONError(e.get_error_msg())
  222. except ProtectedError:
  223. return JSONError(u'该耗材已被使用,禁止删除!')
  224. except IntegrityError:
  225. return JSONError(u'该耗材已被使用,禁止删除!')
  226. except Exception, e:
  227. traceback.print_exc()
  228. return JSONError(u'删除失败!')
  229. return JSONResponse({})
  230. @csrf_exempt
  231. @permission_required('material.import_consumable')
  232. def consumable_import(request):
  233. file = request.FILES.get('excel_file')
  234. try:
  235. line = 2
  236. importer = ConsumableImporter()
  237. excel_rows = importer.getExcelData(file)
  238. with transaction.atomic():
  239. for excel_row in excel_rows:
  240. try:
  241. row = importer.validRow(excel_row)
  242. option = Option.getByName(row[u'类别'], Option.CONSUMABLE_MODE)
  243. data = {
  244. 'name': row[u'名称'],
  245. 'model': row[u'代码'],
  246. 'option_type': option.id,
  247. 'unit': row[u'单位'],
  248. 'standard': row[u'规格'],
  249. 'warehouse_place': row[u'库位'],
  250. 'purchase_suggest': Material.getPurchaseSuggestValue(row[u'库存预警']),
  251. 'stock_upper_limit': row[u'库存上限'],
  252. 'stock_lower_limit': row[u'库存下限'],
  253. 'notes': row[u'备注'],
  254. 'enabled': 1,
  255. }
  256. data['type'] = ProductBase.CONSUMABLE
  257. pb = ProductBaseSerializer.factory(request.user,data)
  258. pb = pb.validSave()
  259. data['product_base'] = pb.id
  260. serializer = ConsumableSerializer.factory(request.user,data)
  261. serializer.validSave()
  262. except CustomError,e:
  263. raise CustomError(u'第%d行:%s' % (line,e.get_error_msg()))
  264. except Exception,e:
  265. raise CustomError(u'第%d行:%s' %(line,unicode(e)))
  266. line += 1
  267. BizLog.objects.addnew(request.user, BizLog.IMPORT, u"导入耗材数据[%s]条" % (line - 2))
  268. except CustomError, e:
  269. return JSONError(e.get_error_msg())
  270. except Exception, e:
  271. traceback.print_exc()
  272. return JSONError(u'导入失败!')
  273. return JSONResponse()
  274. @token_required
  275. def consumable_select(request):
  276. param = request.GET.get('param')
  277. supplier = request.GET.get('supplier')
  278. warehouse = request.GET.get('warehouse')
  279. rows = Consumable.objects.filter(product_base__enabled=True)
  280. if param:
  281. rows = rows.filter(
  282. Q(product_base__name__icontains=param) | Q(product_base__model__icontains=param)
  283. )
  284. rows, total = utils.get_page_data(request, rows)
  285. data = []
  286. for row in rows:
  287. record_data = []
  288. if supplier and warehouse:
  289. record_data = GetWarehouseSrockRecord.getRecord(row.product_base.id, warehouse, supplier)
  290. item = {
  291. 'id': row.id,
  292. 'product_id': row.product_base.id,
  293. 'name': row.product_base.name,
  294. 'model': row.product_base.model,
  295. 'option_type': row.product_base.option_type.name,
  296. 'unit': row.product_base.unit,
  297. 'warehouse_place': row.product_base.warehouse_place,
  298. 'record_data': record_data,
  299. 'standard': row.product_base.standard
  300. }
  301. data.append(item)
  302. return DataGridJSONResponse(data, total)
  303. @token_required
  304. def deliver_list(request):
  305. type = int(request.GET.get('type'))
  306. product_notes = request.GET.get('product_notes')
  307. try:
  308. valid_permission(request.user, Deliver.getPermissionByType(type, 'view'))
  309. except:
  310. return DataGridJSONResponse([], 0)
  311. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  312. department_ids = request.user.getSubDepartmentIds()
  313. user_ids = request.user.getSubEmployeeIds()
  314. rows = Deliver.objects.filter(product_type=type, warehouse_id__in=warehouses_ids)
  315. rows = rows.filter(
  316. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  317. if product_notes:
  318. g_ids = rows.values_list('id')
  319. d_ids = DeliverDetail.objects.filter(main_id__in=g_ids, notes__icontains=product_notes).values_list('main_id')
  320. rows = rows.filter(id__in=d_ids)
  321. f = DeliverFilter(request.GET, queryset=rows)
  322. total_row = f.qs.aggregate(total_count=Sum('total_count'), total_cost=Sum('total_cost'))
  323. more = {
  324. 'total_count': Formater.formatCountShow(total_row['total_count']),
  325. 'total_cost': Formater.formatAmountShow(total_row['total_cost'])
  326. }
  327. rows, total = utils.get_page_data(request, f.qs)
  328. serializer = DeliverSerializer(rows, many=True)
  329. return DataGridJSONResponse(serializer.data, total, more)
  330. @csrf_exempt
  331. @token_required
  332. def deliver_export(request):
  333. id = request.GET.get('id')
  334. try:
  335. type = Deliver.getValidType(request.GET.get('type'))
  336. if type == Deliver.MATERIAL:
  337. perm = 'material.view_material_cost'
  338. elif type == Deliver.CONSUMABLE:
  339. perm = 'material.view_consumable_cost'
  340. is_show_cost = isHasPermissions(request.user, perm)
  341. if id:
  342. instance = Deliver.getById(id)
  343. valid_permission(request.user, instance.getPermission('export'))
  344. deliver_detail = DeliverDetail.objects.filter(main=instance)
  345. serializer = DeliverDetailSerializer(deliver_detail, many=True)
  346. export_data = ExportChange.dict_to_obj(serializer)
  347. export_data = DeliverDetailResource(is_show_cost).export(export_data)
  348. filename = utils.attachment_save(export_data)
  349. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出原料/耗材出库单[%s]明细,id=%d" % (instance.no, instance.id))
  350. else:
  351. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  352. department_ids = request.user.getSubDepartmentIds()
  353. user_ids = request.user.getSubEmployeeIds()
  354. rows = Deliver.objects.filter(product_type=type, warehouse_id__in=warehouses_ids)
  355. rows = rows.filter(
  356. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  357. f = DeliverFilter(request.GET, queryset=rows)
  358. serializer = DeliverSerializer(f.qs, many=True)
  359. valid_permission(request.user, Deliver.getPermissionByType(type, 'export'))
  360. export_data = ExportChange.dict_to_obj(serializer)
  361. export_data = DeliverResource(is_show_cost).export(export_data)
  362. filename = utils.attachment_save(export_data)
  363. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出原料/耗材出库单")
  364. except CustomError, e:
  365. return JSONError(e.get_error_msg())
  366. except Exception, e:
  367. traceback.print_exc()
  368. return JSONError(u'导出失败!')
  369. return JSONResponse({'filename': filename})
  370. @csrf_exempt
  371. @token_required
  372. def deliver_save(request):
  373. source = request.GET.get('source')
  374. id = request.GET.get('id')
  375. # detail_id:添加保存,出库直接保存,不需要添加明细detail_id=-1,添加明细保存默认detail_id=0,修改保存,detail_id=明细id
  376. detail_id = -1
  377. if source == 'touch':
  378. main_data = json.loads(request.body)['main']
  379. items_data = json.loads(request.body)['item']
  380. detail_id = json.loads(request.body)['detail']
  381. else:
  382. main_data = json.loads(request.POST.get('main'))
  383. items_data = json.loads(request.POST.get('item'))
  384. try:
  385. type = Deliver.getValidType(request.GET.get('type'))
  386. main_data['product_type'] = type
  387. with transaction.atomic():
  388. serializer = DeliverSerializer.factory(request.user, main_data, id)
  389. if serializer.instance and serializer.instance.status == settings.PASS:
  390. raise CustomError(u'该出库单已审核,禁止修改!')
  391. serializer = serializer.validSave()
  392. valid_permission(request.user, serializer.getPermission('add'))
  393. if source == 'touch' and detail_id >= 0:
  394. # 手机端保存,如果是修改,先删除要修改的明细
  395. DeliverDetail.objects.filter(id=int(detail_id)).delete()
  396. for item in items_data:
  397. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(serializer.warehouse,item['product_base'])
  398. instance = DeliverDetail.objects.create(
  399. main_id=id,
  400. product_base_id=item['product_base'],
  401. warehouse_stock=warehouse_stock,
  402. warehouse_stockrecord_id=item['warehouse_stockrecord'],
  403. total_cost=Formater.formatAmount(item['total_cost']),
  404. count=Formater.formatCount(item['count']),
  405. notes=item['notes'],
  406. )
  407. BizLog.objects.addnew(
  408. request.user,
  409. BizLog.INSERT,
  410. u"APP添加原料/耗材出库明细[%s],id=%d" % (instance.product_base.name, instance.id),
  411. item
  412. )
  413. else:
  414. DeliverDetail.objects.filter(main=serializer).delete()
  415. for item in items_data:
  416. item['main'] = serializer.id
  417. detail_serializer = DeliverDetailSerializer.factory(request.user, data=item)
  418. detail_serializer.validSave()
  419. serializer.update_total()
  420. except CustomError, e:
  421. return JSONError(e.get_error_msg())
  422. except Exception, e:
  423. traceback.print_exc()
  424. return JSONError(u'保存失败!')
  425. return JSONResponse(serializer.id)
  426. @token_required
  427. def deliver_delete(request):
  428. id = request.GET.get('id')
  429. try:
  430. with transaction.atomic():
  431. instance = Deliver.getById(id)
  432. valid_permission(request.user, instance.getPermission('delete'))
  433. if instance.status == settings.PASS:
  434. raise CustomError(u'该出库单已审核,禁止删除!')
  435. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除原料/耗材出库单[%s],id=%d" % (instance.no, instance.id))
  436. DeliverDetail.objects.filter(main=instance).delete()
  437. instance.delete()
  438. except CustomError, e:
  439. return JSONError(e.get_error_msg())
  440. except ProtectedError:
  441. return JSONError(u'该出库单已被引用,禁止删除!')
  442. except IntegrityError:
  443. return JSONError(u'该出库单已被引用,禁止删除!')
  444. except Exception, e:
  445. traceback.print_exc()
  446. return JSONError(u'删除失败!')
  447. return JSONResponse({})
  448. @token_required
  449. def deliver_detail(request):
  450. id = request.GET.get('id')
  451. if not id:
  452. return JSONResponse()
  453. instance = Deliver.getById(id)
  454. company = instance.department.getCompany()
  455. if instance.status == settings.PASS:
  456. status_text = u'已审核'
  457. else:
  458. status_text = u'待审核'
  459. main_data = {
  460. 'id': instance.id,
  461. 'warehouse_id': instance.warehouse_id,
  462. 'warehouse_name': instance.warehouse.name,
  463. 'receiver_id': instance.receiver_id,
  464. 'receiver_name': instance.receiver and instance.receiver.name or '',
  465. 'receiver_department_name': instance.receiver_department and instance.receiver_department.name or '',
  466. 'goods_id': instance.goods_id,
  467. 'goods_name': instance.goods and instance.goods.product_base.name or '',
  468. 'create_user_name': instance.create_user.name,
  469. 'create_time': Formater.formatStrTime(instance.create_time),
  470. 'total_count': Formater.formatCountShow(instance.total_count),
  471. 'total_cost': Formater.formatAmountShow(instance.total_cost),
  472. 'status_text': status_text,
  473. 'status': instance.status,
  474. 'check_user_text': instance.check_user and instance.check_user.name or ' ',
  475. 'check_time': Formater.formatStrTime(instance.create_time),
  476. 'notes': instance.notes,
  477. 'no': instance.no,
  478. 'company': company.name
  479. }
  480. data = {
  481. 'main_data': main_data,
  482. 'items_data': []
  483. }
  484. detail_rows = DeliverDetail.objects.filter(main=instance)
  485. for detail_row in detail_rows:
  486. no = ''
  487. if detail_row.warehouse_stockrecord_id:
  488. godownentry = GodownEntryDetail.objects.filter(stock_record=detail_row.warehouse_stockrecord).first()
  489. if godownentry:
  490. no = godownentry.main.no
  491. else:
  492. no = InventoryDetail.objects.filter(
  493. warehouse_stock_record=detail_row.warehouse_stockrecord).first().main.no
  494. record_data = GetWarehouseSrockRecord.getRecord(detail_row.product_base.id, instance.warehouse_id)
  495. item_data = {
  496. 'detail_id': detail_row.id,
  497. 'id': detail_row.product_base_id,
  498. 'name': detail_row.product_base.name,
  499. 'model': detail_row.product_base.model,
  500. 'total_cost': Formater.formatAmountShow(detail_row.total_cost),
  501. 'count': Formater.formatCountShow(detail_row.count),
  502. 'entry_no': detail_row.warehouse_stockrecord_id,
  503. 'no': no,
  504. 'record_data': record_data,
  505. 'warehouse_stock_count': Formater.formatCountShow(detail_row.warehouse_stock.count),
  506. 'unit': detail_row.product_base.unit or '',
  507. 'notes': detail_row.notes or ''
  508. }
  509. data['items_data'].append(item_data)
  510. return JSONResponse(data)
  511. @token_required
  512. def deliver_check(request):
  513. id = request.GET.get('id')
  514. try:
  515. with transaction.atomic():
  516. instance = Deliver.getById(id)
  517. valid_permission(request.user, instance.getPermission('check'))
  518. if instance.status == settings.PASS:
  519. raise CustomError(u'该出库单已审核')
  520. deliver_details = DeliverDetail.objects.filter(main=instance)
  521. for deliver_detail in deliver_details:
  522. warehouse_record = BizWarehouse.deliveredByStockRecord(WarehouseRecord.CK_ZJ,
  523. deliver_detail.warehouse_stockrecord,
  524. deliver_detail.count)
  525. deliver_detail.warehouse_record = warehouse_record
  526. deliver_detail.total_cost = -warehouse_record.amount
  527. deliver_detail.save()
  528. instance.update_total()
  529. instance.status = settings.PASS
  530. instance.check_user = request.user
  531. instance.check_time = timezone.now()
  532. BizLog.objects.addnew(
  533. request.user,
  534. BizLog.CHECK,
  535. u"审核原料/耗材出库[%s],id=%d" % (instance.no, instance.id),
  536. )
  537. instance.save()
  538. except CustomError, e:
  539. return JSONError(e.get_error_msg())
  540. except Exception, e:
  541. traceback.print_exc()
  542. return JSONError(u'审核失败')
  543. return JSONResponse({})
  544. @token_required
  545. def goods_select(request):
  546. goods = Goods.objects.filter(product_base__enabled=True)
  547. data = []
  548. for row in goods:
  549. item = {
  550. 'id': row.id,
  551. 'value': row.product_base.name
  552. }
  553. data.append(item)
  554. return JSONResponse(data)
  555. @token_required
  556. def get_amount(request):
  557. product_id = request.GET.get('product_id')
  558. warehouse = request.GET.get('warehouse')
  559. count = request.GET.get('count')
  560. try:
  561. product = ProductBase.getById(product_id)
  562. warehouse = Warehouse.getById(warehouse)
  563. amount, amount2, max_entry_price, max_entry_price2 = BizWarehouse.tryDelivered(product, warehouse, Formater.formatCount(count))
  564. data = {
  565. 'total_cost': Formater.formatAmountShow(amount),
  566. 'max_entry_price': Formater.formatPriceShow(max_entry_price)
  567. }
  568. except CustomError, e:
  569. traceback.print_exc()
  570. return JSONError(e.get_error_msg())
  571. except Exception, e:
  572. traceback.print_exc()
  573. return JSONError(u'获取成本合计失败!')
  574. return JSONResponse(data)
  575. @token_required
  576. def edit_warehouse(request):
  577. rows = json.loads(request.POST.get('data'))
  578. data = []
  579. try:
  580. for row in rows:
  581. count = Formater.formatCount(row['count'])
  582. product = ProductBase.getById(row['product_id'])
  583. warehouse = Warehouse.getById(row['warehouse'])
  584. amount, amount2, max_entry_price, max_entry_price2 = BizWarehouse.tryDelivered(product, warehouse, count)
  585. item = {
  586. 'id': row['product_id'],
  587. 'num': row['num'],
  588. 'total_cost': Formater.formatAmountShow(amount),
  589. 'max_entry_price': Formater.formatPriceShow(max_entry_price)
  590. }
  591. data.append(item)
  592. except CustomError, e:
  593. return JSONError(e.get_error_msg())
  594. except Exception, e:
  595. traceback.print_exc()
  596. return JSONError(u'获取成本合计失败!')
  597. return JSONResponse(data)
  598. @token_required
  599. def get_customer(request):
  600. goods = Customer.objects.filter()
  601. data = []
  602. for row in goods:
  603. item = {
  604. 'id': row.id,
  605. 'value': row.name
  606. }
  607. data.append(item)
  608. return JSONResponse(data)
  609. @token_required
  610. def inventory_list(request):
  611. product_type = int(request.GET.get('product_type'))
  612. product_name = request.GET.get('product_name')
  613. product_model = request.GET.get('product_model')
  614. product_notes = request.GET.get('product_notes')
  615. try:
  616. valid_permission(request.user, Inventory.getPermissionByType(product_type, 'view'))
  617. except:
  618. return DataGridJSONResponse([], 0)
  619. rows = Inventory.objects.filter(product_type=product_type)
  620. if product_name:
  621. ids = InventoryDetail.objects.filter(product__name__icontains=product_name).values_list('main_id')
  622. rows = rows.filter(id__in=ids)
  623. if product_model:
  624. ids = InventoryDetail.objects.filter(product__model__icontains=product_model).values_list('main_id')
  625. rows = rows.filter(id__in=ids)
  626. if product_notes:
  627. g_ids = rows.values_list('id')
  628. d_ids = InventoryDetail.objects.filter(main_id__in=g_ids, notes__icontains=product_notes).values_list('main_id')
  629. rows = rows.filter(id__in=d_ids)
  630. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  631. department_ids = request.user.getSubDepartmentIds()
  632. user_ids = request.user.getSubEmployeeIds()
  633. rows = rows.filter(warehouse_id__in=warehouses_ids)
  634. rows = rows.filter(
  635. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  636. f = InventoryFilter(request.GET, queryset=rows)
  637. total_row = f.qs.aggregate(sum_count=Sum('total_count'), sum_amount=Sum('total_amount'))
  638. more = {
  639. 'sum_count': Formater.formatCountShow(total_row['sum_count']),
  640. 'sum_amount': Formater.formatAmountShow(total_row['sum_amount'])
  641. }
  642. rows, total = utils.get_page_data(request, f.qs)
  643. serializer = InventorySerializer(rows, many=True)
  644. return DataGridJSONResponse(serializer.data, total, more)
  645. @csrf_exempt
  646. @token_required
  647. def inventory_save(request):
  648. id = request.GET.get('id')
  649. data = json.loads(request.body)
  650. try:
  651. with transaction.atomic():
  652. pb = InventorySerializer.factory(request.user, data['order_data'], id)
  653. if pb.instance and pb.instance.check_status == settings.PASS:
  654. raise CustomError(u'该盘存单已审核')
  655. pb = pb.validSave()
  656. valid_permission(request.user, pb.getPermission('add'))
  657. InventoryDetail.objects.filter(main_id=pb.id).delete()
  658. for item in data['items']:
  659. item['main'] = pb.id
  660. pbd = InventoryDetailSerializer.factory(request.user, item)
  661. pbd.validSave()
  662. pb.updateAmount()
  663. except CustomError, e:
  664. return JSONError(e.get_error_msg())
  665. except Exception, e:
  666. traceback.print_exc()
  667. return JSONError(u'保存失败')
  668. return JSONResponse({})
  669. @csrf_exempt
  670. @token_required
  671. def inventory_delete(request):
  672. id = int(request.GET.get('id'))
  673. try:
  674. with transaction.atomic():
  675. order = Inventory.getById(id)
  676. valid_permission(request.user, order.getPermission('delete'))
  677. if order.check_status == settings.PASS:
  678. raise CustomError(u'该盘存单已审核,禁止删除')
  679. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除盘存单[%s],id=%d" % (order.no, order.id))
  680. InventoryDetail.objects.filter(main__id=order.id).delete()
  681. order.delete()
  682. except CustomError, e:
  683. return JSONError(e.get_error_msg())
  684. except ProtectedError:
  685. return JSONError(u'该盘存单已被引用,禁止删除')
  686. except IntegrityError:
  687. return JSONError(u'该盘存单已被引用,禁止删除')
  688. except Exception, e:
  689. traceback.print_exc()
  690. return JSONError(u'删除失败!')
  691. return JSONResponse({})
  692. @csrf_exempt
  693. @token_required
  694. def inventory_detail(request):
  695. id = int(request.GET.get('id'))
  696. instance = Inventory.getById(id)
  697. company = Inventory.getById(id).department.getCompany()
  698. rows = InventoryDetail.objects.filter(main_id=id)
  699. if instance.check_status == settings.PASS:
  700. status_text = u'已审核'
  701. else:
  702. status_text = u'待审核'
  703. if instance.type == instance.SURPLUS:
  704. type_text = u'盘盈'
  705. elif instance.type == instance.LOSS:
  706. type_text = u'盘亏'
  707. else:
  708. type_text = ''
  709. main_data = {
  710. 'id': instance.id,
  711. 'warehouse_id': instance.warehouse_id,
  712. 'warehouse_name': instance.warehouse.name,
  713. 'create_user_name': instance.create_user.name,
  714. 'create_time': Formater.formatStrTime(instance.create_time),
  715. 'status': instance.check_status,
  716. 'type_text': type_text,
  717. 'status_text': status_text,
  718. 'check_user_text': instance.check_user and instance.check_user.name or ' ',
  719. 'check_time': Formater.formatStrTime(instance.create_time),
  720. 'total_count': Formater.formatCountShow(instance.total_count),
  721. 'total_amount': Formater.formatAmountShow(instance.total_amount),
  722. 'notes': instance.notes or '',
  723. 'no': instance.no,
  724. 'company': company.name
  725. }
  726. data = {
  727. 'company': company.name,
  728. 'inventory_type':instance.type,
  729. 'main_data': main_data,
  730. 'items_data': [],
  731. }
  732. for row in rows:
  733. record_data = GetWarehouseSrockRecord.getRecord(row.product_id, row.main.warehouse_id)
  734. product_base = row.product
  735. if product_base.type == ProductBase.GOODS:
  736. g_row = GoodsGodownEntryDetail.objects.filter(stock_record_id=row.loss_stock_record_id).first()
  737. else:
  738. g_row = GodownEntryDetail.objects.filter(stock_record_id=row.loss_stock_record_id).first()
  739. if not g_row:
  740. g_row = InventoryDetail.objects.filter(warehouse_stock_record_id=row.loss_stock_record_id).first()
  741. item = {
  742. 'id': row.id,
  743. 'product_id': row.product_id,
  744. 'loss_stock_record': row.loss_stock_record_id,
  745. 'product_name': row.product.name,
  746. 'unit': row.product.unit,
  747. 'product_model': row.product.model,
  748. 'warehouse_text': row.main.warehouse.name,
  749. 'surplus_count': row.loss_stock_record and Formater.formatCountShow(row.loss_stock_record.surplus_count) or '',
  750. 'count': Formater.formatCountShow(row.count),
  751. 'price': Formater.formatPriceShow(row.price),
  752. 'amount': Formater.formatAmountShow(row.amount),
  753. 'type_text': row.product.get_type_display(),
  754. 'option_type_text': row.product.option_type.name,
  755. 'notes': row.notes or '',
  756. 'entry_no': g_row and g_row.main.no or '',
  757. 'entry_notes': g_row and g_row.main.notes or '',
  758. 'record_data': record_data
  759. }
  760. data['items_data'].append(item)
  761. return JSONResponse(data)
  762. @csrf_exempt
  763. @token_required
  764. def inventory_export(request):
  765. product_type = int(request.GET.get('product_type'))
  766. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  767. department_ids = request.user.getSubDepartmentIds()
  768. user_ids = request.user.getSubEmployeeIds()
  769. rows = Inventory.objects.filter(product_type=product_type, warehouse_id__in=warehouses_ids)
  770. rows = rows.filter(
  771. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  772. f = InventoryFilter(request.GET, queryset=rows)
  773. serializer = InventorySerializer(f.qs, many=True)
  774. valid_permission(request.user, Inventory.getPermissionByType(product_type, 'export'))
  775. export_data = ExportChange.dict_to_obj(serializer)
  776. perm = ''
  777. if product_type == Inventory.MATERIAL:
  778. perm = 'material.view_material_cost'
  779. elif product_type == Inventory.CONSUMABLE:
  780. perm = 'material.view_consumable_cost'
  781. is_show_cost = isHasPermissions(request.user, perm)
  782. export_data = InventoryResource(is_show_cost).export(export_data)
  783. filename = utils.attachment_save(export_data)
  784. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出盘存单")
  785. return JSONResponse({'filename': filename})
  786. @csrf_exempt
  787. @token_required
  788. def inventory_detail_export(request):
  789. id = request.GET.get('id')
  790. order = Inventory.getById(id)
  791. valid_permission(request.user, order.getPermission('export'))
  792. serializer = InventoryDetailSerializer(InventoryDetail.objects.filter(main_id=id), many=True)
  793. export_data = ExportChange.dict_to_obj(serializer)
  794. perm = ''
  795. if order.product_type == Inventory.MATERIAL:
  796. perm = 'material.view_material_cost'
  797. elif order.product_type == Inventory.CONSUMABLE:
  798. perm = 'material.view_consumable_cost'
  799. is_show_cost = isHasPermissions(request.user, perm)
  800. export_data = InventoryDetailResource(is_show_cost).export(export_data)
  801. filename = utils.attachment_save(export_data)
  802. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出盘存明细单")
  803. return JSONResponse({'filename': filename})
  804. @csrf_exempt
  805. @token_required
  806. def inventory_check(request):
  807. id = int(request.GET.get('id'))
  808. try:
  809. with transaction.atomic():
  810. order = Inventory.getById(id)
  811. valid_permission(request.user, order.getPermission('check'))
  812. if order.check_status == settings.PASS:
  813. raise CustomError(u'该盘存单已审核,不允许重复操作')
  814. d_rows = InventoryDetail.objects.filter(main_id=id)
  815. if order.type == Inventory.SURPLUS:
  816. for d_row in d_rows:
  817. stock_record = BizWarehouse.entry(WarehouseRecord.RK_PY, d_row.product, d_row.main.warehouse, None, d_row.count, d_row.price, d_row.price)
  818. d_row.warehouse_stock_record = stock_record
  819. d_row.save()
  820. else:
  821. for d_row in d_rows:
  822. warehouse_record = BizWarehouse.deliveredByStockRecord(WarehouseRecord.CK_PK, d_row.loss_stock_record, d_row.count)
  823. if warehouse_record.count != 0:
  824. d_row.price = warehouse_record.amount / warehouse_record.count
  825. d_row.amount = -warehouse_record.amount
  826. d_row.warehouse_record = warehouse_record
  827. d_row.save()
  828. order.updateAmount()
  829. order.check_status = settings.PASS
  830. order.check_user = request.user
  831. order.check_time = timezone.now()
  832. order.save()
  833. BizLog.objects.addnew(
  834. request.user,
  835. BizLog.CHECK,
  836. u"审核盘存单[%s],id=%d" % (order.no, order.id),
  837. )
  838. except CustomError, e:
  839. return JSONError(e.get_error_msg())
  840. except Exception, e:
  841. traceback.print_exc()
  842. return JSONError(u'审核失败!')
  843. return JSONResponse({})
  844. @token_required
  845. def deliver_query_list(request):# 原料耗材出库查询
  846. try:
  847. valid_permission(request.user, getPermissionByType(int(request.GET.get('type')), 'view'))
  848. except:
  849. return DataGridJSONResponse([], 0)
  850. rows = get_filter_data(request)
  851. total_row = rows.aggregate(total_count1=Sum('deliver_detail_ref_warehouse_record__count'),
  852. total_count2=Sum('inventory_details_ref_warehouse_record__count'),
  853. total_cost1=Sum('deliver_detail_ref_warehouse_record__total_cost'),
  854. total_cost2=Sum('inventory_details_ref_warehouse_record__amount'),
  855. return_count=Sum('deliver_detail_ref_warehouse_record__return_count'),
  856. return_cost=Sum('deliver_detail_ref_warehouse_record__return_cost'))
  857. more = {
  858. 'total_count': Formater.formatCountShow((total_row['total_count1'] or 0) + (total_row['total_count2'] or 0)),
  859. 'total_cost': Formater.formatAmountShow((total_row['total_cost1'] or 0) + (total_row['total_cost2'] or 0)),
  860. 'return_count': Formater.formatCountShow(total_row['return_count']),
  861. 'return_cost': Formater.formatAmountShow(total_row['return_cost']),
  862. }
  863. rows, total = utils.get_page_data(request, rows)
  864. data = get_deliver_query_data(rows)
  865. return DataGridJSONResponse(data, total, more)
  866. @token_required
  867. def deliver_query_export(request):
  868. type = int(request.GET.get('type'))
  869. try:
  870. valid_permission(request.user, getPermissionByType(type, 'export'))
  871. rows = get_filter_data(request)
  872. data = get_deliver_query_data(rows)
  873. export_data = ExportChange.dict_to_obj2(data)
  874. if type == ProductBase.MATERIAL:
  875. perm = 'material.view_material_cost'
  876. elif type == ProductBase.CONSUMABLE:
  877. perm = 'material.view_consumable_cost'
  878. is_show_cost = isHasPermissions(request.user, perm)
  879. export_data = DeliverQueryResource(is_show_cost).export(export_data)
  880. filename = utils.attachment_save(export_data)
  881. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出出库查询")
  882. except CustomError, e:
  883. return JSONError(e.get_error_msg())
  884. except Exception, e:
  885. traceback.print_exc()
  886. return JSONError(u'导出出库查询失败!')
  887. return JSONResponse({'filename': filename})
  888. @token_required
  889. def deliver_query_detail(request):
  890. rows = get_filter_data(request)
  891. data = get_deliver_query_data(rows)
  892. return JSONResponse(data)
  893. def get_filter_data(request):
  894. product_type = int(request.GET.get('type'))
  895. happen_time = request.GET.get('happen_time')
  896. no = request.GET.get('no')
  897. goods = request.GET.get('goods')
  898. receiver = request.GET.get('receiver')
  899. name = request.GET.get('name')
  900. model = request.GET.get('model')
  901. type = request.GET.get('deliver_type')
  902. notes = request.GET.get('notes')
  903. warehouse = request.GET.get('warehouse')
  904. create_user = request.GET.get('create_user')
  905. rows = WarehouseRecord.objects.filter(product__type=product_type, type__in=[3,4,5]).order_by('-id')
  906. if happen_time:
  907. happen_time_begin = happen_time.split(' - ')[0]
  908. happen_time_end = happen_time.split(' - ')[1] + ' 23:59:59'
  909. rows = rows.filter(happen_time__gt=happen_time_begin, happen_time__lt=happen_time_end)
  910. if no:
  911. rows = rows.filter(Q(deliver_detail_ref_warehouse_record__main__no__icontains=no) | Q(
  912. inventory_details_ref_warehouse_record__main____no__icontains=no))
  913. if notes:
  914. rows = rows.filter(Q(deliver_detail_ref_warehouse_record__notes__icontains=notes) | Q(
  915. inventory_details_ref_warehouse_record__notes__icontains=notes))
  916. if receiver:
  917. rows = rows.filter(deliver_detail_ref_warehouse_record__main__receiver__name__icontains=receiver)
  918. if goods:
  919. rows = rows.filter(deliver_detail_ref_warehouse_record__main__goods__product_base__name__icontains=goods)
  920. if create_user:
  921. rows = rows.filter(Q(deliver_detail_ref_warehouse_record__main__create_user__name__icontains=create_user) |
  922. Q(inventory_details_ref_warehouse_record__main__create_user__name__icontains=create_user))
  923. if name:
  924. rows = rows.filter(product__name__icontains=name)
  925. if model:
  926. rows = rows.filter(product__model__icontains=model)
  927. if type:
  928. rows = rows.filter(type=type)
  929. if warehouse:
  930. rows = rows.filter(warehouse__name__icontains=warehouse)
  931. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  932. department_ids = request.user.getSubDepartmentIds()
  933. user_ids = request.user.getSubEmployeeIds()
  934. rows = rows.filter(warehouse_id__in=warehouses_ids)
  935. rows = rows.filter(Q(
  936. Q(deliver_detail_ref_warehouse_record__main__department_id__in=department_ids)
  937. | Q(deliver_detail_ref_warehouse_record__main__create_user_id__in=user_ids)
  938. | Q(deliver_detail_ref_warehouse_record__main__create_user=request.user)) | Q(
  939. Q(inventory_details_ref_warehouse_record__main__department_id__in=department_ids)
  940. | Q(inventory_details_ref_warehouse_record__main__create_user_id__in=user_ids)
  941. | Q(inventory_details_ref_warehouse_record__main__create_user=request.user)
  942. ))
  943. return rows
  944. def get_deliver_query_data(rows):
  945. rows = rows.values(
  946. 'id',
  947. 'type',
  948. 'product__name',
  949. 'product__model',
  950. 'product__unit',
  951. 'product__type',
  952. 'product__warehouse_place',
  953. 'inventory_details_ref_warehouse_record__count',
  954. 'inventory_details_ref_warehouse_record__amount',
  955. 'warehouse__name',
  956. 'happen_time',
  957. 'cur_count',
  958. 'deliver_detail_ref_warehouse_record__count',
  959. 'deliver_detail_ref_warehouse_record__total_cost',
  960. 'deliver_detail_ref_warehouse_record__return_count',
  961. 'deliver_detail_ref_warehouse_record__return_cost',
  962. 'deliver_detail_ref_warehouse_record__notes',
  963. 'deliver_detail_ref_warehouse_record__main__receiver__name',
  964. 'deliver_detail_ref_warehouse_record__main__check_user__name',
  965. 'deliver_detail_ref_warehouse_record__main__create_user__name',
  966. 'deliver_detail_ref_warehouse_record__main__check_time',
  967. 'deliver_detail_ref_warehouse_record__main__goods__product_base__name',
  968. 'deliver_detail_ref_warehouse_record__main__no',
  969. 'deliver_detail_ref_warehouse_record__warehouse_stockrecord__godown_entry_detail_ref_stock_record__main__no',
  970. 'inventory_details_ref_warehouse_record__main__no',
  971. 'inventory_details_ref_warehouse_record__main__check_user__name',
  972. 'inventory_details_ref_warehouse_record__main__create_user__name',
  973. 'inventory_details_ref_warehouse_record__notes'
  974. # 'inventory_details_ref_warehouse_record__loss_stock_record__godown_entry_detail_ref_stock_record__main__no',
  975. )
  976. data = []
  977. for row in rows:
  978. warehouse_record_type = WarehouseRecord.TYPE_CHOICES[row['type']][1]
  979. product_type_text = ProductBase.TYPE_CHOICES[row['product__type']][1]
  980. no = row['deliver_detail_ref_warehouse_record__main__no']
  981. check_user = row['deliver_detail_ref_warehouse_record__main__check_user__name']
  982. create_user = row['deliver_detail_ref_warehouse_record__main__create_user__name']
  983. receiver = row['deliver_detail_ref_warehouse_record__main__receiver__name']
  984. notes = row['deliver_detail_ref_warehouse_record__notes']
  985. name = row['product__name']
  986. model = row['product__model']
  987. unit = row['product__unit']
  988. entry_no = row['deliver_detail_ref_warehouse_record__warehouse_stockrecord__godown_entry_detail_ref_stock_record__main__no']
  989. warehouse_place = row['product__warehouse_place']
  990. count = Formater.formatCountShow(row['deliver_detail_ref_warehouse_record__count'])
  991. total_cost = Formater.formatAmountShow(row['deliver_detail_ref_warehouse_record__total_cost'])
  992. return_count = Formater.formatCountShow(row['deliver_detail_ref_warehouse_record__return_count'])
  993. return_cost = Formater.formatAmountShow(row['deliver_detail_ref_warehouse_record__return_cost'])
  994. if row['type'] == WarehouseRecord.CK_PK:
  995. no = row['inventory_details_ref_warehouse_record__main__no']
  996. # entry_no = row['inventory_details_ref_warehouse_record__loss_stock_record__godown_entry_detail_ref_stock_record__main__no']
  997. check_user = row['inventory_details_ref_warehouse_record__main__check_user__name']
  998. create_user = row['inventory_details_ref_warehouse_record__main__create_user__name']
  999. receiver = ''
  1000. notes = row['inventory_details_ref_warehouse_record__notes']
  1001. count = Formater.formatCountShow(row['inventory_details_ref_warehouse_record__count'])
  1002. total_cost = Formater.formatAmountShow(row['inventory_details_ref_warehouse_record__amount'])
  1003. return_count = '0.00'
  1004. return_cost = '0.0000'
  1005. item = {
  1006. 'id': row['id'],
  1007. 'type': warehouse_record_type,
  1008. 'product_type': product_type_text,
  1009. 'name': name,
  1010. 'model': model,
  1011. 'unit': unit,
  1012. 'warehouse_place': warehouse_place,
  1013. 'warehouse': row['warehouse__name'],
  1014. 'happen_time': Formater.formatStrTime(row['happen_time']),
  1015. 'cur_count': Formater.formatCountShow(row['cur_count']),
  1016. 'count': count,
  1017. 'total_cost': total_cost,
  1018. 'return_count': return_count,
  1019. 'return_cost': return_cost,
  1020. 'receiver': receiver,
  1021. 'check_user': check_user,
  1022. 'create_user': create_user,
  1023. 'notes': notes,
  1024. 'no': no,
  1025. 'entry_no': entry_no
  1026. }
  1027. data.append(item)
  1028. return data
  1029. def getPermissionByType(type, action):
  1030. permissions = {
  1031. ProductBase.MATERIAL: {'view': 'plan.view_material_deliver_query',
  1032. 'export': 'plan.export_material_deliver_query',
  1033. },
  1034. ProductBase.CONSUMABLE: {'view': 'plan.view_consumable_deliver_query',
  1035. 'export': 'plan.export_consumable_deliver_query',
  1036. }
  1037. }
  1038. return permissions[type][action]
  1039. @token_required
  1040. def deliver_return_list(request):
  1041. type = int(request.GET.get('type'))
  1042. product_notes = request.GET.get('product_notes')
  1043. try:
  1044. valid_permission(request.user, DeliverReturn.getPermissionByType(type, 'view'))
  1045. except:
  1046. return DataGridJSONResponse([], 0)
  1047. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  1048. department_ids = request.user.getSubDepartmentIds()
  1049. user_ids = request.user.getSubEmployeeIds()
  1050. rows = Deliver.objects.filter(product_type=type, status=settings.PASS,
  1051. warehouse_id__in=warehouses_ids)
  1052. rows = rows.filter(
  1053. Q(department_id__in=department_ids) | Q(create_user_id__in=user_ids) | Q(create_user=request.user))
  1054. if product_notes:
  1055. g_ids = rows.values_list('id')
  1056. d_ids = DeliverDetail.objects.filter(main_id__in=g_ids, notes__icontains=product_notes).values_list('main_id')
  1057. rows = rows.filter(id__in=d_ids)
  1058. f = DeliverFilter(request.GET, queryset=rows)
  1059. total_row = f.qs.aggregate(total_count=Sum('total_count'), total_cost=Sum('total_cost'),
  1060. return_count=Sum('return_count'), return_cost=Sum('return_cost'))
  1061. more = {
  1062. 'total_count': Formater.formatCountShow(total_row['total_count']),
  1063. 'total_cost': Formater.formatAmountShow(total_row['total_cost']),
  1064. 'return_count': Formater.formatCountShow(total_row['return_count']),
  1065. 'return_cost': Formater.formatAmountShow(total_row['return_cost'])
  1066. }
  1067. rows, total = utils.get_page_data(request, f.qs)
  1068. serializer = DeliverReturnViewSerializer(rows, many=True)
  1069. return DataGridJSONResponse(serializer.data, total, more)
  1070. @token_required
  1071. def deliver_return_select_list(request):
  1072. id = int(request.GET.get('id'))
  1073. ids = DeliverReturnDetail.objects.filter(deliver_detail__main_id=id).values_list('main_id',flat=True)
  1074. rows = DeliverReturn.objects.filter(id__in=ids)
  1075. data = []
  1076. for row in rows:
  1077. data.append(row)
  1078. serializer = DeliverReturnSerializer(data, many=True)
  1079. return DataGridJSONResponse(serializer.data, rows.count())
  1080. @token_required
  1081. def deliver_return_detail(request):
  1082. id = request.GET.get('id')
  1083. ids = request.GET.get('ids')
  1084. data = {
  1085. 'main_data': '',
  1086. 'deliver_data': [],
  1087. 'items_data': []
  1088. }
  1089. if ids:
  1090. id_list = ids.split(',')
  1091. deliver_returns = DeliverReturn.getByIds(id_list)
  1092. for deliver_return in deliver_returns:
  1093. deliver_data = {
  1094. 'no': deliver_return.no,
  1095. 'return_count': Formater.formatCountShow(deliver_return.return_count),
  1096. 'return_cost': Formater.formatAmountShow(deliver_return.return_cost),
  1097. 'reason': deliver_return.reason
  1098. }
  1099. data['deliver_data'].append(deliver_data)
  1100. instance = Deliver.getById(id)
  1101. company = instance.department.getCompany()
  1102. main_data = {
  1103. 'warehouse_id': instance.warehouse_id,
  1104. 'warehouse_name': instance.warehouse.name,
  1105. 'receiver_id': instance.receiver_id,
  1106. 'receiver_name': instance.receiver.name,
  1107. 'goods_id': instance.goods_id,
  1108. 'goods_name': instance.goods and instance.goods.product_base.name ,
  1109. 'create_user_name': instance.create_user.name,
  1110. 'create_time': Formater.formatStrTime(instance.create_time),
  1111. 'total_count': Formater.formatCountShow(instance.total_count),
  1112. 'total_cost': Formater.formatAmountShow(instance.total_cost),
  1113. 'return_count': Formater.formatCountShow(instance.return_count),
  1114. 'return_cost': Formater.formatAmountShow(instance.return_cost),
  1115. 'notes': instance.notes,
  1116. 'no': instance.no,
  1117. 'company': company.name,
  1118. }
  1119. data['main_data'] = main_data
  1120. detail_rows = DeliverDetail.objects.filter(main=instance)
  1121. for detail_row in detail_rows:
  1122. item_data = {
  1123. 'id': detail_row.id,
  1124. 'product_id': detail_row.product_base_id,
  1125. 'name': detail_row.product_base.name,
  1126. 'model': detail_row.product_base.model,
  1127. 'total_cost': Formater.formatAmountShow(detail_row.total_cost),
  1128. 'count': Formater.formatCountShow(detail_row.count),
  1129. 'cur_count': Formater.formatCountShow(detail_row.count - detail_row.return_count),
  1130. 'warehouse_stock_count': Formater.formatCountShow(detail_row.warehouse_stock.count),
  1131. 'unit':detail_row.product_base.unit or '',
  1132. 'notes':detail_row.notes or ''
  1133. }
  1134. data['items_data'].append(item_data)
  1135. return JSONResponse(data)
  1136. @token_required
  1137. def deliver_return_save(request):
  1138. id = request.GET.get('id')
  1139. main_data = json.loads(request.POST.get('main'))
  1140. items_data = json.loads(request.POST.get('item'))
  1141. try:
  1142. type = DeliverReturn.getValidType(request.GET.get('type'))
  1143. main_data['product_type'] = type
  1144. with transaction.atomic():
  1145. serializer = DeliverReturnSerializer.factory(request.user, main_data)
  1146. serializer = serializer.validSave()
  1147. valid_permission(request.user, serializer.getPermission('add'))
  1148. for item in items_data:
  1149. item['main'] = serializer.id
  1150. detail_serializer = DeliverReturnDetailSerializer.factory(request.user, data=item)
  1151. detail_serializer = detail_serializer.validSave()
  1152. detail_serializer.deliver_detail.updateReturn()
  1153. serializer.update_total()
  1154. deliver = Deliver.getById(id)
  1155. deliver.update_return()
  1156. except CustomError, e:
  1157. return JSONError(e.get_error_msg())
  1158. except Exception, e:
  1159. traceback.print_exc()
  1160. return JSONError(u'保存失败!')
  1161. return JSONResponse()
  1162. @token_required
  1163. def deliver_return_query_list(request):# 原料耗材退料查询
  1164. try:
  1165. valid_permission(request.user, getPermissionByType(int(request.GET.get('type')), 'view'))
  1166. except:
  1167. return DataGridJSONResponse([], 0)
  1168. rows = get_return_filter_data(request)
  1169. total_row = rows.aggregate(return_count=Sum('deliver_return_detail_ref_warehouse_record__return_count'),
  1170. return_cost=Sum('deliver_return_detail_ref_warehouse_record__return_cost'))
  1171. more = {
  1172. 'return_count': Formater.formatCountShow(total_row['return_count']),
  1173. 'return_cost': Formater.formatAmountShow(total_row['return_cost']),
  1174. }
  1175. rows, total = utils.get_page_data(request, rows)
  1176. data = get_deliver_return_query_data(rows)
  1177. return DataGridJSONResponse(data, total, more)
  1178. @token_required
  1179. def deliver_return_query_export(request):
  1180. type = int(request.GET.get('type'))
  1181. try:
  1182. valid_permission(request.user, getReturnPermissionByType(type, 'export'))
  1183. rows = get_return_filter_data(request)
  1184. data = get_deliver_return_query_data(rows)
  1185. export_data = ExportChange.dict_to_obj2(data)
  1186. if type == ProductBase.MATERIAL:
  1187. perm = 'material.view_material_cost'
  1188. elif type == ProductBase.CONSUMABLE:
  1189. perm = 'material.view_consumable_cost'
  1190. is_show_cost = isHasPermissions(request.user, perm)
  1191. export_data = DeliverReturnQueryResource(is_show_cost).export(export_data)
  1192. filename = utils.attachment_save(export_data)
  1193. BizLog.objects.addnew(request.user, BizLog.EXPORT, u"导出原料/耗材退料查询")
  1194. except CustomError, e:
  1195. return JSONError(e.get_error_msg())
  1196. except Exception, e:
  1197. traceback.print_exc()
  1198. return JSONError(u'导出原料/耗材退料查询失败!')
  1199. return JSONResponse({'filename': filename})
  1200. @token_required
  1201. def deliver_return_query_detail(request):
  1202. rows = get_return_filter_data(request)
  1203. data = get_deliver_return_query_data(rows)
  1204. return JSONResponse(data)
  1205. def get_return_filter_data(request):
  1206. product_type = int(request.GET.get('type'))
  1207. create_time = request.GET.get('create_time')
  1208. warehouse = request.GET.get('warehouse')
  1209. return_no = request.GET.get('return_no')
  1210. no = request.GET.get('no')
  1211. name = request.GET.get('name')
  1212. model = request.GET.get('model')
  1213. notes = request.GET.get('notes')
  1214. reason = request.GET.get('reason')
  1215. create_user = request.GET.get('create_user')
  1216. rows = WarehouseRecord.objects.filter(product__type=product_type, type=7).order_by('-id')
  1217. if create_time:
  1218. create_time_begin = create_time.split(' - ')[0]
  1219. create_time_end = create_time.split(' - ')[1] + ' 23:59:59'
  1220. rows = rows.filter(deliver_return_detail_ref_warehouse_record__main__create_time__gt=create_time_begin,
  1221. deliver_return_detail_ref_warehouse_record__main__create_time__lt=create_time_end)
  1222. if no:
  1223. rows = rows.filter(deliver_return_detail_ref_warehouse_record__deliver_detail__main__no__icontains=no)
  1224. if notes:
  1225. rows = rows.filter(deliver_return_detail_ref_warehouse_record__notes__icontains=notes)
  1226. if create_user:
  1227. rows = rows.filter(deliver_return_detail_ref_warehouse_record__main__create_user__name__icontains=create_user)
  1228. if warehouse:
  1229. rows = rows.filter(deliver_return_detail_ref_warehouse_record__deliver_detail__main__warehouse__name__icontains=warehouse)
  1230. if return_no:
  1231. rows = rows.filter(
  1232. deliver_return_detail_ref_warehouse_record__main__no__icontains=return_no)
  1233. if reason:
  1234. rows = rows.filter(deliver_return_detail_ref_warehouse_record__main__reason__icontains=reason)
  1235. if name:
  1236. rows = rows.filter(deliver_return_detail_ref_warehouse_record__product_base__name__icontains=name)
  1237. if model:
  1238. rows = rows.filter(deliver_return_detail_ref_warehouse_record__product_base__name__icontains=model)
  1239. warehouses_ids = Warehouse.getManagerWarehouses(request.user)
  1240. department_ids = request.user.getSubDepartmentIds()
  1241. user_ids = request.user.getSubEmployeeIds()
  1242. rows = rows.filter(warehouse_id__in=warehouses_ids)
  1243. rows = rows.filter(
  1244. Q(deliver_return_detail_ref_warehouse_record__main__department_id__in=department_ids)
  1245. | Q(deliver_return_detail_ref_warehouse_record__main__create_user_id__in=user_ids)
  1246. | Q(deliver_return_detail_ref_warehouse_record__main__create_user=request.user))
  1247. return rows
  1248. def get_deliver_return_query_data(rows):
  1249. rows = rows.values(
  1250. 'id',
  1251. 'type',
  1252. 'deliver_return_detail_ref_warehouse_record__product_base__name',
  1253. 'deliver_return_detail_ref_warehouse_record__product_base__model',
  1254. 'deliver_return_detail_ref_warehouse_record__product_base__type',
  1255. 'deliver_return_detail_ref_warehouse_record__product_base__warehouse_place',
  1256. 'warehouse__name',
  1257. 'cur_count',
  1258. 'deliver_return_detail_ref_warehouse_record__return_count',
  1259. 'deliver_return_detail_ref_warehouse_record__return_cost',
  1260. 'deliver_return_detail_ref_warehouse_record__notes',
  1261. 'deliver_return_detail_ref_warehouse_record__main__create_user__name',
  1262. 'deliver_return_detail_ref_warehouse_record__main__create_time',
  1263. 'deliver_return_detail_ref_warehouse_record__main__reason',
  1264. 'deliver_return_detail_ref_warehouse_record__main__no',
  1265. 'deliver_return_detail_ref_warehouse_record__deliver_detail__main__no',
  1266. )
  1267. data = []
  1268. for row in rows:
  1269. warehouse_record_type = WarehouseRecord.TYPE_CHOICES[row['type']][1]
  1270. product_type_text = ProductBase.TYPE_CHOICES[row['deliver_return_detail_ref_warehouse_record__product_base__type']][1]
  1271. item = {
  1272. 'id': row['id'],
  1273. 'type': warehouse_record_type,
  1274. 'product_type': product_type_text,
  1275. 'name': row['deliver_return_detail_ref_warehouse_record__product_base__name'],
  1276. 'model': row['deliver_return_detail_ref_warehouse_record__product_base__model'],
  1277. 'warehouse_place': row['deliver_return_detail_ref_warehouse_record__product_base__warehouse_place'],
  1278. 'warehouse': row['warehouse__name'],
  1279. 'cur_count': Formater.formatCountShow(row['cur_count']),
  1280. 'create_user': row['deliver_return_detail_ref_warehouse_record__main__create_user__name'],
  1281. 'create_time': Formater.formatStrTime(row['deliver_return_detail_ref_warehouse_record__main__create_time']),
  1282. 'return_count': Formater.formatCountShow(row['deliver_return_detail_ref_warehouse_record__return_count']),
  1283. 'return_cost': Formater.formatAmountShow(row['deliver_return_detail_ref_warehouse_record__return_cost']),
  1284. 'reason': row['deliver_return_detail_ref_warehouse_record__main__reason'],
  1285. 'notes': row['deliver_return_detail_ref_warehouse_record__notes'],
  1286. 'return_no': row['deliver_return_detail_ref_warehouse_record__main__no'],
  1287. 'no': row['deliver_return_detail_ref_warehouse_record__deliver_detail__main__no']
  1288. }
  1289. data.append(item)
  1290. return data
  1291. def getReturnPermissionByType(type, action):
  1292. permissions = {
  1293. ProductBase.MATERIAL: {'view': 'warehouse.view_material_deliver_return_query',
  1294. 'export': 'warehouse.export_material_deliver_return_query',
  1295. },
  1296. ProductBase.CONSUMABLE: {'view': 'purchase.view_consumable_deliver_return_query',
  1297. 'export': 'purchase.export_consumable_deliver_return_query',
  1298. }
  1299. }
  1300. return permissions[type][action]
  1301. @csrf_exempt
  1302. @token_required
  1303. def stock_log(request):
  1304. keyword = request.GET.get('keyword')
  1305. action = request.GET.get('action')
  1306. happen_time = request.GET.get('happen_time')
  1307. warehouse_id = request.GET.get('warehouse_id')
  1308. product_id = request.GET.get('product_id')
  1309. product_base = ProductBase.getById(int(product_id))
  1310. valid_permission(request.user, WarehouseStock.getPermissionByType(product_base.type, 'log'))
  1311. page, page_size = utils.get_page_info(request)
  1312. product_id = int(product_id)
  1313. warehouse_id = int(warehouse_id)
  1314. where = ''
  1315. if happen_time:
  1316. happen_time = happen_time.split(' - ')
  1317. where += " AND m.happen_time >= '%s' " % happen_time[0]
  1318. where += " AND m.happen_time <= '%s' " % (happen_time[1] + ' 23:59:59')
  1319. if action:
  1320. where += ' AND m.type = %d' % int(action)
  1321. if keyword and len(keyword) > 0:
  1322. where += " AND (m.order_no like '%" + keyword + "%' " \
  1323. " or m.warehouse_name like '%" + keyword + "%' )"
  1324. page_sql = ' LIMIT %d OFFSET %d ' % (page_size, page * page_size)
  1325. sql = """SELECT * FROM(
  1326. SELECT
  1327. pwr.type,
  1328. pwr.happen_time,
  1329. (CASE WHEN pwr.type in (3, 4) THEN gd.`no`
  1330. WHEN pwr.type = 5 THEN iv.`no`
  1331. WHEN pwr.type = 6 THEN gr.`no`
  1332. WHEN pwr.type = 7 THEN gdr.`no`
  1333. else '' END) AS order_no,
  1334. (CASE WHEN pwr.type in (3, 4) THEN dd.total_cost
  1335. WHEN pwr.type = 5 THEN ind.price
  1336. WHEN pwr.type = 6 THEN gedr.price
  1337. WHEN pwr.type = 7 THEN gdrd.return_cost
  1338. else '' END) AS order_price,
  1339. pwr.count,
  1340. pwr.amount,
  1341. pwr.amount/pwr.count as cost,
  1342. pw.name as warehouse_name,
  1343. pwr.warehouse_id AS warehouse_id,
  1344. pwr.product_id AS product_id,
  1345. pwr.id AS id,
  1346. pwr.cur_count as cur_count,
  1347. pwr.cur_amount as cur_amount
  1348. FROM product_warehouse_record pwr LEFT JOIN
  1349. product_warehouse pw ON pwr.warehouse_id = pw.id LEFT JOIN
  1350. product_warehouse_stock pws ON pwr.product_id = pws.product_id AND pwr.warehouse_id=pws.warehouse_id LEFT JOIN
  1351. deliver_detail dd ON pwr.id=dd.warehouse_record_id LEFT JOIN
  1352. deliver gd ON dd.main_id=gd.id LEFT JOIN
  1353. deliver_detail_return gdrd ON pwr.id = gdrd.warehouse_record_id LEFT JOIN
  1354. deliver_return gdr ON gdrd.main_id = gdr.id LEFT JOIN
  1355. godown_entry_detail_return gedr ON pwr.id=gedr.warehouse_record_id LEFT JOIN
  1356. godown_entry_return gr ON gedr.main_id=gr.id LEFT JOIN
  1357. inventory_detail ind on ind.warehouse_record_id=pwr.id left join
  1358. inventory iv ON iv.id=ind.main_id
  1359. WHERE pwr.warehouse_id = %(warehose)d AND pwr.product_id = %(product)d AND pwr.type >=3
  1360. UNION ALL
  1361. SELECT
  1362. pwr.type,
  1363. pwr.happen_time,
  1364. (CASE WHEN pwr.type in (0, 1) THEN ge.`no`
  1365. WHEN pwr.type = 2 THEN iv.`no`
  1366. else '' END) AS order_no,
  1367. (CASE WHEN pwr.type in (0, 1) THEN ged.price
  1368. WHEN pwr.type = 2 THEN ind.price
  1369. else '' END) AS order_price,
  1370. pwr.count,
  1371. pwr.amount,
  1372. pwr.amount/pwr.count as cost,
  1373. pw.name as warehouse_name,
  1374. pwr.warehouse_id AS warehouse_id,
  1375. pwr.product_id AS product_id,
  1376. pwr.id AS id,
  1377. pwr.cur_count as cur_count,
  1378. pwr.cur_amount as cur_amount
  1379. FROM product_warehouse_record pwr LEFT JOIN
  1380. product_warehouse pw ON pwr.warehouse_id = pw.id LEFT JOIN
  1381. product_warehouse_stock pws ON pwr.product_id = pws.product_id AND pwr.warehouse_id=pws.warehouse_id LEFT JOIN
  1382. product_warehouse_record_detail pwrd ON pwr.id=pwrd.warehouse_record_id LEFT JOIN
  1383. godown_entry_detail ged ON pwrd.warehouse_stock_record_id=ged.stock_record_id LEFT JOIN
  1384. godown_entry ge ON ged.main_id=ge.id LEFT JOIN
  1385. inventory_detail ind on ind.warehouse_stock_record_id = pwrd.warehouse_stock_record_id left join
  1386. inventory iv ON iv.id = ind.main_id
  1387. WHERE pwr.warehouse_id = %(warehose)d AND pwr.product_id = %(product)d AND (pwr.type <= 2)
  1388. ) as m
  1389. WHERE 1=1 %(where)s
  1390. ORDER BY m.happen_time DESC
  1391. """ % {'warehose': warehouse_id, 'product': product_id, 'where': where}
  1392. sum_sql = """ SELECT
  1393. COUNT(0)
  1394. FROM
  1395. (%s) AS t
  1396. """ % sql
  1397. items = []
  1398. sql = '%s %s' % (sql, page_sql)
  1399. cursor = connection.cursor()
  1400. cursor.execute(sql)
  1401. row = cursor.fetchone()
  1402. total = 0
  1403. while row:
  1404. action_text = WarehouseRecord.TYPE_CHOICES[row[0]][1]
  1405. text = ''
  1406. if row[0] == WarehouseRecord.RK_ZJ:
  1407. text = u'入库单[' + row[2] + u']'
  1408. elif row[0] == WarehouseRecord.RK_CG:
  1409. text = u'采购转入库,入库单[' + row[2] + u']'
  1410. elif row[0] == WarehouseRecord.RK_PY:
  1411. text = u'盘盈单[' + row[2] + u']'
  1412. elif row[0] == WarehouseRecord.CK_ZJ:
  1413. text = u'出库单[' + row[2] + ']'
  1414. elif row[0] == WarehouseRecord.CK_XS:
  1415. text = u'订单转出库,出库单[' + row[2] + u']'
  1416. elif row[0] == WarehouseRecord.CK_PK:
  1417. text = u'盘亏单[' + row[2] + u']'
  1418. elif row[0] == WarehouseRecord.TH:
  1419. text = u'退货单[' + row[2] + u']'
  1420. elif row[0] == WarehouseRecord.TL:
  1421. text = u'退料单[' + row[2] + u']'
  1422. item = {
  1423. 'action': row[0],
  1424. 'action_text': action_text,
  1425. 'create_time': strftime(row[1]),
  1426. 'order_no': row[2],
  1427. 'count': Formater.formatCountShow(row[4]),
  1428. 'cost': Formater.formatPriceShow(row[6]),
  1429. 'price': Formater.formatPriceShow(row[3]),
  1430. 'warehouse_text': row[7],
  1431. 'text': text,
  1432. 'cur_count': Formater.formatCountShow(row[11]),
  1433. 'cur_amount': Formater.formatAmountShow(row[12]),
  1434. }
  1435. items.append(item)
  1436. row = cursor.fetchone()
  1437. cursor.execute(sum_sql)
  1438. row = cursor.fetchone()
  1439. if row:
  1440. total = row[0]
  1441. return DataGridJSONResponse(items, total)