<?php
/**
* 对外接口:/data_trans/product/*
*/
namespace App\Controller\DataTrans;
use App\Controller\Validator\CommonSignatureAppValidator;
use App\Service\CommonService;
use Common\Crisp\CrispItem\ProductItem;
use Common\DataSynch\Crisp\Model\CrispCommodityModel;
use Common\DataTrans\Crisp\Model\CrispProductModel;
use Common\Helper\SimplifyAsSnakeArray\SimplifyAsSnakeArrayHelper;
use Common\PimcoreHelper\ControllerHelper\BaseJsonController;
use Common\Signature\Exception\BaseSignatureException;
use Pimcore\Db;
use Pimcore\Model\DataObject\CrispCommodity;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use function array_intersect;
use function array_values;
class ProductController extends BaseJsonController{
/**
* @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_product_id_list")
* @throws BaseSignatureException
*/
function getProductIdList(Request $request):Response{
(new CommonSignatureAppValidator())->validateRequest($request);
$input=[];
$body=function(array $input):array{
$allowedProductIdList=CrispCommodityModel::getArticleIdListByArticleStatusAllowed();
$productIdList=CrispProductModel::getOrderKeyAscList();
$finalList=array_values(array_intersect($productIdList,$allowedProductIdList));
return [
'product_id_list'=>$finalList,
];
};
$res=$this->run($input,$body);
return $res;
}
/**
* @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_product_list")
* @throws BaseSignatureException
*/
function getProductList(Request $request):Response{
(new CommonSignatureAppValidator())->validateRequest($request);
$productIdList=$request->get('product_id_list')??[];
$input=[
'product_id_list'=>$productIdList,
];
$body=function(array $input):array{
$allowedProductIdList=CrispCommodityModel::getArticleStatusAllowedArticleIdListByArticleIdList($input['product_id_list']);
$pimcoreObjectList=CrispProductModel::getListByProductIdList($allowedProductIdList);
$parserObjectList=ProductItem::dataObjectListExportToInstanceList($pimcoreObjectList);
$finalList=SimplifyAsSnakeArrayHelper::simplifyAsSnakeArrayMass($parserObjectList);
return [
'product_list'=>$finalList,
];
};
$res=$this->run($input,$body);
return $res;
}
/**
* @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_commodity_list")
* @throws BaseSignatureException
*/
function getCommodityList(Request $request):Response{
(new CommonSignatureAppValidator())->validateRequest($request);
$params = $request->request->all();
$page = intval($params['page']??1);
$limit = intval($params['limit']??10);
$offset = ($page-1) * $limit;
$listing = new CrispCommodity\Listing();
$listing->filterByShelfCategoryId(10000, '>=');
if(!empty($params['product_id'])) {
$listing->filterByArticleId($params['product_id']);
}
$list = $listing->getItems($offset, $limit);
$data = [];
foreach($list as $commodity) {
$item = [];
$item['basic'] = [
'物料号'=>$commodity->getArticleId(),
'物料名称'=>$commodity->getArticleDescription(),
'公司'=>$commodity->get('companyCode'),
'可售状态'=>$commodity->get('articleStatus'),
'ERP状态'=>$commodity->get('erpStatus'),
'Product Key'=>$commodity->get('productKey'),
'Category Group'=>$commodity->get('categoryGroup'),
'OrigId'=>$commodity->get('origId'),
'表价'=>$commodity->get('listPrice'),
'销售价格单位'=>$commodity->get('listPriceUnit'),
'销售单位'=>$commodity->get('uomIso'),
'交付时间'=>$commodity->get('plannedDeliveryTime'),
'替换物料号'=>$commodity->get('replacementArticleId'),
'产品线'=>$commodity->get('productlineId'),
'产品线描述'=>$commodity->get('productlineDesc'),
'BA'=>$commodity->get('productSegment'),
'BU'=>$commodity->get('productBu'),
'产品类型'=>$commodity->get('versionRevisionTypeSap'),
'国产/进口'=>$commodity->get('importFlag'),
'最小整包装PAC'=>$commodity->get('packingQuantity'),
'最小起订量'=>$commodity->get('minimumOrderQuantity'),
'原产地'=>$commodity->get('countryOfOrigin'),
'计划策略组'=>$commodity->get('strategyGroupSap'),
'净重'=>$commodity->get('netWeight'),
'毛重'=>$commodity->get('grossWeight'),
'重量单位'=>$commodity->get('weightUnit'),
'货币单位'=>$commodity->get('currency')
];
$fileters = [];
$prodFileters = json_decode($commodity->getFilters(), true);
foreach ($prodFileters as $k=>$val) {
$fileters[LOCALFIELDS[$k]] = $val;
}
// global 属性补充
$assetInfo = [];
if($commodity->getMainImage()) {
$assetInfo[] = ['assetType'=>"picture", 'subtype'=>'subtypeLabel', 'subtypeLabel'=>"产品图", 'url'=>$commodity->getMainImage()];
}
$item['assetInfo'] = $assetInfo;
//$commodity = new CrispCommodity();
$item['shelfCategoryId'] = $commodity->getShelfCategoryId();
$item['productTypeDescription'] = $commodity->getProductTypeDescription();
$item['productShortDescription'] = $commodity->getProductShortDescription();
$item['technicalDataGroup'] = [["sortId"=>"4","label"=>"产品属性"]];
$item['technicalData'] = [["groupSortId"=>"4", "subHeadline"=>"", "subTechnicalData"=>$fileters]];
$data[] = $item;
}
return $this->json([
'total'=>$listing->getTotalCount(),
'items'=>$data
]);
}
/**
* 可售状态下的物料号、产品名称、产品描述、产品主图
* @Symfony\Component\Routing\Annotation\Route("/data_trans/product/get_simple_commodity_list")
* @throws BaseSignatureException
*/
function getSimpleCommodityList(Request $request):Response{
// 换成秘钥的方式:ApiUrl?time=${10位时间戳}&sign=${算法生成的秘钥}
// 秘钥算法:md5(${10位时间戳} + IY2IJHYY58FRVL6LOPGFFE32HUEW9LJE)
$time = $request->query->get('time');
$sign = $request->query->get('sign');
if(!$time) {
return $this->rsps(false, '缺少参数:time');
}
if(!$sign) {
return $this->rsps(false, '缺少参数:sign');
}
$myTime = time();
if($time>$myTime) {
return $this->rsps(false, '请使用当前时间戳,不能使用未来的时间');
}
if($time<$myTime-600) {
return $this->rsps(false, '时间戳过期,不能超过10分钟.params:'.$time.'-server:'.$myTime);
}
$mySign = md5($time.'IY2IJHYY58FRVL6LOPGFFE32HUEW9LJE'); // 生成的秘钥小写32位
if($mySign!=$sign) {
return $this->rsps(false, '秘钥错误 '.$mySign);
}
$params = $request->request->all();
$page = $params['page'] ?? 1;
$page = intval($page) < 1 ? 1 : intval($page);
$limit = $params['limit'] ?? 10;
$limit = intval($limit) >100 ? 100 : intval($limit);
$offset = ($page-1)*$limit;
$order = 'a.o_id desc';
if(isset($params['order'])) {
if($params['order']=='old') {
$order = 'a.o_id asc';
}
}
$commodityClassId = CrispCommodity::classId();
$select = 'o_id id,articleId,articleDescription,mainImage, productTypeDescription,productShortDescription,productLongDescription,topFeatures';//shelfCategoryId
$sql = "select {$select} from object_{$commodityClassId} a where a.articleStatus=1 and a.o_published=1 ";
$sqlCount = "select count(1) ct from object_{$commodityClassId} a where a.articleStatus=1 and a.o_published=1 ";
if(!empty($params['id'])) {
$id = intval($params['id']);
$sql .= " and a.o_id = {$id}";
$sqlCount .= " and a.o_id = {$id}";
}
if(!empty($params['articleId'])) {
$articleId = trim(rawurldecode($params['articleId']));
$sql .= " and a.articleId = '{$articleId}'";
$sqlCount .= " and a.articleId = '{$articleId}'";
}
if(!empty($params['keyword'])) {
$keyword = '%'.trim($params['keyword']).'%';
$sql .= " and (a.productTypeDescription like :keyword or a.articleDescription like '{$keyword}')";
$sqlCount .= " and (a.productTypeDescription like :keyword or a.articleDescription like '{$keyword}')";
}
$sql .= " order by {$order} limit {$offset}, {$limit}";
$total = Db::get()->query($sqlCount)->fetchColumn();
$items = Db::get()->query($sql)->fetchAll(\PDO::FETCH_ASSOC);
return $this->rsps(true, 'success', [
'total'=>$total,
'items'=>$items
]);
}
}