$type, 'id' => $id]); return $res; } public static function decodeOrderNo($orderNo) { $supplierOrderNo = [ 'OR', 'PO', ]; $orderNoHead = substr($orderNo, 0, 2); if(in_array($orderNoHead, $supplierOrderNo)){ return self::STORE_TYPE_SUPPLIER; } return self::STORE_TYPE_STORE; } public static function orderStatusKey2Jst($status) { /** * 等待买家付款=WAIT_BUYER_PAY, * 等待卖家发货=WAIT_SELLER_SEND_GOODS(传此状态时实际支付金额即pay节点支付金额=应付金额ERP才会显示已付款待审核), * 等待买家确认收货=WAIT_BUYER_CONFIRM_GOODS, * 交易成功=TRADE_FINISHED, * 付款后交易关闭=TRADE_CLOSED, * 付款前交易关闭=TRADE_CLOSED_BY_TAOBAO; */ $arr = [ // Order::ORDER_FLOW_DEFAULT => 'WAIT_BUYER_PAY', Order::ORDER_FLOW_NO_SEND => 'WAIT_SELLER_SEND_GOODS', Order::ORDER_FLOW_SEND => 'WAIT_BUYER_CONFIRM_GOODS', Order::ORDER_FLOW_CONFIRM => 'TRADE_FINISHED', Order::ORDER_FLOW_CANCEL => 'TRADE_CLOSED', ]; return $arr[$status] ?? ''; } public static function api($store_id, $serveHttp, $params) { $config = self::conf($store_id); $apiRequest = new ApiRequest($config); $response = $apiRequest->request($serveHttp, $params); if(isset($response['code'])){ if($response['code'] == 100){ debug_log(['code==100', $response, $store_id], __CLASS__ . '.log'); self::setConfExpires($store_id); } } return $response; } public static function setConfExpires($store_id = 0) { $token = Option::get(OptionSetting::JU_SHUI_TAN_TOKEN, $store_id, self::$store_type)['value']; if($token){ $token = json_decode($token, true); $token['expires_in'] = time() - $token['refresh_time']; self::saveToken($store_id, $token); } } public static function conf($store_id = 0, $refresh = 0) { $cacheK = $store_id . self::$store_type; if(isset(self::$confs[$cacheK]) && !$refresh){ return self::$confs[$cacheK]; } $conf = Option::get(OptionSetting::JU_SHUI_TAN, 0, 'saas')['value']; if($conf){ $conf = json_decode($conf, true); $conf['baseUrl'] = self::$baseUrl; if(strpos($_SERVER['SCRIPT_FILENAME'], 'quanqudao.we10.cn')){ $conf['baseUrl'] = self::$baseUrlDev; } $url_callback = ''; if (\Yii::$app instanceof \yii\web\Application){ $url_callback = \Yii::$app->request->hostInfo . '/index.php/jushuitan/callback'; } $conf['url_callback'] = $url_callback; $access_token = ''; $refresh_token = ''; $token = Option::get(OptionSetting::JU_SHUI_TAN_TOKEN, $store_id, self::$store_type)['value']; if($token){ $token = json_decode($token, true); $expires = $token['expires_in'] + $token['refresh_time'] < time(); if($token['access_token'] && !$expires){ $access_token = $token['access_token']; $refresh_token = $token['refresh_token']; } if($token['is_debug']){ $conf['baseUrl'] = self::$baseUrlDev; } } $conf['access_token'] = $access_token; $conf['refresh_token'] = $refresh_token; $conf['token_info'] = $token; $conf['__'] = [ '$store_type' => self::$store_type, '$store_id' => $store_id, ]; } self::$confs[$cacheK] = $conf; return $conf; } public static function saveConf($store_id = 0, $config = []) { $oldConf = Option::get(OptionSetting::JU_SHUI_TAN_TOKEN, $store_id, self::$store_type, '{}')['value']; $oldConf = json_decode($oldConf, true); $conf = array_merge($oldConf, $config); $set = Option::set(OptionSetting::JU_SHUI_TAN_TOKEN, json_encode($conf), $store_id, self::$store_type); self::conf($store_id, 1); return $set; } public static function saveToken($store_id = 0, $refreshToken = []) { $refreshToken['refresh_time'] = time(); return self::saveConf($store_id, $refreshToken); } public static function getConf($store_id = 0, $key = '') { $config = self::conf($store_id); if(empty($config['token_info'])){ return ''; } return $config['token_info'][$key]; } public static function code2token($store_id = 0, $code = '') { $config = self::conf($store_id); $Auth = new Auth($config); $refreshToken = $Auth->getAccessToken($code); if($refreshToken['code'] != 0){ debug_log([__FUNCTION__, __LINE__, $store_id, $code, $refreshToken], __CLASS__ . '.log'); return $refreshToken; } self::saveToken($store_id, $refreshToken['data']); // self::cat2Jst($store_id, 0, -1); return $refreshToken; } public static function refreshToken($store_id = 0) { if(!self::isopen($store_id)){ return; } $config = self::conf($store_id); $Auth = new Auth($config); $refreshToken = $Auth->refreshToken($config['refresh_token']); debug_log([__FUNCTION__, __LINE__, $store_id, $refreshToken], __CLASS__ . '.log'); if($refreshToken['code'] != 0){ debug_log([__FUNCTION__, __LINE__, $store_id, $refreshToken], __CLASS__ . '.log'); return $refreshToken; } self::saveToken($store_id, $refreshToken['data']); return $refreshToken; } public static function checkUrlSign($store_id, $get = []) { $config = self::conf($store_id); $Auth = new Auth($config); $sign = Util::getSign($Auth->getConfig()['app_Secret'],$get); if($sign == $get['sign']){ return true; } return false; } public static function isopen($store_id = 0) { $config = self::conf($store_id); if($store_id <= 0){ return $config; } return empty($config['access_token']) ? 0 : 1; } public static function createUrl($store_id = 0) { try{ if(!self::isopen(0)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $config = self::conf($store_id); $Auth = new Auth($config); $data = [ 'state' => self::encodeState($store_id, self::$store_type), 'app_key' => $Auth->getConfig()['app_Key'], 'timestamp' => time(), 'charset' => $Auth->getConfig()['charset'] ]; $sign = Util::getSign($Auth->getConfig()['app_Secret'],$data); $url = $Auth->getConfig()['authUrl'] . '?sign=' . $sign . '&' . http_build_query($data); return [ 'code' => 0, 'data' => $url, ]; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function oAuth($app_key, $code, $state) { try{ if($state){ $state = self::decodeState($state); } $store_id = $state['id']; if($state['type'] == self::STORE_TYPE_STORE){ $store = Store::findOne(['is_delete' => 0, 'id' => $store_id]); } if($state['type'] == self::STORE_TYPE_SUPPLIER){ $store = Supplier::findOne(['is_delete' => 0, 'id' => $store_id]); } if (!$store || empty($app_key) || empty($code)) { \Yii::error('<====================>授权回调 参数错误, 参数为:' . json_encode(all_params())); echo '授权失败,参数错误'; return; } self::initStoreType($state['type']); if(!self::checkUrlSign($store_id, all_params())){ \Yii::error('<====================>授权回调 Sign参数错误, 参数为:' . json_encode(all_params())); echo '授权失败,参数错误,签名错误'; return; } $res = self::code2token($store_id, $code); if ($res['code'] != 0) { \Yii::error('<====================> token解析失败, 参数为:' . json_encode($res)); echo '授权失败,token解析失败,错误信息:' . $res['msg']; return; } echo '授权成功!'; return; } catch (\Exception $ex) { \Yii::error($ex); echo $ex->getMessage(); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function gid2Jst($id) { return 'cyy_' . $id; } public static function skuid2Jst($store_id, $goods, $goods_attr_item = []) { $attr_ids = array_column($goods_attr_item['attr_list'] ?? $goods_attr_item, 'attr_id'); sort($attr_ids); $sku_attr_ids = implode('_', $attr_ids); $attrs = json_decode($goods['attr'], true); $sku_attr = []; foreach($attrs as $attr){ $attr_ids = array_column($attr['attr_list'], 'attr_id'); sort($attr_ids); $item_attr_ids = implode('_', $attr_ids); if($item_attr_ids === $sku_attr_ids){ $sku_attr = $attr; } } // $skuRule = self::getConf($store_id, 'skuRule'); // if($skuRule == 0){ // return self::skuid2Jst1($goods, $sku_attr); // } // if($skuRule == 2){ // return self::skuid2Jst2($goods, $sku_attr); // } return self::skuid2Jst2($goods, $sku_attr); } public static function skuid2Jst1($goods, $goods_attr_item = []) { $attr_ids = array_column($goods_attr_item['attr_list'] ?? $goods_attr_item, 'attr_id'); sort($attr_ids); return 'cyy_' . $goods['id'] . '_' . implode('_', $attr_ids); } public static function skuid2Jst2($goods, $goods_attr_item = []) { return $goods_attr_item['no']; } public static function skuv2Jst($id, $goods_attr_item = []) { $attr_names = array_column($goods_attr_item['attr_list'] ?? $goods_attr_item, 'attr_name', 'attr_id'); return implode(';', array_values($attr_names)); } public static function __queryJstGoods($store_id = 0, $goods_ids = []) { try{ if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } if(!$goods_ids){ throw new \Exception('查询参数为空'); } foreach($goods_ids as &$item){ $item = self::gid2Jst($item); } $data = [ 'i_ids' => $goods_ids, ]; $response = self::api($store_id, ServeHttp::QUERY_MALL_ITEM,$data); return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function queryJstGoodsQty($store_id = 0, $i_ids = []) { try{ if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $query['i_ids'] = implode(',', $i_ids); $response = self::api($store_id, ServeHttp::QUERY_INVENTORY,$query); if($response['data'] && $response['data']['inventorys']){ foreach($response['data']['inventorys'] as &$qtyList){ //可用数:可用数[同步线上的库存数]=主仓实际库存-订单占有数+虚拟库存+采购在途(业务设置)+进货仓(业务设置)+销退仓库存(业务设置) $qtyList['__online_qty'] = $qtyList['qty'] - $qtyList['order_lock'] + $qtyList['virtual_qty'] + $qtyList['purchase_qty'] + $qtyList['in_qty'] + $qtyList['return_qty']; if($qtyList['__online_qty'] < 0){ $qtyList['__online_qty'] = 0; } } } $response['query'] = $query; return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function syncStoreJstGoodsQty($store_id, $goods) { //先更新对应云仓聚水潭商品 if($goods->cloud_goods_id){ $supplier = Supplier::findOne(['cloud_supplier_id' => $goods->cloud_supplier_id, 'is_delete' => 0, 'status' => 1]); if($supplier){ self::syncSupplierJstGoodsQty($supplier->id, $goods->cloud_goods_id, $store_id, $goods); $goods->refresh(); return; } } if(empty($goods->jst_goods_id)){ return; } $attr_group_list = json_decode($goods->attr, true); if(empty($goods['jst_supplier_id'])){ $qtyRes = self::queryJstGoodsQty($store_id, [$goods['goods_no']]); }else{ // $qtyRes = self::queryJstSupplierGoodsQty($store_id, $goods['jst_supplier_id'], ['style_codes' => $goods['goods_no']]); $jstSupplierGoods = self::queryJstSupplierGoods($store_id, $goods['goods_no']); if($jstSupplierGoods['code'] != 0){ return; } $qtyRes = $jstSupplierGoods['data']['__qty']; } $qtySkus = []; $updateAttrList = []; foreach($attr_group_list as &$attr_info){ $qty = 0; if($qtyRes['data']['list']){ foreach($qtyRes['data']['list'] as $iqty){ if($iqty['item_code'] == $attr_info['no']){ $qty = $iqty['stock']; break; } } } if($qtyRes['data']['inventorys']){ foreach($qtyRes['data']['inventorys'] as $iqty){ if($iqty['sku_id'] == $attr_info['no']){ $qty = $iqty['__online_qty']; break; } } } $lockNum = self::lockLocalJstGoodsNumGet($store_id, $goods, $attr_info); $qty -= $lockNum; if($qty != $attr_info['num']){ $updateAttrList[] = [ 'attr_id_list' => array_column($attr_info['attr_list'], 'attr_id'), 'num' => $qty - $attr_info['num'], ]; $attr_info['num'] = $qty; } } if($updateAttrList){ $goods->numAdd($updateAttrList, 0); $goods['attr'] = json_encode($attr_group_list); debug_log([__FUNCTION__, '更新库存',$store_id, $goods['id'], $updateAttrList, $res, self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); }else{ debug_log([__FUNCTION__, '无需更新库存',$store_id, $goods['id'], $updateAttrList, $res, self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); } } public static function syncSupplierJstGoodsQty($supplier_id, $goods, $store_id = 0, $store_goods = null) { self::initStoreType(self::STORE_TYPE_SUPPLIER); if(is_int($goods) || is_string($goods)){ $gid = $goods; $glist = (new PlatformForm(['id' => $gid]))->goodsInfo(); if($glist['code'] == 0 && $glist['data']['count'] == 1){ $goods = $glist['data']['list'][0]; }else{ throw new \Exception('云仓接口:' . $glist['msg']); } $goods['attr'] = $goods['attrs']; } if(empty($goods['jst_goods_id'])){ return $goods; } $goods['__attrs'] = $goods['attrs']; $attr_group_list = json_decode($goods['attrs'], true); if(empty($goods['jst_supplier_id'])){ $qtyRes = self::queryJstGoodsQty($supplier_id, [$goods['goods_no']]); }else{ // $qtyRes = self::queryJstSupplierGoodsQty($supplier_id, $goods['jst_supplier_id'], ['style_codes' => $goods['goods_no']]); $jstSupplierGoods = self::queryJstSupplierGoods($supplier_id, $goods['goods_no']); if($jstSupplierGoods['code'] != 0){ return; } $qtyRes = $jstSupplierGoods['data']['__qty']; } $store_goods_attr = (array)json_decode($store_goods['attr'], true); $updateAttrListStore = 0; $qtySkus = []; $updateAttrList = []; foreach($attr_group_list as &$attr_info){ $qty = 0; if($qtyRes['data']['list']){ foreach($qtyRes['data']['list'] as $iqty){ if($iqty['item_code'] == $attr_info['no']){ $qty = $iqty['stock']; break; } } } if($qtyRes['data']['inventorys']){ foreach($qtyRes['data']['inventorys'] as $iqty){ if($iqty['sku_id'] == $attr_info['no']){ $qty = $iqty['__online_qty']; break; } } } $lockNum = self::lockLocalJstGoodsNumGet($supplier_id, $goods, $attr_info); $qty -= $lockNum; if($qty != $attr_info['num']){ $updateAttrList[] = [ 'attr_id_list' => array_column($attr_info['attr_list'], 'attr_id'), 'num' => $qty - $attr_info['num'], ]; $attr_info['num'] = $qty; } foreach($store_goods_attr as $si => $sattr){ if($attr_info['no'] == $sattr['no']){ if($attr_info['num'] != $sattr['num']){ $updateAttrListStore = 1; $store_goods_attr[$si]['num'] = $attr_info['num']; } break; } } } if($updateAttrListStore || $updateAttrList){ $goods['attrs'] = json_encode($attr_group_list); $form = new SupplierForm(); $res = $form->setGoodsAttrNum($supplier_id, $goods['id'], $updateAttrList, $store_id); debug_log([__FUNCTION__, '更新云仓库存',$supplier_id, $goods['id'], $updateAttrList, $res, self::lockLocalJstGoodsNumList($supplier_id)], __CLASS__ . '.log'); }else{ debug_log([__FUNCTION__, '无需更新云仓库存',$supplier_id, $goods['id'], $updateAttrList, $res, self::lockLocalJstGoodsNumList($supplier_id)], __CLASS__ . '.log'); } return $goods; } public static function queryJstGoodsList($store_id = 0, $query = [], $get_qty = 0) { try{ $get_qty = $get_qty ? $get_qty : $query['get_qty']; if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } // $query['i_ids'] = ['cyy_2621']; // $query['item_flds'] = ['onsale']; // $query['only_item'] = true; $query['modified_begin'] = $query['modified_begin'] ?? date('Y-m-d 00:00:00', time() - 86400 * 6); $query['modified_end'] = $query['modified_end'] ?? date('Y-m-d 23:59:59'); if($query['i_ids']){ unset($query['modified_begin']); unset($query['modified_end']); } $response = self::api($store_id, ServeHttp::QUERY_MALL_ITEM,$query); if($response['code'] == 0 && $response['data']['data_count']){ foreach($response['data']['datas'] as &$item){ $item['qty'] = 0; if($get_qty){ $qty = self::queryJstGoodsQty($store_id, [$item['i_id']]); $item['__qty'] = $qty; } $item['pics'] = $item['pics'] ?? [$item['pic']]; $item['onsale'] = 0; if($item['skus']){ foreach($item['skus'] as &$v){ $v['properties_value'] = $v['properties_value'] ? : '默认'; if($v['enabled'] == 1){ $item['onsale'] = 1; } $v['qty'] = 0; if($get_qty && $qty['data']['inventorys']){ foreach($qty['data']['inventorys'] as $sku){ if($v['sku_id'] == $sku['sku_id']){ $v['qty'] = $sku['__online_qty']; } } } $item['qty'] += $v['qty']; } } $item['_attr'] = self::handleAttr($item); } } $response['query'] = $query; $response['_args'] = func_get_args(); $response['$get_qty'] = $get_qty; return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function queryJstGoods($store_id = 0, $i_id = '') { $query['i_ids'] = [$i_id]; $list = self::queryJstGoodsList($store_id, $query, 1); if($list['code'] != 0){ return $list; } if($list['data']['datas']){ return [ 'code' => 0, 'data' => $list['data']['datas'][0], ]; } return [ 'code' => 1, 'msg' => '商品未查到1', ]; } public static function queryJstSupplierGoodsList($store_id = 0, $jst_supplier_name = '', $query = [], $get_goods_info = 0, $get_qty = 0) { try{ $get_qty = $get_qty ? $get_qty : $query['get_qty']; $get_goods_info = $get_goods_info ? $get_goods_info : $query['get_goods_info']; if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $query['page_num'] = $query['page_num'] ?? 1; $query['page_size'] = $query['page_size'] ?? 20; //每页条数 最多100 $query['sort'] = 'DESC'; // $query['creator'] = '创建人'; // $query['style_code_list'] = ['cyy_2621']; //款号列表 精确搜索,一次最多20个 // $query['item_code_list'] = ['cyy_2621_602']; //商品编码 精确搜索,一次最多20个 // $query['item_name'] = '测试商品1'; //商品名称 模糊搜索 // $query['distributor_supplier_name'] = '代发供应商名称'; // $query['created_start_time'] = '2022-06-30 13:37:32'; // $query['created_end_time'] = '2022-06-30 13:37:32'; // $query['update_start_time'] = '2022-06-30 13:37:32'; // $query['update_end_time'] = '2022-06-30 13:37:32'; $jst_supplier_name && $query['distributor_supplier_name'] = $jst_supplier_name; $response = self::api($store_id, '/open/api/goods/inneropen/goods/querygoodslist',$query); // $response = json_decode('{"msg": null,"code": 0,"data": {"total": 126,"has_next": true,"list": [{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 7.9,"distributor_supplier_name": "湖南优点购商贸有限公司","created": "2024-03-11 12:57:55","style_code": "469865549258","item_name": "麻辣王子辣条零食网红小零食小吃批发零售独立包装休闲食品面筋","main_image_list": ["https://images.sursung.com/prod/pt/10968313/20231002/5710B7DCE9AF4838A2B241272C02DDA6_s182221_h800_w800.jpg","https://images.sursung.com/prod/pt/10968313/20231002/B51B392CDD5B4F26AF01DA4B5778CE29_s164513_h800_w800.jpg","https://images.sursung.com/prod/pt/10968313/20231002/2048ABE808B64640B6CC3C5EB5F2AFC9_s220785_h800_w800.jpg","https://images.sursung.com/prod/pt/10968313/20231002/58ED2CB6301345088CD75918D9628D5E_s144894_h800_w800.jpg","https://images.sursung.com/prod/pt/10968313/20231002/0F7409C0B4634758AF650BF412E53B92_s146490_h800_w800.jpg"],"min_cost_price": null,"item_spu_id": "C10592F30B0A4A63BD38EB4C9F52E69B","item_status": "distribution","distributor_status": true,"item_source": "FROM_SUP","distributor_co_id": "10968313","private_status": true,"updated": "2024-03-11 13:37:29","min_supply_price": 5},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 49,"distributor_supplier_name": "","created": "2024-03-07 16:55:12","style_code": "24260036030","item_name": "春季新款圆领纯棉休闲刺绣套头舒适卫衣66913 | 24260036030","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/C4B461F6770D484896E5EC0A3C6C5275_s194132_h1280_w1280.jpg"],"min_cost_price": 23,"item_spu_id": "7A96FC0F898F40B2A69EE9F6B083AC54","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 13:33:01","min_supply_price": 28},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 49,"distributor_supplier_name": "","created": "2024-03-07 16:55:12","style_code": "24260046030","item_name": "春季新款圆领纯棉休闲刺绣套头舒适卫衣66901 | 24260046030","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/96D0A81839A2493383B91ADC7B2B341C_s211325_h1280_w1280.jpg"],"min_cost_price": 23,"item_spu_id": "825D42C894DE45D1907E590F98E24338","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 12:25:39","min_supply_price": 28},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 49,"distributor_supplier_name": "","created": "2024-03-07 16:55:11","style_code": "24260076030","item_name": "春季新款圆领纯棉休闲刺绣套头舒适卫衣66922 | 24260076030","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/861BF4F2E8B649CD81E65D54A3626A38_s194411_h1280_w1280.jpg"],"min_cost_price": 23,"item_spu_id": "42EE1CDE64024140847658A7268625BA","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 11:47:00","min_supply_price": 28},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 49,"distributor_supplier_name": "","created": "2024-03-07 16:55:11","style_code": "24260056030","item_name": "春季新款圆领纯棉休闲刺绣套头舒适卫衣66903 | 24260056030","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/7C5F67FBFA4C43B99DDD4C530F1D6264_s204319_h1280_w1280.jpg"],"min_cost_price": 23,"item_spu_id": "656BA60B3B1B4201BBDC61B8B9B218E2","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 11:56:08","min_supply_price": 28},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 49,"distributor_supplier_name": "","created": "2024-03-07 16:55:11","style_code": "24260066030","item_name": "春季新款圆领纯棉休闲刺绣套头舒适卫衣66915 | 24260066030","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/0CA44A67A75C4BA7BD45DBB9B8D47769_s226359_h1280_w1280.jpg"],"min_cost_price": 24,"item_spu_id": "891E32837A464C8088393E1372DB89E8","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 13:11:22","min_supply_price": 29},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 48,"distributor_supplier_name": "","created": "2024-03-07 16:53:36","style_code": "24230136030","item_name": "H*家西裤男斜纹竹炭纤维舒适商务休闲男裤A12 | 24230136030","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/CCBE49C37EFB4FDAB99145A9A5C9E854_s186526_h1701_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/4B4D6D4BD9254F4EA488E20205A8FB96_s190233_h1631_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/50ADE8CA42BF47F3B5CAF915522A9B9A_s193943_h1649_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/CFC060FB235A4DDA85A2451CCBE066BB_s421984_h1526_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/C88B1FFDF79B451EB75AEB66ED74A8CF_s457301_h1615_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/64D05779E5A54E9D9E1E2A4F441BFDB4_s258059_h1358_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/A386322950034DB0AA233248055C7DA5_s322777_h1356_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/43A1754A18A144EF93925FE0BBD73144_s508934_h1364_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/16B5F14917624D3B82A3E8291397DF49_s215763_h685_w1260.jpg"],"min_cost_price": 21,"item_spu_id": "4D630D58552848D2ACFFFDAF2554A449","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 11:37:33","min_supply_price": 26},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 79,"distributor_supplier_name": "","created": "2024-03-07 16:53:36","style_code": "24310416060","item_name": "H*家夹克男双面穿字母印花抽绳连帽工装顺滑外套男春季AVA | 24310416060","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/22423970A6DF42CF9A7CCA819E5C2038_s242182_h1378_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/4911439C485B4135BFB3703300ADF4FF_s205627_h1349_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/1286A3354E8E41BCB208B3FB40197A6B_s465277_h1398_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/4DAA39ED00604448BB31C7698CB91C8E_s96942_h667_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/A43161123E8144B4B44B4544330B11A0_s335129_h1281_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/BDDA2A2EE0934C3BBCE62BF66AB6EEB1_s510854_h1491_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/3C4FD4D970AE407CB0B5EFF8ED05275D_s450168_h2058_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/EF3CF4CDEC914E30A2DDECD4AEA14A0B_s148401_h846_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/0F7F1CA22F4B4470B86348E0FB4AF0C6_s290693_h944_w1260.jpg"],"min_cost_price": 50,"item_spu_id": "A40E0BC49E7B480A98B0CE062F244EAE","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-07 18:03:35","min_supply_price": 55},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 48,"distributor_supplier_name": "","created": "2024-03-07 16:53:36","style_code": "24230146036","item_name": "H*家休闲裤男夏季抽绳松紧腰裤腿字母运动九分裤TER | 24230146036","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240307/3926F792AAEC4D1A8790CCCE1E337024_s72042_h1274_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/657759FD9120435EA6BAB2E866D6811A_s74270_h1293_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/088CD4CB2C2F467183791EC23628CB25_s238601_h1227_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/D51C4AAAA407439991DEBE965F95B09E_s247025_h1151_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/42D9A6FC263148EAA4AECE7A9CD3E80D_s222941_h1462_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/EDC20AE52B9C4A11A5572B38B99272B7_s187824_h1483_w1260.jpg","https://images.sursung.com/prod/item/13492662/20240307/67B778C72CF64F6F84A989F6E1AE0E55_s313012_h1134_w1260.jpg"],"min_cost_price": 27,"item_spu_id": "F9705E8AEC2F487A9945EA5B64E16D45","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-08 10:41:36","min_supply_price": 32},{"perfect_platform_list": [{"perfect": true,"platform_type": "taobao"}],"creator": "徐银","min_sale_price": 139,"distributor_supplier_name": "","created": "2024-03-04 11:32:07","style_code": "2431016095","item_name": "春季专柜同步款翻领外套净色时尚休闲男暗扣夹克外套ZK8922 | 2431016095","main_image_list": ["https://images.sursung.com/prod/item/13492662/20240304/3A37A5B2262244F2B2CA96DF68F4CBFB_s311700_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/7311EFD7A64F4891ACCA55944A058A14_s320340_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/1A55E5BA63544FEE9B6B062179236794_s533254_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/5A5D0AA5EC024BB39B9AA020D67BB797_s566833_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/69406076596F4CBD884CD2EC5CBC2F98_s575510_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/91F1ACA69FF84436B53B141058BFCB3E_s577732_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/328B235BB6C54D56BDD374D1C26BC672_s499824_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/2D1D3CBB2F824BE886CFD2E5C9A22C2B_s364101_h1536_w1536.jpg","https://images.sursung.com/prod/item/13492662/20240304/0B7514E9F91D49A7BE5F571E57F5A86A_s202425_h995_w1260.jpg"],"min_cost_price": 85,"item_spu_id": "294A875FCE8A419E90CEB72721461527","item_status": "distribution","distributor_status": false,"item_source": "ERP_SPU","distributor_co_id": null,"private_status": true,"updated": "2024-03-04 13:58:21","min_supply_price": 90}]},"request_id": "c2d5c993a3f4432e89e3b0d5db561bb9","query": {"page_num": "1","page_size": "10","sort": "DESC"},"_args": [1,{"page_num": "1","page_size": "10","sort": "DESC"},null],"$get_qty": null}', true); if($response['code'] == 0 && $response['data']['total']){ foreach($response['data']['list'] as &$item){ $style_code = $item['style_code']; $supplier_co_id = 0; if($item['distributor_status']){ $supplier_co_id = $item['distributor_co_id']; } $item['_supplier_co_id'] = $supplier_co_id; $item['onsale'] = 0; if($item['item_status'] == 'distribution' && $item['private_status'] == false){ $item['onsale'] = 1; } $item['qty'] = 0; $item['__qty'] = []; $item['__goods_info'] = []; if($get_goods_info){ $item['__goods_info'] = self::queryJstSupplierGoodsInfo($store_id, $item['item_spu_id']); $ginfo = $item['__goods_info']['data']; if($get_qty && $ginfo['item_sku_list']){ if($supplier_co_id){ $item_codes = array_column($ginfo['item_sku_list'], 'item_code'); $item['__qty'] = self::queryJstSupplierGoodsQty($store_id, $supplier_co_id, ['item_codes' => implode(',', $item_codes)]); }else{ $item['__qty'] = self::queryJstGoodsQty($store_id, [$style_code]); } $item['_attr'] = self::supplierGoodsHandleAttr($item); foreach($item['_attr'] as &$v){ $item['qty'] += $v['num']; } } } } } $response['$store_type'] = self::$store_type; $response['getConf'] = self::getConf($store_id); $response['query'] = $query; $response['_args'] = func_get_args(); $response['$get_qty'] = $get_qty; $response['$get_goods_info'] = $get_goods_info; return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function queryJstSupplierGoodsInfo($store_id = 0, $item_spuId = '') { try{ $k = [$store_id, $item_spuId]; $v = cache()->get($k); if($v){ return $v; } $query['item_spuId'] = $item_spuId; $response = self::api($store_id, '/open/api/goods/inneropen/goods/querygoodsdetail',$query); $response['query'] = $query; cache()->set($k, $response, 3600); return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function queryJstSupplierGoodsQty($store_id = 0, $supplier_co_id = 0, $query = []) { try{ $query['supplier_co_id'] = $supplier_co_id; // $query['style_codes'] = $style_code; // $query['item_codes'] = $item_code; $query['page_num'] = $query['page_num'] ?? 1; $query['page_size'] = $query['page_size'] ?? 500; //每页条数 最多500 $query['order_by_key'] = $query['order_by_key'] ?? 1; $response = self::api($store_id, '/open/api/goods/inneropen/supplier/goods/querydiserpgoodsdata',$query); $response['query'] = $query; return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function queryJstSupplierGoods($store_id = 0, $style_code = '') { $query['style_code_list'] = [$style_code]; $list = self::queryJstSupplierGoodsList($store_id, '', $query, 1, 1); if($list['code'] != 0){ return $list; } if($list['data']['list']){ return [ 'code' => 0, 'data' => $list['data']['list'][0], ]; } return [ 'code' => 1, 'msg' => '商品未查到', 'data' => $list, ]; } public static function queryJstSupplierList($store_id = 0, $query = []) { try{ $query['status'] = 2; $query['page_num'] = $query['page_num'] ?? 1; $query['page_size'] = $query['page_size'] ?? 100; //每页数量,最大100 $response = self::api($store_id, '/open/api/company/inneropen/partner/channel/querymysupplier',$query); $response['query'] = $query; return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function goods2Jst($store_id = 0, $start_id = 0, $count = 1, $upType = 0) { try{ if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $upload_goods = self::getConf($store_id, 'upload_goods'); if(!$upload_goods){ return [ 'code' => 1, 'msg' => 'upload_goods close', ]; } $query = Goods::find()->where(['>=', 'id', $start_id])->orderBy('id ASC'); $query->andWhere(['store_id' => $store_id, 'is_delete' => 0]); $cacheKey = 'goods2Jst' . $store_id; if($count == -1){ $count = $query->count(); $cacheV = cache()->get($cacheKey); if($cacheV){ throw new \Exception('已有队列进行中,请在' . ($cacheV - time()) . '秒后重试'); } } if($count > 1){ $time = round($count * 1.5); cache()->set($cacheKey, time() + $time, $time); } $icount = 5; $icount = $count < $icount ? $count : $icount; $list = $query->limit($icount)->all(); $max = 50; $data = []; $upcount = 0; $upGoodsIds = []; foreach($list as $item){ $c_name = null; $goods_cat = GoodsCat::findOne([ 'goods_id' => $item['id'], 'is_delete' => 0 ]); if($goods_cat){ $cat = Cat::findOne($goods_cat->cat_id); $c_name = self::cname2Jst($cat); } // $supplier = Supplier::findOne(['cloud_supplier_id'=>$item['cloud_supplier_id']]); $_data = [ 'batch_enabled' => false, 'i_id' => self::gid2Jst($item->id), 'name' => $item->name, 'pic' => $item->cover_pic, 'unit' => $item['unit'], 'weight' => $item['weight'], 'enabled' => $item['status'] == 1 ? 1 : -1, 'c_price' => $item['cost_price'], // 'supplier_name' => $supplier->supplier_name ?: '', // 'supplier_i_id' => $item['cloud_goods_id'], ]; $c_name && $_data['c_name'] = $c_name; $skus = json_decode($item->attr, true); if($upcount && (count($data) + count($skus) >= $max)){ break; } foreach(array_slice($skus, 0, 50) as $sku){ $sku_id = self::skuid2Jst($store_id, $item, $sku); $sku_name = self::skuv2Jst($item->id, $sku); $_data = array_merge($_data, [ 'sku_id' => $sku_id, 's_price' => $sku['price'], 'sku_pic' => $sku['pic'] ?: $item['cover_pic'], 'sku_code' => $sku['no'], 'qty' => $sku['num'], 'properties_value' => $sku_name, ]); $data[] = $_data; } $upcount++; $upGoodsIds[] = $item->id; $start_id = $item->id; if(count($data) >= $max){ break; } } if($upType == 0){ $updata = [ 'items' => $data, ]; $response = self::api($store_id, ServeHttp::UPLOAD_ITEMSKU, $updata); if($response['code']){ debug_log(['goods2Jst', $response, $upGoodsIds], __CLASS__ . '.log'); } if(isset($response['datas'])){ foreach($response['datas'] as $item){ if(!$item['issuccess']){ debug_log(['goods2Jst', $item], __CLASS__ . '.log'); } } } } if($upType == 1){ $updata = [ 'items' => $data, 'so_id' => self::gid2Jst($item->id) . time(), 'warehouse' => 1, 'is_confirm' => 1, 'type' => 'check', ]; $response = self::api($store_id, ServeHttp::UPLOAD_INVENTORY_V2, $updata); if($response['code']){ debug_log(['goods2Jst $upType == 1', $response, $upGoodsIds], __CLASS__ . '.log'); } } if($count > 1 && ($count - $upcount > 1)){ $queue = queue_push(new \app\jobs\jushuitan\Goods2JSTJob([ 'id' => $store_id, 'start_id' => $start_id + 1, 'count' => $count - $upcount, 'upType' => $upType, ]), 1); } sleep(1); return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function cname2Jst($cat, $cids = []) { $cname = 'cyy' . str_replace('-', '_', $cat['name']); if(in_array($cat['id'], $cids)){ throw new \Exception('层级嵌套错误'); } $cids[] = $cat['id']; if($cat['parent_id'] == 0){ $name = $cname; }else{ $pcat = Cat::findOne(['id' => $cat['parent_id'], 'is_delete' => 0]); if(!$pcat){ throw new \Exception('父级已删除'); } $name = self::cname2Jst($pcat, $cids) . '-' . $cname; } return $name; } public static function cat2Jst($store_id = 0, $start_id = 0, $count = 1) { try{ if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $upload_goods = self::getConf($store_id, 'upload_goods'); if(!$upload_goods){ return [ 'code' => 1, 'msg' => 'upload_goods close', ]; } $query = Cat::find()->where(['>=', 'id', $start_id])->orderBy('id ASC'); $query->andWhere(['store_id' => $store_id, 'is_delete' => 0]); $msgExt = ''; $cacheKey = 'cat2Jst' . $store_id; if($count == -1){ $count = $query->count(); $cacheV = cache()->get($cacheKey); if($cacheV){ throw new \Exception('已有队列进行中,大约' . ($cacheV - time()) . '秒后执行完毕'); } } if($count > 1){ $time = round($count * 1.5); cache()->set($cacheKey, time() + $time, $time); $msgExt = '.大约' . $time . '秒后执行完毕'; } $query->select('id, parent_id, name, sort'); $list = $query->limit($count == 1 ? 1 : 2)->asArray()->all(); if(count($list)){ $item = $list[0]; try{ $c_name = self::cname2Jst($item); } catch (\Exception $ex) { debug_log(['cat2Jst$c_name$del', $item], __CLASS__ . '.log'); \Yii::error([__FUNCTION__, $ex->getMessage(), $item]); $c_name = null; } if($c_name){ $data = [ 'c_name' => $c_name, 'sort' => $item['sort'], ]; $response = self::api($store_id, '/open/jushuitan/category/upload', $data); if($response['code']){ debug_log(['cat2Jst', $response, $data], __CLASS__ . '.log'); } } } if($count > 1 && count($list) > 1){ $queue = queue_push(new \app\jobs\jushuitan\Cat2JSTJob([ 'id' => $store_id, 'start_id' => $list[1]['id'], 'count' => $count -1, ]), 1); } sleep(1); return [ 'code' => 0, 'msg' => '操作成功,后台队列处理中。' . $msgExt, 'data' => $response, ]; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function orderSingleQuery($store_id = 0, $orderNo = []) { if($orderNo){ if(is_string($orderNo)){ $orderNo = [$orderNo]; } $shop_id = self::getConf($store_id, 'shop_id'); $updata = [ 'shop_id' => (int)$shop_id, 'so_ids' => $orderNo, ]; $response = self::api($store_id, ServeHttp::QUERY_ORDERS_SINGLE, $updata); debug_log(['orderSingleQuery', $response, $orderNo, $updata], __CLASS__ . '.log'); if($response['code']){ debug_log(['orderSingleQuery', $response, $orderNo, $updata], __CLASS__ . '.log'); } return $response; } return [ 'code' => 0, 'msg' => '', ]; } public static function orderLabelUpload($store_id = 0, $orderNo = '', $labels = [], $action_type = 1) { if($orderNo && $labels){ $shop_id = self::getConf($store_id, 'shop_id'); $updata = [ 'shop_id' => (int)$shop_id, 'so_id' => (string)$orderNo, 'labels' => $labels, 'action_type' => (int)$action_type, ]; $response = self::api($store_id, '/open/jushuitan/order/label/upload', $updata); debug_log(['orderLabelUpload', $response, $orderNo, $updata], __CLASS__ . '.log'); if($response['code']){ debug_log(['orderLabelUpload', $response, $orderNo, $updata], __CLASS__ . '.log'); return $response; } } return [ 'code' => 0, 'msg' => '', ]; } public static function order2Jst($store_id = 0, $start_id = 0, $count = 1) { try{ if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能' . json_encode(func_get_args())); } $query = Order::find()->where(['>=', 'id', $start_id])->orderBy('id ASC'); $query->andWhere(['store_id' => $store_id, 'is_delete' => 0]); $cacheKey = 'order2Jst' . $store_id; if($count == -1){ $count = $query->count(); $cacheV = cache()->get($cacheKey); if($cacheV){ throw new \Exception('已有队列进行中,请在' . ($cacheV - time()) . '秒后重试'); } } if($count > 1){ $time = round($count * 1.5); cache()->set($cacheKey, time() + $time, $time); } $shop_id = self::getConf($store_id, 'shop_id'); if(empty($shop_id)){ throw new \Exception('shop_id不存在,不能同步订单' . json_encode(func_get_args())); } $icount = 50; $icount = $count < $icount ? $count : $icount; $list = $query->limit($icount)->all(); $list = array_combine(array_column($list, 'order_no'), $list); $max = 50; $data = []; $upcount = 0; $upOrderIds = []; foreach($list as $item){ $need_express = 1; if($item['is_delivery'] || $item['is_offline']){ $need_express = 0; } $is_cod = $item['pay_type'] == Order::PAY_TYPE_COD; $shop_status = self::orderStatusKey2Jst($item['trade_status']); if(!$shop_status && !$is_cod){ continue; } $addres = json_decode($item['address_data'], true); $ods = $item->detail; $goodsList = []; foreach ($ods as $od) { $sku = json_decode($od->attr, true); $goods = json_decode($od['goods_info'], true); $sku_id = self::skuid2Jst($store_id, $goods, $sku); $sku_name = self::skuv2Jst($od->goods_id, $sku); $_data = [ 'sku_id' => $sku_id, 'shop_sku_id' => $sku_id, 'amount' => (float)$od['total_price'], 'base_price' => (float)$od['total_price'], 'qty' => $od['num'], 'name' => $od->goods_name . '_' . $sku_name, 'outer_oi_id' => md5($item['order_no'] . '_' . $sku_id), ]; $goodsList[] = $_data; } $_data = [ 'shop_id' => (int)$shop_id, 'so_id' => $item['order_no'], 'order_date' => date('Y-m-d H:i:s', $item['created_at']), 'shop_status' => $shop_status, 'shop_buyer_id' => (string)$item['user_id'], 'receiver_state' => $addres['province'] ?? '--', 'receiver_city' => $addres['city'] ?? '--', 'receiver_district' => $addres['district'] ?? '--', 'receiver_address' => $addres['detail'] ?? '--', 'receiver_name' => $item['name'] ?? '--', 'receiver_phone' => $item['mobile'] ?? '--', 'pay_amount' => (float)$item['pay_price'], 'freight' => (float)$item['express_price'], 'buyer_message' => $item['remark'], 'is_cod' => $is_cod, 'items' => $goodsList, 'pay' => [ 'outer_pay_id' => $item['order_no'], 'pay_date' => date('Y-m-d H:i:s', $item['pay_time']), 'payment' => Order::PAY_TYP_NAME[$item['pay_type']] ?? '--', 'seller_account' => '--', 'buyer_account' => (string)$item['user_id'], 'amount' => (float)$item['pay_price'], ], ]; if($item['express_no']){ $_data['l_id'] = $item['express_no']; $_data['logistics_company'] = $item['express'] ?: '--'; } $_data['labels'][] = 'cyy'; if($item['is_delivery']){ $_data['labels'][] = '同城配送'; } if($item['is_offline']){ $_data['labels'][] = '自提'; } if($is_cod){ $_data['labels'][] = '货到付款'; } if($item['trans_status'] == 1){ $orderLabelUpload = self::orderLabelUpload($store_id, $item['order_no'], ['转单']); } if(!$need_express){ $_data['l_id'] = '-'; $_data['logistics_company'] = '其他'; } $_data['labels'] = implode(',', $_data['labels']); $data[] = $_data; $upcount++; $upOrderIds[] = $item->id; $start_id = $item->id; if(count($data) >= $max){ break; } } $updata = $data; if(empty($updata)){ throw new \Exception('提交数据为空' . json_encode(func_get_args())); } self::saveConf($store_id, ['upload_order_time_last' => time()]); $response = self::api($store_id, ServeHttp::UPLOAD_ORDERS, $updata); debug_log(['order2Jst', $response, $upOrderIds, $updata], __CLASS__ . '.log'); if($response['code']){ debug_log(['order2Jst', $response, $upOrderIds, $updata], __CLASS__ . '.log'); } if(isset($response['data']) && isset($response['data']['datas'])){ foreach($response['data']['datas'] as $item){ if(!$item['issuccess']){ debug_log(['order2Jst', $item], __CLASS__ . '.log'); }else{ self::lockLocalJstGoodsNum($list[$item['so_id']], 1); } } } if($count > 1 && ($count - $upcount > 1)){ $queue = queue_push(new \app\jobs\jushuitan\Order2JSTJob([ 'id' => $store_id, 'start_id' => $start_id + 1, 'count' => $count - $upcount, ]), 1); } sleep(1); return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function orderRefund2Jst($store_id = 0, $start_id = 0, $count = 1) { try{ if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能' . json_encode(func_get_args())); } $query = OrderRefund::find()->where(['>=', 'id', $start_id])->orderBy('id ASC'); $query->andWhere(['store_id' => $store_id, 'is_delete' => 0]); $cacheKey = 'orderRefund2Jst' . $store_id; if($count == -1){ $count = $query->count(); $cacheV = cache()->get($cacheKey); if($cacheV){ throw new \Exception('已有队列进行中,请在' . ($cacheV - time()) . '秒后重试'); } } if($count > 1){ $time = round($count * 1.5); cache()->set($cacheKey, time() + $time, $time); } $shop_id = self::getConf($store_id, 'shop_id'); if(empty($shop_id)){ throw new \Exception('shop_id不存在,不能同步订单' . json_encode(func_get_args())); } $icount = 50; $icount = $count < $icount ? $count : $icount; $list = $query->limit($icount)->all(); $list = array_combine(array_column($list, 'order_refund_no'), $list); $max = 50; $data = []; $upcount = 0; $upOrderIds = []; foreach($list as $item){ $o = Order::findOne($item['order_id']); $ods = $item->detail; $goodsList = []; foreach ($ods as $od) { $sku = json_decode($od->attr, true); $goods = json_decode($od['goods_info'], true); $sku_id = self::skuid2Jst($store_id, $goods, $sku); $sku_name = self::skuv2Jst($od->goods_id, $sku); $_data = [ 'sku_id' => $sku_id, 'amount' => (float)$od['total_price'], 'base_price' => (float)$od['total_price'], 'qty' => $od['num'], 'type' => '退货', // 'name' => $od->goods_name . '_' . $sku_name, 'outer_oi_id' => md5($o['order_no'] . '_' . $sku_id), ]; $goodsList[] = $_data; } $good_status = 'BUYER_RECEIVED'; if($item['is_user_send']){ $good_status = 'BUYER_RETURNED_GOODS'; } if($item['status'] == 1){ $good_status = 'SELLER_RECEIVED'; } $shop_status = 'WAIT_SELLER_AGREE'; if($item['is_agree']){ $shop_status = 'WAIT_BUYER_RETURN_GOODS'; } if($item['is_user_send']){ $shop_status = 'WAIT_SELLER_CONFIRM_GOODS'; } if($item['status'] == OrderRefund::STATUS_REFUND_AGREE){ $shop_status = 'SUCCESS'; } if($item['status'] == OrderRefund::STATUS_REFUSE){ $shop_status = 'SELLER_REFUSE_BUYER'; } if($item['is_user_cancel'] == 1){ $shop_status = 'CLOSED'; } $_data = [ 'shop_id' => (int)$shop_id, 'outer_as_id' => $item['order_refund_no'], 'so_id' => $o['order_no'], 'type' => '普通退货', 'shop_status' => $shop_status, 'good_status' => $good_status, 'question_type' => '普通退货', 'refund' => (float)$o['pay_price'], 'payment' => 0.00, 'items' => $goodsList, ]; if($item['user_send_express_no']){ $_data['l_id'] = $item['user_send_express_no']; $_data['logistics_company'] = $item['user_send_express']; } $data[] = $_data; $upcount++; $upOrderIds[] = $item->id; $start_id = $item->id; if(count($data) >= $max){ break; } } $updata = $data; if(empty($updata)){ throw new \Exception('提交数据为空' . json_encode(func_get_args())); } $response = self::api($store_id, ServeHttp::UPLOAD_AFTERSALE, $updata); debug_log(['orderRefund2Jst', $response, $upOrderIds, $updata], __CLASS__ . '.log'); if($response['code']){ debug_log(['orderRefund2Jst', $response, $upOrderIds, $updata], __CLASS__ . '.log'); } if(isset($response['data']) && isset($response['data']['datas'])){ foreach($response['data']['datas'] as $item){ if(!$item['issuccess']){ debug_log(['orderRefund2Jst', $item], __CLASS__ . '.log'); }else{ // self::lockLocalJstGoodsNum($list[$item['so_id']], 1); } } } if($count > 1 && ($count - $upcount > 1)){ $queue = queue_push(new \app\jobs\jushuitan\OrderRefund2JSTJob([ 'id' => $store_id, 'start_id' => $start_id + 1, 'count' => $count - $upcount, ]), 1); } sleep(1); return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function afterGoodsSave($goods) { try{ if(!self::isopen($goods->store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $cacheKey = 'executeGoods2JST' . $goods->id; $cacheV = cache()->get($cacheKey); if($cacheV){ return; } $second = 10; cache()->set($cacheKey, 1, $second); $queue = queue_push(new \app\jobs\jushuitan\Goods2JSTJob([ 'id' => $goods->store_id, 'start_id' => $goods->id, ]), $second); $queue = queue_push(new \app\jobs\jushuitan\Goods2JSTJob([ 'id' => $goods->store_id, 'start_id' => $goods->id, 'upType' => 1, ]), $second); return $queue; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function afterCatSave($cat) { try{ if(!self::isopen($cat->store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $cacheKey = 'executeCat2JST' . $cat->id; $cacheV = cache()->get($cacheKey); if($cacheV){ return; } $second = 10; cache()->set($cacheKey, 1, $second); $queue = queue_push(new \app\jobs\jushuitan\Cat2JSTJob([ 'id' => $cat->store_id, 'start_id' => $cat->id, ]), $second); return $queue; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function lockLocalJstGoodsNumList($store_id) { $list = []; $cacheKeyList = 'lockLocalJstGoodsNumList' . self::$store_type . $store_id; $cacheListV = cache()->get($cacheKeyList) ? : []; foreach ($cacheListV as $gid) { if(self::$store_type == self::STORE_TYPE_STORE){ $goods = Goods::findOne($gid); if(!$goods['jst_goods_id']){ continue; } } if(self::$store_type == self::STORE_TYPE_SUPPLIER){ $glist = (new PlatformForm(['id' => $gid]))->goodsInfo(); if($glist['code'] == 0 && $glist['data']['count'] == 1){ $goods = $glist['data']['list'][0]; } if(!$goods['jst_goods_id']){ continue; } $goods['attr'] = $goods['attrs']; } $gattr = json_decode($goods['attr'], true); foreach($gattr as $gattr_item){ $gattr_ids = array_column($gattr_item['attr_list'], 'attr_id'); sort($gattr_ids); $cacheKey = 'lockLocalJstGoodsNum' . self::$store_type . $store_id . '_' . $goods['id'] . '_' . implode('_', $gattr_ids); $cacheV = cache()->get($cacheKey) ? : 0; if($cacheV){ $list[] = [ 'attr_ids' => implode(',', $gattr_ids), 'no' => $gattr_item['no'], 'i_ids' => self::$store_type == self::STORE_TYPE_STORE ? self::skuid2Jst($goods['store_id'], $goods, $gattr_item) : $gattr_item['no'], 'cacheV' => $cacheV, ]; } } } debug_log([__FUNCTION__, $list], __CLASS__ . '.log'); return [ 'code' => 0, 'data' => $list, ]; } public static function lockLocalJstGoodsNumGet($store_id, $goods, $gattr_item) { $gattr_ids = array_column($gattr_item['attr_list'], 'attr_id'); sort($gattr_ids); $cacheKey = 'lockLocalJstGoodsNum' . self::$store_type . $store_id . '_' . $goods['id'] . '_' . implode('_', $gattr_ids); $cacheV = cache()->get($cacheKey); return $cacheV > 0 ? $cacheV : 0; } public static function lockLocalJstGoodsNum($order, $unlock = 0, $changedAttributes = []) { try{ $store_id = $order->store_id; debug_log([__FUNCTION__, $order->id, '锁库存逻辑', $unlock, $changedAttributes, self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); $order->refresh(); $od = $order->detail; if(!$od){ debug_log([__FUNCTION__, $order->id, '订单商品还没录入,跳出'], __CLASS__ . '.log'); return; } // \Yii::error($od); $cacheKeyList = 'lockLocalJstGoodsNumList' . self::$store_type . $store_id; $cacheListV = cache()->get($cacheKeyList) ? : []; $cacheKeyOrder = 'lockLocalJstGoodsNumOrder' . self::$store_type . $store_id . '_' . $order->id; $cacheOrderV = cache()->get($cacheKeyOrder); $cacheTtl = 60 * 25; if($unlock){ if(empty($cacheOrderV)){ debug_log([__FUNCTION__, $order->id, $cacheKeyOrder, $cacheOrderV, '缓存不存在,无需解锁'], __CLASS__ . '.log'); return; }else{ cache()->delete($cacheKeyOrder); } }else{ if($cacheOrderV){ debug_log([__FUNCTION__, $order->id, $cacheOrderV, '缓存已存在,无需加锁'], __CLASS__ . '.log'); return; }else{ if($changedAttributes){ debug_log([__FUNCTION__, $order->id, $changedAttributes, '订单创建时缓存未初始化,无需操作'], __CLASS__ . '.log'); return; } debug_log([__FUNCTION__, $cacheKeyOrder, '锁关联订单', self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); cache()->set($cacheKeyOrder, 1, $cacheTtl); } } foreach($od as $item){ $goods = json_decode($item['goods_info'], true); if(!$goods['jst_goods_id']){ continue; } $attr = json_decode($item['attr'], true); $attr_ids = array_column($attr, 'attr_id'); sort($attr_ids); $gattr = json_decode($goods['attr'], true); foreach($gattr as $gattr_item){ $gattr_ids = array_column($gattr_item['attr_list'], 'attr_id'); sort($gattr_ids); if(implode('_', $attr_ids) == implode('_', $gattr_ids)){ $cacheKey = 'lockLocalJstGoodsNum' . self::$store_type . $store_id . '_' . $goods['id'] . '_' . implode('_', $attr_ids); $cacheV = cache()->get($cacheKey) ? : 0; if($unlock){ if(empty($cacheV)){ debug_log([__FUNCTION__, $order->id, $cacheV, '缓存不存在,无需解锁'], __CLASS__ . '.log'); return; }else{ $val = $cacheV - $item['num']; cache()->set($cacheKey, $val, $cacheTtl); if($val <= 0){ cache()->set($cacheKeyList, array_unique(array_diff($cacheListV, [$goods['id']])), $cacheTtl); } } }else{ cache()->set($cacheKey, $cacheV + $item['num'], $cacheTtl); cache()->set($cacheKeyList, array_unique(array_merge($cacheListV, [$goods['id']])), $cacheTtl); } debug_log([__FUNCTION__, $cacheKey, cache()->get($cacheKey), $cacheKeyList, cache()->get($cacheKeyList),self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); break; } } } } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function afterOrderSave($order, $changedAttributes = []) { try{ if(!self::isopen($order->store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } self::lockLocalJstGoodsNum($order, 0, $changedAttributes); $is_cod = $order['pay_type'] == Order::PAY_TYPE_COD; $shop_status = self::orderStatusKey2Jst($order['trade_status']); if(!$shop_status && !$is_cod){ return [ 'code' => 1, 'msg' => '不需要上传', ]; } if(!self::isopen($order->store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } $cacheKey = 'executeOrder2JST' . $order->id; $cacheV = cache()->get($cacheKey); if($cacheV){ return; } $second = 10; cache()->set($cacheKey, 1, $second); $queue = queue_push(new \app\jobs\jushuitan\Order2JSTJob([ 'id' => $order->store_id, 'start_id' => $order->id, ]), $second); return $queue; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function afterOrderRefundSave($insert, $changedAttributes, $orderRefund) { try{ if(!self::isopen($orderRefund->store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能'); } // if(!$insert){ // return [ // 'code' => 1, // 'msg' => '不需要上传', // ]; // } $cacheKey = 'executeOrderRefund2JST' . $orderRefund->id; $cacheV = cache()->get($cacheKey); if($cacheV){ return; } $second = 2; cache()->set($cacheKey, 1, $second); $queue = queue_push(new \app\jobs\jushuitan\OrderRefund2JSTJob([ 'id' => $orderRefund->store_id, 'start_id' => $orderRefund->id, ]), $second); return $queue; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function lockLocalJstGoodsNumSupplier($order, $unlock = 0, $changedAttributes = []) { try{ $supplier = Supplier::findOne(['cloud_supplier_id' => $order->supplier_id]); $store_id = $supplier->id; if(!self::isopen($store_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能' . json_encode(func_get_args())); } debug_log([__FUNCTION__, $order->id, '锁库存逻辑', $unlock, $changedAttributes, self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); try{ //批发单刷新 if($order instanceof \yii\base\Model){ $order->refresh(); } } catch (\Exception $ex) { } $od = $order->detail; if(!$od){ debug_log([__FUNCTION__, $order->id, '订单商品还没录入,跳出'], __CLASS__ . '.log'); return; } // \Yii::error($od); $cacheKeyList = 'lockLocalJstGoodsNumList' . self::$store_type . $store_id; $cacheListV = cache()->get($cacheKeyList) ? : []; $cacheKeyOrder = 'lockLocalJstGoodsNumOrder' . self::$store_type . $store_id . '_' . $order->id; $cacheOrderV = cache()->get($cacheKeyOrder); $cacheTtl = 60 * 25; if($unlock){ if(empty($cacheOrderV)){ debug_log([__FUNCTION__, $order->id, $cacheKeyOrder, $cacheOrderV, '缓存不存在,无需解锁'], __CLASS__ . '.log'); return; }else{ cache()->delete($cacheKeyOrder); } }else{ if($cacheOrderV){ debug_log([__FUNCTION__, $order->id, $cacheOrderV, '缓存已存在,无需加锁'], __CLASS__ . '.log'); return; }else{ if($changedAttributes){ debug_log([__FUNCTION__, $order->id, $changedAttributes, '订单创建时缓存未初始化,无需操作'], __CLASS__ . '.log'); return; } debug_log([__FUNCTION__, $cacheKeyOrder, '锁关联订单', self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); cache()->set($cacheKeyOrder, 1, $cacheTtl); } } foreach($od as $item){ $glist = (new PlatformForm(['id' => $item['goods_id']]))->goodsInfo(); if($glist['code'] == 0 && $glist['data']['count'] == 1){ $goods = $glist['data']['list'][0]; } if(!$goods['jst_goods_id']){ continue; } //兼容批发、转单数据 $attr = is_array($item['attr']) ? $item['attr'] : json_decode($item['attr'], true); $attr_ids = array_column($attr['attr_list'] ?? $attr, 'attr_id'); sort($attr_ids); $gattr = json_decode($goods['attrs'], true); foreach($gattr as $gattr_item){ $gattr_ids = array_column($gattr_item['attr_list'], 'attr_id'); sort($gattr_ids); if(implode('_', $attr_ids) == implode('_', $gattr_ids)){ $cacheKey = 'lockLocalJstGoodsNum' . self::$store_type . $store_id . '_' . $goods['id'] . '_' . implode('_', $attr_ids); $cacheV = cache()->get($cacheKey) ? : 0; if($unlock){ if(empty($cacheV)){ debug_log([__FUNCTION__, $order->id, $cacheV, '缓存不存在,无需解锁'], __CLASS__ . '.log'); return; }else{ $val = $cacheV - $item['num']; cache()->set($cacheKey, $val, $cacheTtl); if($val <= 0){ cache()->set($cacheKeyList, array_unique(array_diff($cacheListV, [$goods['id']])), $cacheTtl); } } }else{ cache()->set($cacheKey, $cacheV + $item['num'], $cacheTtl); cache()->set($cacheKeyList, array_unique(array_merge($cacheListV, [$goods['id']])), $cacheTtl); } debug_log([__FUNCTION__, $cacheKey, cache()->get($cacheKey), $cacheKeyList, cache()->get($cacheKeyList),self::lockLocalJstGoodsNumList($store_id)], __CLASS__ . '.log'); break; } } } } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function afterPurchaseOrderSave($order, $insert = false, $changedAttributes = []) { try{ if(!$insert){ return; } self::initStoreType(self::STORE_TYPE_SUPPLIER); self::lockLocalJstGoodsNumSupplier($order, 0, $changedAttributes); } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function cloudTransitOrder($order_no = 'PO123123') { $order = null; try{ $orderTransit = \app\models\OrderTransit::findOne(['cloud_order_no' => $order_no]); $orderList = (new SupplierForm(['order_id' => (string)$orderTransit['cloud_order_id']]))->supplierPurchaseOrderList($orderTransit['cloud_supplier_id'], 1); if($orderList['code'] == 0 && $orderList['data']['count']){ $order = $orderList['data']['list'][0]; $goods_list = $order['goods_list']; $order = json_decode(json_encode($order)); $order->detail = $goods_list; $order->id = $order->order_no; } } catch (\Exception $ex) { \Yii::error($ex); } return $order; } public static function afterTransitOrderSave($orderTransit, $insert = false, $changedAttributes = []) { try{ if(!$insert){ return; } self::initStoreType(self::STORE_TYPE_SUPPLIER); $cloudOrder = self::cloudTransitOrder($orderTransit['cloud_order_no']); self::lockLocalJstGoodsNumSupplier($cloudOrder); } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function supplierOrder2Jst($supplier_id = 0, $start_time = 0) { try{ self::initStoreType(self::STORE_TYPE_SUPPLIER); if(!self::isopen($supplier_id)){ return [ 'code' => 1, 'msg' => '未配置此功能', ]; // throw new \Exception('未配置此功能' . json_encode(func_get_args())); } $shop_id = self::getConf($supplier_id, 'shop_id'); if(empty($shop_id)){ return [ 'code' => 1, 'msg' => 'shop_id不存在,不能同步订单', ]; // throw new \Exception('shop_id不存在,不能同步订单' . json_encode(func_get_args())); } if($start_time == 0){ $upload_order_time_last = self::getConf($supplier_id, 'upload_order_time_last'); if($upload_order_time_last){ $start_time = $upload_order_time_last; }else{ $start_time = time() - 600; } } $form = new SupplierForm(); $supplierOrder = $form->supplierOrderList2Jst($supplier_id, $start_time); if($supplierOrder['code']){ throw new \Exception('获取订单失败,' . $supplierOrder['msg'] . json_encode(func_get_args())); } if(empty($supplierOrder['data']['list'])){ return [ 'code' => 0, 'msg' => '订单数据为空', ]; } $max = 50; $arr = array_chunk($supplierOrder['data']['list'], $max); foreach($arr as $list){ $list = array_combine(array_column($list, 'so_id'), $list); $data = []; $upOrderIds = []; foreach($list as $_data){ $up = 1; $_data['labels'] = 'cyy,' . $_data['labels']; $_data['shop_id'] = (int)$shop_id; $_data['is_cod'] = (bool)$_data['is_cod']; $_data['pay_amount'] = (float)$_data['pay_amount']; $_data['freight'] = (float)$_data['freight']; $_data['pay']['amount'] = (float)$_data['pay']['amount']; foreach($_data['items'] as &$item){ if(empty($item['sku_id'])){ $up = 0; debug_log(['supplierOrder2Jst', 'sku_id为空', $_data['so_id']], __CLASS__ . '.log'); break; } $item['outer_oi_id'] = md5($item['outer_oi_id']); $item['qty'] = (int)$item['qty']; $item['amount'] = (float)$item['amount']; $item['base_price'] = (float)$item['base_price']; } if(!$up){ continue; } $data[] = $_data; $upOrderIds[] = $_data['so_id']; } $updata = $data; if(empty($updata)){ return [ 'code' => 0, 'msg' => '提交数据为空', ]; throw new \Exception('提交数据为空' . json_encode(func_get_args())); } self::saveConf($supplier_id, ['upload_order_time_last' => time()]); $response = self::api($supplier_id, ServeHttp::UPLOAD_ORDERS, $updata); debug_log(['supplierOrder2Jst', $response, $upOrderIds, $updata], __CLASS__ . '.log'); if($response['code']){ debug_log(['supplierOrder2Jst', $response, $upOrderIds, $updata], __CLASS__ . '.log'); } if(isset($response['data']) && isset($response['data']['datas'])){ foreach($response['data']['datas'] as $item){ if(!$item['issuccess']){ debug_log(['supplierOrder2Jst', $item], __CLASS__ . '.log'); }else{ //批发 $order2 = \app\models\PurchaseOrder::findOne(['cloud_order_no' => $item['so_id']]); if($order2){ $order = \app\models\PurchaseOrder::findOne(['order_no' => $order2['order_no']]); } if(!$order){ //转单 $order = self::cloudTransitOrder($item['so_id']); } self::lockLocalJstGoodsNumSupplier($order, 1); } } } // sleep(1); } return $response; } catch (\Exception $ex) { \Yii::error($ex); return [ 'code' => 1, 'msg' => $ex->getMessage(), ]; } } public static function checkGoodsImport2Store($store_id, $params) { try { $id = $params['i_id']; $goods = Goods::find()->where(['jst_goods_id' => trim($id), 'store_id' => $store_id, 'is_delete' => 0])->select(['id'])->limit(1)->one(); return [ 'code' => 0, 'data' => $goods, ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } // 添加店铺商品 public static function jstGoods2Store($store_id, $params) { $goods = self::queryJstGoods($store_id, $params['i_id']); if ($goods['code'] != 0) { return $goods; } $goods = $goods['data']; $store_goods = Goods::find()->where(['jst_goods_id' => trim($goods['i_id']), 'store_id' => $store_id, 'is_delete' => 0])->select(['id'])->limit(1)->one(); $model = new GoodsForm(['id' => $store_goods['id']]); $model->jst_goods_id = $goods['i_id']; $model->status = 1; $model->store_id = $store_id; $model->name = $params['name']; $model->price = $params['price']; $model->cost_price = $params['cost_price']; $model->original_price = $params['original_price']; $model->goods_num = $goods['qty']; $model->goods_no = $goods['i_id']; $model->use_attr = 1; $attr = $params['attr']; foreach($attr as &$item){ foreach($goods['skus'] as $sku){ if($sku['sku_id'] == $item['no']){ $item['num'] = $sku['qty']; } } } $model->attr = $attr; $model->cat_id = $params['cat']; $model->service = ''; $model->content = ''; $model->product_type = 0; $model->form = ['is_form' => 0]; $model->cover_pic = $goods['pic']; $pics = []; foreach($goods['pics'] as $pic){ $pics[] = ['pic_url' => $pic]; } $model->goods_pic_list = $pics; $res = $model->save(); if($res['code'] != 0){ \Yii::error([__FUNCTION__, $res, $goods, $params, $model]); return $res; } return $res; } // 批量添加店铺商品 public static function jstGoods2StoreBatch($store_id, $params) { try{ $i_ids = explode(',', $params['i_ids']); foreach($i_ids as $i_id){ $goods = self::queryJstGoods($store_id, $i_id); if ($goods['code'] != 0) { return $goods; } $goods = $goods['data']; $attr = $goods['_attr']; $store_goods = Goods::find()->where(['jst_goods_id' => trim($goods['i_id']), 'store_id' => $store_id, 'is_delete' => 0])->select(['id'])->limit(1)->one(); $model = new GoodsForm(['id' => $store_goods['id']]); $model->jst_goods_id = $goods['i_id']; $model->status = 1; $model->store_id = $store_id; $model->name = $goods['name']; $model->price = $goods['market_price'] ?: 0; $model->cost_price = $goods['s_price'] ?: 0; $model->original_price = $goods['market_price'] ?: 0; $model->goods_num = $goods['qty']; $model->goods_no = $goods['i_id']; $model->use_attr = 1; $model->attr = $attr; $model->cat_id = $params['cat']; $model->service = ''; $model->content = ''; $model->product_type = 0; $model->form = ['is_form' => 0]; $model->cover_pic = $goods['pic']; $pics = []; foreach($goods['pics'] as $pic){ $pics[] = ['pic_url' => $pic]; } $model->goods_pic_list = $pics; $res = $model->save(); if($res['code'] != 0){ \Yii::error([__FUNCTION__, $res, $goods, $params, $model]); return $res; } } return [ 'code' => 0, 'msg' => '操作成功' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() . $e->getLine() ]; } } public static function commonHandleStore($supplier_id, $data, $id = 0) { $supplier = Supplier::findOne(['id' => $supplier_id, 'is_delete' => 0]); if (!$supplier) { return [ 'code' => 1, 'msg' => '供货商未找到', ]; } $supplierForm = new SupplierForm(); $supplierForm->attributes = $data; $supplierForm->token_supplier_id = $supplier->cloud_supplier_id; $setGoods = $supplierForm->setGoods(); if ($setGoods['code'] == 1) { return $setGoods; } // 提交审核 $supplierForm = new SupplierForm(); $supplierForm->attributes = ['goods_id' => $setGoods['data']['goods_id']]; $supplierForm->token_supplier_id = $supplier->cloud_supplier_id; $submitAudit = $supplierForm->auditSubmit(); if ($submitAudit['code'] == 1) { return $submitAudit; } // 审核商品 $form = new PlatformForm(); $form->attributes = [ 'id' => $submitAudit['data']['goods_id'], 'status' => 1, ]; return $form->auditHandle(); } //attr参数包含店铺和供应商所需参数 public static function handleAttr(&$goods) { $_attr = []; $skus = $goods['skus']; $image = $goods['pic']; foreach ($goods['skus'] as &$sku) { $attr_list = [ [ 'attr_group_name' => '规格', 'attr_name' => $sku['properties_value'] ] ]; $attr = [ 'attr_list' => $attr_list, 'num' => $sku['qty'], 'price' => sprintf('%.2f', $sku['market_price']), 'cost_price' => sprintf('%.2f', $sku['sale_price']), 'no' => $sku['sku_id'], 'pic' => $sku['pic'] == '' ? $image : $sku['pic'], 'share_commission_first' => '', 'share_commission_second' => '', 'share_commission_third' => '', 'wholesale_price' => sprintf('%.2f', $sku['sale_price']), 'original_price' => sprintf('%.2f', $sku['market_price']), ]; if(self::$store_type == self::STORE_TYPE_SUPPLIER){ $attr['price'] = sprintf('%.2f', $sku['sale_price']); } $_attr[] = $attr; $sku['_attr'] = $attr; } return $_attr; } public static function checkGoodsImport2Supplier($params) { try { $id = $params['i_id']; $cloud_store_token = get_platform_token(); $goods_url = "/cloud/user/getJstGoods"; $goods_data = []; $goods_data['access_token'] = $cloud_store_token; //获取供货商的token信息 $goods_data['jst_goods_id'] = $id; //默认为 1 $domain = (new OptionSetting)->getCloudDomainName(); $goods_data_info = cloud_post($domain . $goods_url,$goods_data); $goods_data_info = json_decode($goods_data_info,true); if($goods_data_info['code'] != 0){ throw new \Exception($goods_data_info['msg']); }else{ return $goods_data_info; } } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } // 添加云仓商品 public static function jstGoods2Supplier($supplier_id, $params) { $goods = self::queryJstGoods($supplier_id, $params['i_id']); if ($goods['code'] != 0) { return $goods; } $goods = $goods['data']; $attr = $params['attr']; foreach($attr as &$item){ foreach($goods['skus'] as $sku){ if($sku['sku_id'] == $item['no']){ $item['num'] = $sku['qty']; } } } $data = [ 'cat_id' => \implode(',', $params['cat']), 'name' => $params['name'], 'goods_no' => (string)$params['i_id'], 'g_s_pic_url' => $goods['pic'], 'desc' => $params['name'], 'g_price' => $params['price'], 'g_wholesale_price' => $params['wholesale_price'], 'g_wholesale_ladder_rebate' => '[]', 'g_wholesale_rebate_switch' => '0', 'weight' => '', 'g_original_price' => $params['original_price'], 'g_unit' => $goods['unit'], 'g_shop_count' => 1, 'num' => $goods['qty'], 'use_attr' => '1', 'g_pic_list' => $goods['pics'], 'g_send_type' => '0', 'attrs' => $attr, 'is_change' => 1, 'jst_goods_id' => $params['i_id'], 'market_price' => sprintf('%.2f', $goods['market_price']), ]; return self::commonHandleSupplier($supplier_id, $data, $params['i_id']); } // 批量添加云仓商品 public static function jstGoods2SupplierBatch($supplier_id, $params) { try{ $i_ids = explode(',', $params['i_ids']); foreach($i_ids as $i_id){ $goods = self::queryJstGoods($supplier_id, $i_id); if ($goods['code'] != 0) { return $goods; } $goods = $goods['data']; $attr = $goods['_attr']; $data = [ 'cat_id' => \implode(',', $params['cat']), 'name' => $goods['name'], 'goods_no' => (string)$i_id, 'g_s_pic_url' => $goods['pic'], 'desc' => $goods['name'], 'g_price' => sprintf('%.2f', $goods['s_price']), 'g_wholesale_price' => sprintf('%.2f', $goods['s_price']), 'g_wholesale_ladder_rebate' => '[]', 'g_wholesale_rebate_switch' => '0', 'weight' => '', 'g_original_price' => sprintf('%.2f', $goods['s_price']), 'g_unit' => $goods['unit'], 'g_shop_count' => 1, 'num' => $goods['qty'], 'use_attr' => '1', 'g_pic_list' => $goods['pics'], 'g_send_type' => '0', 'attrs' => $attr, 'is_change' => 1, 'jst_goods_id' => $i_id, 'market_price' => sprintf('%.2f', $goods['market_price']), ]; $result = self::commonHandleSupplier($supplier_id, $data, $i_id); if (intval($result['code']) !== 0) { throw new \Exception($result['msg']); } } return [ 'code' => 0, 'msg' => '操作成功' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() . $e->getLine() ]; } } // 添加店铺商品 public static function jstSupplierGoods2Store($store_id, $params) { $goods = self::queryJstSupplierGoods($store_id, $params['i_id']); if ($goods['code'] != 0) { return $goods; } $goods = $goods['data']; $store_goods = Goods::find()->where(['jst_goods_id' => trim($goods['style_code']), 'store_id' => $store_id, 'is_delete' => 0])->select(['id'])->limit(1)->one(); $model = new GoodsForm(['id' => $store_goods['id']]); $model->jst_goods_id = $goods['style_code']; $model->jst_supplier_id = $goods['_supplier_co_id'] ?: 0; $model->status = 1; $model->store_id = $store_id; $model->name = $params['name']; $model->price = $params['price']; $model->cost_price = $params['cost_price']; $model->original_price = $params['original_price']; $model->goods_num = $goods['qty']; $model->goods_no = $goods['style_code']; $model->use_attr = 1; $attr = $params['attr']; // foreach($attr as &$item){ // foreach($goods['skus'] as $sku){ // if($sku['sku_id'] == $item['no']){ // $item['num'] = $sku['qty']; // } // } // } $model->attr = $attr; $model->cat_id = $params['cat']; $model->service = ''; $model->content = ''; $model->product_type = 0; $model->form = ['is_form' => 0]; $model->cover_pic = $goods['main_image_list'][0] ?? ''; $pics = []; foreach($goods['main_image_list'] as $pic){ $pics[] = ['pic_url' => $pic]; } $model->goods_pic_list = $pics; $model->content = $goods['_desc']; if($goods['__goods_info'] && $goods['__goods_info']['data']){ $model->video_url = $goods['__goods_info']['data']['item_photo']['item_video'] ?: $goods['__goods_info']['data']['item_photo']['goods_video']; } $res = $model->save(); if($res['code'] != 0){ \Yii::error([__FUNCTION__, $res, $goods, $params, $model]); return $res; } return $res; } // 批量添加店铺商品 public static function jstSupplierGoods2StoreBatch($store_id, $params) { try{ $i_ids = explode(',', $params['i_ids']); foreach($i_ids as $i_id){ $goods = self::queryJstSupplierGoods($store_id, $i_id); if ($goods['code'] != 0) { return $goods; } $goods = $goods['data']; $attr = $goods['_attr']; $store_goods = Goods::find()->where(['jst_goods_id' => trim($goods['style_code']), 'store_id' => $store_id, 'is_delete' => 0])->select(['id'])->limit(1)->one(); $model = new GoodsForm(['id' => $store_goods['id']]); $model->jst_goods_id = $goods['style_code']; $model->jst_supplier_id = $goods['_supplier_co_id'] ?: 0; $model->status = 1; $model->store_id = $store_id; $model->name = $goods['item_name']; $model->price = $goods['min_sale_price']; $model->cost_price = $goods['min_supply_price']; $model->original_price = $goods['min_sale_price']; $model->goods_num = $goods['qty']; $model->goods_no = $goods['style_code']; $model->use_attr = 1; // $attr = $params['attr']; // foreach($attr as &$item){ // foreach($goods['skus'] as $sku){ // if($sku['sku_id'] == $item['no']){ // $item['num'] = $sku['qty']; // } // } // } $model->attr = $attr; $model->cat_id = $params['cat']; $model->service = ''; $model->content = ''; $model->product_type = 0; $model->form = ['is_form' => 0]; $model->cover_pic = $goods['main_image_list'][0] ?? ''; $pics = []; foreach($goods['main_image_list'] as $pic){ $pics[] = ['pic_url' => $pic]; } $model->goods_pic_list = $pics; $model->content = $goods['_desc']; if($goods['__goods_info'] && $goods['__goods_info']['data']){ $model->video_url = $goods['__goods_info']['data']['item_photo']['item_video'] ?: $goods['__goods_info']['data']['item_photo']['goods_video']; } $res = $model->save(); if($res['code'] != 0){ \Yii::error([__FUNCTION__, $res, $goods, $params, $model]); return $res; } } return [ 'code' => 0, 'msg' => '操作成功' ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage() . $e->getLine() ]; } } // 添加云仓商品 public static function jstSupplierGoods2Supplier($supplier_id, $params) { $supplierGoods = self::queryJstSupplierGoods($supplier_id, $params['i_id']); if($supplierGoods['code']){ return $supplierGoods; } $attr = $params['attr']; $data = [ 'cat_id' => \implode(',', $params['cat']), 'name' => $params['name'], 'goods_no' => (string)$params['i_id'], 'g_s_pic_url' => $supplierGoods['data']['main_image_list'][0] ?? '', 'desc' => $supplierGoods['data']['_desc'], 'g_price' => $params['price'], 'g_wholesale_price' => $params['wholesale_price'], 'g_wholesale_ladder_rebate' => '[]', 'g_wholesale_rebate_switch' => '0', 'weight' => '', 'g_original_price' => $params['original_price'], 'g_unit' => '', 'g_shop_count' => 1, 'num' => $supplierGoods['data']['qty'], 'use_attr' => '1', 'g_pic_list' => $supplierGoods['data']['main_image_list'] ?: [], 'g_send_type' => '0', 'attrs' => $attr, 'is_change' => 1, 'jst_goods_id' => $params['i_id'], 'jst_supplier_id' => $supplierGoods['data']['_supplier_co_id'] ?: 0, 'market_price' => sprintf('%.2f', $supplierGoods['data']['min_sale_price']), ]; if($supplierGoods['data']['__goods_info'] && $supplierGoods['data']['__goods_info']['data']){ $data['video_url'] = $supplierGoods['data']['__goods_info']['data']['item_photo']['item_video'] ?: $supplierGoods['data']['__goods_info']['data']['item_photo']['goods_video']; } return self::commonHandleSupplier($supplier_id, $data, $params['i_id']); } // 批量添加云仓商品 public static function jstSupplierGoods2SupplierBatch($supplier_id, $params) { try{ $i_ids = explode(',', $params['i_ids']); $res = []; foreach($i_ids as $i_id){ $supplierGoods = self::queryJstSupplierGoods($supplier_id, $i_id); if($supplierGoods['code']){ return $supplierGoods; } $attr = $supplierGoods['data']['_attr']; $data = [ 'cat_id' => \implode(',', $params['cat']), 'name' => $supplierGoods['data']['item_name'], 'goods_no' => (string)$i_id, 'g_s_pic_url' => $supplierGoods['data']['main_image_list'][0] ?? '', 'desc' => $supplierGoods['data']['_desc'], 'g_price' => sprintf('%.2f', $supplierGoods['data']['min_supply_price']), 'g_wholesale_price' => sprintf('%.2f', $supplierGoods['data']['min_supply_price']), 'g_wholesale_ladder_rebate' => '[]', 'g_wholesale_rebate_switch' => '0', 'weight' => '', 'g_original_price' => sprintf('%.2f', $supplierGoods['data']['min_sale_price']), 'g_unit' => '', 'g_shop_count' => 1, 'num' => $supplierGoods['data']['qty'], 'use_attr' => '1', 'g_pic_list' => $supplierGoods['data']['main_image_list'] ?: [], 'g_send_type' => '0', 'attrs' => $attr, 'is_change' => 1, 'jst_goods_id' => $i_id, 'jst_supplier_id' => $supplierGoods['data']['_supplier_co_id'] ?: 0, 'market_price' => sprintf('%.2f', $supplierGoods['data']['min_sale_price']), ]; if($supplierGoods['data']['__goods_info'] && $supplierGoods['data']['__goods_info']['data']){ $data['video_url'] = $supplierGoods['data']['__goods_info']['data']['item_photo']['item_video'] ?: $supplierGoods['data']['__goods_info']['data']['item_photo']['goods_video']; } $result = self::commonHandleSupplier($supplier_id, $data, $i_id); $res[] = $result; if (intval($result['code']) !== 0) { throw new \Exception($result['msg']); } } return [ 'code' => 0, 'msg' => '操作成功', 'ress' => $res, ]; } catch (\Exception $e) { return [ 'code' => 1, 'ress' => $res, 'msg' => $e->getMessage() . $e->getLine() ]; } } public static function commonHandleSupplier($supplier_id, $data, $id = 0) { $supplier = Supplier::findOne(['id' => $supplier_id, 'is_delete' => 0]); if (!$supplier) { return [ 'code' => 1, 'msg' => '供货商未找到', ]; } $_res = ['query' => $data]; $supplierForm = new SupplierForm(); $supplierForm->attributes = $data; $supplierForm->token_supplier_id = $supplier->cloud_supplier_id; $setGoods = $supplierForm->setGoods(); if ($setGoods['code'] == 1) { return array_merge($setGoods, $_res); } // 提交审核 $supplierForm = new SupplierForm(); $supplierForm->attributes = ['goods_id' => $setGoods['data']['goods_id']]; $supplierForm->token_supplier_id = $supplier->cloud_supplier_id; $submitAudit = $supplierForm->auditSubmit(); if ($submitAudit['code'] == 1) { return array_merge($submitAudit, $_res); } // 审核商品 $form = new PlatformForm(); $form->attributes = [ 'id' => $submitAudit['data']['goods_id'], 'status' => 1, ]; return array_merge($form->auditHandle(), $_res); } //attr参数包含店铺和供应商所需参数 public static function supplierGoodsHandleAttr(&$supplierGoods) { $_attr = []; $image = $supplierGoods['main_image_list'][0]; $qty = $supplierGoods['__qty']; $ginfo = $supplierGoods['__goods_info']['data']; $desc = $ginfo['describe'] ?? ''; $imgs = $ginfo['item_photo']['item_detail_images']; if($imgs){ $desc .= '
'; } $supplierGoods['_desc'] = $desc; foreach ($supplierGoods['__goods_info']['data']['item_sku_list'] as &$sku) { $attr_list = [ [ 'attr_group_name' => $ginfo['first_spec_name'], 'attr_name' => $sku['first_spec_value_name'], ], ]; if($ginfo['second_spec_name']){ $attr_list[] = [ 'attr_group_name' => $ginfo['second_spec_name'], 'attr_name' => $sku['second_spec_value_name'], ]; } $num = 0; if($qty['data']['list']){ foreach($qty['data']['list'] as $iqty){ if($iqty['item_code'] == $sku['item_code']){ $num = $iqty['stock']; break; } } } if($qty['data']['inventorys']){ foreach($qty['data']['inventorys'] as $iqty){ if($iqty['sku_id'] == $sku['item_code']){ $num = $iqty['qty']; break; } } } // $attr_list = [ // [ // 'attr_group_name' => '规格', // 'attr_name' => $sku['properties_value'] // ] // ]; $attr = [ 'attr_list' => $attr_list, 'num' => $num, 'price' => sprintf('%.2f', $sku['sale_price']), 'cost_price' => sprintf('%.2f', $sku['supply_price']), 'wholesale_price' => sprintf('%.2f', $sku['supply_price']), 'original_price' => sprintf('%.2f', $sku['sale_price']), 'no' => $sku['item_code'], 'weight' => $sku['weight'], 'pic' => $sku['pic'] == '' ? $image : $sku['pic'], 'share_commission_first' => '', 'share_commission_second' => '', 'share_commission_third' => '', ]; if(self::$store_type == self::STORE_TYPE_SUPPLIER){ $attr['price'] = sprintf('%.2f', $sku['supply_price']); } $sku['qty'] = $attr['num']; $sku['_attr'] = $attr; $_attr[] = $attr; } return $_attr; } }