www.lightcourse.com/app/common/logic/Order.php

609 lines
28 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\common\logic;
use think\facade\Db;
/**
* ============================================================================
* 联课教育商城系统
* ============================================================================
* 版权所有 2022 刻羽互动科技有限公司,并保留所有权利。
* 网站地址: http://www.o1h.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* ============================================================================
* 逻辑层模型
*/
class Order {
/**
* 取消订单
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $user 操作人
* @param string $msg 操作备注
* @param boolean $if_update_account 是否变更账户金额
* @param boolean $if_queue 是否使用队列
* @param boolean $if_pay 是否已经支付,已经支付则全部退回支付金额
* @return array
*/
public function changeOrderStateCancel($order_info, $role, $user = '', $msg = '', $if_update_account = true, $if_quque = true, $if_pay = false) {
$order_model = model('order');
if ($order_info['order_state'] != ORDER_STATE_CANCEL) {
$order_id = $order_info['order_id'];
//库存销量变更
$goods_list = $order_model->getOrdergoodsList(array('order_id' => $order_id));
$data = array();
$pintuan_list = array(); //需要后续处理的促销活动
$ppintuanorder_model=model('ppintuanorder');
foreach ($goods_list as $goods) {
$data[$goods['goods_id']] = $goods['goods_num'];
//如果是拼团
if ($goods['goods_type'] == 6) {
$pintuan_list[] = $goods;
}
$condition=array();
$condition[]=array('order_id','=',$order_info['order_id']);
$condition[]=array('pintuanorder_type','=',0);
$condition[]=array('pintuanorder_state','=',1);
$ppintuanorder_model->editPpintuanorder($condition, array('pintuanorder_state'=>0));
}
model('goods')->cancelOrderUpdateStorage($data);
if ($if_update_account) {
$predeposit_model = model('predeposit');
//注意:当用户全额使用预存款进行支付,并不会冻结, 当用户使用部分预存款进行支付,支付的预存款则会冻结.也就是支付成功之后不会有冻结资金,当未支付成功,使用的预付款变为冻结资金。
if ($order_info['order_state'] == ORDER_STATE_NEW) {
//解冻充值卡
$rcb_amount = floatval($order_info['rcb_amount']);
if ($rcb_amount > 0) {
$data_pd = array();
$data_pd['member_id'] = $order_info['buyer_id'];
$data_pd['member_name'] = $order_info['buyer_name'];
$data_pd['amount'] = $rcb_amount;
$data_pd['order_sn'] = $order_info['order_sn'];
$predeposit_model->changeRcb('order_cancel', $data_pd);
}
//当是已下单,未支付(可能包含部分款项使用预存款,预存款在冻结资金),则退还预存款,取消订单
$pd_amount = floatval($order_info['pd_amount']);
if ($pd_amount > 0) {
$data_pd = array();
$data_pd['member_id'] = $order_info['buyer_id'];
$data_pd['member_name'] = $order_info['buyer_name'];
$data_pd['amount'] = $pd_amount;
$data_pd['order_sn'] = $order_info['order_sn'];
$predeposit_model->changePd('order_cancel', $data_pd);
}
}
if ($order_info['order_state'] == ORDER_STATE_PAY && $order_info['payment_code'] != 'offline') {//offline为货到付款的订单取消时不需要返回预存款
//拼团退团
if (!empty($pintuan_list)) {
foreach ($pintuan_list as $goods) {
$ppintuangroup_info = Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->lock(true)->find();
if ($ppintuangroup_info && $ppintuangroup_info['pintuangroup_state'] == 1) {
if ($ppintuangroup_info['pintuangroup_joined'] > 0) {
Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->dec('pintuangroup_joined')->update();
if ($ppintuangroup_info['pintuangroup_joined'] == 1) {
//拼团统计开团数量
$condition = array();
$condition[] = array('pintuan_id', '=', $ppintuangroup_info['pintuan_id']);
$condition[] = array('pintuan_count', '>', 0);
Db::name('ppintuan')->where($condition)->dec('pintuan_count')->update();
}
}
}
}
}
$refundreturn_model = model('refundreturn');
$refundreturn_model->refundAmount($order_info, $order_info['order_amount']);
}
}
//更新订单信息
$update_order = array('order_state' => ORDER_STATE_CANCEL, 'pd_amount' => 0);
$update = $order_model->editOrder($update_order, array('order_id' => $order_id));
if (!$update) {
throw new \think\Exception('保存失败', 10006);
}
//分销佣金取消
$condition=array();
$condition[]=array('orderinviter_order_id','=',$order_id);
$condition[]=array('orderinviter_valid','=',0);
$condition[]=array('orderinviter_order_type','=',0);
Db::name('orderinviter')->where($condition)->update(['orderinviter_valid' => 2]);
//添加订单日志
$data = array();
$data['order_id'] = $order_id;
$data['log_role'] = $role;
$data['log_msg'] = '取消了订单';
$data['log_user'] = $user;
if ($msg) {
$data['log_msg'] .= ' ( ' . $msg . ' )';
}
$data['log_orderstate'] = ORDER_STATE_CANCEL;
$order_model->addOrderlog($data);
}
}
/**
* 收货
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $user 操作人
* @param string $msg 操作备注
* @return array
*/
public function changeOrderStateReceive($order_info, $role, $user = '', $msg = '') {
try {
$member_id = $order_info['buyer_id'];
$order_id = $order_info['order_id'];
$order_model = model('order');
//更新订单状态
$update_order = array();
$update_order['finnshed_time'] = TIMESTAMP;
$update_order['order_state'] = ORDER_STATE_SUCCESS;
$update = $order_model->editOrder($update_order, array('order_id' => $order_id));
if (!$update) {
throw new \think\Exception('保存失败', 10006);
}
//添加订单日志
$data = array();
$data['order_id'] = $order_id;
$data['log_role'] = 'buyer';
$data['log_msg'] = '签收了货物';
$data['log_user'] = $user;
if ($msg) {
$data['log_msg'] .= ' ( ' . $msg . ' )';
}
$data['log_orderstate'] = ORDER_STATE_SUCCESS;
$order_model->addOrderlog($data);
//分发推广佣金
$orderinviter_model = model('orderinviter');
$orderinviter_model->giveMoney($order_id);
//添加会员积分
if (config('ds_config.points_isuse') == 1) {
model('points')->savePointslog('order', array(
'pl_memberid' => $order_info['buyer_id'], 'pl_membername' => $order_info['buyer_name'],
'orderprice' => $order_info['order_amount'], 'order_sn' => $order_info['order_sn'],
'order_id' => $order_info['order_id']
), true);
}
//添加会员经验值
model('exppoints')->saveExppointslog('order', array(
'explog_memberid' => $order_info['buyer_id'], 'explog_membername' => $order_info['buyer_name'],
'orderprice' => $order_info['order_amount'], 'order_sn' => $order_info['order_sn'],
'order_id' => $order_info['order_id']
), true);
//邀请人获得返利积分
$inviter_id = ds_getvalue_byname('member', 'member_id', $member_id, 'inviter_id');
if (!empty($inviter_id)) {
$inviter_name = ds_getvalue_byname('member', 'member_id', $inviter_id, 'member_name');
$rebate_amount = ceil(0.01 * $order_info['order_amount'] * config('ds_config.points_rebate'));
model('points')->savePointslog('rebate', array(
'pl_memberid' => $inviter_id, 'pl_membername' => $inviter_name, 'pl_points' => $rebate_amount
), true);
}
return ds_callback(true, '操作成功');
} catch (Exception $e) {
return ds_callback(false, '操作失败');
}
}
/**
* 更改运费
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $user 操作人
* @param float $price 运费
* @return array
*/
public function changeOrderShipPrice($order_info, $role, $user = '', $price) {
try {
$order_id = $order_info['order_id'];
$order_model = model('order');
$data = array();
$data['shipping_fee'] = abs(floatval($price));
$data['order_amount'] = Db::raw('goods_amount+' . $data['shipping_fee']);
if (($order_info['rcb_amount'] + $order_info['pd_amount']) > ($data['shipping_fee'] + $order_info['goods_amount'])) {
throw new \think\Exception('订单金额必须大于用户已支付金额', 10006);
}
$update = $order_model->editOrder($data, array('order_id' => $order_id));
halt($update);
if ($update >= 0) {
throw new \think\Exception('保存失败', 10006);
}
//记录订单日志
$data = array();
$data['order_id'] = $order_id;
$data['log_role'] = $role;
$data['log_user'] = $user;
$data['log_msg'] = '修改了运费' . '( ' . $price . ' )';
;
$data['log_orderstate'] = $order_info['payment_code'] == 'offline' ? ORDER_STATE_PAY : ORDER_STATE_NEW;
$order_model->addOrderlog($data);
return ds_callback(true, '操作成功');
} catch (Exception $e) {
return ds_callback(false, $e->getMessage());
}
}
/**
* 更改运费
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $user 操作人
* @param float $price 运费
* @return array
*/
public function changeOrderSpayPrice($order_info, $role, $user = '', $price) {
$order_model = model('order');
Db::startTrans();
try {
$order_id = $order_info['order_id'];
$data = array();
$data['goods_amount'] = abs(floatval($price));
$data['order_amount'] = Db::raw('shipping_fee+' . $data['goods_amount']);
if (($order_info['rcb_amount'] + $order_info['pd_amount']) > ($order_info['shipping_fee'] + $data['goods_amount'])) {
throw new \think\Exception('订单金额必须大于用户已支付金额', 10006);
}
$update = $order_model->editOrder($data, array('order_id' => $order_id));
if ($update < 0) {
throw new \think\Exception('保存失败', 10006);
}
//修改商品费用
if ($data['goods_amount'] > 0) {
$ordergoods_list = $order_model->getOrdergoodsList(array('order_id' => $order_id));
$diff_amount = $data['goods_amount'] - $order_info['goods_amount'];
$i = 0;
foreach ($ordergoods_list as $ordergoods) {
if ($i != (count($ordergoods_list) - 1)) {
if ($order_info['goods_amount'] > 0) {
$temp = $ordergoods['goods_pay_price'] / $order_info['goods_amount'] * $diff_amount;
$price = round($ordergoods['goods_pay_price'] + $temp, 2);
} else {
$price = round(1 / count($ordergoods_list) * $diff_amount, 2);
$temp = $price;
}
$diff_amount -= $temp;
} else {
$price = $ordergoods['goods_pay_price'] + $diff_amount;
}
$order_model->editOrdergoods(array('goods_pay_price' => $price), array('rec_id' => $ordergoods['rec_id']));
//修改分销佣金
$condition=array();
$condition[]=array('orderinviter_order_id','=',$order_id);
$condition[]=array('orderinviter_goods_id','=',$ordergoods['goods_id']);
$condition[]=array('orderinviter_valid','=',0);
$condition[]=array('orderinviter_order_type','=',0);
$orderinviter_list=Db::name('orderinviter')->where($condition)->select()->toArray();
foreach($orderinviter_list as $orderinviter_info){
$orderinviter_goods_amount=$price;
$orderinviter_money=round($orderinviter_info['orderinviter_ratio']/100*$orderinviter_goods_amount,2);
Db::name('orderinviter')->where(array(array('orderinviter_id','=',$orderinviter_info['orderinviter_id'])))->update(['orderinviter_goods_amount' => $orderinviter_goods_amount,'orderinviter_money'=>$orderinviter_money]);
}
$i++;
}
} else {
$order_model->editOrdergoods(array('goods_pay_price' => 0), array('order_id' => $order_id));
//修改分销佣金
$condition=array();
$condition[]=array('orderinviter_order_id','=',$order_id);
$condition[]=array('orderinviter_valid','=',0);
$condition[]=array('orderinviter_order_type','=',0);
Db::name('orderinviter')->where($condition)->update(['orderinviter_goods_amount' => 0,'orderinviter_money'=>0]);
}
//记录订单日志
$data = array();
$data['order_id'] = $order_id;
$data['log_role'] = $role;
$data['log_user'] = $user;
$data['log_msg'] = '修改了运费' . '( ' . $price . ' )';
;
$data['log_orderstate'] = $order_info['payment_code'] == 'offline' ? ORDER_STATE_PAY : ORDER_STATE_NEW;
$order_model->addOrderlog($data);
} catch (\Exception $e) {
Db::rollback();
return ds_callback(false, $e->getMessage());
}
Db::commit();
return ds_callback(true, '操作成功');
}
/**
* 回收站操作(放入回收站、还原、永久删除)
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $state_type 操作类型
* @return array
*/
public function changeOrderStateRecycle($order_info, $role, $state_type) {
$order_id = $order_info['order_id'];
$order_model = model('order');
//更新订单删除状态
$state = str_replace(array('delete', 'drop', 'restore'), array(
ORDER_DEL_STATE_DELETE, ORDER_DEL_STATE_DROP, ORDER_DEL_STATE_DEFAULT
), $state_type);
$update = $order_model->editOrder(array('delete_state' => $state), array('order_id' => $order_id));
if (!$update) {
return ds_callback(false, '操作失败');
} else {
return ds_callback(true, '操作成功');
}
}
/**
* 发货
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $user 操作人
* @return array
*/
public function changeOrderSend($order_info, $role, $user = '', $post = array()) {
$order_id = $order_info['order_id'];
$order_model = model('order');
//查看是否为拼团订单
$condition = array();
$condition[] = array('order_id', '=', $order_id);
$condition[] = array('pintuanorder_type', '=', 0);
$pintuanorder = model('ppintuanorder')->getOnePpintuanorder($condition);
if (!empty($pintuanorder) && $pintuanorder['pintuanorder_state'] != 2) {
return ds_callback(FALSE, '拼团订单暂时不允许发货');
}
try {
Db::startTrans();
$data = array();
$data['reciver_name'] = $post['reciver_name'];
$data['reciver_info'] = $post['reciver_info'];
$data['deliver_explain'] = $post['deliver_explain'];
$data['daddress_id'] = intval($post['daddress_id']);
$data['shipping_express_id'] = intval($post['shipping_express_id']);
$data['shipping_time'] = TIMESTAMP;
$condition = array();
$condition[] = array('order_id', '=', $order_id);
$update = $order_model->editOrdercommon($data, $condition);
if (!$update) {
throw new \think\Exception('操作失败', 10006);
}
$data = array();
$data['shipping_code'] = isset($post['shipping_code']) ? $post['shipping_code'] : '';
$data['order_state'] = ORDER_STATE_SEND;
$data['delay_time'] = TIMESTAMP;
$update = $order_model->editOrder($data, $condition);
if (!$update) {
throw new \think\Exception('操作失败', 10006);
}
Db::commit();
} catch (Exception $e) {
Db::rollback();
return ds_callback(false, $e->getMessage());
}
if ($post['shipping_express_id'] && isset($post['shipping_code'])) {
$express_info = model('express')->getExpressInfo(intval($post['shipping_express_id']));
}
//添加订单日志
$data = array();
$data['order_id'] = intval($order_id);
$data['log_role'] = 'admin';
$data['log_user'] = $user;
$data['log_msg'] = '发出了货物 ( 编辑了发货信息 )';
$data['log_orderstate'] = ORDER_STATE_SEND;
$order_model->addOrderlog($data);
// 发送买家消息
$param = array();
$param['code'] = 'order_deliver_success';
$param['member_id'] = $order_info['buyer_id'];
//阿里短信参数
$param['ali_param'] = array(
'order_sn' => $order_info['order_sn'],
);
$param['ten_param'] = array(
$order_info['order_sn'],
);
$param['param'] = array_merge($param['ali_param'], array(
'order_url' => HOME_SITE_URL .'/Memberorder/show_order?order_id='.$order_id
));
//微信模板消息
$param['weixin_param'] = array(
'url' => config('ds_config.h5_site_url') . '/member/order_detail?order_id=' . $order_id,
'data' => array(
"keyword1" => array(
"value" => isset($post['shipping_code']) ? $post['shipping_code'] : '无',
"color" => "#333"
),
"keyword2" => array(
"value" => isset($express_info['express_name']) ? $express_info['express_name'] : '无',
"color" => "#333"
),
"keyword3" => array(
"value" => date('Y-m-d H:i'),
"color" => "#333"
),
"keyword4" => array(
"value" => isset($order_info['extend_order_common']['reciver_name']) ? $order_info['extend_order_common']['reciver_name'] : '无',
"color" => "#333"
),
"keyword5" => array(
"value" => isset($order_info['extend_order_common']['address']) ? $order_info['extend_order_common']['reciver_info']['address'] : '无',
"color" => "#333"
)
),
);
model('cron')->addCron(array('cron_exetime'=>TIMESTAMP,'cron_type'=>'sendMemberMsg','cron_value'=>serialize($param)));
return ds_callback(true, '操作成功');
}
/**
* 收到货款
* @param array $order_info
* @param string $role 操作角色 buyer、admin、system 分别代表买家、管理员、系统
* @param string $user 操作人
* @return array
*/
public function changeOrderReceivePay($order_list, $role, $user = '', $post = array()) {
$order_model = model('order');
$data = array();
$data['api_paystate'] = 1;
$update = $order_model->editOrderpay($data, array('pay_sn' => $order_list[0]['pay_sn']));
if (!$update) {
throw new \think\Exception('更新支付单状态失败', 10006);
}
$predeposit_model = model('predeposit');
foreach ($order_list as $order_info) {
$order_id = $order_info['order_id'];
if ($order_info['order_state'] != ORDER_STATE_NEW)
continue;
//下单,支付被冻结的充值卡
$rcb_amount = floatval($order_info['rcb_amount']);
if ($rcb_amount > 0) {
$data_pd = array();
$data_pd['member_id'] = $order_info['buyer_id'];
$data_pd['member_name'] = $order_info['buyer_name'];
$data_pd['amount'] = $rcb_amount;
$data_pd['order_sn'] = $order_info['order_sn'];
$predeposit_model->changeRcb('order_comb_pay', $data_pd);
}
//下单,支付被冻结的预存款
$pd_amount = floatval($order_info['pd_amount']);
if ($pd_amount > 0) {
$data_pd = array();
$data_pd['member_id'] = $order_info['buyer_id'];
$data_pd['member_name'] = $order_info['buyer_name'];
$data_pd['amount'] = $pd_amount;
$data_pd['order_sn'] = $order_info['order_sn'];
$predeposit_model->changePd('order_comb_pay', $data_pd);
}
}
//更新订单状态
$update_order = array();
$update_order['order_state'] = ORDER_STATE_PAY;
$update_order['payment_time'] = isset($post['payment_time']) ? strtotime($post['payment_time']) : TIMESTAMP;
$update_order['payment_code'] = isset($post['payment_code']) ? $post['payment_code'] : '';
$update_order['trade_no'] = isset($post['trade_no']) ? $post['trade_no'] : '';
$update = $order_model->editOrder($update_order, array(
'pay_sn' => $order_info['pay_sn'], 'order_state' => ORDER_STATE_NEW
));
if (!$update) {
throw new \think\Exception('操作失败', 10006);
}
$ppintuangroup_model = model('ppintuangroup');
foreach ($order_list as $order_info) {
//防止重复发送消息
if ($order_info['order_state'] != ORDER_STATE_NEW)
continue;
$order_id = $order_info['order_id'];
$order_goods = $order_model->getOrdergoodsList(array('order_id' => $order_info['order_id']));
foreach ($order_goods as $goods) {
//如果是拼团
if ($goods['goods_type'] == 6) {
$ppintuangroup_info = Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->lock(true)->find();
if ($ppintuangroup_info && $ppintuangroup_info['pintuangroup_state'] == 1) {
if ($ppintuangroup_info['pintuangroup_joined'] == 0) {
//拼团统计开团数量
$condition = array();
$condition[] = array('pintuan_id', '=', $ppintuangroup_info['pintuan_id']);
Db::name('ppintuan')->where($condition)->inc('pintuan_count')->update();
}
//开团统计新增人数
Db::name('ppintuangroup')->where('pintuangroup_id', $goods['promotions_id'])->inc('pintuangroup_joined')->update();
if (($ppintuangroup_info['pintuangroup_joined'] + 1) >= $ppintuangroup_info['pintuangroup_limit_number']) {
$condition = array();
$condition[] = array('pintuangroup_is_virtual', '=', 0);
$condition[] = array('pintuangroup_id', '=', $goods['promotions_id']);
$condition2 = array();
$condition2[] = array('pintuangroup_id', '=', $goods['promotions_id']);
$ppintuangroup_model->successPpintuangroup($condition, $condition2);
$condition = array();
$condition[] = array('pintuan_id', '=', $ppintuangroup_info['pintuan_id']);
Db::name('ppintuan')->where($condition)->inc('pintuan_ok_count')->update();
}
}
}
}
// 支付成功发送买家消息
$param = array();
$param['code'] = 'order_payment_success';
$param['member_id'] = $order_info['buyer_id'];
//阿里短信参数
$param['ali_param'] = array(
'order_sn' => $order_info['order_sn'],
);
$param['ten_param'] = array(
$order_info['order_sn'],
);
$param['param'] = array_merge($param['ali_param'], array(
'order_url' => HOME_SITE_URL .'/Memberorder/show_order?order_id='.$order_info['order_id']
));
//微信模板消息
$param['weixin_param'] = array(
'url' => config('ds_config.h5_site_url') . '/member/order_detail?order_id=' . $order_info['order_id'],
'data' => array(
"keyword1" => array(
"value" => $order_info['order_sn'],
"color" => "#333"
),
"keyword2" => array(
"value" => $order_goods[0]['goods_name'] . (count($order_goods) > 1 ? sprintf(lang('order_goods_more_than_one'), count($order_goods)) : ''),
"color" => "#333"
),
"keyword3" => array(
"value" => $order_info['order_amount'],
"color" => "#333"
),
"keyword4" => array(
"value" => date('Y-m-d H:i', $order_info['add_time']),
"color" => "#333"
)
),
);
model('cron')->addCron(array('cron_exetime'=>TIMESTAMP,'cron_type'=>'sendMemberMsg','cron_value'=>serialize($param)));
//添加订单日志
$data = array();
$data['order_id'] = $order_id;
$data['log_role'] = $role;
$data['log_user'] = $user;
$data['log_msg'] = '收到了货款 ' . (isset($post['trade_no']) ? ('( 支付平台交易号 : ' . $post['trade_no'] . ' )') : '');
$data['log_orderstate'] = ORDER_STATE_PAY;
$order_model->addOrderlog($data);
}
}
}