app/Customize/Service/GoodsService.php line 1090

Open in your IDE?
  1. <?php
  2. namespace Customize\Service;
  3. use Customize\Converter\DynamicConverter;
  4. use Eccube\Entity\ClassCategory;
  5. use Lm\Engine\EC\Entity\GoodsExtended;
  6. use Lm\Engine\EC\Entity\SkuWithPrice;
  7. use Lm\Engine\SokujitsuHassou\SokujitsuHassou;
  8. use Lm\Engine\EC\Entity\GoodsWithRelated;
  9. use Lm\Entity\GoodsColor;
  10. use Lm\Service\Cache\CacheService;
  11. use Lm\Service\Db\SqlService;
  12. class GoodsService extends LmAbstractService
  13. {
  14.     const CFIMG_DOMAIN "img0.land-mark.biz";
  15.     const TAX 10;
  16.     const VENDING_LIST_FOLDER 'files/goods/';
  17.     const VENDING_LIST_FILENAME 'goods_vending_status_list.json';
  18.     /**
  19.      * @var LmHelper $LmHelper
  20.      */
  21.     protected $LmHelper;
  22.     /**
  23.      * @var DynamicConverter $dynamicConverter
  24.      */
  25.     protected $dynamicConverter;
  26.     public function __construct(CacheService     $cacheService,
  27.                                 LmHelper         $lmHelper,
  28.                                 DynamicConverter $dynamicConverter)
  29.     {
  30.         //
  31.         parent::__construct($cacheService);
  32.         //
  33.         $this->LmHelper $lmHelper;
  34.         $this->dynamicConverter $dynamicConverter;
  35.     }
  36.     public function getGoodsRoutingMap($from)
  37.     {
  38.         $sql = new SqlService();
  39.         $data $sql->Table('goods_routing_map_table')
  40.             ->Set('grm_from'$from)
  41.             ->Find();
  42.         if (!empty($data)) {
  43.             return $data['grm_to'];
  44.         } else {
  45.             return false;
  46.         }
  47.     }
  48.     public function getGoodsRoutingByHinban($hinban)
  49.     {
  50.         $sql = new SqlService();
  51.         $data $sql->Table('goods_routing_table')
  52.             ->Set('gr_hinban'$hinban)
  53.             ->Find();
  54.         if (!empty($data)) {
  55.             return $data['gr_goods'];
  56.         } else {
  57.             return false;
  58.         }
  59.     }
  60.     public function getGoodsSusoageById($goodsId)
  61.     {
  62.         $result = (new SqlService())
  63.             ->Select('goods_susoage')
  64.             ->Table('goods_table')
  65.             ->Set('goods_id'$goodsId)
  66.             ->Find();
  67.         if (empty($result)) {
  68.             return false;
  69.         }
  70.         return $result['goods_susoage'];
  71.     }
  72.     public function getGoodsSusoageByHinban($hinban)
  73.     {
  74.         $result = (new SqlService())
  75.             ->Select('goods_susoage')
  76.             ->Table('goods_table')
  77.             ->Join('goods_routing_table''goods_id = gr_goods''INNER')
  78.             ->Set('T1.gr_hinban'$hinban)
  79.             ->Find();
  80.         if (empty($result)) {
  81.             return false;
  82.         }
  83.         return $result['goods_susoage'];
  84.     }
  85.     /**
  86.      * @param $id int
  87.      * @param bool $DlFlg 削除されたDATAを抽出しない
  88.      * @return array
  89.      */
  90.     public function getGoodsById($id$DlFlg false)
  91.     {
  92.         return $this->getCached(function () use ($id$DlFlg) {
  93.             $sql = new SqlService();
  94.             $sql->Table('goods_table')
  95.                 ->Set('goods_id'$id);
  96.             if ($DlFlg) {
  97.                 $sql->Set('goods_ddate'null);
  98.             }
  99.             $data $sql->Find();
  100.             if (!empty($data)) {
  101.                 return $data;
  102.             } else {
  103.                 return false;
  104.             }
  105.         });
  106.     }
  107.     /**
  108.      * @param bool $whichNoDeleted
  109.      * @param int|null $goodsStatus
  110.      * @param array $fields
  111.      * @return mixed
  112.      * @throws \ReflectionException
  113.      */
  114.     public function getGoodsList($whichNoDeleted false$goodsStatus null, array $fields = [])
  115.     {
  116.         return $this->getCached(function () use ($whichNoDeleted$goodsStatus$fields) {
  117.             //
  118.             $sql = (new SqlService())
  119.                 ->Table('goods_table')
  120.                 ->Order('goods_id')
  121.             ;
  122.             ;
  123.             //
  124.             if ($whichNoDeleted) {
  125.                 $sql->Set('goods_ddate'null);
  126.             }
  127.             //
  128.             if ($goodsStatus !== null) {
  129.                 $sql->Set('goods_status'$goodsStatus);
  130.             }
  131.             //
  132.             if (!empty($fields)) {
  133.                 $sql->Select(implode(','$fields));
  134.             }
  135.             //
  136.             return $sql->Finds() ?? [];
  137.         });
  138.     }
  139.     /**
  140.      * 指定されたJANコードIDの商品情報を取得する
  141.      *
  142.      * @param $janId = dtb_product_class.id
  143.      * @return array|null
  144.      */
  145.     public function getGoodsByJanId($janId)
  146.     {
  147.         $result = (new SqlService())
  148.             ->Select('T.*')
  149.             ->Table('goods_table')
  150.             ->Join('jancode_table''goods_id = jan_goods''INNER')
  151.             ->Set('T1.jan_id'$janId)
  152.             ->Find();
  153.         return $result;
  154.     }
  155.     /**
  156.      * 商品カラーIDより、商品情報を取得する
  157.      *
  158.      * @param int $gclId 商品カラーID (=dtb_product_class.class_category1 - $offset)
  159.      * @return mixed
  160.      * @throws \ReflectionException
  161.      */
  162.     public function getGoodsByGclId($gclId)
  163.     {
  164.         return $this->getCached(function () use ($gclId) {
  165.             $data = (new SqlService())
  166.                 ->Select('T.*, T2.*')
  167.                 ->Table('goods_table')
  168.                 ->Join('goods_color_table''T.goods_id = T1.gcl_goods''INNER')
  169.                 ->Join('color_table''T2.color_id = T1.gcl_color_id''INNER')
  170.                 ->Set('T1.gcl_id'$gclId)
  171.                 ->Find();
  172.             if (!empty($data)) {
  173.                 return $data;
  174.             } else {
  175.                 return false;
  176.             }
  177.         });
  178.     }
  179.     /**
  180.      * 800-379……UT……商品ページの複製化
  181.      * 親カテに属する商品を検索
  182.      * @param string $goodsId
  183.      * @param string $mcWebName
  184.      * @param string $mcMcWebName
  185.      * @return array
  186.      * @author worker_g
  187.      */
  188.     public function isBelongsToMc($goodsId$mcWebName)
  189.     {
  190.         // TODO: null AS `category_id`
  191.         // TODO: null AS `category_webname`
  192.         $result = (new SqlService())
  193.             ->Select('main_category_id, main_category_webname, T4.*')
  194.             ->Table('main_category_table')
  195.             ->Join('category_table''main_category_id = T1.category_main_category''INNER')
  196.             ->Join('goods_category_table''T1.category_id = T2.gc_category''INNER')
  197.             ->Join('goods_table''T3.goods_id = T2.gc_goods''INNER')
  198.             ->Join('category_group_table''T4.category_group_id = T.main_category_group')
  199.             ->Set('T3.goods_id'$goodsId)
  200.             ->Set('main_category_webname'$mcWebName)
  201.             ->Find()
  202.             ?? (new SqlService())
  203.                 ->Select('main_category_id, main_category_webname, T3.*')
  204.                 ->Table('main_category_table')
  205.                 ->Join('goods_main_category_table''main_category_id = T1.gmc_main_category''INNER')
  206.                 ->Join('goods_table''T2.goods_id = T1.gmc_goods''INNER')
  207.                 ->Join('category_group_table''T3.category_group_id = T.main_category_group')
  208.                 ->Set('T2.goods_id'$goodsId)
  209.                 ->Set('main_category_webname'$mcWebName)
  210.                 ->Find();
  211.         return $result;
  212.     }
  213.     /**
  214.      * 800-379……UT……商品ページの複製化
  215.      * 親カテに属する商品を検索
  216.      * @param string $goodsId
  217.      * @param string $mcWebName
  218.      * @param string $mcMcWebName
  219.      * @return array
  220.      * @author worker_g
  221.      */
  222.     public function isBelongsToMcMc($goodsId$mcMcWebName$mcWebName)
  223.     {
  224.         // TODO: null AS `category_id`
  225.         // TODO: null AS `category_webname`
  226.         // TODO: 親カテのみ
  227.         $result = (new SqlService())
  228.             ->Select('main_category_id, main_category_webname, T4.*')
  229.             ->Table('main_category_table')
  230.             ->Join('category_table''main_category_id = T1.category_main_category''INNER')
  231.             ->Join('goods_category_table''T1.category_id = T2.gc_category''INNER')
  232.             ->Join('goods_table''T3.goods_id = T2.gc_goods''INNER')
  233.             ->Join('category_group_table''T4.category_group_id = T.main_category_group')
  234.             ->Set('T3.goods_id'$goodsId)
  235.             ->Set('main_category_main_category_webname'$mcMcWebName)
  236.             ->Set('main_category_webname'$mcWebName)
  237.             ->Find();
  238.         return $result;
  239.     }
  240.     /**
  241.      * 800-379……UT……商品ページの複製化
  242.      * 子カテに属する商品を検索
  243.      * @param string $goodsId
  244.      * @param string $mcWebName
  245.      * @param string $ctWebName
  246.      * @return array
  247.      * @author worker_g
  248.      */
  249.     public function isBelongsToMcCt($goodsId$mcWebName$ctWebName)
  250.     {
  251.         $result = (new SqlService())
  252.             ->Select('main_category_id, main_category_webname, T1.category_id, T1.category_webname, T4.*')
  253.             ->Table('main_category_table')
  254.             ->Join('category_table''main_category_id = T1.category_main_category''INNER')
  255.             ->Join('goods_category_table''T1.category_id = T2.gc_category''INNER')
  256.             ->Join('goods_table''T3.goods_id = T2.gc_goods''INNER')
  257.             ->Join('category_group_table''T4.category_group_id = T.main_category_group')
  258.             ->Set('T3.goods_id'$goodsId)
  259.             ->Set('main_category_webname'$mcWebName)
  260.             ->Set('T1.category_webname'$ctWebName)
  261.             ->Find();
  262.         return $result;
  263.     }
  264.     /**
  265.      * 800-379……UT……商品ページの複製化
  266.      * 子カテに属する商品を検索
  267.      * @param string $goodsId
  268.      * @param string $mcMcWebName
  269.      * @param string $mcWebName
  270.      * @param string $ctWebName
  271.      * @return array
  272.      * @author worker_g
  273.      */
  274.     public function isBelongsToMcMcCt($goodsId$mcMcWebName$mcWebName$ctWebName)
  275.     {
  276.         $result = (new SqlService())
  277.             ->Select('main_category_id, main_category_webname, T1.category_id, T1.category_webname, T4.*')
  278.             ->Table('main_category_table')
  279.             ->Join('category_table''main_category_id = T1.category_main_category''INNER')
  280.             ->Join('goods_category_table''T1.category_id = gc_category''INNER')
  281.             ->Join('goods_table''T3.goods_id = T2.gc_goods''INNER')
  282.             ->Join('category_group_table''T4.category_group_id = T.main_category_group')
  283.             ->Set('T3.goods_id'$goodsId)
  284.             ->Set('main_category_main_category_webname'$mcMcWebName)
  285.             ->Set('main_category_webname'$mcWebName)
  286.             ->Set('T1.category_webname'$ctWebName)
  287.             ->Find();
  288.         return $result;
  289.     }
  290.     /**
  291.      * 型番取得(1件)
  292.      *
  293.      * @param string $goods_id 商品ID
  294.      * @return string
  295.      */
  296.     public function getGoodsKataban1($goods_id)
  297.     {
  298.         $result = (new SqlService())
  299.             ->Select('DISTINCT gpt.gp_kataban')
  300.             ->Table('goods_price_table AS gpt')
  301.             ->Where('gp_goods = ' $goods_id)
  302.             ->Find();
  303.         return (!empty($result)) ? $result['gp_kataban'] : '';
  304.     }
  305.     /**
  306.      * カラーリスト取得
  307.      *
  308.      * @param string $goods_id 商品ID
  309.      * @return string
  310.      */
  311.     public function getGoodsColorList($goods_id)
  312.     {
  313.         $list = (new SqlService())
  314.             ->Select('ct.color_rgb')
  315.             ->Table('goods_color_table AS gct')
  316.             ->Join('color_table AS ct''gct.gcl_color_id = ct.color_id''INNER')
  317.             ->Where('gcl_goods = ' $goods_id)
  318.             ->Where('gcl_display_status = 1')
  319.             ->OrderBy('CAST( color_name AS BINARY )')
  320.             ->Finds();;
  321.         $ret '';
  322.         foreach ($list ?? [] as $row) {
  323.             $ret .= '<div style="float: left; width: 10px; height: 10px; background-color: #' str_replace("#"""$row['color_rgb']) . '; border: 1px solid #EFEFEF;"></div>';
  324.         }
  325.         $ret '<div style="margin-top: 15px;">' $ret '</div>';
  326.         return $ret;
  327.     }
  328.     /**
  329.      * 商品価格取得
  330.      * Note. 現行では1SQLとしているが、厳格なSQLではエラーとなるため、キャンペーン価格と通常価格で分けて取得
  331.      *
  332.      * @param string $goods_id 商品ID
  333.      * @return string
  334.      */
  335.     public function getGoodsPrice($goods_id$display_max false)
  336.     {
  337.         $min $max 0;
  338.         // キャンペーン価格取得
  339.         $cols = array(
  340.             'MIN(cp_price) AS mi',
  341.             'MAX(cp_price) AS ma',
  342.         );
  343.         $result_cp = (new SqlService())
  344.             ->Select(join(","$cols))
  345.             ->Table('campaign_price_table')
  346.             ->Where('cp_start_datetime <= NOW()')
  347.             ->Where('cp_end_datetime >= NOW()')
  348.             ->Where('cp_del_flg = 0')
  349.             ->Where('cp_gp = ' $goods_id)
  350.             ->Find();
  351.         if (!empty($result_cp)) {
  352.             $min = (int)$result_cp['mi'];
  353.             $max = (int)$result_cp['ma'];
  354.         }
  355.         // キャンペーン価格が無い場合は通常価格を検索
  356.         if ($min === && $max === 0) {
  357.             $cols = array(
  358.                 'MIN(gp_price2) AS mi',
  359.                 'MAX(gp_price2) AS ma',
  360.             );
  361.             $result_gp = (new SqlService())
  362.                 ->Select(join(","$cols))
  363.                 ->Table('goods_price_table')
  364.                 ->Where('(gp_display != 99 OR gp_display IS NULL)')
  365.                 ->Where('gp_goods = ' $goods_id)
  366.                 ->Find();
  367.             if (!empty($result_gp)) {
  368.                 // TODO: 税率設定
  369.                 $min round($result_gp['mi'] * (self::TAX 100));
  370.                 $max round($result_gp['ma'] * (self::TAX 100));
  371.             }
  372.         }
  373.         $ret number_format($min);
  374.         if ($display_max) {
  375.             $ret .= ($min === $max) ? "円" "円~" number_format($max) . "円";
  376.         } else {
  377.             $ret .= ($min === $max) ? "円" "円~";
  378.         }
  379.         return $ret;
  380.     }
  381.     /**
  382.      * 口コミ取得
  383.      *
  384.      * @param string $goods_id 商品ID
  385.      * @return string
  386.      */
  387.     public function getGoodsAverage($goods_id)
  388.     {
  389.         // Note. cra_goods_id が PRIMARY のため、取得件数は1件
  390.         $result = (new SqlService())
  391.             ->Select('cra_average_points')
  392.             ->Table('customer_review_average_table')
  393.             ->Where('cra_target_count >= 1')
  394.             ->Where('cra_goods_id = ' $goods_id)
  395.             ->Find();
  396.         return (!empty($result)) ? (int)$result['cra_average_points'] : 0;
  397.     }
  398.     /**
  399.      * 口コミimgタグ取得
  400.      *
  401.      * @param string $average レビュー平均
  402.      * @return string
  403.      */
  404.     public function getGoodsAverageImg($average)
  405.     {
  406.         $image_name = (int)($average 2) / 10;
  407.         $ret "<img class=\"searchpop_result_description_review_img\" alt=\"お客様からの口コミレビュー評価の星の数" $average "\" src=\"" $this->LmHelper->getConfig('CFIMG_URL') . "/public_images/review/star_m" $image_name ".gif\">";
  408.         return $ret;
  409.     }
  410.     /**
  411.      * レビュー数取得
  412.      *
  413.      * @param string $goods_id 商品ID
  414.      * @return string
  415.      */
  416.     public function getGoodsReviewCount($goods_id$goods_status)
  417.     {
  418.         if ($goods_status != '1') {
  419.             return 0;
  420.         }
  421.         $result = (new SqlService())
  422.             ->Table('customer_review_table')
  423.             ->Where('cr_approval = 1')
  424.             ->Where('cr_site_id = 0')
  425.             ->Where('cr_goods_id = ' $goods_id)
  426.             ->Where('cr_main_category_id = 0')
  427.             ->Count();
  428.         return (int)$result;
  429.     }
  430.     /**
  431.      * データ整形:商品検索
  432.      *
  433.      * @param array $list
  434.      * @return array
  435.      */
  436.     public function formatItemList($list)
  437.     {
  438.         $formatRows $list;
  439.         $formatRows['searchtext'] = $list['params']['searchtext'];
  440.         $formatRows['display_max'] = $list['params']['max_display_cnt'];
  441.         $formatRows['item'] = array();
  442.         if ($list['item']) {
  443.             foreach ($list['item'] as $idx => $row) {
  444.                 $formatRows['item'][$idx] = $row;
  445.                 $formatRows['item'][$idx]['tt_type'] = '1';
  446.                 $formatRows['item'][$idx]['kataban'] = $this->getGoodsKataban1($row['goods_id']);
  447.                 $formatRows['item'][$idx]['color'] = $this->getGoodsColorList($row['goods_id']);
  448.                 $formatRows['item'][$idx]['price'] = $this->getGoodsPrice($row['goods_id']);
  449.                 $formatRows['item'][$idx]['image'] = $this->LmHelper->getGoodsImageUrl($row['goods_id'], 'main_sum.webp');
  450.                 // 口コミ
  451.                 $formatRows['item'][$idx]['average'] = $this->getGoodsAverage($row['goods_id']);
  452.                 $formatRows['item'][$idx]['average_img'] = $this->getGoodsAverageImg($formatRows['item'][$idx]['average']);
  453.                 $formatRows['item'][$idx]['review'] = $this->getGoodsReviewCount($row['goods_id'], $row['goods_status']);
  454.                 // ステータス
  455.                 $formatRows['item'][$idx]['status'] = $row['goods_status'];
  456.             }
  457.         }
  458.         return $formatRows;
  459.     }
  460.     /**
  461.      * データ整形:カテゴリ検索
  462.      *
  463.      * @param array $list
  464.      * @return array
  465.      */
  466.     public function formatCategoryList($list)
  467.     {
  468.         $formatRows $list;
  469.         $formatRows['searchtext'] = $list['params']['searchtext'];
  470.         $formatRows['display_max'] = $list['params']['max_display_cnt'];
  471.         $formatRows['category_type'] = $list['params']['category_type'];
  472.         $formatRows['categories'] = array();
  473.         if ($list['categories']) {
  474.             foreach ($list['categories'] as $idx => $row) {
  475.                 // ※現行通りにセットすると以下の通りとなる
  476.                 $categoryInfo null;
  477.                 $row['categoryInfo'] = $categoryInfo;
  478.                 $row['item_count'] = $row['goodscount'];
  479.                 $formatRows['categories'][$idx] = $row;
  480.             }
  481.         }
  482.         return $formatRows;
  483.     }
  484.     /**
  485.      * データ整形:カラムリスト
  486.      *
  487.      * @param array $list
  488.      * @return array
  489.      */
  490.     public function formatColumnList($list)
  491.     {
  492.         $formatRows $list;
  493.         $formatRows['searchtext'] = $list['params']['searchtext'];
  494.         $formatRows['display_max'] = $list['params']['max_display_cnt'];
  495.         return $formatRows;
  496.     }
  497.     /**
  498.      * データ整形:商品リスト(カテゴリ検索)
  499.      *
  500.      * @param array $list
  501.      * @return array
  502.      */
  503.     public function formatItemByCategoryList($list)
  504.     {
  505.         $formatRows $list;
  506.         $formatRows['main_category_id'] = $list['params']['main_category_id'];
  507.         $formatRows['category_id'] = $list['params']['category_id'];
  508.         $formatRows['category_group_only_main'] = $list['params']['category_group_only_main'];
  509.         $formatRows['display_max'] = $list['params']['max_display_cnt'];
  510.         $formatRows['item'] = array();
  511.         if ($list['item']) {
  512.             foreach ($list['item'] as $idx => $row) {
  513.                 $formatRows['item'][$idx] = $row;
  514.                 $formatRows['item'][$idx]['tt_type'] = '1';
  515.                 $formatRows['item'][$idx]['kataban'] = $this->getGoodsKataban1($row['goods_id']);
  516.                 $formatRows['item'][$idx]['color'] = $this->getGoodsColorList($row['goods_id']);
  517.                 $formatRows['item'][$idx]['price'] = $this->getGoodsPrice($row['goods_id']);
  518.                 $formatRows['item'][$idx]['image'] = $this->LmHelper->getGoodsImageUrl($row['goods_id'], 'main_sum.jpg');
  519.             }
  520.         }
  521.         return $formatRows;
  522.     }
  523.     /**
  524.      * カテゴリ検索SQL取得(From句 ~ Where句)
  525.      * ※本SQLは複雑なためSQL文を直接編集する
  526.      *
  527.      * @param SqlService $sqlService
  528.      * @param string $keyword
  529.      * @param int $start
  530.      * @param int $limit
  531.      * @param bool $isSecret
  532.      * @return string
  533.      */
  534.     protected static function getSqlSearchCategoryQuery(SqlService $sqlService$keyword$type$isSecret)
  535.     {
  536.         // SQLパラメータ: キーワード
  537.         $sqlService->Params([
  538.             'keyword_exact' => $keyword,
  539.             'keyword_like' => "%{$keyword}%",
  540.         ]);
  541.         // ブランド別かどうか
  542.         $main_category_group "";
  543.         if ($type == 'normal') {
  544.             $main_category_group " main_category_group NOT IN ( 6, 7, 8 )";
  545.         } else if ($type == 'brand') {
  546.             $main_category_group " main_category_group = 6";
  547.         } else if ($type == 'description') {
  548.             $main_category_group " main_category_group = 7";
  549.         } else if ($type == 'maker') {
  550.             $main_category_group " main_category_group = 8";
  551.         }
  552.         if ($main_category_group) {
  553.             $main_category_group "WHERE" $main_category_group;
  554.         }
  555.         $sql "
  556. FROM (
  557.     SELECT
  558.         1 AS result_priority
  559.     ,    main_category_id
  560.     ,    NULL AS category_id
  561.     ,    main_category_name
  562.     ,    NULL AS category_name
  563.     ,    main_category_webname
  564.     ,    NULL AS category_webname
  565.     ,    main_category_group
  566.     ,    ((main_category_name = :keyword_exact) || (main_breadcrumb = :keyword_exact)) AS exact1
  567.     ,    LENGTH(main_category_name) AS exact2
  568.     ,    lppv_pageview
  569.     ,    goods_count
  570.     ,   main_category_main_category_webname
  571.     FROM (
  572.         SELECT
  573.             main_category_id
  574.         ,    main_category_name
  575.         ,    main_category_webname
  576.         ,    main_category_group
  577.         ,    main_breadcrumb
  578.         ,    main_category_pageviews AS lppv_pageview
  579.         ,    COUNT(DISTINCT goods_id) AS goods_count
  580.         ,   main_category_main_category_webname
  581.         FROM main_category_table
  582.         INNER JOIN category_group_table ON category_group_id = main_category_group AND category_group_only_main = 1
  583.         LEFT JOIN goods_main_category_table ON main_category_id = gmc_main_category
  584.         LEFT JOIN goods_table ON goods_id = gmc_goods AND goods_ddate IS NULL";
  585.         if (!$isSecret) {
  586.             $sql .= " AND goods_status = 1 ";
  587.         }
  588.         $sql .= " WHERE main_category_name collate utf8_unicode_ci LIKE :keyword_like
  589.         GROUP BY main_category_id
  590.         UNION ALL
  591.         SELECT
  592.             main_category_id
  593.         ,    main_category_name
  594.         ,    main_category_webname
  595.         ,    main_category_group
  596.         ,    main_breadcrumb
  597.         ,    main_category_pageviews AS lppv_pageview
  598.         ,    COUNT(DISTINCT goods_id) AS goods_count
  599.         ,   main_category_main_category_webname
  600.         FROM main_category_table
  601.         INNER JOIN category_group_table ON category_group_id = main_category_group AND category_group_only_main != 1
  602.         LEFT JOIN category_table ON main_category_id = category_main_category AND category_status = 1
  603.         LEFT JOIN goods_category_table ON category_id = gc_category
  604.         LEFT JOIN goods_table ON goods_id = gc_goods AND goods_ddate IS NULL";
  605.         if (!$isSecret) {
  606.             $sql .= " AND goods_status = 1 ";
  607.         }
  608.         $sql .= " WHERE category_is_hinban_link = 0 AND main_category_name collate utf8_unicode_ci LIKE :keyword_like
  609.         GROUP BY main_category_id
  610.     ) AS mc
  611.     UNION
  612.     SELECT
  613.         result_priority
  614.     ,    main_category_id
  615.     ,    category_id
  616.     ,    main_category_name
  617.     ,    category_name
  618.     ,    main_category_webname
  619.     ,    category_webname
  620.     ,    main_category_group
  621.     ,    exact1
  622.     ,    exact2
  623.     ,    lppv_pageview
  624.     ,    goods_count
  625.     ,   main_category_main_category_webname
  626.     FROM (
  627.         SELECT
  628.             20 AS result_priority
  629.         ,    main_category_id
  630.         ,    category_id
  631.         ,    main_category_name
  632.         ,    category_name
  633.         ,    main_category_webname
  634.         ,    category_webname
  635.         ,    main_category_group
  636.         ,    0 AS exact1
  637.         ,    category_pageviews AS lppv_pageview
  638.         ,    LENGTH(main_category_name) AS exact2
  639.         ,    COUNT(DISTINCT goods_id) AS goods_count
  640.         ,   main_category_main_category_webname
  641.         FROM main_category_table
  642.         INNER JOIN category_table ON main_category_id = category_main_category AND category_status = 1
  643.         INNER JOIN goods_category_table ON category_id = gc_category
  644.         INNER JOIN goods_table ON goods_id = gc_goods AND goods_ddate IS NULL";
  645.         if (!$isSecret) {
  646.             $sql .= " AND goods_status = 1 ";
  647.         }
  648.         $sql .= " WHERE category_is_hinban_link = 0 AND category_name collate utf8_unicode_ci LIKE :keyword_like
  649.         GROUP BY category_id
  650.     ) AS ct
  651. ) AS ct_summary
  652. INNER JOIN category_group_table ON category_group_id = ct_summary.main_category_group
  653. $main_category_group
  654.         ";
  655.         return $sql;
  656.     }
  657.     /**
  658.      * カテゴリ検索SQL取得
  659.      * ※本SQLは複雑なためSQL文を直接編集する
  660.      *
  661.      * @param $SqlService $sqlService
  662.      * @param string $keyword
  663.      * @param int $start
  664.      * @param int $limit
  665.      * @param bool $isSecret
  666.      * @return string
  667.      */
  668.     protected static function getSqlSearchCategoryList(SqlService $sqlService$keyword$type$start$limit$isSecret)
  669.     {
  670.         $sql self::getSqlSearchCategoryQuery($sqlService$keyword$type$isSecret);
  671.         $sql "
  672. SELECT
  673.     ct_summary.main_category_id
  674. ,    ct_summary.category_id AS category_id
  675. ,    ct_summary.main_category_name
  676. ,    ct_summary.category_name AS category_name
  677. ,    ct_summary.main_category_webname
  678. ,    ct_summary.category_webname AS category_webname
  679. ,    ct_summary.main_category_group
  680. ,    category_group_only_main
  681. ,     IfNull(ct_summary.goods_count, 0) AS goodscount
  682. , main_category_main_category_webname " $sql "
  683. ORDER BY exact1 DESC, lppv_pageview DESC, goodscount DESC , exact2 ASC, result_priority ASC
  684. LIMIT " intval($start). "," intval($limit);
  685.         return $sql;
  686.     }
  687.     /**
  688.      * カテゴリ検索SQL(count)取得
  689.      * ※本SQLは複雑なためSQL文を直接編集する
  690.      *
  691.      * @param SqlService $sqlService
  692.      * @param string $keyword
  693.      * @param int $start
  694.      * @param bool $isSecret
  695.      */
  696.     protected static function getSqlSearchCategoryCount(SqlService $sqlService$keyword$type$isSecret)
  697.     {
  698.         $sql self::getSqlSearchCategoryQuery($sqlService$keyword$type$isSecret);
  699.         $sql "SELECT COUNT(*) AS CNT FROM ( SELECT 'X' " $sql ") AS XXX";
  700.         return $sql;
  701.     }
  702.     /**
  703.      * カテゴリ検索SQL取得(From句 ~ Where句)
  704.      * ※本SQLは複雑なためSQL文を直接編集する
  705.      *
  706.      * @param int $main_category_id
  707.      * @param int $category_id
  708.      * @param bool $isSecret
  709.      * @return string
  710.      */
  711.     protected static function getSqlSearchItemByMainCategoryIdQuery($main_category_id$category_id$isSecret)
  712.     {
  713.         $mc_genre_text_map = array(
  714.             '222' => '事務服'// jimufuku
  715.         );
  716.         $where_goods_status "";
  717.         if (!$isSecret) {
  718.             $where_goods_status ' AND goods_status = 1 ';
  719.         }
  720.         $where "";
  721.         if (isset($mc_genre_text_map[$main_category_id])) {
  722.             $where "
  723.     UNION
  724.     SELECT
  725.         goods_id
  726.     ,    goods_name
  727.     FROM goods_table
  728.     WHERE goods_genre_text = '{$mc_genre_text_map[$main_category_id]}'
  729.     AND goods_ddate IS NULL
  730.     {$where_goods_status}";
  731.         }
  732.         $sql "
  733. FROM (
  734.     SELECT
  735.         goods_id
  736.     ,    goods_name
  737.     FROM main_category_table
  738.     INNER JOIN goods_main_category_table
  739.     ON main_category_id = gmc_main_category
  740.     INNER JOIN goods_table
  741.     ON goods_id = gmc_goods
  742.     WHERE goods_ddate IS NULL
  743.     AND main_category_id = {$main_category_id}
  744.     {$where_goods_status}
  745. {$where}
  746. ) AS goods
  747. LEFT JOIN rank_table ON goods_id = rank_goods
  748.         ";
  749.         return $sql;
  750.     }
  751.     /**
  752.      * メインカテゴリID⇒商品検索SQL(list)取得
  753.      * ※本SQLは複雑なためSQL文を直接編集する
  754.      *
  755.      * @param int $main_category_id
  756.      * @param int $category_id
  757.      * @param int $limit
  758.      * @param bool $isSecret
  759.      * @return string
  760.      */
  761.     protected static function getSqlSearchItemListByMainCategoryId($main_category_id$category_id$limit$isSecret)
  762.     {
  763.         $sqls = array(
  764.             "SELECT goods_id, goods_name",
  765.             self::getSqlSearchItemByMainCategoryIdQuery($main_category_id$category_id$isSecret),
  766.             "ORDER BY rank_money DESC",
  767.             "LIMIT 0, $limit",
  768.         );
  769.         return join(" "$sqls);
  770.     }
  771.     /**
  772.      * メインカテゴリID⇒商品検索SQL(count)取得
  773.      * ※本SQLは複雑なためSQL文を直接編集する
  774.      *
  775.      * @param int $main_category_id
  776.      * @param int $category_id
  777.      * @param bool $isSecret
  778.      */
  779.     protected static function getSqlSearchItemCountByMainCategoryId($main_category_id$category_id$isSecret)
  780.     {
  781.         $sqls = array(
  782.             "SELECT COUNT(*) AS CNT FROM ( SELECT 'X' ",
  783.             self::getSqlSearchItemByMainCategoryIdQuery($main_category_id$category_id$isSecret),
  784.             ") AS XXX",
  785.         );
  786.         return join(" "$sqls);
  787.     }
  788.     /**
  789.      * 指定されたキーワードにて商品一覧を検索する
  790.      *
  791.      * @param array $params
  792.      * @return array|null
  793.      */
  794.     public function searchItemListByKeyword($params)
  795.     {
  796.         $list = array();
  797.         $list['params'] = $params;
  798.         // SQLパラメータ
  799.         $bind = [];
  800.         // SQLパラメータ: キーワード検索
  801.         $keywords = [];
  802.         // キーワード検索
  803.         $sqlKeywords "SELECT goods_id FROM search_goods_keywords WHERE 1";
  804.         foreach ($params['keywords'] as $index => $keyword) {
  805.             //
  806.             $keywords[$placeholder "keyword{$index}"] = "%{$keyword}%";
  807.             //
  808.             $sqlKeywords .= " AND fulltext_keywords LIKE :{$placeholder}";
  809.         }
  810.         // シークレットモード
  811.         if (LmHelper::isSecret()) {
  812.             $sqlKeywords .= " AND sgk_goods_status = 1";
  813.         }
  814.         if (!empty($keywords)) {
  815.             $bind array_merge($bind$keywords);
  816.         }
  817.         // ソート順
  818.         if ($params['order_type'] == "1") { // 安い順
  819.             $order "rt.lowest_price ASC";
  820.         } elseif ($params['order_type'] == "3") { // 高い順
  821.             $order "rt.lowest_price DESC";
  822.         } else { // 品番順
  823.             $order "rt.rank_money DESC";
  824.         }
  825.         // 商品テーブルを照会
  826.         $cols = array('gt.goods_id''gt.goods_name''gt.goods_status''gt.goods_main_kataban AS gp_kataban''rt.rank_money''rt.lowest_price');
  827.         $sql = new SqlService();
  828.         $sql->Table('goods_table AS gt')
  829.             ->Join("rank_table AS rt""gt.goods_id = rt.rank_goods"'LEFT')
  830.             ->Where("goods_id IN (" $sqlKeywords ")")
  831.             ->Where("goods_ddate IS NULL");
  832.         // SQLパラメータ
  833.         if (!empty($bind)) {
  834.             $sql->Params($bind);
  835.         }
  836.         $list['item_count'] = (clone $sql)->Count();
  837.         $list['item'] = $sql->Table('goods_table AS gt')
  838.             ->Select(join(","$cols))
  839.             ->GroupBy('gt.goods_id')
  840.             ->OrderBy($order)
  841.             ->Limit($params['start'] . ', ' $params['max_display_cnt'])
  842.             ->Finds();
  843.         //->Finds(2, true);
  844.         // リスト整形
  845.         return $this->formatItemList($list);
  846.     }
  847.     /**
  848.      * 指定されたキーワードにてカテゴリ一覧を検索する
  849.      *
  850.      * @param array $params
  851.      * @return array|null
  852.      */
  853.     public function searchCategoryListByKeyword($params)
  854.     {
  855.         $list = array();
  856.         $list['params'] = $params;
  857.         // キーワードは最初の1件のみ使用
  858.         $keyword $params['keywords'][0];
  859.         $isSecret LmHelper::isSecret();
  860.         // SQL取得
  861.         $sql1 = new SqlService();
  862.         $sql2 = new SqlService();
  863.         $sqlList self::getSqlSearchCategoryList($sql1$keyword$params['category_type'], $params['start'], $params['max_display_cnt'], $isSecret);
  864.         $sqlCount self::getSqlSearchCategoryCount($sql2$keyword$params['category_type'], $isSecret);
  865.         // カテゴリ検索
  866.         $list['categories'] = $sql1->Sql($sqlList)->FetchAll();
  867.         $list['category_count'] = $sql2->Sql($sqlCount)->Fetch();
  868.         $list['category_count'] = isset($list['category_count']['CNT']) ? $list['category_count']['CNT'] : 0;
  869.         // リスト整形
  870.         return $this->formatCategoryList($list);
  871.     }
  872.     /**
  873.      * 指定されたキーワードにてコラム一覧を検索する
  874.      *
  875.      * @param string $keyword
  876.      * @param int $limit
  877.      * @return array|null
  878.      */
  879.     public function searchColumnListByKeyword($params)
  880.     {
  881.         $list = array();
  882.         $list['params'] = $params;
  883.         // SQLパラメータ
  884.         $bind = [];
  885.         // SQLパラメータ: キーワード検索
  886.         $keywords = [];
  887.         // キーワード検索
  888.         $where_column1 = array();
  889.         $where_column2 = array();
  890.         foreach ($params['keywords'] as $index => $keyword) {
  891.             //
  892.             $keywords[$placeholder "keyword{$index}"] = "%{$keyword}%";
  893.             //
  894.             $where_column1[] = "`column_name` LIKE :{$placeholder}";
  895.             $where_column2[] = "`column_keyword_tag` LIKE :{$placeholder}";
  896.         }
  897.         if (!empty($keywords)) {
  898.             $bind array_merge($bind$keywords);
  899.         }
  900.         // コラムテーブルを照会
  901.         $cols = array('c.column_name''c.column_title_tag''c.column_webname''mc.main_category_webname''ct.category_webname');
  902.         $sql = new SqlService();
  903.         // SQLパラメータ
  904.         if (!empty($bind)) {
  905.             $sql->Params($bind);
  906.         }
  907.         $sql->Table('column_table AS c')
  908.             ->Select(join(","$cols))
  909.             ->Join("main_category_table AS mc""c.column_main_category = mc.main_category_id"'LEFT')
  910.             ->Join("category_table AS ct""c.column_target_category = ct.category_id"'LEFT')
  911.             ->Where("c.column_status = 1")
  912.             ->Limit('0, ' intval($params['max_display_cnt']));
  913.         if ($where_column1 && $where_column2) {
  914.             $sql->Where(join(" OR "$where_column1) . " OR " join(" OR "$where_column2));
  915.         }
  916.         $list['columns'] = $sql->Finds();
  917.         // リスト整形
  918.         return $this->formatColumnList($list);
  919.     }
  920.     /**
  921.      * 指定されたカテゴリID属する商品一覧を検索する
  922.      *
  923.      * @param int $mainCategoryId
  924.      * @param int $limit
  925.      * @return array|null
  926.      */
  927.     public function searchItemListByMainCategoryId($params)
  928.     {
  929.         $list = array();
  930.         $list['params'] = $params;
  931.         $sql = new SqlService();
  932.         $isSecret LmHelper::isSecret();
  933.         // カテゴリ情報の取得
  934.         $result $sql->Table('main_category_table AS mct')
  935.             ->Select('mct.main_category_id, mct.main_category_name, mct.main_category_webname, ct.category_id, ct.category_name, ct.category_webname')
  936.             ->Join("category_table AS ct""mct.main_category_id = ct.category_main_category"'LEFT')
  937.             ->Where('mct.main_category_id = ' $params['main_category_id']);
  938.         if ($params['category_id']) {
  939.             $sql->Where("ct.category_id = " $params['category_id']);
  940.         }
  941.         $result $sql->Find();
  942.         $list += $result;
  943.         // カテゴリテーブル/商品テーブルを照会
  944.         if (!$params['category_group_only_main']) {
  945.             // not OnlyMain
  946.             $cols = array('gt.goods_id''gt.goods_canonical_hinban''gt.goods_name');
  947.             // SQL取得
  948.             $sql->Table('main_category_table AS mct')
  949.                 ->Join("category_table AS ct""mct.main_category_id = ct.category_main_category"'INNER')
  950.                 ->Join("goods_category_table AS gct""ct.category_id = gct.gc_category"'INNER')
  951.                 ->Join("goods_table AS gt""gt.goods_id = gct.gc_goods"'INNER')
  952.                 ->Join("rank_table AS rt""gt.goods_id = rt.rank_goods"'LEFT')
  953.                 ->Where("gt.goods_ddate IS NULL")
  954.                 ->Where("mct.main_category_id = " $params['main_category_id']);
  955.             if (!$isSecret) {
  956.                 $sql->Where("gt.goods_status = 1");
  957.             }
  958.             if ($params['category_id']) {
  959.                 $sql->Where("ct.category_id = " $params['category_id']);
  960.             }
  961.             $list['item_count'] = (clone $sql)->Count(0'DISTINCT(gt.goods_id)');
  962.             $list['item'] = $sql->Select(join(","$cols))
  963.                 ->GroupBy("gt.goods_id, gt.goods_name")
  964.                 ->OrderBy("rt.rank_money DESC")
  965.                 ->Limit('0, ' $params['max_display_cnt'])
  966.                 ->Finds(0true);
  967.         } else {
  968.             // OnlyMain
  969.             // SQL取得
  970.             $sqlList self::getSqlSearchItemListByMainCategoryId($params['main_category_id'], $params['category_id'], $params['max_display_cnt'], $isSecret);
  971.             $sqlCount self::getSqlSearchItemCountByMainCategoryId($params['main_category_id'], $params['category_id'], $isSecret);
  972.             // SQL実行
  973.             $list['item'] = $sql->Sql($sqlList)->FetchAll(0true);
  974.             $list['item_count'] = $sql->Sql($sqlCount)->Fetch();
  975.             $list['item_count'] = isset($list['item_count']['CNT']) ? $list['item_count']['CNT'] : 0;
  976.         }
  977.         // リスト整形
  978.         return $this->formatItemByCategoryList($list);
  979.     }
  980.     /**
  981.      * TODO: 型番を検索を検索する
  982.      *
  983.      * @param int $goods_id
  984.      * @return array|null
  985.      */
  986.     public function getGoodsKataban($goods_id)
  987.     {
  988.         //    $strSql = "SELECT  FROM goods_price_table WHERE gp_goods = " . $goods_id . " AND NOT(gp_display <=> 99) LIMIT 0,3";
  989.         $result = (array)(new SqlService())
  990.             ->Table('goods_price_table')
  991.             ->Sql('SELECT DISTINCT gp_kataban')
  992.             ->Set('gp_goods'$goods_id)
  993.             ->Set('gp_display'99'!=')
  994.             ->Limit(3)
  995.             ->FindAll();
  996.         return $result;
  997.     }
  998.     /**
  999.      * TODO: 即日発送の可否
  1000.      *
  1001.      * @return array|null
  1002.      */
  1003.     public function getGoodsSameDayShipping($goods_id NULL$is_matrix NULL$jan_id NULL$gp_id NULL$gcl_id NULL$amount NULL$date NULL)
  1004.     {
  1005.         return (new SokujitsuHassou())
  1006.             ->check($goods_id$is_matrix$jan_id$gcl_id$gp_id$date$amount);
  1007.     }
  1008.     /**
  1009.      * 入荷予定日の計算
  1010.      *
  1011.      * @param int $goodsId
  1012.      * @param bool $isMatrix
  1013.      * @param int $janId
  1014.      * @param int $gpId
  1015.      * @param int $gclId
  1016.      * @param string $datetime
  1017.      * @return array|false|null
  1018.      * @return array|false|string|null
  1019.      */
  1020.     public function getGoodsStockDate($goodsId NULL$isMatrix NULL$janId NULL$gpId NULL$gclId NULL$datetime NULL)
  1021.     {
  1022.         return (new \Lm\Engine\Zaiko\NyuukaYoteibi())
  1023.             ->calculate($goodsId$isMatrix$janId$gpId$gclId$datetime)
  1024.         ;
  1025.     }
  1026.     /**
  1027.      * @param null|int $goodsId
  1028.      * @param null|bool $isMatrix
  1029.      * @param null|int $janId
  1030.      * @param null|int $gpId
  1031.      * @param null|int $gclId
  1032.      * @param null|string $datetime
  1033.      * @return array|bool
  1034.      */
  1035.     public function getGoodsReservation($goodsId null$isMatrix null$janId null$gpId null$gclId null$datetime null)
  1036.     {
  1037.         return (new \Lm\Engine\Zaiko\Yoyaku())
  1038.             ->check2($goodsId$isMatrix$janId$gpId$gclId$datetime)
  1039.         ;
  1040.     }
  1041.     /**
  1042.      * 単一SKUの在庫数取得(バリデーション用)
  1043.      *
  1044.      * @param int $jan_id (=dtb_product_class.id)
  1045.      * @return mixed|null 0 ・・・ 在庫なし
  1046.      * 0以上 ・・・ 在庫あり
  1047.      * null ・・・ 無限(入荷予定)
  1048.      * @throws \Exception
  1049.      */
  1050.     public function getValidationStock(int $jan_id)
  1051.     {
  1052.         $stockInfo $this->getGoodsStock(nullfalse$jan_id);
  1053.         $stock $stockInfo['stock_total'];
  1054.         return $stock;
  1055.     }
  1056.     /**
  1057.      * モジュール……在庫数
  1058.      *
  1059.      * @param int|NULL $goods_id
  1060.      * @param bool $is_matrix
  1061.      * @param int|NULL $jan_id
  1062.      * @param int|NULL $gp_id
  1063.      * @param int|NULL $gcl_id
  1064.      * @param string|NULL $date
  1065.      * @return array|mixed
  1066.      * @throws \Exception
  1067.      */
  1068.     public function getGoodsStock(int $goods_id NULLbool $is_matrix falseint $jan_id NULLint $gp_id NULLint $gcl_id NULLstring $date NULL)
  1069.     {
  1070.         return $this->getCached(function () use ($goods_id$is_matrix$jan_id$gp_id$gcl_id$date) {
  1071.             //
  1072.             return GoodsWithRelated::getStockById($goods_id$is_matrix$jan_id$gp_id$gcl_id$date);
  1073.         });
  1074.     }
  1075.     // 売れ筋カラー取得
  1076.     public function getSellingColorSql($goods_id$goods_count)
  1077.     {
  1078.         $limit = (int)($goods_count 5);
  1079.         $strSql "SELECT * FROM (
  1080.                     SELECT *
  1081.                     FROM `selling_color_count_table`
  1082.                     WHERE `scc_goods_id` = " $goods_id "
  1083.                     ORDER BY `scc_amount` desc
  1084.                 ) as data
  1085.                 limit " $limit;
  1086.         $temp_list = (new SqlService())
  1087.             ->Sql($strSql)
  1088.             ->FetchAll();
  1089.         $selling_list = array();
  1090.         foreach ((array)$temp_list as $selling) {
  1091.             $selling_list[$selling['scc_gcl']] = $selling;
  1092.         }
  1093.         return $selling_list;
  1094.     }
  1095.     // 商品色
  1096.     public function getGoodsColorSelectSql($goods_id)
  1097.     {
  1098.         //
  1099.         return $this->getCached(function () use ($goods_id) {
  1100.             $strSql "SELECT
  1101.                         *
  1102.                         FROM (
  1103.                             SELECT
  1104.                                 gcl_id
  1105.                             ,    gcl_display
  1106.                             ,    color_id
  1107.                             ,    color_display
  1108.                             ,    color_name
  1109.                             ,    color_rgb
  1110.                             FROM goods_table
  1111.                             LEFT JOIN goods_color_table ON goods_id = gcl_goods AND gcl_display_status = 1
  1112.                             LEFT JOIN color_table ON color_id = gcl_color_id
  1113.                             WHERE goods_id = {$goods_id}
  1114.                         ) AS `goods`
  1115.                         ORDER BY
  1116.                             gcl_display
  1117.                         ,    color_display
  1118.                         ,    CAST( color_name AS binary )";
  1119.             $data = (new SqlService())
  1120.                 ->Sql($strSql)
  1121.                 ->FetchAll();
  1122.             if (is_null($data)) {
  1123.                 return false;
  1124.             }
  1125.             $tmpRow 0;
  1126.             $color_array = array();
  1127.             foreach ($data as $row) {
  1128.                 $tmpRow++;
  1129.                 $color_array[$tmpRow 1]['gcl_id'] = $row['gcl_id'];
  1130.                 $color_array[$tmpRow 1]['color_name'] = $row['color_name'];
  1131.                 $color_array[$tmpRow 1]['color_rgb'] = $row['color_rgb'];
  1132.             }
  1133.             return $color_array;
  1134.         });
  1135.     }
  1136.     // 商品サイズ
  1137.     public function getGoodsSizeListById($goods_id)
  1138.     {
  1139.         //
  1140.         return $this->getCached(function () use ($goods_id) {
  1141.             $strSql "SELECT *,
  1142.                 (CASE WHEN cp_price IS NOT NULL AND cp_price > 0 THEN cp_price ELSE ROUND(gp_price2 * (1+ 10/100)) END) as gp_price
  1143.                 FROM goods_price_table
  1144.                 INNER JOIN size_table ON gp_size_id = size_id
  1145.                 LEFT JOIN campaign_price_table ON cp_gp = gp_id AND `cp_end_datetime` >= NOW() and `cp_start_datetime` <= NOW() and cp_del_flg =0
  1146.                 WHERE gp_goods = {$goods_id}
  1147.                 AND ( gp_display IS NULL OR ( gp_display IS NOT NULL AND gp_display != 99 ) )
  1148.                 ORDER BY gp_display,size_display";
  1149.             $data = ((array)((new SqlService())
  1150.                 ->Sql($strSql)
  1151.                 ->FetchAll()));
  1152.             $tmpArray1 = [];
  1153.             $tmpArray2 = [];
  1154.             foreach ($data as $row) {
  1155.                 $tmpArray1[$row['gp_id']] = $row['size_name'];
  1156.                 $tmpArray2[$row['gp_id']]['gp_price'] = $row['gp_price'];
  1157.             }
  1158.             // サイズ名で並び替え
  1159.             $tmpRow 0;
  1160.             $size_array = array();
  1161.             foreach ($tmpArray1 as $key => $val) {
  1162.                 $tmpRow++;
  1163.                 $size_array[$tmpRow 1]['gp_id'] = $key;
  1164.                 $size_array[$tmpRow 1]['size_name'] = $val;
  1165.                 $size_array[$tmpRow 1]['gp_price'] = $tmpArray2[$key]['gp_price'];
  1166.             }
  1167.             return $size_array;
  1168.         });
  1169.     }
  1170.     /**
  1171.      * 商品規格1(=商品カラー)より、商品サイズ一覧(在庫情報含む)を取得する
  1172.      *
  1173.      * @param ClassCategory $classCategory1
  1174.      * @return mixed
  1175.      * @throws \ReflectionException
  1176.      */
  1177.     public function getGoodsSizeListWithStockInfoByClassCategory1(ClassCategory $classCategory1)
  1178.     {
  1179.         //
  1180.         return $this->getCached(function () use ($classCategory1) {
  1181.             $classCategoryId $classCategory1->getId();
  1182.             $classCategoryNameId $classCategory1->getClassName()->getId();
  1183.             $dbConvertConfig $this->LmHelper->getConfig('DbConvert');
  1184.             $AddIdNum = (int)$dbConvertConfig['ProductClassCategory']['offset'][$classCategoryNameId];
  1185.             $gclId $classCategoryId $AddIdNum;
  1186.             return $this->getGoodsSizeListWithStockInfoByGclId($gclId);
  1187.         });
  1188.     }
  1189.     /**
  1190.      * 商品カラーIDより、商品サイズ一覧(在庫情報含む)を取得する
  1191.      *
  1192.      * @param int $gclId 商品カラーID (=dtb_product_class.class_category1 - $offset)
  1193.      * @return mixed
  1194.      * @throws \ReflectionException
  1195.      */
  1196.     public function getGoodsSizeListWithStockInfoByGclId($gclId)
  1197.     {
  1198.         //
  1199.         return $this->getCached(function () use ($gclId) {
  1200.             //
  1201.             $sizeList = [];
  1202.             //
  1203.             $goodsId = (new GoodsColor($gclId))->getGoods()->getGoodsId();
  1204.             //
  1205.             $skuList array_filter(SkuWithPrice::getInstanceList($goodsId), function ($sku) use ($gclId) {
  1206.                 //
  1207.                 return $sku->getGclId() === (int)$gclId;
  1208.             });
  1209.             //
  1210.             $sokujitsuHassouList $this->getGoodsSameDayShipping($goodsIdtrue);
  1211.             //
  1212.             foreach ($skuList as $sku) {
  1213.                 //
  1214.                 $gpId $sku->getGpId();
  1215.                 //
  1216.                 if (!isset($sizeList[$gpId])) {
  1217.                     //
  1218.                     $sizeList[$gpId] = [
  1219.                         'gp_id' => $gpId,
  1220.                         'size_name' => $sku->getSizeName(),
  1221.                         'gp_price' => $sku->getPriceInTax(),
  1222.                         'disabled' => 0,
  1223.                     ];
  1224.                 }
  1225.                 //
  1226.                 if ($sku->isNoDisplay()) {
  1227.                     $sizeList[$gpId]['size_name'] = "{$sizeList[$gpId]['size_name']} - 購入不可";
  1228.                     $sizeList[$gpId]['disabled'] = 1// 無効フラグ = 「1: 無効」
  1229.                 } else if ($sku->getIsYoyakuAvailable() || $sku->getIsBichikuYoyakuAvailable()) {
  1230.                     //
  1231.                     $sizeList[$gpId]['size_name'] = "{$sizeList[$gpId]['size_name']} - 予約";
  1232.                 } else if ($sokujitsuHassouList[$gclId][$gpId] > SokujitsuHassou::FLG_NONE) {
  1233.                     //
  1234.                     $sizeList[$gpId]['size_name'] = "{$sizeList[$gpId]['size_name']} - 即日発送";
  1235.                 } else if (!is_numeric($sku->getStockTotal())) {
  1236.                     // 在庫あり(「*」)
  1237.                     // no operation.
  1238.                 } else if ($sku->getStockTotal() > 0) {
  1239.                     // 在庫あり
  1240.                     // no operation.
  1241.                 } else {
  1242.                     $sizeList[$gpId]['size_name'] = "{$sizeList[$gpId]['size_name']} - 在庫切れ";
  1243.                     $sizeList[$gpId]['disabled'] = 1// 無効フラグ = 「1: 無効」
  1244.                 }
  1245.             }
  1246.             //
  1247.             return $sizeList;
  1248.         });
  1249.     }
  1250.     /**
  1251.      * 商品に対応する加工種別の取得
  1252.      *
  1253.      * @param int $id
  1254.      * @return false|int
  1255.      */
  1256.     public static function getEnableEstimateTypeById($id)
  1257.     {
  1258.         //
  1259.         return (new GoodsExtended($id))
  1260.             ->getAvailableEstimateType() ?: false
  1261.         ;
  1262.     }
  1263.     /**
  1264.      * 指定されたJANコードID(=商品規格ID)リスト中、加工可能(裾上げ)商品を含むか否かを返す
  1265.      *
  1266.      * @param int[] $janIdList
  1267.      * @return bool
  1268.      */
  1269.     public static function isSusoageExistInJanIdList($janIdList)
  1270.     {
  1271.         //
  1272.         return (bool)(array_filter($janIdList, function ($janId) {
  1273.             //
  1274.             return (GoodsExtended::createByJanId($janId))->isSusoageAvailable();
  1275.         }));
  1276.     }
  1277.     /**
  1278.      * 指定されたJANコードID(=商品規格ID)リスト中、加工可能(裾上げ以外)商品を含むか否かを返す
  1279.      *
  1280.      * @param int[] $janIdList
  1281.      * @return bool
  1282.      */
  1283.     public static function isNairePrintExistInJanIdList($janIdList)
  1284.     {
  1285.         //
  1286.         return (bool)(array_filter($janIdList, function ($janId) {
  1287.             //
  1288.             return (GoodsExtended::createByJanId($janId))->isNairePrintAvailable();
  1289.         }));
  1290.     }
  1291.     /**
  1292.      * 指定されたJANコードID(=商品規格ID)リスト中、加工可能(共栄)商品を含むか否かを返す
  1293.      *
  1294.      * @param int[] $janIdList
  1295.      * @return bool
  1296.      */
  1297.     public static function isKyoueiExistInJanIdList($janIdList)
  1298.     {
  1299.         //
  1300.         return (bool)(array_filter($janIdList, function ($janId) {
  1301.             //
  1302.             return (GoodsExtended::createByJanId($janId))->isKyouei();
  1303.         }));
  1304.     }
  1305.     /**
  1306.      * 指定されたJANコードID(=商品規格ID)リスト中、加工可能(共栄以外)商品を含むか否かを返す
  1307.      *
  1308.      * @param int[] $janIdList
  1309.      * @return bool
  1310.      */
  1311.     public static function isNairePrintWithKyoueiExistInJanIdList($janIdList)
  1312.     {
  1313.         //
  1314.         return (bool)(array_filter($janIdList, function ($janId) {
  1315.             //
  1316.             return ($goods GoodsExtended::createByJanId($janId))
  1317.                 && $goods->isNairePrintWithKyoueiAvailable()
  1318.             ;
  1319.         }));
  1320.     }
  1321.     /**
  1322.      * @param int[] $janIdList
  1323.      * @return bool
  1324.      */
  1325.     public static function isNairePrintWithoutKyoueiExistInJanIdList($janIdList)
  1326.     {
  1327.         //
  1328.         return (bool)(array_filter($janIdList, function ($janId) {
  1329.             //
  1330.             return ($goods GoodsExtended::createByJanId($janId))
  1331.                 && $goods->isNairePrintWithoutKyoueiAvailable()
  1332.                 ;
  1333.         }));
  1334.     }
  1335.     /**
  1336.      * JANコードID(=商品規格ID)より、SKU情報を取得する
  1337.      *
  1338.      * @param int $janId JANコードID(=`dtb_product_class`.`id`).
  1339.      * @return mixed
  1340.      * @throws \ReflectionException
  1341.      */
  1342.     public function getSkuInfoByJanId($janId)
  1343.     {
  1344.         return $this->getCached(function () use ($janId) {
  1345.             return (new SqlService())
  1346.                 ->Select('T1.gcl_id, T2.gp_id, T.*')
  1347.                 ->Table('jancode_table')
  1348.                 ->Join('goods_color_table''T1.gcl_id = T.jan_color''INNER')
  1349.                 ->Join('goods_price_table''T2.gp_id = T.jan_price''INNER')
  1350.                 ->Set('jan_id'$janId)
  1351.                 ->Find();
  1352.         });
  1353.     }
  1354.     /**
  1355.      * @param $lmOrderId
  1356.      * @return array|null
  1357.      */
  1358.     public function getSkuListByOrderId($lmOrderId)
  1359.     {
  1360.         //
  1361.         $result = (new SqlService())
  1362.             ->Select('T.oh_shubetsu, T3.jan_id, T2.ogl_amount')
  1363.             ->Table('order_header_table')
  1364.             ->Join('order_list_table''T.oh_id = T1.ol_oh')
  1365.             ->Join('order_goods_list_table''T.oh_id = ogl_oh AND T1.ol_id = T2.ogl_ol')
  1366.             ->Join('jancode_table''T3.jan_goods = T1.ol_goods AND T3.jan_color = T2.ogl_gcl AND T3.jan_price = T2.ogl_gp')
  1367.             ->Set('T.oh_id'$lmOrderId)
  1368.             ->Set('T3.jan_ddate''NULL')
  1369.             ->FindAll();
  1370.         //
  1371.         return $result;
  1372.     }
  1373.     /**
  1374.      * @param $goodsIds
  1375.      * @return array|null
  1376.      */
  1377.     public function getGoodsListByIds($goodsIds$data$an_v)
  1378.     {
  1379.         $sql "SELECT
  1380.                     goods_id
  1381.                 ,   goods_canonical_hinban
  1382.                 ,   goods_icon1
  1383.                 ,   goods_icon2
  1384.                 ,   goods_icon3
  1385.                 ,   goods_icon4
  1386.                 ,   goods_icon5
  1387.                 ,   goods_maker_uresuji
  1388.                 ,   gcl.rgb_list
  1389.                 ,   gp1.gp_kataban
  1390.                 ,   gp2.mi
  1391.                 ,   gp2.min_teika_intax as gp_teika
  1392.                 ,   gi0.gi_id AS gi0_id
  1393.                 FROM
  1394.                     goods_table
  1395.                 LEFT JOIN (
  1396.                     SELECT gcl_goods AS goods_id, GROUP_CONCAT(color_rgb ORDER BY CAST( color_name AS BINARY ) SEPARATOR ',') AS rgb_list
  1397.                     FROM
  1398.                         goods_color_table
  1399.                     INNER JOIN
  1400.                         color_table ON gcl_color_id = color_id
  1401.                     WHERE gcl_goods IN ({$goodsIds}) AND gcl_display_status = 1
  1402.                     GROUP BY gcl_goods
  1403.                 ) AS gcl using (goods_id)
  1404.                 LEFT JOIN (
  1405.                     SELECT gp_goods AS goods_id, gp_kataban
  1406.                     FROM goods_price_table
  1407.                     INNER JOIN (
  1408.                         SELECT MIN(gp_id) AS gp_id
  1409.                         FROM goods_price_table
  1410.                         WHERE gp_goods IN ({$goodsIds})
  1411.                         GROUP BY gp_goods
  1412.                     ) gp_min using (gp_id)
  1413.                     WHERE gp_goods IN ({$goodsIds})
  1414.                 ) AS gp1 using (goods_id)
  1415.                 LEFT JOIN (
  1416.                     SELECT gp_goods AS goods_id,
  1417.                     (CASE WHEN cp_price IS NOT NULL AND cp_price > 0 THEN MIN(cp_price/1.10) ELSE MIN(gp_price2) END) as mi,
  1418.                     MIN(gp_teika) as min_teika_intax
  1419.                     FROM goods_price_table
  1420.                     LEFT JOIN campaign_price_table ON cp_gp = gp_id AND `cp_end_datetime` >= NOW() and `cp_start_datetime` <= NOW() and cp_del_flg =0
  1421.                     WHERE gp_goods IN ({$goodsIds}) AND (gp_display != 99 OR gp_display IS NULL)
  1422.                     GROUP BY gp_goods
  1423.                 ) AS gp2 using (goods_id)
  1424.                 LEFT JOIN (
  1425.                     SELECT gi_goods AS goods_id, MAX(gi_id) AS gi_id
  1426.                     FROM goods_image_table
  1427.                     WHERE gi_goods IN ({$goodsIds}) AND gi_display = 0
  1428.                     GROUP BY gi_goods
  1429.                 ) AS gi0 using (goods_id)
  1430.                 WHERE goods_id IN ({$goodsIds})";
  1431.         $tempGoodsList = ((array)((new SqlService())
  1432.         ->Sql($sql)
  1433.         ->FetchAll()));
  1434.         $goodsList = array();
  1435.         foreach ($tempGoodsList as $goods) {
  1436.             $goodsList[$goods['goods_id']] = $goods;
  1437.         }
  1438.         for ($i 1$i <= count($data['item']); $i++) {
  1439.             $data['item'][$an_v[$i 1]]['goods_canonical_hinban'] = $goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['goods_canonical_hinban'];
  1440.             $data['item'][$an_v[$i 1]]['gi0_id'] = $goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['gi0_id'];
  1441.             $data['item'][$an_v[$i 1]]['color_list'] = array();
  1442.             foreach (explode(','$goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['rgb_list']) as $colorCount => $rgb) {
  1443.                 $data['item'][$an_v[$i 1]]['color_list'][] = $rgb == '' '#111111' '#'.$rgb;
  1444.             }
  1445.             $data['item'][$an_v[$i 1]]['color_count'] = $colorCount 1;
  1446.             $data['item'][$an_v[$i 1]]['price'] = $goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['mi'];
  1447.             $data['item'][$an_v[$i 1]]['teika'] =
  1448.                 isset($goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['gp_teika']) && !empty($goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['gp_teika']) ? $goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['gp_teika'] : null;
  1449.             $data['item'][$an_v[$i 1]]['goods_maker_uresuji'] = $goodsList[$data['item'][$an_v[$i 1]]['goods_id']]['goods_maker_uresuji'];
  1450.         }
  1451.         return $data['item'];
  1452.     }
  1453.     /**
  1454.      * @param boolean $createNewFlg
  1455.      * @return array|null
  1456.      */
  1457.     public function getGoodsVendingStatusMap($createNewFlg false) {
  1458.         $filename self::VENDING_LIST_FOLDER self::VENDING_LIST_FILENAME;
  1459.         $goodsVendingStatusList = [];
  1460.         if ($createNewFlg) {
  1461.             $goodsVendingStatusList $this->createGoodsVendingFile();
  1462.         } else {
  1463.             if (file_exists($filename)) {
  1464.                 $json file_get_contents($filename);
  1465.                 $goodsVendingStatusList json_decode($jsontrue);
  1466.             } else {
  1467.                 $goodsVendingStatusList $this->createGoodsVendingFile();
  1468.             }
  1469.         }
  1470.         $vendingStatusMap = [];
  1471.         if ($goodsVendingStatusList) {
  1472.             foreach ($goodsVendingStatusList as $row) {
  1473.                 $vendingStatusMap[(int)$row['goods_id']] = (int)$row['goods_vending_status'];
  1474.             }
  1475.         }
  1476.         return $vendingStatusMap;
  1477.     }
  1478.     protected function createGoodsVendingFile () {
  1479.         $filename self::VENDING_LIST_FOLDER self::VENDING_LIST_FILENAME;
  1480.         $goodsVendingStatusList $this->dynamicConverter->getGoodsVendingStatusList();
  1481.         $encoded json_encode($goodsVendingStatusList);
  1482.         mkdir(self::VENDING_LIST_FOLDER0777true);
  1483.         file_put_contents($filename$encoded);
  1484.         return $goodsVendingStatusList;
  1485.     }
  1486. }