每个客户对接可能客户都有自己的服务器作为中控系统;需要双方的信息进行相互推送达到信息同步;那么怎么实现信息同步呢?
①表模型修改后触发,redis储存需要推送的信息。
②定时任务跑推送到客户服务器url进行信息同步。
models/Register.php (模型),模型类保存后触发。
public function afterSave($insert, $changedAttributes)
{
$data = $insert ? json_encode($this->attributes) : json_encode($changedAttributes);
//推送增加积分(除了erp不推送类型为20)
$list = json_decode($data,true);
if ($list['integral'] > 0 && $insert && $list['type'] != 20) {
//脚本取消订单返还积分、赠送积分放置队列脚本处理
$is_card_user = User::find()->where(['id' => $list['user_id']])->select('is_card_user')->scalar();
if ($is_card_user == 1) {
if (in_array($list['type'], [6, 7, 8, 13, 21, 22, 23])) {
\Yii::$app->redis->lpush(CacheKeyEnum::INTEGRAL_QUEUE, $list['id']);
}else{
$v = self::findOne(['id' => $list['id']]);
pushIntegrals($list['store_id'], $list['user_id'], $list['integral'], self::getIntegralType($list['type']), self::getIntegralDetail($v));
}
}
}
$member = new MemberListForm();
$member->sendWxUpdate($data);
}
commands/QueueController.php (定时任务)
public function actionIntegral()
{
date_default_timezone_set("PRC");
$key = CacheKeyEnum::INTEGRAL_QUEUE;
$redis = \Yii::$app->redis;
$len = $redis->llen($key);
for ($i=1; $i<=$len; $i++) {
$id = $redis->lpop($key);
$info = Register::findOne(['id' => $id]);
if (!$info) {
$redis->lpush($key, $id);
continue;
}
pushIntegrals($info->store_id, $info->user_id, $info->integral, $info->type, Register::getIntegralDetail($info));
unset($info);
}
echo 'success'. "\n";
}
helpers.php (公共方法,这样就可做到推送)
function pushIntegrals($store_id, $user_id, $integral, $type, $integral_detail){
$member = \app\models\Member::findOne(['store_id' => $store_id, 'is_erp' => 1]);
$user = \app\models\User::findOne(['id' => $user_id]);
//判断是否对接erp会员并且领取会员卡券
if (!$member || empty($user) || $user->is_card_user != 1) {
return false;
}
$userMember = \app\models\UserMember::findOne(['store_id' => $store_id, 'user_id' => $user_id]);
$data = [
'user_id' => $user->id,
'mobile' => $user->binding,
'membership_number' => $userMember->membership_number,
'integral' => abs($integral),
'income_type' => $integral >= 0 ? 0 : 1,
'type' => \app\models\Register::getIntegralType($type),
'integral_detail' => $integral_detail,
];
\Yii::error($data, '同步积分params');
$res = requestCardApi($member->integral_url, $data, $member->app_key);
\Yii::error($res, '同步积分res');
return $res;
}