setWhere($model, $data); // 获取数据列表 return $model->alias('order')->with(['product' => ['image', 'refund', 'last_refund'], 'user']) ->order(['order.create_time' => 'desc']) ->where($this->transferDataType($dataType)) ->paginate($data); } /** * 获取订单总数 */ public function getCount($dataType, $data) { $model = $this; // 检索查询条件 $model = $model->setWhere($model, $data); // 获取数据列表 return $model->alias('order') ->where($this->transferDataType($dataType)) ->count(); } /** * 订单列表(全部) */ public function getListAll($dataType, $query = []) { $where[] = ['order.is_delete','=',0]; //搜索订单号 if (!empty($query['order_no'])) { $where[] =['order.order_no','like','%'.trim($query['order_no']).'%']; } //搜索订单号 if (!empty($query['user_no'])) { $userid = (new UserModel)->where('user_no', 'like','%'.trim($query['user_no']) .'%')->value('user_id'); if (!empty($userid)) { $where[] =['order.user_id','=',$userid]; } } //搜索时间段 if (!empty($query['create_time'])) { $sta_time = strtotime($query['create_time'][0].' 00:00:00'); $end_time = strtotime($query['create_time'][1].' 23:59:59'); if ($query['is_time'] == 1) { $time = 'order.pay_time'; }else{ $time = 'order.create_time'; } $where[] =[$time,'between',[$sta_time,$end_time]]; } $field = 'order.order_no,order.create_time,order.pay_time,order.express_price, order.express_price,order.express_no,order.delivery_type,order.buyer_remark,order.delivery_status, order.delivery_time,u.user_no,p.grade_product_price,p.product_price,p.product_name,p.total_num,p.total_price, add.name,add.phone,add.detail,r.name as province,re.name as city,reg.name as region,order.order_status, order.pay_status,order.delivery_status,order.receipt_status,exp.express_name,pro.product_no,p.pv,sku.product_no as sku_product_no, p.order_product_id'; // 获取数据列表 return (new OrderProductModel)->alias('p') ->join('order order','p.order_id = order.order_id') ->join('user u','u.user_id = order.user_id') ->join('order_address add','add.order_id = order.order_id') ->join('region r','r.id = add.province_id','left') ->join('region re','re.id = add.city_id','left') ->join('region reg','reg.id = add.region_id','left') ->join('product pro','pro.product_id = p.product_id') ->join('product_sku sku','sku.product_sku_id = p.product_sku_id','left') ->join('express exp','exp.express_id = order.express_id','left') ->field($field) ->where($this->transferDataType($dataType)) ->where($where) ->order(['order.create_time' => 'desc']) ->select()->toArray(); } /** * 订单导出 */ public function exportList($dataType, $query) { // 获取订单列表 $list = $this->getListAll($dataType, $query); // 导出excel文件 (new Exportservice)->orderList($list); } /** * 设置检索查询条件 */ private function setWhere($model, $data) { //搜索订单号 if (isset($data['order_no']) && $data['order_no'] != '') { $model = $model->where('order.order_no', 'like', '%' . trim($data['order_no']) . '%'); } //搜索订单号 if (isset($data['user_no']) && $data['user_no'] != '') { $userid = (new UserModel)->where('user_no', 'like','%'.trim($data['user_no']) .'%')->column('user_id'); if (!empty($userid)) { $model = $model->where('order.user_id', 'in', $userid); } } //搜索自提门店 if (isset($data['store_id']) && $data['store_id'] != '') { $model = $model->where('order.extract_store_id', '=', $data['store_id']); } //搜索配送方式 if (isset($data['style_id']) && $data['style_id'] != '') { $model = $model->where('order.delivery_type', '=', $data['style_id']); } //搜索时间段 if (isset($data['create_time']) && $data['create_time'] != '') { $sta_time = array_shift($data['create_time']).'00:00:00'; $end_time = array_pop($data['create_time']).'23:59:59'; if ($data['is_time'] == 1) { $time = 'order.pay_time'; }else{ $time = 'order.create_time'; } $model = $model->whereBetweenTime($time, $sta_time, $end_time); } return $model; } /** * 转义数据类型条件 */ private function transferDataType($dataType) { $filter = []; // 订单数据类型 switch ($dataType) { case 'all': break; case 'payment'; $filter['order.pay_status'] = OrderPayStatusEnum::PENDING; $filter['order.order_status'] = 10; break; case 'delivery'; $filter['order.pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['order.delivery_status'] = 10; $filter['order.order_status'] = 10; break; case 'received'; $filter['order.pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['order.delivery_status'] = 20; $filter['order.receipt_status'] = 10; $filter['order.order_status'] = 10; break; case 'cancel'; $filter['order.pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['order.delivery_status'] = 10; $filter['order.receipt_status'] = 10; $filter['order.order_status'] = 21; break; case 'comment'; $filter['order.is_comment'] = 0; $filter['order.order_status'] = 30; break; case 'six'; $filter['order.is_comment'] = 1; $filter['order.order_status'] = 30; break; } return $filter; } /** * 确认发货(单独订单) */ public function delivery($data) { // 转义为订单列表 $orderList = [$this]; // 验证订单是否满足发货条件 if (!$this->verifyDelivery($orderList)) { return false; } // 整理更新的数据 $updateList = [[ 'order_id' => $this['order_id'], 'express_id' => $data['express_id'], 'express_no' => $data['express_no'] ]]; // 更新订单发货状态 if ($status = $this->updateToDelivery($updateList)) { // 获取已发货的订单 $completed = self::detail($this['order_id'], ['user', 'address', 'product', 'express']); // 发送消息通知 $this->sendDeliveryMessage([$completed]); } return $status; } /** * 确认发货后发送消息通知 */ private function sendDeliveryMessage($orderList) { // 实例化消息通知服务类 $Service = new MessageService; foreach ($orderList as $item) { // 发送消息通知 $Service->delivery($item, OrderTypeEnum::MASTER); } return true; } /** * 更新订单发货状态(批量) */ private function updateToDelivery($orderList) { $data = []; foreach ($orderList as $item) { $data[] = [ 'data' => [ 'express_no' => $item['express_no'], 'express_id' => $item['express_id'], 'delivery_status' => 20, 'delivery_time' => time(), ], 'where' => [ 'order_id' => $item['order_id'] ], ]; } return $this->updateAll($data); } /** * 验证订单是否满足发货条件 */ private function verifyDelivery($orderList) { foreach ($orderList as $order) { if ( $order['pay_status']['value'] != 20 || $order['delivery_type']['value'] != DeliveryTypeEnum::EXPRESS || $order['delivery_status']['value'] != 10 || $order['order_status']['value'] != 10 //非进行中的订单不可发货 ) { $this->error = "订单号[{$order['order_no']}] 不满足发货条件!"; return false; } } return true; } /** * 修改订单价格 */ public function updatePrice($data) { if ($this['pay_status']['value'] != 10) { $this->error = '该订单不合法'; return false; } if ($this['order_source'] != 10) { $this->error = '该订单不合法'; return false; } // 实际付款金额 $payPrice = bcadd($data['update_price'], $data['update_express_price'], 2); if ($payPrice <= 0) { $this->error = '订单实付款价格不能为0.00元'; return false; } return $this->save([ 'order_no' => $this->orderNo(), // 修改订单号, 否则微信支付提示重复 'order_price' => $data['update_price'], 'pay_price' => $payPrice, 'update_price' => helper::bcsub($data['update_price'], helper::bcsub($this['total_price'], $this['coupon_money'])), 'express_price' => $data['update_express_price'] ]) !== false; } /** * 审核:用户取消订单 */ public function confirmCancel($data) { // 判断订单是否有效 无效情况 1未支付 或 2已发货 if ($this['pay_status']['value'] != 20 || $this['delivery_status']['value'] != 10) { $this->error = '该订单不合法'; return false; } // 订单取消事件 return $this->transaction(function () use ($data) { if ($data['is_cancel'] == true) { // 执行退款操作 (new OrderRefundService)->execute($this); // 回退商品库存 ProductFactory::getFactory($this['order_source'])->backProductStock($this['product'], true); // 回退用户优惠券 $this['coupon_id'] > 0 && UserCouponModel::setIsUse($this['coupon_id'], false); // 回退用户积分 $user = UserModel::detail($this['user_id']); $describe = "订单取消:{$this['order_no']}"; $this['points_num'] > 0 && $user->setIncPoints($this['points_num'], $describe); } // 更新订单状态 return $this->save(['order_status' => $data['is_cancel'] ? 20 : 10]); }); } /** * 获取已付款订单总数 (可指定某天) */ public function getOrderData($startDate, $endDate, $type) { $model = $this; !is_null($startDate) && $model = $model->where('pay_time', '>=', strtotime($startDate)); if (is_null($endDate)) { !is_null($startDate) && $model = $model->where('pay_time', '<', strtotime($startDate) + 86400); } else { $model = $model->where('pay_time', '<', strtotime($endDate) + 86400); } $model = $model->where('is_delete', '=', 0) ->where('pay_status', '=', 20) ->where('order_status', '<>', 20); if ($type == 'order_total') { // 订单数量 return $model->count(); } else if ($type == 'order_total_price') { // 订单总金额 return $model->sum('pay_price'); } else if ($type == 'order_user_total') { // 支付用户数 return count($model->distinct(true)->column('user_id')); } return 0; } /** * 获取待处理订单 */ public function getReviewOrderTotal() { $filter['pay_status'] = OrderPayStatusEnum::SUCCESS; $filter['delivery_status'] = 10; $filter['order_status'] = 10; return $this->where($filter)->count(); } /** * 获取某天的总销售额 * 结束时间不传则查一天 */ public function getOrderTotalPrice($startDate = null, $endDate = null) { $model = $this; $model = $model->where('pay_time', '>=', strtotime($startDate)); if (is_null($endDate)) { $model = $model->where('pay_time', '<', strtotime($startDate) + 86400); } else { $model = $model->where('pay_time', '<', strtotime($endDate) + 86400); } return $model->where('pay_status', '=', 20) ->where('order_status', '<>', 20) ->where('is_delete', '=', 0) ->sum('pay_price'); } /** * 获取某天的客单价 * 结束时间不传则查一天 */ public function getOrderPerPrice($startDate = null, $endDate = null) { $model = $this; $model = $model->where('pay_time', '>=', strtotime($startDate)); if (is_null($endDate)) { $model = $model->where('pay_time', '<', strtotime($startDate) + 86400); } else { $model = $model->where('pay_time', '<', strtotime($endDate) + 86400); } return $model->where('pay_status', '=', 20) ->where('order_status', '<>', 20) ->where('is_delete', '=', 0) ->avg('pay_price'); } /** * 获取某天的下单用户数 */ public function getPayOrderUserTotal($day) { $startTime = strtotime($day); $userIds = $this->distinct(true) ->where('pay_time', '>=', $startTime) ->where('pay_time', '<', $startTime + 86400) ->where('pay_status', '=', 20) ->where('is_delete', '=', 0) ->column('user_id'); return count($userIds); } /** * 获取兑换记录 * @param $param array * @return \think\Paginator */ public function getExchange($param) { $model = $this; if (isset($param['order_status']) && $param['order_status'] > -1) { $model = $model->where('order.order_status', '=', $param['order_status']); } if (isset($param['nickName']) && !empty($param['nickName'])) { $model = $model->where('user.nickName', 'like', '%' . trim($param['nickName']) . '%'); } return $model->with(['user'])->alias('order') ->join('user', 'user.user_id = order.user_id') ->where('order.order_source', '=', 20) ->where('order.is_delete', '=', 0) ->order(['order.create_time' => 'desc']) ->paginate($param); } // /** // * 批量发货 // */ // public function batchDelivery($file) // { // try { // /* 转码 */ // $file = iconv("utf-8", "gb2312", $file); // if (empty($file) OR !file_exists($file)) { // $this->error = '文件不存在'; // return false; // } // /** @var Xlsx $objRead */ // $objRead = IOFactory::createReader('Xlsx'); // if (!$objRead->canRead($file)) { // $objRead = IOFactory::createReader('Xls'); // if (!$objRead->canRead($file)) { // $this->error = '只支持导入Excel文件!'; // return false; // } // } // $file_size = $_FILES['iFile']['size']; // if ($file_size > 5 * 1024 * 1024) { // $this->error = '文件大小不能超过5M'; // return false; // } // /* 建立excel对象 */ // $objPHPExcel = $objRead->load($file); // $sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet // $highestRow = $sheet->getHighestRow(); // 取得总行数 // $highestColumn = $sheet->getHighestColumn(); // 取得总列数 // \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); // $lines = $highestRow -1; // if($lines <= 0){ // $this->error = 'excel表格,没有数据'; // return false; // } // // if($lines > 1000){ // // $this->error = '单次最多发货500个订单'; // // return false; // // } // p($lines); // // 遍历并记录订单信息 // for ($j = 2; $j <= $highestRow; $j++) { // $mobile = trim($objPHPExcel->getActiveSheet()->getCell('A' . $j)->getValue()); // p($mobile); // } // if (count($list) > 0) { // $this->updateAll($list); // // 发送消息通知 // $this->sendDeliveryMessage($orderList); // } // unlink($savePath); // return true; // } catch (\Exception $e) { // $this->error = $e->getMessage(); // return false; // } // } /** * 批量发货 */ public function batchDelivery($fileInfo) { try { $saveName = Filesystem::disk('public')->putFile('', $fileInfo); $savePath = public_path() . "uploads/{$saveName}"; //载入excel表格 $inputFileType = IOFactory::identify($savePath); //传入Excel路径 $reader = IOFactory::createReader($inputFileType); $PHPExcel = $reader->load($savePath); $sheet = $PHPExcel->getSheet(0); // 读取第一個工作表 // 遍历并记录订单信息 $list = []; $orderList = []; $sheet = $sheet->toArray(); $orderNoLineMap = []; $updateOrderNo = []; $line = 1; foreach ($sheet as $key => $val) { if ($key > 0 && !is_null($val[0])) { $orderNumb = trim($val[0]); $orderNoLineMap[$orderNumb] = $line++; if ($val[1] && $val[2]) { // 查找发货公司是否存在 $express = ExpressModel::findByName(trim($val[1])); $order = self::detail([ 'order_no' => $orderNumb, 'order_status' => 10, 'delivery_status' => 10,//限制订单状态为进行中,发货状态为未发货 ], ['user', 'address', 'product', 'express']); if ($express && $order) { $list[] = [ 'data' => [ 'express_no' => trim($val[2]), 'express_id' => $express['express_id'], 'delivery_status' => 20, 'delivery_time' => time(), ], 'where' => [ 'order_id' => $order['order_id'] ], ]; array_push($orderList, $order); $updateOrderNo[] = $orderNumb; } } } if ($key > 0 && is_null($val[0])) { unset($sheet[$key]); } } unset($sheet[0]);//去掉表头 if (count($list) > 500) { $this->error = '单次最多发货500个订单'; return false; } if (count($list) > 0) { $this->updateAll($list); // 发送消息通知 $this->sendDeliveryMessage($orderList); } unlink($savePath); if (count($sheet) != count($updateOrderNo)) { $orgOrderNo = array_column($sheet, 0); $updateOrderNo = array_flip($updateOrderNo); $info = []; foreach ($orgOrderNo as $orderNumber) { if (!isset($updateOrderNo[(int)$orderNumber])) { $info[] = '第' . ($orderNoLineMap[(int)$orderNumber] ?? 0) . '行,订单号:' . $orderNumber ; } } $info = '文件中' . implode(';', $info) . '订单状态有误,无法发货'; $this->error = $info; return false; } return true; } catch (\Exception $e) { $this->error = $e->getMessage(); return false; } } /** * 取消订单 */ public function orderCancel($data) { // 判断订单是否有效 if ($this['delivery_status']['value'] == 20 || $this['order_status']['value'] != 10 || $this['pay_status']['value'] != 20) { $this->error = "订单不允许取消"; return false; } // 订单取消事件 return $this->transaction(function () use ($data) { // 执行退款操作 (new OrderRefundService)->execute($this); // 回退商品库存 ProductFactory::getFactory($this['order_source'])->backProductStock($this['product'], true); // 回退用户优惠券 $this['coupon_id'] > 0 && UserCouponModel::setIsUse($this['coupon_id'], false); // 回退用户积分 $user = UserModel::detail($this['user_id']); $describe = "订单取消:{$this['order_no']}"; $this['points_num'] > 0 && $user->setIncPoints(-$this['points_num'], $describe); // 更新订单状态 return $this->save(['order_status' => 20, 'cancel_remark' => $data['cancel_remark']]); }); } /** * 确认发货(虚拟订单) * @param $extractClerkId * @return bool|mixed */ public function virtual($data) { if ( $this['pay_status']['value'] != 20 || $this['delivery_type']['value'] != DeliveryTypeEnum::NO_EXPRESS || $this['delivery_status']['value'] == 20 || in_array($this['order_status']['value'], [20, 21]) ) { $this->error = '该订单不满足发货条件'; return false; } return $this->transaction(function () use ($data) { // 更新订单状态:已发货、已收货 $status = $this->save([ 'delivery_status' => 20, 'delivery_time' => time(), 'receipt_status' => 20, 'receipt_time' => time(), 'order_status' => 30, 'virtual_content' => $data['virtual_content'], ]); // 执行订单完成后的操作 $OrderCompleteService = new OrderCompleteService(OrderTypeEnum::MASTER); $OrderCompleteService->complete([$this], $this['app_id']); return $status; }); } }