# -*- coding: utf-8 -*- """ api.entry ~~~~~~~~~~~~~~ 有关进出库的接口. :copyright: 云南新八达科技有限公司. :author: 李进才. """ from sqlalchemy import or_, func import datetime from utils.PageHepler import db_page from utils.apiDoc import * from utils.dictionaryHelper import GetList from utils.entryHelper import get_entry_list import pandas as pd @entry.route('/all') class EntryAll(Resource): @staticmethod def post(): data = request.args if data.get('query') is None: return SuccessResponse(ResultCode.SOURCE_DATA_NONE, None, None) reagentQuery = db.session.query(ReagtEntry.Name, ReagtEntry.Specification, ReagtEntry.Maker, ReagtEntry.Unit, ReagtEntry.CertificationCode, ReagtEntry.Number, ReagtEntry.Ratio, ReagtEntry.SmallestUnit, ReagtEntry.UnitPrice, ReagtEntry.SellingPrice, ReagtEntry.ProductionBatch, ReagtEntry.MinValue, ReagtEntry.MaxValue, ReagtEntry.SupplierName, ReagtEntry.TypeName, ReagtEntry.Position, ReagtEntry.EntryId).filter( or_(ReagtEntry.Name.contains(data['query']), ReagtEntry.PinYinCode .contains(data['query']))) \ .filter(ReagtEntry.Using == True) return SuccessResponse(ResultCode.SUCCESS, {'list': db_page(reagentQuery, ReagtEntry.EntryId, data, 6), 'totalNumber': reagentQuery.count()}, None) @entry.route('/expiration') class EntryExpiration(Resource): @staticmethod def get(): data = request.args expirationReagentFilter = db.session.query(ReagtReagent.Name, ReagtStock.Expiration, ReagtReagent.Specification, ReagtStock.Code, ReagtStock.Position). \ join(ReagtReagent, ReagtStock.ReagentId == ReagtReagent.ReagentId). \ filter(ReagtStock.Expiration > datetime.now()). \ filter(ReagtStock.Expiration < (datetime.now() + timedelta(days=10))). \ order_by(ReagtStock.InTime.desc()) expirationReagentPaginate = expirationReagentFilter.paginate(int(data['pageNumber']), 8, error_out=False) resultList = [dict(zip(result.keys(), result)) for result in expirationReagentPaginate.items] return SuccessResponse(ResultCode.SUCCESS, {'list': resultList, 'totalNumber': expirationReagentFilter.count()}, None) @entry.route('/expirationExport') class EntryExpirationExport(Resource): @staticmethod def get(): timestamp = datetime.now().timestamp() expirationReagentFilter = db.session.query(ReagtReagent.Name, ReagtStock.Expiration, ReagtStock.LastNumber, ReagtReagent.Unit, ReagtStock.MinNumberUnit, ReagtReagent.SmallestUnit, ReagtStock.SupplierName, ReagtReagent.UnitPrice, ReagtReagent.Maker, ReagtStock.ProductionBatch, ReagtReagent.MinValue, ReagtReagent.MaxValue, ReagtReagent.Specification, ReagtStock.Code, ReagtStock.Position). \ join(ReagtReagent, ReagtStock.ReagentId == ReagtReagent.ReagentId). \ filter(ReagtStock.Expiration <= datetime.now()). \ order_by(ReagtStock.InTime.desc()) Name, Specification, LastNumber, Unit, MinNumberUnit, \ SmallestUnit, SupplierName, UnitPrice, \ Maker, ProductionBatch, Expiration, MaxValue, MinValue = [], [], [], [], [], [], [], [], [], [], [], [], [] for item in expirationReagentFilter: Name.append(item.Name) Specification.append(item.Specification) LastNumber.append(item.LastNumber) Unit.append(item.Unit) MinNumberUnit.append(item.MinNumberUnit) SmallestUnit.append(item.SmallestUnit) SupplierName.append(item.SupplierName) UnitPrice.append(item.UnitPrice) Maker.append(item.Maker) ProductionBatch.append(item.ProductionBatch) Expiration.append(item.Expiration) MaxValue.append(item.MaxValue) MinValue.append(item.MinValue) dit = {'耗材名称': Name, '规格': Specification, '数量(大单位)': LastNumber, '大单位': Unit, '数量(小单位)': MinNumberUnit, '小单位': SmallestUnit, '供应商': SupplierName, '单价': UnitPrice, '生产厂家': Maker, '产品批号': ProductionBatch, '效期': Expiration, '最大库存数量': MaxValue, '最小库存数量': MinValue} writer = pd.ExcelWriter('./file/' + '过期耗材汇总表' + str(timestamp).replace('.', '-') + '.xlsx') df = pd.DataFrame(dit) # columns参数用于指定生成的excel中列的顺序 df.to_excel(writer, columns=['耗材名称', '规格', '数量(大单位)', '大单位', '数量(小单位)', '小单位', '供应商', '单价', '生产厂家', '产品批号', '效期', '最大库存数量', '最小库存数量'], index=False, encoding='utf-8', sheet_name='过期耗材汇总表') writer.save() return SuccessResponse(ResultCode.SUCCESS, '过期耗材汇总表' + str(timestamp).replace('.', '-'), None) @entry.route('/bottomLimit') class BottomLimit(Resource): @staticmethod def get(): bottomLimitFilter = db.session.query(ReagtReagent.Name, ReagtReagent.Specification, ReagtReagent.MinValue, func.sum(func.coalesce(ReagtStock.LastNumber, 0)).label('AllLastNumber')). \ join(ReagtStock, ReagtStock.ReagentId == ReagtReagent.ReagentId, isouter=True). \ filter(ReagtReagent.Using == True). \ group_by(ReagtReagent.Name, ReagtReagent.Specification, ReagtReagent.MinValue).subquery() bottomLimitFilter = db.session.query(bottomLimitFilter.c.Name, bottomLimitFilter.c.Specification, bottomLimitFilter.c.MinValue, bottomLimitFilter.c.AllLastNumber, (bottomLimitFilter.c.MinValue - bottomLimitFilter.c.AllLastNumber).label( 'Difference') ). \ filter(bottomLimitFilter.c.AllLastNumber < bottomLimitFilter.c.MinValue). \ order_by((bottomLimitFilter.c.MinValue - bottomLimitFilter.c.AllLastNumber)) bottomLimitPaginate = bottomLimitFilter.paginate(int(request.args['pageNumber']), 8, error_out=False) resultList = [dict(zip(result.keys(), result)) for result in bottomLimitPaginate.items] return SuccessResponse(ResultCode.SUCCESS, {'list': resultList, 'totalNumber': bottomLimitFilter.count()}, None) @entry.route('/upperLimit') class UpperLimit(Resource): @staticmethod def get(): upperLimitFilter = db.session.query(ReagtReagent.Name, ReagtReagent.Specification, ReagtReagent.MaxValue, func.sum(ReagtStock.LastNumber).label('AllLastNumber')). \ join(ReagtReagent, ReagtStock.ReagentId == ReagtReagent.ReagentId). \ group_by(ReagtReagent.Name, ReagtReagent.Specification, ReagtReagent.MaxValue).subquery() upperLimitFilter = db.session.query(upperLimitFilter.c.Name, upperLimitFilter.c.Specification, upperLimitFilter.c.MaxValue, upperLimitFilter.c.AllLastNumber, (upperLimitFilter.c.AllLastNumber - upperLimitFilter.c.MaxValue).label( 'Difference')). \ filter(upperLimitFilter.c.AllLastNumber > upperLimitFilter.c.MaxValue). \ order_by((upperLimitFilter.c.AllLastNumber - upperLimitFilter.c.MaxValue)) upperLimitPaginate = upperLimitFilter.paginate(int(request.args['pageNumber']), 8, error_out=False) app.logger.info(upperLimitPaginate.items) resultList = [dict(zip(result.keys(), result)) for result in upperLimitPaginate.items] return SuccessResponse(ResultCode.SUCCESS, {'list': resultList, 'totalNumber': upperLimitFilter.count()}, None) @entry.route('/specification') class Specification(Resource): @staticmethod def get(): return get_entry_list(ReagtReagent.Specification, request.args) @entry.route('/maker') class Maker(Resource): @staticmethod def get(): return get_entry_list(ReagtReagent.Maker, request.args) @entry.route('/unit') class Unit(Resource): @staticmethod def get(): return get_entry_list(ReagtReagent.Unit, request.args) @entry.route('/reagentType') class ReagentType(Resource): @staticmethod def get(): return get_entry_list(ReagtReagent.TypeName, request.args)