文件
mashangyoujiu/Application/Common/Business/BillOrder.class.php

620 行
25 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace Common\Business;
use Blessing\Business\Index;
use Common\Model\BillOrderViewModel;
use Common\Model\RetailBillAdvanceModel;
use Common\Model\RetailBillGroupModel;
use Common\Model\RetailBillOrderModel;
use Common\Model\RetailDaOrderModel;
use Common\Model\RetailSellModel;
use Common\Model\RetailStoreModel;
use Common\Model\RetailUuOrderModel;
use Make\Model\MakeOrderModel;
//[1.8.89]
/**
* 订单类
* Class BillOrder
* [
* 线上线下订单列表(线上线下结合)
* 依据订单id查询订单信息(bill_order,retail_bill_discount) basisIdGetInfo
* 配送或者获取配送价格前的订单状态验证 orderStateVerify
* ]
* @package Common\Business
*/
class BillOrder
{
/**
* 线上线下订单列表(线上线下结合)
* @param $param
* [
* merchant_id
* uid 小程序用户id
* vip_id 会员id
* order_type 1:购买订单 2:售后
* order_status 订单状态 -1 待付款 1:全部订单 2:待发货/自提 3:待收货 4:待评价
* order_genre 订单类型 1.普通订单 2.拼团订单 3.秒杀订单 4.预售订单
* page 分页
* ]
* @return mixed
*/
public function orderList($param)
{
//验证参数
$verifyResult = $this->orderListVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
//获取该用户的待支付订单id集合与倒计时
if ($param['order_status'] == '-1') {
$stayResult = $this->stayPaymentOrder($param);
$param['billId'] = $stayResult['data']['billId'];
$param['waitPayTimeArr'] = $stayResult['data']['waitPayTimeArr'];
}
$where = $this->orderListTerm($param); //查询条件
$fields = [
'id',
'all_money',
'add_time',
'order_no',
'refund_status',
'pay_state',
'status',
'pickup_type',
'remind_state',
'pick_code',
'refund_time',
'cancel_time',
'eval_status',
'delivery_type',
'delivery_record_id',
'delivery_fee',
'order_genre',
'store_id',
'order_type',
'refund_no',
'type'
];
$page = $param['page'] ? $param['page'] : 1;
$OrderModel = new BillOrderViewModel();
$list = $OrderModel->getSelect($where, $fields, 'id desc', $page . ',10');
if (!empty($list)) {
$data = [
'list' => $list,
'billId' => $param['billId'] ? $param['billId'] : [],
'waitPayTimeArr' => $param['waitPayTimeArr'] ? $param['waitPayTimeArr'] : []
];
$list = $this->orderListHandle($data);
}
return callBack(statusCode()['success'], '查询成功', $list);
}
/**
* 线上线下订单列表字段转换
* @param $param
* @return mixed
*/
public function orderListHandle($param)
{
$list = $param['list']; //列表
$billId = $param['billId'];
$waitPayTimeArr = $param['waitPayTimeArr'];
$UuOrderModel = new RetailUuOrderModel();//uu订单模型
$DaOrderModel = new RetailDaOrderModel();//达达订单模型
$SellModel = new RetailSellModel();//商品销售记录模型
$StoreModel = new RetailStoreModel();//门店表模型
$storeList = array();
$RetailBillAdvanceModel = new RetailBillAdvanceModel();
$BillGroupModel = new RetailBillGroupModel();
$plugClass = new Plug();
$ImageClass = new Image();
$data = array();
//购买订单
$fields = [
'goods_id',
'goods_img_id',
'goods_name',
'price',
'sell_number',
'all_money'
];
foreach ($list as $val) {
$add_time = date('Y-m-d H:i:s', $val['add_time']);
if ($val['type'] == 1 && $val['order_type'] == 1) {
//商城购买订单
$pick_code = $val['pick_code'] ? $val['pick_code'] : '';
$tail_start_time = '';
$group_desc_time = '';
$pay_desc_time = '';
$state_msg = '';
if ($val['order_genre'] == 4) {//预售订单
$advance_info = $RetailBillAdvanceModel->bill_advance(array('bill_id' => $val['id']));
$tail_start_time = date('m月d日 H:i', $advance_info['tail_start_time']);
}
//按钮 1开启 0关闭
$button = array(
'pick_code' => 0, //取货码按钮
'remind_send' => 0, //提醒发货按钮
'cancel_order' => 0,//(已支付)取消订单
'cancel_pay' => 0, //(未支付)取消订单
'see_rider' => 0, //查看骑手
'see_logistics' => 0,//查看物流
'receipt' => 0, //确认收货
'evaluate' => 0, //评价
'service' => 0, //售后
'pay_status' => 0, //支付
'tail_pay_status' => 0,//支付尾款
'extraction_code' => 0,//祝福语按钮
);
switch ($val['status']) {
case '0':
//未支付
if ($val['order_genre'] == 4 && $val['pay_state'] == 2) {
//预售已支付定金
if ($advance_info['tail_end_time'] < time()) {
$state_msg = '超出尾款支付时间';
} else if ($advance_info['tail_start_time'] > time()) {
$state_msg = '未到尾款支付时间';
} else {
$state_msg = '待付尾款';
$button['tail_pay_status'] = 1;
}
} else {
//把不在待支付订单列表中的订单改为不能支付
$state_msg = '待付款';
$index = array_search($val['id'], $billId);
if ($index === false) {
$button['pay_status'] = 0;
} else {
$button['pay_status'] = 1;
$pay_desc_time = $waitPayTimeArr[$index];
}
if ($button['pay_status'] == 1) {
$button['cancel_pay'] = 1;
} else {
$state_msg = '交易关闭';
}
}
break;
case '1':
//待发货、待自提
if ($val['refund_status'] == 0) {
//正常订单
if ($val['order_genre'] == 2) {
//拼团订单
$group = $BillGroupModel->getFind(array('bill_id' => $val['id']), 'state,end_time');
if ($group['state'] == 1) {
$state_msg = '拼团中';
$group_desc_time = $group['end_time'];
} else if ($group['state'] == 2) {
$state_msg = '拼团成功';
} else {
$state_msg = '拼团失败';
}
} else {
if ($val['pickup_type'] == 1) { // 自取
$state_msg = '待自取';
$button['pick_code'] = 1;
} else {
$state_msg = '待发货';
$button['remind_send'] = $val['remind_state'] == 1 ? 0 : 1;
}
if ($val['order_genre'] == 1 || $val['order_genre'] == 4) {
$button['cancel_order'] = 1;
}
}
} else if ($val['refund_status'] == 1) {
$state_msg = '已申请售后';
}
break;
case '2':
//待收货
$state_msg = '待收货';
$button['receipt'] = 1;
break;
case '3':
//已收货
$state_msg = '交易完成';
if ($val['refund_status'] == 1) {
$state_msg = '已申请售后';
} else {
if ($val['eval_status'] != 1) {
$state_msg = '待评价';
}
}
if ($val['eval_status'] != 1) {
$button['evaluate'] = 1;
}
if (($val['order_genre'] == 1 || $val['order_genre'] == 4) && ($val['refund_status'] == 0 || $val['refund_status'] == 1)) {
$button['service'] = 1;
}
break;
}
$order_status = 0;
if ($val['pickup_type'] != 1) {
switch ($val['delivery_type']) {
case '1':
//商家配送
break;
case '2':
//达达配送
$order_status = $DaOrderModel->getFindField(array('id' => $val['delivery_record_id']), 'order_status');
break;
case '3':
//uu跑腿
//转成达达状态显示
$state_uu = $UuOrderModel->getFindField(array('id' => $val['delivery_record_id']), 'state');
if ($state_uu == 1) {
$order_status = 1;
} else if ($state_uu == 3 || $state_uu == 4) {
$order_status = 2;
} else if ($state_uu == 5 || $state_uu == 6) {
$order_status = 3;
} else if ($state_uu == -1) {
$order_status = 5;
}
break;
case '4':
//快递发货
if ($val['refund_status'] == 0) {
$button['see_logistics'] = 1;
}
break;
case '5':
//码科配送
$MakeOrderModel = new MakeOrderModel();//码科订单模型
$status = $MakeOrderModel->getFindField(['id' => $val['delivery_record_id']], 'status');
switch ($status) {
case 'payed':
//待接单
$order_status = 1;
break;
case 'accepted':
//'待取件
$order_status = 2;
break;
case 'geted':
//待收件
$order_status = 3;
break;
case 'gotoed':
//待评价
$order_status = 4;
break;
case 'completed':
//订单已完成
$order_status = 4;
break;
case 'cancel':
//已取消
$order_status = 5;
break;
}
break;
}
}
switch ($order_status) {
case '1':
$state_msg = '骑手接单中';
break;
case '2':
$button['see_rider'] = 1;
$state_msg = '骑手取货中';
break;
case '3':
$button['see_rider'] = 1;
$state_msg = '骑手配送中';
break;
case '5':
$state_msg = '骑手接单中';
break;
}
}
if ($val['order_type'] == 1) {
//判断这条订单所属门店,是否有权限
$storePlugStatusPost = [
'store_id' => $val['store_id'],
'identification_arr' => ['blessing'],//插件标识
];
$blessing = $plugClass->plugStoreStatus($storePlugStatusPost);
if ($blessing === true) {
//门店有权限,并开启插件,查询订单是否有祝福码
$extractionCode = new Index();
$extraction_code = $extractionCode->obtainExtractionCode($val['id']);//祝福码
//订单有祝福语,没过期
if ($extraction_code) {
$button['extraction_code'] = 1;
}
}
}
$goods_list = $SellModel->getSelect(['bill_id' => $val['id']], $fields);
foreach ($goods_list as &$v) {
$v['goods_img'] = $ImageClass->getGoodsImageUrl(['img_id' => $v['goods_img_id'], 'store_id' => $val['store_id']]);
}
$val['goods_sell_species'] = count($goods_list);
//门店信息
if (!$storeList[$val['store_id']]) {
$store = $StoreModel->getFind(array('id' => $val['store_id']), 'storetag as store_name,shopimg_id');
$store['store_image'] = getImage($store['shopimg_id']);
$storeList[$val['store_id']] = $store;
}
if (in_array($val['order_type'], ['2', '3'])) {
//售后订单
if (($val['refund_status'] != 2 || $val['refund_status'] == 6) && $val['order_type'] == 2) {
$val['all_money'] = round($val['all_money'] + $val['delivery_fee'], 2);
} else {
$val['all_money'] = floatval($val['all_money']);
}
}
switch ($val['type']) {
case 1:
$type_name = '线上';
break;
case 2:
$type_name = '线下';
break;
}
$data[] = array(
'type_name' => $type_name,
'store_name' => $storeList[$val['store_id']]['store_name'],
'store_image' => $storeList[$val['store_id']]['store_image'],
'id' => $val['id'],
'store_id' => $val['store_id'],
'all_money' => $val['all_money'],
'order_genre' => $val['order_genre'] ? $val['order_genre'] : 0,
'order_no' => $val['order_no'],
'refund_no' => $val['refund_no'] ? $val['refund_no'] : '',
'add_time' => $add_time,
'state_msg' => $state_msg,
'pick_code' => $pick_code ? $pick_code : '',
'tail_start_time' => $tail_start_time ? $tail_start_time : '',
'group_desc_time' => $group_desc_time ? $group_desc_time : '',
'pay_desc_time' => $pay_desc_time ? $pay_desc_time : '',
'goods_info' => $goods_list,
'button' => $button ? $button : [],
'order_type' => $val['order_type'],
'status' => $val['status'],
'refund_status' => $val['refund_status']
);
}
return $data;
}
/**
* 线上线下订单列表的查询条件
* @param $param
* [
* merchant_id
* uid 小程序用户id
* vip_id 会员id
* order_type 1:购买订单 2:售后
* order_status 订单状态 -1 待付款 1:全部订单 2:待发货/自提 3:待收货 4:待评价
* order_genre 订单类型 1.线上普通订单 2.拼团订单 3.秒杀订单 4.预售订单
* billId 用户的待支付订单id集合
*
* ]
* @return mixed
*/
public function orderListTerm($param)
{
$where = [
'merchant_id' => $param['merchant_id'],
];
switch ($param['order_type']) {
case 1:
//购买
$where['order_type'] = 1;
$where['refund_status'] = ['in', '0,1'];
if ($param['order_status'] != 1 || !empty($param['order_genre'])) {
$where['type'] = 1;
//订单状态
switch ($param['order_status']) {
case '-1':
$where['id'] = array('in', $param['billId'] ? $param['billId'] : [0]);
//查询待支付订单
break;
case '2':
//自提或待发货订单
$where['status'] = 1;
$where['refund_status'] = 0;
break;
case '3':
//待收货
$where['pickup_type'] = ['in', '2,3'];
$where['status'] = 2;
$where['refund_status'] = 0;
break;
case '4':
//待评价
$where['status'] = 3;
$where['eval_status'] = 0;
$where['refund_status'] = 0;
break;
}
if (!empty($param['order_genre'])) {
$where['order_genre'] = $param['order_genre'];
}
}
break;
case 2:
//售后
$where['order_type'] = ['in', '2,3'];
break;
}
if (!empty($param['vip_id'])) {
$where[] = [
['uid' => $param['uid']],
['vid' => $param['vip_id']],
'_logic' => 'OR'
];
} else {
$where['uid'] = $param['uid'];
}
return $where;
}
/**
* 获取该用户的待支付订单集合与倒计时
* @param $param
* [
* uid 小程序用户id
* ]
* @return array
*/
public function stayPaymentOrder($param)
{
$redis_key = 'retail_*_*_*_' . $param['uid'] . '_*';
$ApiRedis = new \Addons\Api\RedisController();
$wait_pay_list = $ApiRedis::$redis->mget($ApiRedis::$redis->keys($redis_key));
$billId = array();//存储在待支付列表里的订单ID
$waitPayTimeArr = array();//待支付订单的付款倒计时
if (!empty($wait_pay_list)) {
foreach ($wait_pay_list as $value) {
$data = json_decode($value, true);
if (!in_array($data['bill_id'], $billId)) {
$billId[] = $data['bill_id'];
$waitPayTimeArr[] = $data['expiration_time'];
}
}
}
return callBack(statusCode()['success'], '获取成功', [
'billId' => $billId,
'waitPayTimeArr' => $waitPayTimeArr
]);
}
/**
* 线上线下订单列表的参数验证
* @param $param
* [
* merchant_id
* uid 小程序用户id
* vip_id 会员id
* order_type 1:购买订单 2:退款订单 3换货订单
* order_status 订单状态 -1 待付款 1:全部订单 2:待发货/自提 3:待收货 4:待评价
* order_genre 订单类型 1.普通订单 2.拼团订单 3.秒杀订单 4.预售订单
* page 分页
* ]
* @return mixed
*/
public function orderListVerify($param)
{
if (empty($param['merchant_id']) || empty($param['uid']) || empty($param['order_type'])) {
return callBack(statusCode()['error'], '缺少唯一标识');
}
if (empty($param['order_status']) && $param['order_type'] == 1) {
return callBack(statusCode()['error'], '缺少唯一标识');
}
return callBack(statusCode()['success'], '验证成功');
}
/**
* 依据订单id查询订单信息
* @param $id 订单id
* @return mixed
*/
public function basisIdGetInfo($id)
{
try {
$BillOrderModel = new RetailBillOrderModel();
$info = $BillOrderModel->getCashierOrder([
'b.id' => $id
], "b.*,d.coupon_type,d.coupon_id");
if (!empty($info)) {
return callBack(statusCode()['success'], "查询成功", $info);
} else {
return callBack(statusCode()['error'], "未找到该流水订单");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "未找到该流水订单");
}
}
/**
* 配送或者获取价格的订单状态验证
* @param $param
* [
* platform_type 商户平台类型 1默认系统 2微礼平台
* order_no 订单号
* store_id
* ]
* @return mixed
*/
public function orderStateVerify($param)
{
$platform_type = $param['platform_type'] ? $param['platform_type'] : 1;
try {
$fields = [
'b.id',
'b.refund_status',
'b.order_no',
'b.all_money',
'b.order_type',
'b.uid',
'b.add_time',
'b.refund_no',
'b.merchant_id',
'b.third_order',
'o.status',
'o.order_genre',
'o.user_address',
'o.user_name',
'o.user_phone',
'o.pickup_type',
'o.cancel_delivery_status',
'o.delivery_record_id',
'o.form_id',
'o.remark',
];
if ($platform_type == 2) {
//第三方平台
$fields[] = 'b.third_order';
}
$BillOrderModel = new RetailBillOrderModel();
$order = $BillOrderModel->getOrderLinkFind([
'b.order_no' => strval($param['order_no']),
'b.store_id' => $param['store_id'],
'b.pay_state' => 1,//支付成功
'b.type' => 1,//商城订单
'b.order_type' => ['in', '1,3'],
], $fields); //订单信息
} catch (\Exception $e) {
return callBack(statusCode()['error'], "查询失败");
}
if (empty($order)) {
return callBack(statusCode()['error'], "未找到该订单");
}
if ($order['refund_status'] == 1) {
return callBack(statusCode()['error'], "该订单存在退款申请,请先处理");
}
switch ($order['status']) {
case 2:
return callBack(statusCode()['error'], "订单已在配送,请勿重复操作");
break;
case 3:
return callBack(statusCode()['error'], "订单已收货,请刷新页面查看");
break;
}
if ($order['order_genre'] == 2) {
//拼团订单
$BillGroupModel = new RetailBillGroupModel();
$state = $BillGroupModel->getFindField([
'bill_id' => $order['id']
], 'state');
if ($state != 2) {
return callBack(statusCode()['error'], "该订单未拼团成功,不能进行配送");
}
}
return callBack(statusCode()['success'], "验证成功", ['order_info' => $order]);
}
}