views.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. # coding=utf-8
  2. import json
  3. import traceback
  4. import tablib
  5. from django.db import transaction,IntegrityError, connection
  6. from django.db.models import ProtectedError
  7. from django.views.decorators.csrf import csrf_exempt
  8. from django.utils import timezone
  9. from apps.product.models import ProductBase
  10. from libs import utils
  11. from libs.http import JSONResponse, JSONError, DataGridJSONResponse
  12. from apps.account.decorators import token_required, valid_permission, isHasPermissions
  13. from apps.exceptions import CustomError
  14. from apps.foundation.models import BizLog
  15. from apps.purchase.models import GodownEntry, GodownEntryDetail
  16. from apps.goods.models import GoodsGodownEntry, GoodsGodownEntryDetail
  17. from models import Warehouse, WarehouseAdmin, WarehouseStock, WarehouseRecord, WarehouseStockRecord, InventoryDetail, Inventory
  18. from filters import WarehouseFilter
  19. from serializers import WarehouseSerializer
  20. from apps.base import Formater
  21. @token_required
  22. def warehouse_list(request):
  23. try:
  24. valid_permission(request.user,Warehouse.getPermissionByType(request.GET.get('type'), 'view'))
  25. except:
  26. return DataGridJSONResponse([], 0)
  27. f = WarehouseFilter(request.GET, queryset=Warehouse.objects.filter())
  28. rows, total = utils.get_page_data(request, f.qs)
  29. serializer = WarehouseSerializer(rows, many=True)
  30. return DataGridJSONResponse(serializer.data, total)
  31. @csrf_exempt
  32. @token_required
  33. def warehouse_save(request):
  34. id = request.GET.get('id')
  35. data = json.loads(request.body)
  36. try:
  37. with transaction.atomic():
  38. serializer = WarehouseSerializer.factory(request.user,data,id)
  39. ws = serializer.validSave()
  40. valid_permission(request.user,ws.getPermission('add'))
  41. ws.removeAdmins()
  42. for userid in data['user']:
  43. ws.addAdminByUserId(int(userid))
  44. except CustomError, e:
  45. return JSONError(e.get_error_msg())
  46. except Exception, e:
  47. traceback.print_exc()
  48. return JSONError(u'保存失败!')
  49. return JSONResponse()
  50. @token_required
  51. def warehouse_delete(request):
  52. id = request.GET.get('id')
  53. try:
  54. with transaction.atomic():
  55. w = Warehouse.getById(id)
  56. valid_permission(request.user,w.getPermission('delete'))
  57. w.removeAdmins()
  58. w.removeStock()
  59. BizLog.objects.addnew(request.user, BizLog.DELETE, u"删除仓别[%s],id=%d" % (w.name, w.id))
  60. w.delete()
  61. except CustomError, e:
  62. return JSONError(e.get_error_msg())
  63. except ProtectedError:
  64. return JSONError(u'该仓别已被使用,禁止删除!')
  65. except IntegrityError:
  66. return JSONError(u'该仓别已被使用,禁止删除!')
  67. except Exception, e:
  68. traceback.print_exc()
  69. return JSONError(u'删除失败!')
  70. return JSONResponse({})
  71. @token_required
  72. def warehouse_select(request):
  73. data = []
  74. try:
  75. type = Warehouse.getValidType(request.GET.get('type'))
  76. 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')
  77. for row in warehouses:
  78. item = {
  79. 'id': row['warehouse_id'],
  80. 'value': row['warehouse__name']
  81. }
  82. data.append(item)
  83. except Exception, e:
  84. traceback.print_exc()
  85. return JSONResponse(data)
  86. @token_required
  87. def warehouse_all_select(request):
  88. type = Warehouse.getValidType(request.GET.get('type'))
  89. data = []
  90. rows = Warehouse.objects.filter(type=type)
  91. for row in rows:
  92. item = {
  93. 'id': row.id,
  94. 'name': row.name
  95. }
  96. data.append(item)
  97. return JSONResponse(data)
  98. @csrf_exempt
  99. @token_required
  100. def stock_list(request):
  101. product_name_model = request.GET.get('product_name_model')
  102. warehouse = request.GET.get('warehouse')
  103. last_entry_time = request.GET.get('last_entry_time')
  104. last_deliver_time = request.GET.get('last_deliver_time')
  105. type = int(request.GET.get('type'))
  106. warehouse_place = request.GET.get('warehouse_place')
  107. enable = request.GET.get('product_enabled')
  108. stock_time = request.GET.get('stock_time')
  109. empty = request.GET.get('empty')
  110. source = request.GET.get('source')
  111. page, page_size = utils.get_page_info(request)
  112. try:
  113. valid_permission(request.user, WarehouseStock.getPermissionByType(type, 'view'))
  114. except:
  115. return DataGridJSONResponse([], 0)
  116. rows, total, stock_count, warehouse_amount = WarehouseStock.objects.fetch_stock(request.user, stock_time, product_name_model, warehouse, last_entry_time, last_deliver_time,
  117. type, warehouse_place, enable, page, page_size,empty,source,)
  118. more = {
  119. 'stock_count': stock_count,
  120. 'warehouse_amount': warehouse_amount,
  121. }
  122. return DataGridJSONResponse(rows, total, more)
  123. @csrf_exempt
  124. @token_required
  125. def stock_export(request):
  126. product_name_model = request.GET.get('product_name_model')
  127. warehouse = request.GET.get('warehouse')
  128. last_entry_time = request.GET.get('last_entry_time')
  129. last_deliver_time = request.GET.get('last_deliver_time')
  130. type = request.GET.get('type')
  131. warehouse_place = request.GET.get('warehouse_place')
  132. enable = request.GET.get('product_enabled')
  133. stock_time = request.GET.get('stock_time')
  134. empty = request.GET.get('empty')
  135. page, page_size = utils.get_page_info(request)
  136. try:
  137. valid_permission(request.user, WarehouseStock.getPermissionByType(type, 'export'))
  138. except:
  139. return DataGridJSONResponse([], 0)
  140. rows, total, stock_count, warehouse_amount = WarehouseStock.objects.fetch_stock(request.user, stock_time, product_name_model, warehouse, last_entry_time, last_deliver_time,
  141. type, warehouse_place, enable, page, page_size,empty, '',export=True)
  142. if int(type) == ProductBase.MATERIAL:
  143. perm = 'material.view_material_cost'
  144. elif int(type) == ProductBase.CONSUMABLE:
  145. perm = 'material.view_consumable_cost'
  146. elif int(type) == ProductBase.GOODS:
  147. perm = 'goods.view_goods_cost'
  148. is_show_cost = isHasPermissions(request.user, perm)
  149. if is_show_cost:
  150. headers = (u'名称', u'代码', u'类别', u'单位', u'规格', u'库存', u'仓别', u'存放库位', u'成本价',
  151. u'库存金额', u'助记码', u'最后入库时间', u'最后出库时间', u'未出库天数')
  152. data = []
  153. for row in rows:
  154. item = (
  155. row['product_name'],
  156. row['product_model'],
  157. row['option_type_text'],
  158. row['product_unit'] or '',
  159. row['product_standard'] or '',
  160. row['stock'],
  161. row['warehouse_text'],
  162. row['warehouse_place'] or '',
  163. row['avg_cost_price'],
  164. row['warehouse_amount'],
  165. row['product_code'] or '',
  166. row['last_entry_time'],
  167. row['last_deliverd_time'],
  168. row['days'],
  169. )
  170. data.append(item)
  171. else:
  172. headers = (u'名称', u'代码', u'类别', u'单位', u'规格', u'库存', u'仓别', u'存放库位', u'助记码',
  173. u'最后入库时间', u'最后出库时间', u'未出库天数')
  174. data = []
  175. for row in rows:
  176. item = (
  177. row['product_name'],
  178. row['product_model'],
  179. row['option_type_text'],
  180. row['product_unit'] or '',
  181. row['product_standard'] or '',
  182. row['stock'],
  183. row['warehouse_text'],
  184. row['warehouse_place'] or '',
  185. row['product_code'] or '',
  186. row['last_entry_time'],
  187. row['last_deliverd_time'],
  188. row['days'],
  189. )
  190. data.append(item)
  191. data = tablib.Dataset(*data, headers=headers, title=u"数据")
  192. filename = utils.attachment_save(data)
  193. return JSONResponse({'filename': filename})
  194. @csrf_exempt
  195. @token_required
  196. def stock_ledger_list(request):
  197. product_type = int(request.GET.get('product_type'))
  198. product_name = request.GET.get('product_name')
  199. product_model = request.GET.get('product_model')
  200. date = request.GET.get('date')
  201. warehouse = request.GET.get('warehouse')
  202. exclude_zero = request.GET.get('exclude_zero')
  203. page, page_size = utils.get_page_info(request)
  204. try:
  205. valid_permission(request.user, WarehouseRecord.getPermissionByType(product_type, 'view'))
  206. except:
  207. return DataGridJSONResponse([], 0)
  208. data, total, more = WarehouseStock.objects.fetch_stock_ledger(request.user, product_type, product_name, product_model, date,
  209. warehouse, exclude_zero, page, page_size)
  210. return DataGridJSONResponse(data, total, more)
  211. @csrf_exempt
  212. @token_required
  213. def stock_ledger_export(request):
  214. product_type = int(request.GET.get('product_type'))
  215. product_name = request.GET.get('product_name')
  216. product_model = request.GET.get('product_model')
  217. date = request.GET.get('date')
  218. warehouse = request.GET.get('warehouse')
  219. exclude_zero = request.GET.get('exclude_zero')
  220. page, page_size = utils.get_page_info(request)
  221. valid_permission(request.user, WarehouseRecord.getPermissionByType(product_type, 'export'))
  222. rows, total, more = WarehouseStock.objects.fetch_stock_ledger(request.user, product_type, product_name, product_model, date,
  223. warehouse, exclude_zero, page, page_size, export=True)
  224. headers = (u'产品名称',
  225. u'产品代码',
  226. u'单位',
  227. u'期初结存数量',
  228. u'期初结存平均单价',
  229. u'期初结存金额',
  230. u'本期收入总数量',
  231. u'本期收入平均单价',
  232. u'本期收入总金额',
  233. u'入库数量',
  234. u'入库金额',
  235. u'盘盈数量',
  236. u'盘盈金额',
  237. u'退货数量',
  238. u'退货金额',
  239. u'本期发出总数量',
  240. u'本期发出平均单价',
  241. u'本期发出总金额',
  242. u'出库数量',
  243. u'出库金额',
  244. u'盘亏数量',
  245. u'盘亏金额',
  246. u'退料数量',
  247. u'退料金额',
  248. u'期末结存数量',
  249. u'期末结存平均单价',
  250. u'期末结存金额'
  251. )
  252. data = []
  253. for row in rows:
  254. item = (
  255. row['product_name'],
  256. row['product_model'],
  257. row['unit'],
  258. row['prev_count'],
  259. row['prev_avg'],
  260. row['prev_amount'],
  261. row['in_count'],
  262. row['in_avg'],
  263. row['in_amount'],
  264. row['rk_count'],
  265. row['rk_amount'],
  266. row['py_count'],
  267. row['py_amount'],
  268. row['th_count'],
  269. row['th_amount'],
  270. row['out_count'],
  271. row['out_avg'],
  272. row['out_amount'],
  273. row['ck_count'],
  274. row['ck_amount'],
  275. row['pk_count'],
  276. row['pk_amount'],
  277. row['tl_count'],
  278. row['tl_amount'],
  279. row['remain_count'],
  280. row['remain_avg'],
  281. row['remain_amount']
  282. )
  283. data.append(item)
  284. data = tablib.Dataset(*data, headers=headers, title=u"数据")
  285. filename = utils.attachment_save(data)
  286. return JSONResponse({'filename': filename})
  287. @csrf_exempt
  288. @token_required
  289. def select_stock(request):
  290. warehouse = request.GET.get('warehouse')
  291. supplier = request.GET.get('supplier')
  292. product = request.GET.get('product')
  293. if warehouse:
  294. warehouse = int(warehouse)
  295. if supplier:
  296. supplier = int(supplier)
  297. if product:
  298. product = int(product)
  299. rows = WarehouseStockRecord.objects.filter(warehouse_id=warehouse, product_id=product, surplus_count__gt=0)
  300. if supplier:
  301. rows = rows.filter(supplier_id=supplier)
  302. data = []
  303. for row in rows:
  304. product_base = row.product
  305. if product_base.type == ProductBase.GOODS:
  306. g_row = GoodsGodownEntryDetail.objects.filter(stock_record_id=row.id).first()
  307. else:
  308. g_row = GodownEntryDetail.objects.filter(stock_record_id=row.id).first()
  309. if not g_row:
  310. g_row = InventoryDetail.objects.filter(warehouse_stock_record_id=row.id).first()
  311. item = {
  312. 'stock_id': row.id,
  313. 'no': g_row.main.no,
  314. 'entry_price': Formater.formatPriceShow(row.entry_price),
  315. 'surplus_count': Formater.formatCountShow(row.surplus_count),
  316. 'detail_id': g_row.id,
  317. 'notes': g_row.main.notes or ''
  318. }
  319. data.append(item)
  320. return JSONResponse(data)
  321. @csrf_exempt
  322. @token_required
  323. def select_stocks(request):
  324. warehouse = request.GET.get('warehouse')
  325. supplier = request.GET.get('supplier')
  326. products = json.loads(request.POST.get('products'))
  327. data = []
  328. for product in products:
  329. product_item = {'index': product['index'], 'product_id': product['product_id'], 'items': []}
  330. rows = WarehouseStockRecord.objects.filter(warehouse_id=warehouse, product_id=product['product_id'], surplus_count__gt=0)
  331. if supplier:
  332. rows = rows.filter(supplier_id=supplier)
  333. for row in rows:
  334. product_base = row.product
  335. if product_base.type == ProductBase.GOODS:
  336. g_row = GoodsGodownEntryDetail.objects.filter(stock_record_id=row.id).first()
  337. else:
  338. g_row = GodownEntryDetail.objects.filter(stock_record_id=row.id).first()
  339. if not g_row:
  340. g_row = InventoryDetail.objects.filter(warehouse_stock_record_id=row.id).first()
  341. item = {
  342. 'stock_id': row.id,
  343. 'no': g_row.main.no,
  344. 'entry_price': Formater.formatPriceShow(row.entry_price),
  345. 'surplus_count': Formater.formatCountShow(row.surplus_count),
  346. 'detail_id': g_row.id,
  347. 'notes': g_row.main.notes or ''
  348. }
  349. product_item['items'].append(item)
  350. data.append(product_item)
  351. return JSONResponse(data)