jh-admin/addon/pintuan/model/PintuanGroup.php

513 lines
23 KiB
PHP

<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都SAAS云科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\pintuan\model;
use app\model\BaseModel;
use app\model\message\Message;
use app\model\order\OrderCommon;
use app\model\order\OrderRefund;
use app\model\system\Cron;
/**
* 拼团组
*/
class PintuanGroup extends BaseModel
{
/**
* 创建拼团组
* @param $pintuan_order_info
* @return array|\multitype
*/
public function addPintuanGroup($pintuan_order_info)
{
model('promotion_pintuan_group')->startTrans();
//获取拼团信息
$pintuan_model = new Pintuan();
$pintuan_id = $pintuan_order_info[ 'pintuan_id' ];
$pintuan_info = $pintuan_model->getPintuanInfo([ [ 'pintuan_id', '=', $pintuan_id ] ])[ 'data' ] ?? [];
$pintuan_type = $pintuan_info[ 'pintuan_type' ];//类型
switch ( $pintuan_type ) {
case 'ordinary'://默认拼团方式
$pintuan_num = $pintuan_info[ 'pintuan_num' ];
break;
case 'ladder'://阶梯拼团
$pintuan_num = $pintuan_order_info[ 'pintuan_num' ];
break;
}
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_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_pintuan_group')->add($data);
//添加拼团组关闭事件
$cron = new Cron();
$cron->addCron(1, 0, "拼团组关闭", "ClosePintuanGroup", $data[ 'end_time' ], $res);
//更新拼团开组人数及购买人数
$pintua_data = [
'group_num' => $pintuan_info[ 'group_num' ] + 1,
'order_num' => $pintuan_info[ 'order_num' ] + 1,
];
$pintuan_model->editPintuanNum($pintua_data, [ [ 'pintuan_id', '=', $pintuan_order_info[ 'pintuan_id' ] ] ]);
model('promotion_pintuan_group')->commit();
return $this->success($res);
} catch (\Exception $e) {
model('promotion_pintuan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 编辑组信息
* @param array $condition
* @param array $data
* @return array
*/
public function editPintuanGroup($condition = [], $data = [])
{
$res = model('promotion_pintuan_group')->update($data, $condition);
return $this->success($res);
}
/**
* 加入拼团组
* @param $pintuan_order_info
* @return array|\multitype
*/
public function joinPintuanGroup($pintuan_order_info)
{
model('promotion_pintuan_group')->startTrans();
//获取拼团信息
$pintuan_model = new Pintuan();
$pintuan_id = $pintuan_order_info[ 'pintuan_id' ];
$pintuan = $pintuan_model->getPintuanInfo([ [ '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_info = $this->getPintuanGroupInfo([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ])[ 'data' ] ?? [];
//更新拼团组当前数量及状态
$pintuan_count = $group_info[ 'pintuan_count' ] + 1;
$res = $this->editPintuanGroup([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ], [ 'pintuan_count' => $pintuan_count ]);
if ($pintuan_count == $group_info[ 'pintuan_num' ]) {//已成团
$success_group_num += 1;
//修改拼团组状态
model('promotion_pintuan_group')->update([ 'status' => 3 ], [ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ]);
//查询该组所有订单
$pintuan_order_model = new PintuanOrder();
$pintuan_order = $pintuan_order_model->getPintuanOrderList([ [ 'group_id', '=', $pintuan_order_info[ 'group_id' ] ] ], 'order_id,pintuan_status');
$pintuan_order_list = $pintuan_order[ 'data' ];
$message_model = new Message();
$order_model = new OrderCommon();
if (!empty($pintuan_order_list)) {
foreach ($pintuan_order_list as $v) {
switch ( $v[ 'pintuan_status' ] ) {
case 0:
//将未支付的修改为失败
model('promotion_pintuan_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_pintuan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
// 发送消息
$param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $group_info[ 'site_id' ] ];
$message_model->sendMessage($param);
break;
break;
case 2://已支付
//将已支付的修改为成功
model('promotion_pintuan_order')->update([ 'pintuan_status' => 3 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//开放订单
$order_model->orderUnlock($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']);
// }
$pintuan_order_model = new PintuanOrder();
$pintuan_order_model->virtualSuccessAction($v[ 'order_id' ]);
// 发送消息
$param = [ 'keywords' => 'PINTUAN_COMPLETE', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $group_info[ 'site_id' ] ];
$message_model->sendMessage($param);
break;
}
}
}
}
//更新拼团 购买人数
$pintuan_model->editPintuanNum([ 'order_num' => $order_num, 'success_group_num' => $success_group_num ], [ [ 'pintuan_id', '=', $pintuan_order_info[ 'pintuan_id' ] ] ]);
model('promotion_pintuan_group')->commit();
return $this->success($res);
} catch (\Exception $e) {
model('promotion_pintuan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 查询拼团组信息
* @param array $condition
* @param string $field
* @return array
*/
public function getPintuanGroupInfo($condition = [], $field = '*')
{
$group_info = model('promotion_pintuan_group')->getInfo($condition, $field);
return $this->success($group_info);
}
/**
* 获取拼团组详情
* @param $condition
* @return array
*/
public function getPintuanGroupDetail($condition)
{
$field = 'pg.*,m.nickname,m.headimg,og.sku_name,og.sku_image,pp.pintuan_price';
$alias = 'pg';
$join = [
[ 'promotion_pintuan_order ppo', 'ppo.group_id = pg.group_id and ppo.member_id = pg.head_id', 'inner' ],
[ 'promotion_pintuan 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_pintuan_group')->getInfo($condition, $field, $alias, $join);
//查询参与拼单的会员
if (!empty($info)) {
$member_list = model('promotion_pintuan_order')->getList([ [ "group_id", "=", $info[ "group_id" ] ], [ 'pintuan_status', 'not in', '0,1' ] ], "pintuan_status,member_img,nickname,member_id");
$info[ "member_list" ] = $member_list;
}
return $this->success($info);
}
/**
* 获取组列表
* @param array $condition
* @param string $field
* @return array
*/
public function getPintuanGroupList($condition = [], $field = '*')
{
$list = model('promotion_pintuan_group')->getList($condition, $field);
return $this->success($list);
}
/**
* 获取拼团组商品列表
* @param array $condition
* @return array
*/
public function getPintuanGoodsGroupList($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_pintuan_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 getPintuanGroupPageList($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_pintuan_group')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($list);
}
/**
* 关闭拼团组
* @param $group_id
* @return array|\multitype
*/
public function cronClosePintuanGroup($group_id)
{
model('promotion_pintuan_group')->startTrans();
try {
//获取拼团组信息
$pintuan_group = model('promotion_pintuan_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_pintuan_group')->rollback();
return $res;
}
}
}
model('promotion_pintuan_group')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_pintuan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
/**
* 关闭拼团组未支付订单
* @param $group_id
* @return array|\multitype
*/
public function closeUnpaidGroupOrder($group_id)
{
//获取所有改组未支付的订单
$pintuan_order_model = new PintuanOrder();
$unpaid_order = $pintuan_order_model->getPintuanOrderList([ [ 'group_id', '=', $group_id ], [ 'pintuan_status', '=', 0 ] ], 'order_id');
$unpaid_order_list = $unpaid_order[ 'data' ];
model('promotion_pintuan_order')->startTrans();
$order_model = new OrderCommon();
try {
if (!empty($unpaid_order_list)) {
foreach ($unpaid_order_list as $v) {
//修改拼团订单状态
model('promotion_pintuan_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_pintuan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
}
}
model('promotion_pintuan_order')->commit();
return $this->success();
} catch (\Exception $e) {
model('promotion_pintuan_order')->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 PintuanOrder();
$paid_order = $pintuan_order_model->getPintuanOrderList([ [ 'group_id', '=', $group_id ] ], 'order_id,pintuan_status,site_id');
$paid_order_list = $paid_order[ 'data' ];
$order_model = new OrderCommon();
$message_model = new Message();
model('promotion_pintuan_group')->startTrans();
try {
if ($is_virtual_buy == 1) {//虚拟成团
//修改拼团组状态(成功)
$res = model('promotion_pintuan_group')->update([ 'status' => 3 ], [ [ 'group_id', '=', $group_id ] ]);
//获取拼团组信息
$pintuan_id = model('promotion_pintuan_group')->getValue([ [ 'group_id', '=', $group_id ] ], 'pintuan_id');
//更新拼团 成团组数
model('promotion_pintuan')->setInc([ [ 'pintuan_id', '=', $pintuan_id ] ], 'success_group_num');
if (!empty($paid_order_list)) {
$order_id = 0;
foreach ($paid_order_list as $v) {
switch ( $v[ 'pintuan_status' ] ) {
case 0:
//将未支付的修改为失败
model('promotion_pintuan_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_pintuan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
// 发送消息
$param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
$message_model->sendMessage($param);
break;
case 2://已支付
$order_id = $v[ 'order_id' ];
//解除锁定
$order_model->orderUnlock($v[ 'order_id' ]);
//将已支付的修改为成功
model('promotion_pintuan_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']);
// }
$pintuan_order_model = new PintuanOrder();
$pintuan_order_model->virtualSuccessAction($v[ 'order_id' ]);
// 发送消息
$param = [ 'keywords' => 'PINTUAN_COMPLETE', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
$message_model->sendMessage($param);
break;
}
}
}
} else {//未开启虚拟成团
//修改拼团组状态为失败
$res = model('promotion_pintuan_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_pintuan_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_pintuan_group')->rollback();
return $result;
}
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
// 发送消息
$param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
$message_model->sendMessage($param);
break;
case 2:
//关闭拼团订单
model('promotion_pintuan_order')->update([ 'pintuan_status' => 1 ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
//解除锁定
$order_model->orderUnlock($v[ 'order_id' ]);
//主动退款
$order_refund_model = new OrderRefund();
$refund_result = $order_refund_model->activeRefund($v[ 'order_id' ], "拼团订单关闭", '拼团订单关闭');
if ($refund_result[ "code" ] < 0) {
model('promotion_pintuan_group')->rollback();
return $refund_result;
}
//关闭订单
// $result = $order_model->orderClose($v['order_id'], [], '拼团失败,订单自动关闭');
// if ($result["code"] < 0) {
// model('promotion_pintuan_group')->rollback();
// return $result;
// }
//更新订单营销状态名称
model('order')->update([ 'promotion_status_name' => '拼团失败' ], [ [ 'order_id', '=', $v[ 'order_id' ] ] ]);
// 发送消息
$param = [ 'keywords' => 'PINTUAN_FAIL', 'time' => time(), 'order_id' => $v[ 'order_id' ], 'site_id' => $v[ 'site_id' ] ];
$message_model->sendMessage($param);
break;
}
}
}
}
model('promotion_pintuan_group')->commit();
return $this->success($res);
} catch (\Exception $e) {
model('promotion_pintuan_group')->rollback();
return $this->error('', $e->getMessage());
}
}
}