123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 |
- # coding=utf-8
- import json
- import traceback
- import tablib
- from django.db import transaction,IntegrityError, connection
- from django.db.models import ProtectedError
- from django.views.decorators.csrf import csrf_exempt
- from django.utils import timezone
- from apps.product.models import ProductBase
- from libs import utils
- from libs.http import JSONResponse, JSONError, DataGridJSONResponse
- from apps.account.decorators import token_required, valid_permission, isHasPermissions
- from apps.exceptions import CustomError
- from apps.foundation.models import BizLog
- from apps.purchase.models import GodownEntry, GodownEntryDetail
- from apps.goods.models import GoodsGodownEntry, GoodsGodownEntryDetail
- from models import Warehouse, WarehouseAdmin, WarehouseStock, WarehouseRecord, WarehouseStockRecord, InventoryDetail, Inventory
- from filters import WarehouseFilter
- from serializers import WarehouseSerializer
- from apps.base import Formater
- @token_required
- def warehouse_list(request):
- try:
- valid_permission(request.user,Warehouse.getPermissionByType(request.GET.get('type'), 'view'))
- except:
- return DataGridJSONResponse([], 0)
- f = WarehouseFilter(request.GET, queryset=Warehouse.objects.filter())
- rows, total = utils.get_page_data(request, f.qs)
- serializer = WarehouseSerializer(rows, many=True)
- return DataGridJSONResponse(serializer.data, total)
- @csrf_exempt
- @token_required
- def warehouse_save(request):
- id = request.GET.get('id')
- data = json.loads(request.body)
- try:
- with transaction.atomic():
- serializer = WarehouseSerializer.factory(request.user,data,id)
- ws = serializer.validSave()
- valid_permission(request.user,ws.getPermission('add'))
- ws.removeAdmins()
- for userid in data['user']:
- ws.addAdminByUserId(int(userid))
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'保存失败!')
- return JSONResponse()
- @token_required
- def warehouse_delete(request):
- id = request.GET.get('id')
- try:
- with transaction.atomic():
- w = Warehouse.getById(id)
- valid_permission(request.user,w.getPermission('delete'))
- w.removeAdmins()
- w.removeStock()
- BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除仓别[%s],id=%d" % (w.name, w.id))
- w.delete()
- except CustomError, e:
- return JSONError(e.get_error_msg())
- except ProtectedError:
- return JSONError(u'该仓别已被使用,禁止删除!')
- except IntegrityError:
- return JSONError(u'该仓别已被使用,禁止删除!')
- except Exception, e:
- traceback.print_exc()
- return JSONError(u'删除失败!')
- return JSONResponse({})
- @token_required
- def warehouse_select(request):
- data = []
- try:
- type = Warehouse.getValidType(request.GET.get('type'))
- warehouses = WarehouseAdmin.objects.filter(user=request.user, warehouse__type=type,warehouse__enabled=True).order_by('-warehouse__is_default','-warehouse_id').values('warehouse_id', 'warehouse__name')
- for row in warehouses:
- item = {
- 'id': row['warehouse_id'],
- 'value': row['warehouse__name']
- }
- data.append(item)
- except Exception, e:
- traceback.print_exc()
- return JSONResponse(data)
- @token_required
- def warehouse_all_select(request):
- type = Warehouse.getValidType(request.GET.get('type'))
- data = []
- rows = Warehouse.objects.filter(type=type)
- for row in rows:
- item = {
- 'id': row.id,
- 'name': row.name
- }
- data.append(item)
- return JSONResponse(data)
- @csrf_exempt
- @token_required
- def stock_list(request):
- product_name_model = request.GET.get('product_name_model')
- warehouse = request.GET.get('warehouse')
- last_entry_time = request.GET.get('last_entry_time')
- last_deliver_time = request.GET.get('last_deliver_time')
- type = int(request.GET.get('type'))
- warehouse_place = request.GET.get('warehouse_place')
- enable = request.GET.get('product_enabled')
- stock_time = request.GET.get('stock_time')
- empty = request.GET.get('empty')
- source = request.GET.get('source')
- page, page_size = utils.get_page_info(request)
- try:
- valid_permission(request.user, WarehouseStock.getPermissionByType(type, 'view'))
- except:
- return DataGridJSONResponse([], 0)
- rows, total, stock_count, warehouse_amount = WarehouseStock.objects.fetch_stock(request.user, stock_time, product_name_model, warehouse, last_entry_time, last_deliver_time,
- type, warehouse_place, enable, page, page_size,empty,source,)
- more = {
- 'stock_count': stock_count,
- 'warehouse_amount': warehouse_amount,
- }
- return DataGridJSONResponse(rows, total, more)
- @csrf_exempt
- @token_required
- def stock_export(request):
- product_name_model = request.GET.get('product_name_model')
- warehouse = request.GET.get('warehouse')
- last_entry_time = request.GET.get('last_entry_time')
- last_deliver_time = request.GET.get('last_deliver_time')
- type = request.GET.get('type')
- warehouse_place = request.GET.get('warehouse_place')
- enable = request.GET.get('product_enabled')
- stock_time = request.GET.get('stock_time')
- empty = request.GET.get('empty')
- page, page_size = utils.get_page_info(request)
- try:
- valid_permission(request.user, WarehouseStock.getPermissionByType(type, 'export'))
- except:
- return DataGridJSONResponse([], 0)
- rows, total, stock_count, warehouse_amount = WarehouseStock.objects.fetch_stock(request.user, stock_time, product_name_model, warehouse, last_entry_time, last_deliver_time,
- type, warehouse_place, enable, page, page_size,empty, '',export=True)
- if int(type) == ProductBase.MATERIAL:
- perm = 'material.view_material_cost'
- elif int(type) == ProductBase.CONSUMABLE:
- perm = 'material.view_consumable_cost'
- elif int(type) == ProductBase.GOODS:
- perm = 'goods.view_goods_cost'
- is_show_cost = isHasPermissions(request.user, perm)
- if is_show_cost:
- headers = (u'名称', u'代码', u'类别', u'单位', u'规格', u'库存', u'仓别', u'存放库位', u'成本价',
- u'库存金额', u'助记码', u'最后入库时间', u'最后出库时间', u'未出库天数')
- data = []
- for row in rows:
- item = (
- row['product_name'],
- row['product_model'],
- row['option_type_text'],
- row['product_unit'] or '',
- row['product_standard'] or '',
- row['stock'],
- row['warehouse_text'],
- row['warehouse_place'] or '',
- row['avg_cost_price'],
- row['warehouse_amount'],
- row['product_code'] or '',
- row['last_entry_time'],
- row['last_deliverd_time'],
- row['days'],
- )
- data.append(item)
- else:
- headers = (u'名称', u'代码', u'类别', u'单位', u'规格', u'库存', u'仓别', u'存放库位', u'助记码',
- u'最后入库时间', u'最后出库时间', u'未出库天数')
- data = []
- for row in rows:
- item = (
- row['product_name'],
- row['product_model'],
- row['option_type_text'],
- row['product_unit'] or '',
- row['product_standard'] or '',
- row['stock'],
- row['warehouse_text'],
- row['warehouse_place'] or '',
- row['product_code'] or '',
- row['last_entry_time'],
- row['last_deliverd_time'],
- row['days'],
- )
- data.append(item)
- data = tablib.Dataset(*data, headers=headers, title=u"数据")
- filename = utils.attachment_save(data)
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @token_required
- def stock_ledger_list(request):
- product_type = int(request.GET.get('product_type'))
- product_name = request.GET.get('product_name')
- product_model = request.GET.get('product_model')
- date = request.GET.get('date')
- warehouse = request.GET.get('warehouse')
- exclude_zero = request.GET.get('exclude_zero')
- page, page_size = utils.get_page_info(request)
- try:
- valid_permission(request.user, WarehouseRecord.getPermissionByType(product_type, 'view'))
- except:
- return DataGridJSONResponse([], 0)
- data, total, more = WarehouseStock.objects.fetch_stock_ledger(request.user, product_type, product_name, product_model, date,
- warehouse, exclude_zero, page, page_size)
- return DataGridJSONResponse(data, total, more)
- @csrf_exempt
- @token_required
- def stock_ledger_export(request):
- product_type = int(request.GET.get('product_type'))
- product_name = request.GET.get('product_name')
- product_model = request.GET.get('product_model')
- date = request.GET.get('date')
- warehouse = request.GET.get('warehouse')
- exclude_zero = request.GET.get('exclude_zero')
- page, page_size = utils.get_page_info(request)
- valid_permission(request.user, WarehouseRecord.getPermissionByType(product_type, 'export'))
- rows, total, more = WarehouseStock.objects.fetch_stock_ledger(request.user, product_type, product_name, product_model, date,
- warehouse, exclude_zero, page, page_size, export=True)
- headers = (u'产品名称',
- u'产品代码',
- u'单位',
- u'期初结存数量',
- u'期初结存平均单价',
- u'期初结存金额',
- u'本期收入总数量',
- u'本期收入平均单价',
- u'本期收入总金额',
- u'入库数量',
- u'入库金额',
- u'盘盈数量',
- u'盘盈金额',
- u'退货数量',
- u'退货金额',
- u'本期发出总数量',
- u'本期发出平均单价',
- u'本期发出总金额',
- u'出库数量',
- u'出库金额',
- u'盘亏数量',
- u'盘亏金额',
- u'退料数量',
- u'退料金额',
- u'期末结存数量',
- u'期末结存平均单价',
- u'期末结存金额'
- )
- data = []
- for row in rows:
- item = (
- row['product_name'],
- row['product_model'],
- row['unit'],
- row['prev_count'],
- row['prev_avg'],
- row['prev_amount'],
- row['in_count'],
- row['in_avg'],
- row['in_amount'],
- row['rk_count'],
- row['rk_amount'],
- row['py_count'],
- row['py_amount'],
- row['th_count'],
- row['th_amount'],
- row['out_count'],
- row['out_avg'],
- row['out_amount'],
- row['ck_count'],
- row['ck_amount'],
- row['pk_count'],
- row['pk_amount'],
- row['tl_count'],
- row['tl_amount'],
- row['remain_count'],
- row['remain_avg'],
- row['remain_amount']
- )
- data.append(item)
- data = tablib.Dataset(*data, headers=headers, title=u"数据")
- filename = utils.attachment_save(data)
- return JSONResponse({'filename': filename})
- @csrf_exempt
- @token_required
- def select_stock(request):
- warehouse = request.GET.get('warehouse')
- supplier = request.GET.get('supplier')
- product = request.GET.get('product')
- if warehouse:
- warehouse = int(warehouse)
- if supplier:
- supplier = int(supplier)
- if product:
- product = int(product)
- rows = WarehouseStockRecord.objects.filter(warehouse_id=warehouse, product_id=product, surplus_count__gt=0)
- if supplier:
- rows = rows.filter(supplier_id=supplier)
- data = []
- for row in rows:
- product_base = row.product
- if product_base.type == ProductBase.GOODS:
- g_row = GoodsGodownEntryDetail.objects.filter(stock_record_id=row.id).first()
- else:
- g_row = GodownEntryDetail.objects.filter(stock_record_id=row.id).first()
- if not g_row:
- g_row = InventoryDetail.objects.filter(warehouse_stock_record_id=row.id).first()
- item = {
- 'stock_id': row.id,
- 'no': g_row.main.no,
- 'entry_price': Formater.formatPriceShow(row.entry_price),
- 'surplus_count': Formater.formatCountShow(row.surplus_count),
- 'detail_id': g_row.id,
- 'notes': g_row.main.notes or ''
- }
- data.append(item)
- return JSONResponse(data)
- @csrf_exempt
- @token_required
- def select_stocks(request):
- warehouse = request.GET.get('warehouse')
- supplier = request.GET.get('supplier')
- products = json.loads(request.POST.get('products'))
- data = []
- for product in products:
- product_item = {'index': product['index'], 'product_id': product['product_id'], 'items': []}
- rows = WarehouseStockRecord.objects.filter(warehouse_id=warehouse, product_id=product['product_id'], surplus_count__gt=0)
- if supplier:
- rows = rows.filter(supplier_id=supplier)
- for row in rows:
- product_base = row.product
- if product_base.type == ProductBase.GOODS:
- g_row = GoodsGodownEntryDetail.objects.filter(stock_record_id=row.id).first()
- else:
- g_row = GodownEntryDetail.objects.filter(stock_record_id=row.id).first()
- if not g_row:
- g_row = InventoryDetail.objects.filter(warehouse_stock_record_id=row.id).first()
- item = {
- 'stock_id': row.id,
- 'no': g_row.main.no,
- 'entry_price': Formater.formatPriceShow(row.entry_price),
- 'surplus_count': Formater.formatCountShow(row.surplus_count),
- 'detail_id': g_row.id,
- 'notes': g_row.main.notes or ''
- }
- product_item['items'].append(item)
- data.append(product_item)
- return JSONResponse(data)
|