admin/addon/pinfan/model/PinfanGroup.php

563 lines
29 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace addon\pinfan\model;
use addon\coupon\model\MemberCoupon;
use app\model\BaseModel;
use app\model\member\MemberAccount as MemberAccountModel;
use app\model\order\OrderCommon;
use app\model\order\OrderRefund;
use app\model\order\VirtualOrder;
use app\model\system\Cron;
use app\model\system\User;
/**
* 拼团返现组
*/
class PinfanGroup extends BaseModel
{
/**
* 创建拼团返现组
* @param $pintuan_order_info
* @return array|\multitype
*/
public function addPinfanGroup($pintuan_order_info)
{
model('promotion_pinfan_group')->startTrans();
//获取拼团信息
$pintuan_model = new Pinfan();
$pintuan_id = $pintuan_order_info[ 'pintuan_id' ];
$pintuan = $pintuan_model->getPinfanInfo([ [ 'pintuan_id', '=', $pintuan_id ] ]);
$pintuan_info = $pintuan[ 'data' ];
try {
$data = [
'site_id' => $pintuan_info[ 'site_id' ],
'goods_id' => $pintuan_info[ 'goods_id' ],
'is_virtual_goods' => $pintuan_info[ 'is_virtual_goods' ],
'pintuan_id' => $pintuan_order_info[ 'pintuan_id' ],
'head_id' => $pintuan_order_info[ 'head_id' ],
'pintuan_num' => $pintuan_info[ 'pintuan_num' ],
'pintuan_count' => 1,
'create_time' => time(),
'end_time' => time() + ( $pintuan_info[ 'pintuan_time' ] * 60 ),
'status' => 2,
'is_virtual_buy' => $pintuan_info[ 'is_virtual_buy' ],
'is_single_buy' => $pintuan_info[ 'is_single_buy' ],
'is_promotion' => $pintuan_info[ 'is_promotion' ],
'buy_num' => $pintuan_info[ 'buy_num' ],
];
$res = model('promotion_pinfan_group')->add($data);
//添加拼团返现组关闭事件
$cron = new Cron();
$cron->addCron(1, 0, "拼团返现组关闭", "ClosePinfanGroup", $data[ 'end_time' ], $res);
//更新拼团开组人数及购买人数
$pintua_data = [
'group_num' => $pintuan_info[ 'group_num' ] + 1,
'order_num' => $pintuan_info[ 'order_num' ] + 1,
];
$pintuan_model->editPinfanNum($pintua_data, [ [ 'pintuan_id', '=', $pintuan_order_info[ 'pintuan_id' ] ] ]);
model('promotion_pinfan_group')->commit();
return $this->success($res);
} catch (\Exception $e) {
model('promotion_pinfan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 编辑组信息
* @param array $condition
* @param array $data
* @return array
*/
public function editPinfanGroup($condition = [], $data = [])
{
$res = model('promotion_pinfan_group')->update($data, $condition);
return $this->success($res);
}
/**
* 加入拼团返现组
* @param $pintuan_order_info
* @return array|\multitype
*/
public function joinPinfanGroup($pintuan_order_info)
{
model('promotion_pinfan_group')->startTrans();
//获取拼团信息
$pintuan_model = new Pinfan();
$pintuan_id = $pintuan_order_info[ 'pintuan_id' ];
$pintuan = $pintuan_model->getPinfanInfo([ [ 'pintuan_id', '=', $pintuan_id ] ]);
$pintuan_info = $pintuan[ 'data' ];
try {
$order_num = $pintuan_info[ 'order_num' ] + 1;
$success_group_num = $pintuan_info[ 'success_group_num' ];
//获取拼团返现组信息
$group = $this->getPinfanGroupInfo([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ]);
$group_info = $group[ 'data' ];
//更新拼团返现组当前数量及状态
$pintuan_count = $group_info[ 'pintuan_count' ] + 1;
$res = $this->editPinfanGroup([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ], [ 'pintuan_count' => $pintuan_count ]);
if ($pintuan_count == $group_info[ 'pintuan_num' ]) {//已成团
$success_group_num += 1;
//修改拼团返现组状态
model('promotion_pinfan_group')->update([ 'status' => 3 ], [ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ]);
//查询该组所有订单
$pintuan_order_model = new PinfanOrder();
$pintuan_order = $pintuan_order_model->getPinfanOrderList([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ], 'order_id,pintuan_status,member_id');
$pintuan_order_list = $pintuan_order[ 'data' ];
#获取拼团组中支付的订单
$pintuan_bidding_arr = [];
foreach ($pintuan_order_list as $key => $value) {
if ($value[ 'pintuan_status' ] == 2) {
$pintuan_bidding_arr[ $key ] = $value;
}
}
$pintuan_bidding_arr = array_column($pintuan_bidding_arr, 'order_id');
shuffle($pintuan_bidding_arr);
#随机筛选拼中人Id组
$pintuan_success_arr = array_slice($pintuan_bidding_arr, 0, $pintuan_info[ 'chengtuan_num' ]);
$order_model = new OrderCommon();
$user_model = new User();
$member_account_model = new MemberAccountModel();
$user_admin_info = $user_model->getUserInfo([ [ 'app_module', '=', 'shop' ], [ 'is_admin', '=', 1 ], [ 'site_id', '=', $pintuan_info[ 'site_id' ] ] ])[ 'data' ];
if (!empty($pintuan_order_list)) {
foreach ($pintuan_order_list as $v) {
switch ( $v[ 'pintuan_status' ] ) {
case 0:
//将未支付的修改为失败
model('promotion_pinfan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//开放订单
$order_model->orderUnlock($v[ 'order_id' ]);
//关闭订单
$result = $order_model->orderClose($v[ 'order_id' ], [], '拼团组人数已满,订单自动关闭');
if ($result[ "code" ] < 0) {
model('promotion_pinfan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
break;
case 2://已支付
//开放订单
$order_model->orderUnlock($v[ 'order_id' ]);
//更新订单营销状态名称
if (in_array($v[ 'order_id' ], $pintuan_success_arr)) {
//将已支付的修改为成功
model('promotion_pinfan_order')->update([ 'pintuan_status' => 3 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
model('order')->update([ 'promotion_status_name' => '拼团成功', 'is_enable_refund' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
#拼中发货
//针对虚拟订单执行收发货操作
if ($group_info[ 'is_virtual_goods' ] == 1) {
$order_model->orderCommonTakeDelivery($v[ 'order_id' ]);
}
} else {
model('promotion_pinfan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
#未拼中订单
//主动退款
$order_refund_model = new OrderRefund();
$refund_result = $order_refund_model->activeRefund($v[ 'order_id' ], "拼团订单关闭", '拼团订单关闭');
if ($refund_result[ "code" ] < 0) {
model('promotion_pinfan_group')->rollback();
return $refund_result;
}
//关闭订单 todo 退款完毕后会自动关闭订单,理论上不需要在这里调用退款
// $result = $order_model->orderClose($v[ 'order_id' ]);
// if ($result[ "code" ] < 0) {
// model('promotion_pinfan_group')->rollback();
// return $result;
// }
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
#发放奖励
if ($pintuan_info[ 'reward_type' ] == 1) {
#奖励储值余额
$member_account_model->addMemberAccount($pintuan_info[ 'site_id' ], $v[ 'member_id' ], 'balance', $pintuan_info[ 'reward_type_num' ], 'pinfan', 0, '活动奖励发放', $v[ 'order_id' ]);
$user_model->addUserLog($user_admin_info[ 'uid' ], $user_admin_info[ 'username' ], $pintuan_info[ 'site_id' ], "拼团返利会员余额调整id:" . $v[ 'member_id' ] . "金额" . $pintuan_info[ 'reward_type_num' ]);
} else if ($pintuan_info[ 'reward_type' ] == 2) {
#奖励现金余额
$member_account_model->addMemberAccount($pintuan_info[ 'site_id' ], $v[ 'member_id' ], 'balance_money', $pintuan_info[ 'reward_type_num' ], 'pinfan', 0, '活动奖励发放', $v[ 'order_id' ]);
$user_model->addUserLog($user_admin_info[ 'uid' ], $user_admin_info[ 'username' ], $pintuan_info[ 'site_id' ], "拼团返利会员余额调整id:" . $v[ 'member_id' ] . "金额" . $pintuan_info[ 'reward_type_num' ]);
} else if ($pintuan_info[ 'reward_type' ] == 4) {
#奖励积分
$member_account_model->addMemberAccount($pintuan_info[ 'site_id' ], $v[ 'member_id' ], 'point', $pintuan_info[ 'reward_type_num' ], 'pinfan', 0, '活动奖励发放', $v[ 'order_id' ]);
$user_model->addUserLog($user_admin_info[ 'uid' ], $user_admin_info[ 'username' ], $pintuan_info[ 'site_id' ], "拼团返利会员积分调整id:" . $v[ 'member_id' ] . "积分数量" . $pintuan_info[ 'reward_type_num' ]);
} else if ($pintuan_info[ 'reward_type' ] == 3) {
#发放优惠券
$member_cpupon_model = new MemberCoupon();
$member_cpupon_model->sendCoupon(explode(',', $pintuan_info[ 'reward_type_num' ]), $pintuan_info[ 'site_id' ], $v[ 'member_id' ], 3, '', '', $v[ 'order_id' ]);
}
}
break;
}
}
}
}
//更新拼团 购买人数
$pintuan_model->editPinfanNum([ 'order_num' => $order_num, 'success_group_num' => $success_group_num ], [ [ 'pintuan_id', '=', $pintuan_order_info[ 'pintuan_id' ] ] ]);
model('promotion_pinfan_group')->commit();
return $this->success($res);
} catch (\Exception $e) {
model('promotion_pinfan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 查询拼团返现组信息
* @param array $condition
* @param string $field
* @return array
*/
public function getPinfanGroupInfo($condition = [], $field = '*')
{
$group_info = model('promotion_pinfan_group')->getInfo($condition, $field);
return $this->success($group_info);
}
/**
* 获取拼团返现组详情
* @param $condition
* @return array
*/
public function getPinfanGroupDetail($condition)
{
$field = 'pg.*,m.nickname,m.headimg,og.sku_name,og.sku_image,pp.pintuan_price';
$alias = 'pg';
$join = [
[ 'promotion_pinfan_order ppo', 'ppo.group_id = pg.group_id and ppo.member_id = pg.head_id', 'inner' ],
[ 'promotion_pinfan pp', 'pp.pintuan_id = pg.pintuan_id', 'inner' ],
[ 'order_goods og', 'og.order_id = ppo.order_id', 'inner' ],
[ 'member m', 'm.member_id = pg.head_id', 'inner' ]
];
$info = model('promotion_pinfan_group')->getInfo($condition, $field, $alias, $join);
//查询参与拼单的会员
if (!empty($info)) {
$member_list = model('promotion_pinfan_order')->getList([ [ "group_id", "=", $info[ "group_id" ] ] ], "member_img,nickname,member_id");
$info[ "member_list" ] = $member_list;
}
return $this->success($info);
}
/**
* 获取组列表
* @param array $condition
* @param string $field
* @return array
*/
public function getPinfanGroupList($condition = [], $field = '*')
{
$list = model('promotion_pinfan_group')->getList($condition, $field);
return $this->success($list);
}
/**
* 获取拼团返现组商品列表
* @param array $condition
* @return array
*/
public function getPinfanGoodsGroupList($condition = [])
{
$field = 'ppg.group_id,ppg.goods_id,ppg.pintuan_id,ppg.head_id,ppg.pintuan_num,ppg.pintuan_count,ppg.create_time,ppg.end_time,ppg.status,ppg.is_single_buy,ppg.is_promotion,ppg.buy_num,m.member_id,m.nickname,m.headimg';
$alias = 'ppg';
$join = [
[
'member m',
'ppg.head_id = m.member_id',
'inner'
]
];
$list = model('promotion_pinfan_group')->getList($condition, $field, 'ppg.create_time desc', $alias, $join);
return $this->success($list);
}
/**
* 获取拼团返现组分页列表
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
*/
public function getPinfanGroupPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '')
{
$field = 'pg.*,g.goods_name,g.goods_image,m.nickname,m.headimg';
$alias = 'pg';
$join = [
[
'goods g',
'pg.goods_id = g.goods_id',
'inner'
],
[
'member m',
'm.member_id = pg.head_id',
'inner'
]
];
$list = model('promotion_pinfan_group')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($list);
}
/**
* 关闭拼团返现组
* @param $group_id
* @return array|\multitype
*/
public function cronClosePinfanGroup($group_id)
{
model('promotion_pinfan_group')->startTrans();
try {
//获取拼团返现组信息
$pintuan_group = model('promotion_pinfan_group')->getInfo([ [ 'group_id', '=', $group_id ] ], 'status,is_virtual_buy,is_virtual_goods');
if (!empty($pintuan_group)) {
if ($pintuan_group[ 'status' ] == 2) {
//关闭所有已支付的订单
$res = $this->closePaidGroupOrder($group_id, $pintuan_group[ 'is_virtual_buy' ], $pintuan_group[ 'is_virtual_goods' ]);
if ($res[ 'code' ] < 0) {
model('promotion_pinfan_group')->rollback();
return $res;
}
}
}
model('promotion_pinfan_group')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_pinfan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 关闭拼团返现组已支付订单
* @param $group_id
* @param $is_virtual_buy
* @param $is_virtual_goods
* @return array|\multitype
*/
public function closePaidGroupOrder($group_id, $is_virtual_buy, $is_virtual_goods)
{
//获取所有该组的订单
$pintuan_order_model = new PinfanOrder();
$paid_order = $pintuan_order_model->getPinfanOrderList([ [ 'group_id', '=', $group_id ] ], 'order_id,pintuan_status,member_id,pintuan_id');
$paid_order_list = $paid_order[ 'data' ];
if (!empty($paid_order_list)) {
#获取拼团组中支付的订单
$pintuan_bidding_arr = [];
foreach ($paid_order_list as $key => $value) {
if ($value[ 'pintuan_status' ] == 2) {
$pintuan_bidding_arr[ $key ] = $value;
}
}
$pintuan_bidding_arr = array_column($pintuan_bidding_arr, 'order_id');
shuffle($pintuan_bidding_arr);
$pinfan_model = new Pinfan();
$pintuan_info = $pinfan_model->getPinfanInfo([ [ 'pintuan_id', '=', $paid_order_list[ 0 ][ 'pintuan_id' ] ] ])[ 'data' ];
if ($pintuan_info[ 'chengtuan_num' ] >= count($pintuan_bidding_arr)) {
$pintuan_success_arr = $pintuan_bidding_arr;
} else {
#随机筛选拼中人Id组
$pintuan_success_arr = array_slice($pintuan_bidding_arr, 0, $pintuan_info[ 'chengtuan_num' ]);
}
}
$order_model = new OrderCommon();
model('promotion_pinfan_group')->startTrans();
try {
if ($is_virtual_buy == 1) {//虚拟成团
//修改拼团返现组状态(成功)
$res = model('promotion_pinfan_group')->update([ 'status' => 3 ], [ [ 'group_id', '=', $group_id ] ]);
//获取拼团返现组信息
$pintuan_id = model('promotion_pinfan_group')->getValue([ [ 'group_id', '=', $group_id ] ], 'pintuan_id');
//更新拼团 成团组数
model('promotion_pinfan')->setInc([ [ 'pintuan_id', '=', $pintuan_id ] ], 'success_group_num');
$user_model = new User();
$member_account_model = new MemberAccountModel();
$user_admin_info = $user_model->getUserInfo([ [ 'app_module', '=', 'shop' ], [ 'is_admin', '=', 1 ], [ 'site_id', '=', $pintuan_info[ 'site_id' ] ] ])[ 'data' ];
if (!empty($paid_order_list)) {
foreach ($paid_order_list as $v) {
switch ( $v[ 'pintuan_status' ] ) {
case 0:
//将未支付的修改为失败
model('promotion_pinfan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//解除锁定
$order_model->orderUnlock($v[ 'order_id' ]);
//关闭订单
$result = $order_model->orderClose($v[ 'order_id' ], [], '拼团组关闭,订单自动关闭');
if ($result[ "code" ] < 0) {
model('promotion_pinfan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
break;
case 2://已支付
//解除锁定
$order_model->orderUnlock($v[ 'order_id' ]);
//更新订单营销状态名称
if (in_array($v[ 'order_id' ], $pintuan_success_arr)) {
//将已支付的修改为成功
model('promotion_pinfan_order')->update([ 'pintuan_status' => 3 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团成功', 'is_enable_refund' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
#拼中发货
//针对虚拟订单执行收发货操作
if ($is_virtual_goods == 1) {
$Virtual_model = new VirtualOrder();
$Virtual_model->orderTakeDelivery($v[ 'order_id' ]);
}
} else {
#未拼中订单
//主动退款
$order_refund_model = new OrderRefund();
$refund_result = $order_refund_model->activeRefund($v[ 'order_id' ], "拼团订单关闭", '拼团订单关闭');
if ($refund_result[ "code" ] < 0) {
model('promotion_pinfan_group')->rollback();
return $refund_result;
}
//关闭订单 todo 主动退款后应该不需要再退款了
// $result = $order_model->orderClose($v[ 'order_id' ]);
// if ($result[ "code" ] < 0) {
// model('promotion_pinfan_group')->rollback();
// return $result;
// }
model('promotion_pinfan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
#发放奖励
if ($pintuan_info[ 'reward_type' ] == 1) {
#奖励储值余额
$member_account_model->addMemberAccount($pintuan_info[ 'site_id' ], $v[ 'member_id' ], 'balance', $pintuan_info[ 'reward_type_num' ], 'pinfan', 0, '活动奖励发放', $v[ 'order_id' ]);
$user_model->addUserLog($user_admin_info[ 'uid' ], $user_admin_info[ 'username' ], $pintuan_info[ 'site_id' ], "拼团返利会员余额调整id:" . $v[ 'member_id' ] . "金额" . $pintuan_info[ 'reward_type_num' ]);
} else if ($pintuan_info[ 'reward_type' ] == 2) {
#奖励现金余额
$member_account_model->addMemberAccount($pintuan_info[ 'site_id' ], $v[ 'member_id' ], 'balance_money', $pintuan_info[ 'reward_type_num' ], 'pinfan', 0, '活动奖励发放', $v[ 'order_id' ]);
$user_model->addUserLog($user_admin_info[ 'uid' ], $user_admin_info[ 'username' ], $pintuan_info[ 'site_id' ], "拼团返利会员余额调整id:" . $v[ 'member_id' ] . "金额" . $pintuan_info[ 'reward_type_num' ]);
} else if ($pintuan_info[ 'reward_type' ] == 4) {
#奖励积分
$member_account_model->addMemberAccount($pintuan_info[ 'site_id' ], $v[ 'member_id' ], 'point', $pintuan_info[ 'reward_type_num' ], 'pinfan', 0, '活动奖励发放', $v[ 'order_id' ]);
$user_model->addUserLog($user_admin_info[ 'uid' ], $user_admin_info[ 'username' ], $pintuan_info[ 'site_id' ], "拼团返利会员积分调整id:" . $v[ 'member_id' ] . "积分数量" . $pintuan_info[ 'reward_type_num' ]);
} else if ($pintuan_info[ 'reward_type' ] == 3) {
#发放优惠券
$member_cpupon_model = new MemberCoupon();
$member_cpupon_model->sendCoupon(explode(',', $pintuan_info[ 'reward_type_num' ]), $pintuan_info[ 'site_id' ], $v[ 'member_id' ], 3, '', '', $v[ 'order_id' ]);
}
}
break;
}
}
}
} else {//未开启虚拟成团
//修改拼团返现组状态为失败
$res = model('promotion_pinfan_group')->update([ 'status' => 1 ], [ [ 'group_id', '=', $group_id ] ]);
if (!empty($paid_order_list)) {
foreach ($paid_order_list as $v) {
switch ( $v[ 'pintuan_status' ] ) {
case 0:
//将未支付的修改为失败
model('promotion_pinfan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//解除锁定
$order_model->orderUnlock($v[ 'order_id' ]);
//关闭订单
$result = $order_model->orderClose($v[ 'order_id' ], [] , '拼团组关闭,订单自动关闭');
if ($result[ 'code' ] < 0) {
model('promotion_pinfan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
break;
case 2:
//解除锁定
$order_model->orderUnlock($v[ 'order_id' ]);
//关闭拼团订单
model('promotion_pinfan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//主动退款
$order_refund_model = new OrderRefund();
$refund_result = $order_refund_model->activeRefund($v[ 'order_id' ], '拼团订单关闭,订单自动退款', '拼团订单关闭,订单自动退款');
if ($refund_result[ 'code' ] < 0) {
model('promotion_pinfan_group')->rollback();
return $refund_result;
}
//关闭订单 todo 其实可以删掉
// $result = $order_model->orderClose($v[ 'order_id' ]);
// if ($result[ "code" ] < 0) {
// model('promotion_pinfan_group')->rollback();
// return $result;
// }
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
break;
}
}
}
}
model('promotion_pinfan_group')->commit();
return $this->success($res);
} catch (\Exception $e) {
model('promotion_pinfan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
}