产景:对接第三方的积分系统,抓取积分订单信息至商城的时候,对接方的文档也有可能是坑爹,插入表不成功。因为对方的文档和接口是不一致的,所以很多时间可以考虑用字符串去存信息。
如何调试呢?$this->validate() $model->geterrors等都没有信息返回,可以使用try catch解决
分批抓取脚本 (此脚本可以同步遍历无需加字段)
/**
* 积分会员:门店订单抓取至商城脚本
* desc: 固定参数用于抓取
*/
public function actionGetOrderList()
{
set_time_limit(0);
date_default_timezone_set("PRC");
$option = Option::get('shop_order_list', 0, 'admin', '1');
$option = \Yii::$app->serializer->decode($option);
if(!$option){
return false;
}
$store_id = 6;
$limit = 100;
$is_recycle = Store::find()->where(['id'=>$store_id,'is_recycle'=>1])->one();
if($is_recycle){
return false;
}
try {
//循环会员卡结果集合
$membership_data = \Yii::$app->cache->get(CacheKeyEnum::USER_MEMBER_DATA);
if(!$membership_data){
$count = UserMember::find()->where(['store_id' =>$store_id])->andWhere(['>', 'membership_number', 0])->count();
\Yii::$app->cache->set(CacheKeyEnum::USER_MEMBER_DATA,$count);
usleep(20*1000);
}
$count = \Yii::$app->cache->get(CacheKeyEnum::USER_MEMBER_DATA);
$j = \Yii::$app->cache->get(CacheKeyEnum::USER_MEMBER_DATA."_i") ? : 0 ; //从上次跑的页数开始跑
for ($i = $j; $i <= floor($count / $limit); $i++) {
$membership_numbers = UserMember::find()->select(['user_id','membership_number','wechat_union_id'])->where(['store_id' => $store_id])->andWhere(['>', 'membership_number', 0])->limit($limit)->offset($i*$limit)->asArray()->all();
$membership_numbers = array_column($membership_numbers,null, 'membership_number');
foreach ($membership_numbers as $k =>$v){
$param = [
'membership_number' => $v['membership_number'],
];
$res = requestCardApi($option['order_list_url'], $param,$option['app_key'],1);
if($res['code'] == 0){
$user = UserMember::find()->where(['store_id'=>$store_id,'wechat_union_id'=>$v['wechat_union_id']])->one();
$user_id = $v['user_id'] ? : ( $user ? $user->id : 0 );
$this->saveData($res['data'],$user_id,$store_id);
}else{
\Yii::error($res, date('Y-m-d H:i:s').'会员卡抓取门店订单记录失败,会员卡号:'.$v['membership_number']);
}
}
//记录跑的页数,跑完删除缓存,没跑完下次接着跑
\Yii::$app->cache->set(CacheKeyEnum::USER_MEMBER_DATA."_i",$i+1);
usleep(20*1000);
if(floor($count / $limit) == $i){
\Yii::$app->cache->delete(CacheKeyEnum::USER_MEMBER_DATA."_i");
\Yii::$app->cache->delete(CacheKeyEnum::USER_MEMBER_DATA);
}
unset($membership_numbers);
}
} catch (\Exception $e) {
$e->getMessage();
}
}
入库脚本
/**
* 积分会员:保存数据方法
* $param $datas 对接方返回结果集
* $param $user_id 我方商城中用户ID
* $param $store_id 我方商户ID
* desc :
*/
public function saveData($datas = [],$user_id = 0,$store_id=0)
{
foreach ($datas as $k =>$v){
//主订单数据
$main_order = ShopOrder::find()->where(['store_id'=>$store_id,'order_no'=>$v['orderId'],'user_id'=>$user_id])->one();
if(!$main_order){
$order =[
'store_id'=>$store_id,
'book_shop_id'=> $v['shopId'] ? : 0,
'user_id'=> $user_id ? : 0,
'order_no'=> $v['orderId'] ? : "",
'total_price'=> $v['orderPrice'] ? : 0.00,
'pay_price'=> $v['price'] ? : 0.00,
'express_price'=>0,
'custom_fields'=> $v['customFields'] ? json_encode($v['customFields'],true) : '{}',
'postal_code'=> $v['postalCode'] ? : "",
'discount_price'=> $v['discountPrice'] ? : 0.00,
'refund_status'=> $v['refundStatus'] ? : 0,
'remark'=> $v['remark'] ? : "",
'express'=> $v['deliverCompany'] ? : "",
'express_no'=> $v['deliverNumber'] ? : "",
'wdt_sale_no'=> $v['wdtSaleNo'] ? : "",
'logistics_price'=> $v['logisticsPrice'] ? : 0.00,
'customer_phone'=> $v['customerPhone'] ? : "",
'name'=> $v['receiveName'] ? : "",
'state'=> $v['state'] ? : 0,
'pay_time'=> $v['paymentTime'] ? strtotime(explode('.',$v['paymentTime'])[0]): '',
'acc_date'=> $v['accDate'] ? strtotime(explode('.',$v['accDate'])[0]): '',
'confirm_time'=> $v['receiveTime'] ? strtotime(explode('.',$v['receiveTime'])[0]): '',
'create_time'=> $v['orderCreateTime'] ? strtotime(explode('.',$v['orderCreateTime'])[0]): '',
'update_time'=> $v['orderUpdateTime'] ? strtotime(explode('.',$v['orderUpdateTime'])[0]): '',
'mobile'=> $v['receivePhone'] ? : "",
'direct_distributor_money'=> $v['directDistributorMoney'] ? : 0.00,
'payment_mode'=> $v['paymentMode'] ? : 0,
'address'=> $v['receiveAddress'] ? : "",
'cost_center'=> $v['costCenter'] ? : 0.00,
'distributor_id'=> $v['distributorId'] ? : 0,
'order_origin'=> $v['orderOrigin'] ? : 0,
'pos_no'=> $v['posNo'] ? : "",
//'name'=> $v['customerName'] ? : "",
'parent_id'=> $v['parentId'] ? : 0,
'refund_order_no'=> $v['refundNumber'] ? : 0,
'gross_profit_margin'=> $v['grossProfitMargin'] ? : 0.00,
'detail_address'=> $v['detailAddress'] ? : "",
'pur_amount'=> $v['purAmount'] ? : 0.00,
'buyer_user_id'=> $v['buyerUserId'] ? : 0,
'indirect_distributor_money'=> $v['indirectDistributorMoney'] ? : 0.00,
'pos_payee'=> $v['posPayee'] ? : "",
'addtime'=>time()
];
try {
$insert = \Yii::$app->db->createCommand()->insert(ShopOrder::tableName(),$order)->execute();
if($insert){
$id = \Yii::$app->db->getLastInsertID();
foreach ($v['goodsDTOList'] as $kk =>$vv){
$order_detail = new ShopOrderDetail();
$order_detail->order_id = $id ? :"";
$order_detail->goods_id = $vv['productId'] ? : "";
$order_detail->num = $vv['number'] ? : 0;
$order_detail->cost_center = $vv['costCenter'] ? : "";
$order_detail->pile = (int)$vv['pile']? : 0;
$order_detail->pic = $vv['productId'] ? Goods::find()->where(['store_id'=>$store_id])->where(['LIKE', 'attr', '"no":"'. $vv['productId'] .'"'])->one()->cover_pic : "";
$order_detail->goods_name = $vv['productName'] ? : "";
$order_detail->min_price = $vv['minPrice'] ? :"";
$order_detail->std_price = (string)$vv['stdPrice'] ? :"";
$order_detail->total_price = $vv['productPrice'] ? (string)$vv['productPrice'] : "";
$order_detail->user_id = $user_id;
$order_detail->store_id = $store_id;
$order_detail->times = $vv['times'] ? : 0;
$order_detail->min_qty = $vv['minQty'] ? : 0;
$order_detail->sku_id = $vv['skuId'] ? : 0;
$order_detail->save();
}
}
} catch (\Exception $e) {
$e->getMessage() ;
}
}else{
/* @desc 以合作方最新数据为主同步主订单数据,合作方是抓取线下订单的,一锤子买卖不存在退款*/
\Yii::$app->db->createCommand()->update(ShopOrder::tableName(),
[
'total_price'=> $v['orderPrice'] ? : 0.00,
'pay_price'=> $v['price'] ? : 0.00,
'custom_fields'=> $v['customFields'] ? json_encode($v['customFields'],true) : '{}',
'postal_code'=> $v['postalCode'] ? : "",
'discount_price'=> $v['discountPrice'] ? : 0.00,
'refund_status'=> $v['refundStatus'] ? : 0,
'remark'=> $v['remark'] ? : "",
'express'=> $v['deliverCompany'] ? : "",
'express_no'=> $v['deliverNumber'] ? : "",
'wdt_sale_no'=> $v['wdtSaleNo'] ? : "",
'logistics_price'=> $v['logisticsPrice'] ? : 0.00,
'customer_phone'=> $v['customerPhone'] ? : "",
'name'=> $v['receiveName'] ? : "",
'state'=> $v['state'] ? : 0,
'pay_time'=> $v['paymentTime'] ? strtotime(explode('.',$v['paymentTime'])[0]): '',
'acc_date'=> $v['accDate'] ? strtotime(explode('.',$v['accDate'])[0]): '',
'confirm_time'=> $v['receiveTime'] ? strtotime(explode('.',$v['receiveTime'])[0]): '',
'create_time'=> $v['orderCreateTime'] ? strtotime(explode('.',$v['orderCreateTime'])[0]): '',
'update_time'=> $v['orderUpdateTime'] ? strtotime(explode('.',$v['orderUpdateTime'])[0]): '',
'mobile'=> $v['receivePhone'] ? : "",
'direct_distributor_money'=> $v['directDistributorMoney'] ? : 0.00,
'payment_mode'=> $v['paymentMode'] ? : 0,
'address'=> $v['receiveAddress'] ? : "",
'cost_center'=> $v['costCenter'] ? : 0.00,
'distributor_id'=> $v['distributorId'] ? : 0,
'order_origin'=> $v['orderOrigin'] ? : 0,
'pos_no'=> $v['posNo'] ? : "",
'parent_id'=> $v['parentId'] ? : 0,
'refund_order_no'=> $v['refundNumber'] ? : 0,
'gross_profit_margin'=> $v['grossProfitMargin'] ? : 0.00,
'detail_address'=> $v['detailAddress'] ? : "",
'pur_amount'=> $v['purAmount'] ? : 0.00,
'buyer_user_id'=> $v['buyerUserId'] ? : 0,
'indirect_distributor_money'=> $v['indirectDistributorMoney'] ? : 0.00,
'pos_payee'=> $v['posPayee'] ? : "",
'modify_time'=> time()
],
['store_id'=>$store_id,'order_no'=>$v['orderId'],'user_id'=>$user_id])->execute();
}
}
}