src/Controller/DataTrans/ProductController.php line 157

Open in your IDE?
  1. <?php
  2. /**
  3.  * 对外接口:/data_trans/product/*
  4.  */
  5. namespace App\Controller\DataTrans;
  6. use App\Controller\Validator\CommonSignatureAppValidator;
  7. use App\Service\CommonService;
  8. use Common\Crisp\CrispItem\ProductItem;
  9. use Common\DataSynch\Crisp\Model\CrispCommodityModel;
  10. use Common\DataTrans\Crisp\Model\CrispProductModel;
  11. use Common\Helper\SimplifyAsSnakeArray\SimplifyAsSnakeArrayHelper;
  12. use Common\PimcoreHelper\ControllerHelper\BaseJsonController;
  13. use Common\Signature\Exception\BaseSignatureException;
  14. use Pimcore\Db;
  15. use Pimcore\Model\DataObject\CrispCommodity;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use function array_intersect;
  19. use function array_values;
  20. class ProductController extends BaseJsonController{
  21.     /**
  22.      * @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_product_id_list")
  23.      * @throws BaseSignatureException
  24.      */
  25.     function getProductIdList(Request $request):Response{
  26.         (new CommonSignatureAppValidator())->validateRequest($request);
  27.         $input=[];
  28.         $body=function(array $input):array{
  29.             $allowedProductIdList=CrispCommodityModel::getArticleIdListByArticleStatusAllowed();
  30.             $productIdList=CrispProductModel::getOrderKeyAscList();
  31.             $finalList=array_values(array_intersect($productIdList,$allowedProductIdList));
  32.             return [
  33.                 'product_id_list'=>$finalList,
  34.             ];
  35.         };
  36.         $res=$this->run($input,$body);
  37.         return $res;
  38.     }
  39.     /**
  40.      * @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_product_list")
  41.      * @throws BaseSignatureException
  42.      */
  43.     function getProductList(Request $request):Response{
  44.         (new CommonSignatureAppValidator())->validateRequest($request);
  45.         $productIdList=$request->get('product_id_list')??[];
  46.         $input=[
  47.             'product_id_list'=>$productIdList,
  48.         ];
  49.         $body=function(array $input):array{
  50.             $allowedProductIdList=CrispCommodityModel::getArticleStatusAllowedArticleIdListByArticleIdList($input['product_id_list']);
  51.             $pimcoreObjectList=CrispProductModel::getListByProductIdList($allowedProductIdList);
  52.             $parserObjectList=ProductItem::dataObjectListExportToInstanceList($pimcoreObjectList);
  53.             $finalList=SimplifyAsSnakeArrayHelper::simplifyAsSnakeArrayMass($parserObjectList);
  54.             return [
  55.                 'product_list'=>$finalList,
  56.             ];
  57.         };
  58.         $res=$this->run($input,$body);
  59.         return $res;
  60.     }
  61.     /**
  62.      * @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_commodity_list")
  63.      * @throws BaseSignatureException
  64.      */
  65.     function getCommodityList(Request $request):Response{
  66.         (new CommonSignatureAppValidator())->validateRequest($request);
  67.         $params $request->request->all();
  68.         $page intval($params['page']??1);
  69.         $limit intval($params['limit']??10);
  70.         $offset = ($page-1) * $limit;
  71.         $listing = new CrispCommodity\Listing();
  72.         $listing->filterByShelfCategoryId(10000'>=');
  73.         if(!empty($params['product_id'])) {
  74.             $listing->filterByArticleId($params['product_id']);
  75.         }
  76.         $list $listing->getItems($offset$limit);
  77.         $data = [];
  78.         foreach($list as $commodity) {
  79.             $item = [];
  80.             $item['basic'] = [
  81.                 '物料号'=>$commodity->getArticleId(),
  82.                 '物料名称'=>$commodity->getArticleDescription(),
  83.                 '公司'=>$commodity->get('companyCode'),
  84.                 '可售状态'=>$commodity->get('articleStatus'),
  85.                 'ERP状态'=>$commodity->get('erpStatus'),
  86.                 'Product Key'=>$commodity->get('productKey'),
  87.                 'Category Group'=>$commodity->get('categoryGroup'),
  88.                 'OrigId'=>$commodity->get('origId'),
  89.                 '表价'=>$commodity->get('listPrice'),
  90.                 '销售价格单位'=>$commodity->get('listPriceUnit'),
  91.                 '销售单位'=>$commodity->get('uomIso'),
  92.                 '交付时间'=>$commodity->get('plannedDeliveryTime'),
  93.                 '替换物料号'=>$commodity->get('replacementArticleId'),
  94.                 '产品线'=>$commodity->get('productlineId'),
  95.                 '产品线描述'=>$commodity->get('productlineDesc'),
  96.                 'BA'=>$commodity->get('productSegment'),
  97.                 'BU'=>$commodity->get('productBu'),
  98.                 '产品类型'=>$commodity->get('versionRevisionTypeSap'),
  99.                 '国产/进口'=>$commodity->get('importFlag'),
  100.                 '最小整包装PAC'=>$commodity->get('packingQuantity'),
  101.                 '最小起订量'=>$commodity->get('minimumOrderQuantity'),
  102.                 '原产地'=>$commodity->get('countryOfOrigin'),
  103.                 '计划策略组'=>$commodity->get('strategyGroupSap'),
  104.                 '净重'=>$commodity->get('netWeight'),
  105.                 '毛重'=>$commodity->get('grossWeight'),
  106.                 '重量单位'=>$commodity->get('weightUnit'),
  107.                 '货币单位'=>$commodity->get('currency')
  108.             ];
  109.             $fileters = [];
  110.             $prodFileters json_decode($commodity->getFilters(), true);
  111.             foreach ($prodFileters as $k=>$val) {
  112.                 $fileters[LOCALFIELDS[$k]] = $val;
  113.             }
  114.             // global 属性补充
  115.             $assetInfo = [];
  116.             if($commodity->getMainImage()) {
  117.                 $assetInfo[] = ['assetType'=>"picture"'subtype'=>'subtypeLabel''subtypeLabel'=>"产品图"'url'=>$commodity->getMainImage()];
  118.             }
  119.             $item['assetInfo'] = $assetInfo;
  120.             //$commodity = new CrispCommodity();
  121.             $item['shelfCategoryId'] = $commodity->getShelfCategoryId();
  122.             $item['productTypeDescription'] = $commodity->getProductTypeDescription();
  123.             $item['productShortDescription'] = $commodity->getProductShortDescription();
  124.             $item['technicalDataGroup'] = [["sortId"=>"4","label"=>"产品属性"]];
  125.             $item['technicalData'] = [["groupSortId"=>"4""subHeadline"=>"""subTechnicalData"=>$fileters]];
  126.             $data[] = $item;
  127.         }
  128.         return $this->json([
  129.             'total'=>$listing->getTotalCount(),
  130.             'items'=>$data
  131.         ]);
  132.     }
  133.     /**
  134.      * 可售状态下的物料号、产品名称、产品描述、产品主图
  135.      * @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_simple_commodity_list")
  136.      * @throws BaseSignatureException
  137.      */
  138.     function getSimpleCommodityList(Request $request):Response{
  139. //        换成秘钥的方式:ApiUrl?time=${10位时间戳}&sign=${算法生成的秘钥}
  140. //        秘钥算法:md5(${10位时间戳} + IY2IJHYY58FRVL6LOPGFFE32HUEW9LJE)
  141.         $time $request->query->get('time');
  142.         $sign $request->query->get('sign');
  143.         if(!$time) {
  144.             return $this->rsps(false'缺少参数:time');
  145.         }
  146.         if(!$sign) {
  147.             return $this->rsps(false'缺少参数:sign');
  148.         }
  149.         $myTime time();
  150.         if($time>$myTime) {
  151.             return $this->rsps(false'请使用当前时间戳,不能使用未来的时间');
  152.         }
  153.         if($time<$myTime-600) {
  154.             return $this->rsps(false'时间戳过期,不能超过10分钟.params:'.$time.'-server:'.$myTime);
  155.         }
  156.         $mySign md5($time.'IY2IJHYY58FRVL6LOPGFFE32HUEW9LJE'); // 生成的秘钥小写32位
  157.         if($mySign!=$sign) {
  158.             return $this->rsps(false'秘钥错误 '.$mySign);
  159.         }
  160.         $params $request->request->all();
  161.         $page $params['page'] ?? 1;
  162.         $page intval($page) < intval($page);
  163.         $limit $params['limit'] ?? 10;
  164.         $limit intval($limit) >100 100 intval($limit);
  165.         $offset = ($page-1)*$limit;
  166.         $order 'a.o_id desc';
  167.         if(isset($params['order'])) {
  168.             if($params['order']=='old') {
  169.                 $order 'a.o_id asc';
  170.             }
  171.         }
  172.         $commodityClassId CrispCommodity::classId();
  173.         $select 'o_id id,articleId,articleDescription,mainImage, productTypeDescription,productShortDescription,productLongDescription,topFeatures';//shelfCategoryId
  174.         $sql "select {$select} from object_{$commodityClassId} a  where a.articleStatus=1 and a.o_published=1 ";
  175.         $sqlCount "select count(1) ct from object_{$commodityClassId} a where a.articleStatus=1 and a.o_published=1 ";
  176.         if(!empty($params['id'])) {
  177.             $id intval($params['id']);
  178.             $sql .= " and a.o_id = {$id}";
  179.             $sqlCount .= " and a.o_id = {$id}";
  180.         }
  181.         if(!empty($params['articleId'])) {
  182.             $articleId trim(rawurldecode($params['articleId']));
  183.             $sql .= " and a.articleId = '{$articleId}'";
  184.             $sqlCount .= " and a.articleId = '{$articleId}'";
  185.         }
  186.         if(!empty($params['keyword'])) {
  187.             $keyword '%'.trim($params['keyword']).'%';
  188.             $sql .= " and (a.productTypeDescription like :keyword or a.articleDescription like '{$keyword}')";
  189.             $sqlCount .= " and (a.productTypeDescription like :keyword or a.articleDescription like '{$keyword}')";
  190.         }
  191.         $sql .= " order by {$order} limit {$offset}{$limit}";
  192.         $total Db::get()->query($sqlCount)->fetchColumn();
  193.         $items Db::get()->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
  194.         return $this->rsps(true'success', [
  195.             'total'=>$total,
  196.             'items'=>$items
  197.         ]);
  198.     }
  199. }