1
0
mirror of https://github.com/ToxicCrack/PrintABrick.git synced 2025-05-19 05:30:08 -07:00

Add SetService

This commit is contained in:
David Hübner 2017-04-24 11:38:10 +02:00
parent 3ce40e7f23
commit cefd66ec75
5 changed files with 165 additions and 12 deletions

View File

@ -10,3 +10,7 @@ services:
service.ldview:
class: AppBundle\Service\LDViewService
arguments: ['%ldview_bin%', '@oneup_flysystem.media_filesystem']
service.set:
class: AppBundle\Service\SetService
arguments: ['@repository.rebrickable.inventorypart']

View File

@ -6,10 +6,12 @@ use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Rebrickable\Part;
use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Form\Filter\Model\ModelFilterType;
use Doctrine\ORM\Query\AST\ConditionalTerm;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Part controller.
@ -52,7 +54,7 @@ class ModelController extends Controller
}
/**
* Finds and displays a part entity.
* Finds and displays a model entity.
*
* @Route("/{number}", name="model_detail")
* @Method("GET")
@ -61,6 +63,7 @@ class ModelController extends Controller
{
$em = $this->getDoctrine()->getManager();
/** @var Model $model */
if ($model = $this->get('repository.ldraw.model')->findOneByNumber($number)) {
try {
$rbParts = $model != null ? $em->getRepository(Part::class)->findAllByModel($model) : null;
@ -81,4 +84,22 @@ class ModelController extends Controller
return $this->render('error/error.html.twig');
}
/**
* @Route("/{number}/download", name="model_download")
* @Method("GET")
*/
public function downloadAction(Model $model)
{
$zip = $this->get('service.zip')->create($model);
dump($zip);
$response = new Response(file_get_contents($zip));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="' . basename($zip) . '"');
$response->headers->set('Content-length', filesize($zip));
return $response;
}
}

View File

@ -2,6 +2,7 @@
namespace AppBundle\Controller\Rebrickable;
use AppBundle\Entity\LDraw\Model;
use AppBundle\Entity\Color;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Inventory_Set;
@ -28,17 +29,45 @@ class SetController extends Controller
$regularParts = $em->getRepository(Inventory_Part::class)->findAllRegularBySetNumber($set->getNumber());
$spareParts = $em->getRepository(Inventory_Part::class)->findAllSpareBySetNumber($set->getNumber());
$models = $em->getRepository(Model::class)->findAllBySetNumber($set->getNumber());
$template = $this->render('rebrickable/set/parts.html.twig', [
$template = $this->render('rebrickable/set/inventory.html.twig', [
'regularParts' => $regularParts,
'spareParts' => $spareParts,
'models' => $models,
]);
$json = json_encode($template->getContent());
$response = new Response($json, 200);
$response->headers->set('Content-Type', 'application/json');
// $json = json_encode($template->getContent());
// $response = new Response($json, 200);
// $response->headers->set('Content-Type', 'application/json');
//
// return $response;
return $response;
return $template;
}
/**
* @Route("/{number}/models", name="rebrickable_set_models")
*/
public function modelsAction(Set $set)
{
$models = null;
try {
$this->get('repository.ldraw.model')->findAllBySetNumber($set->getNumber());
$models = $this->get('service.set')->getModels($set);
$spareModels = $this->get('service.set')->getSpareModels($set);
// $models = $this->get('repository.ldraw.model')->findAllRegularBySetNumber($set->getNumber());
} catch (\Exception $e) {
$this->addFlash('error', $e->getMessage());
}
return $this->render('rebrickable/set/models.html.twig', [
'set' => $set,
'models' => $models,
'spareModels' => $spareModels
]);
}
/**

View File

@ -16,11 +16,10 @@ class Inventory_PartRepository extends BaseRepository
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory')
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->setParameter('inventory', $inventory)
->andWhere('inventory_part.spare = FALSE')
->distinct(true);
@ -32,14 +31,30 @@ class Inventory_PartRepository extends BaseRepository
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = :inventory')
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->setParameter('inventory', $inventory)
->andWhere('inventory_part.spare = TRUE')
->distinct(true);
return $queryBuilder->getQuery()->getResult();
}
public function findAllBySetNumberAndColor($number, $color)
{
$inventory = $this->getEntityManager()->getRepository(Inventory::class)->findNewestInventoryBySetNumber($number);
$queryBuilder = $this->createQueryBuilder('inventory_part')
->join(Inventory::class, 'inventory', JOIN::WITH, 'inventory_part.inventory = inventory')
->join(Part::class, 'part', JOIN::WITH, 'inventory_part.part = part.number')
->where('part.category != 17')
->andWhere('inventory.id = :inventoryId')
->setParameter('inventoryId', $inventory->getId())
->andWhere('inventory_part.color = :color')
->setParameter('color', $color)
->distinct(true);
return $queryBuilder->getQuery()->getResult();
}
}

View File

@ -0,0 +1,84 @@
<?php
namespace AppBundle\Service;
use AppBundle\Entity\Rebrickable\Inventory_Part;
use AppBundle\Entity\Rebrickable\Set;
use AppBundle\Repository\Rebrickable\Inventory_PartRepository;
use AppBundle\Repository\Rebrickable\PartRepository;
class SetService
{
/** @var Inventory_PartRepository */
private $inventoryPartRepository;
/**
* SetService constructor.
* @param Inventory_PartRepository $inventoryPartRepository
*/
public function __construct(Inventory_PartRepository $inventoryPartRepository)
{
$this->inventoryPartRepository = $inventoryPartRepository;
}
public function getUniqueModelCount(Set $set) {
}
public function getModels(Set $set)
{
$models = [];
$inventoryParts = $this->inventoryPartRepository->findAllRegularBySetNumber($set->getNumber());
/** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) {
$model = $inventoryPart->getPart()->getModel();
$color = $inventoryPart->getColor();
if($model) {
$models[$model->getNumber()]['model'] = $model;
$quantity = 0;
if(isset($models[$model->getNumber()]['colors'][$color->getId()]['quantity'])) {
$quantity = $models[$model->getNumber()]['colors'][$color->getId()]['quantity'];
}
$models[$model->getNumber()]['colors'][$color->getId()] = [
'color' => $color,
'quantity' => $quantity+$inventoryPart->getQuantity()
];
}
}
return $models;
}
public function getSpareModels(Set $set)
{
$models = [];
$inventoryParts = $this->inventoryPartRepository->findAllSpareBySetNumber($set->getNumber());
/** @var Inventory_Part $inventoryPart */
foreach ($inventoryParts as $inventoryPart) {
$model = $inventoryPart->getPart()->getModel();
$color = $inventoryPart->getColor();
if($model) {
$models[$model->getNumber()]['model'] = $model;
$quantity = 0;
if(isset($models[$model->getNumber()]['colors'][$color->getId()]['quantity'])) {
$quantity = $models[$model->getNumber()]['colors'][$color->getId()]['quantity'];
}
$models[$model->getNumber()]['colors'][$color->getId()] = [
'color' => $color,
'quantity' => $quantity+$inventoryPart->getQuantity()
];
}
}
return $models;
}
}