// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\api\model; use app\api\model\Goods as GoodsModel; use app\api\model\kj\KjActivityGood; use app\api\model\kj\KjActivityJoin; use app\api\model\OrderGoods as OrderGoodsModel; use app\api\model\Setting as SettingModel; use app\api\model\GoodsSku as GoodsSkuModel; use app\api\model\user\CommissionsDetail as CommissionsDetailApi; use app\api\model\user\CommissionsDetail; use app\api\service\User as UserService; use app\api\service\Payment as PaymentService; use app\api\service\order\PaySuccess as OrderPaySuccesService; use app\api\service\order\source\Factory as OrderSourceFactory; use app\common\enum\order\PayType; use app\common\enum\order\refund\RefundStatus as RefundStatusEnum; use app\common\model\Order as OrderModel; use app\common\service\Order as OrderService; use app\common\enum\Setting as SettingEnum; use app\common\enum\OrderType as OrderTypeEnum; use app\common\enum\order\PayType as OrderPayTypeEnum; use app\common\enum\order\PayStatus as PayStatusEnum; use app\common\enum\order\OrderStatus as OrderStatusEnum; use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum; use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum; use app\common\library\helper; use app\common\exception\BaseException; use app\common\model\groupbuy\GroupBuyJoin; use app\common\model\groupbuy\GroupBuyActivity; use app\common\model\groupbuy\GroupBuyGoods; use app\common\model\groupbuy\GroupBuyHelp; use app\common\model\groupbuylb\GroupBuyLbJoin; use app\common\model\groupbuylb\GroupBuyLbActivity; use app\common\model\groupbuylb\GroupBuyLbGoods; use app\common\model\groupbuylb\GroupBuyLbHelp; use app\common\model\ms\MsActivityGood; use app\common\model\ms\MsActivity; use app\common\enum\order\OrderSource as OrderSourceEnum; use app\api\model\za\{ZaActivityGood,ZaActivityRelation,ZaActivity}; /** * 订单模型 * Class Order * @package app\api\model */ class Order extends OrderModel { /** * 隐藏字段 * @var array */ protected $hidden = [ 'store_id', 'update_time' ]; /** * 追加字段 * @var array */ protected $append = [ 'state_text', // 售后单状态文字描述 'state_value', // 售后状态码 20已取消 30已完成 11待支付 12待收货未发货 13待收货已发货 'djs_time', // 待支付倒计时(时间戳) 'dsh_time', // 待收货倒计时(时间戳) ]; /** * 待支付订单详情 * @param string $orderNo 订单号 * @return null|static */ public static function getPayDetail(string $orderNo) { return self::detail(['order_no' => $orderNo, 'pay_status' => 10, 'is_delete' => 0], ['goods', 'user']); } /** * 订单支付事件 * @param int $payType * @return bool */ public function onPay(int $payType = OrderPayTypeEnum::WECHAT) { // 判断订单状态 $orderSource = OrderSourceFactory::getFactory($this['order_source']); if (!$orderSource->checkOrderStatusOnPay($this)) { $this->error = $orderSource->getError(); return false; } // 余额支付 if ($payType == OrderPayTypeEnum::BALANCE) { return $this->onPaymentByBalance($this['order_no']); } return true; } /** * 构建支付请求的参数 * @param self $order 订单信息 * @param string $payType 订单支付方式 * @return array * @throws BaseException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function onOrderPayment(self $order, int $payType) { if ($payType == OrderPayTypeEnum::WECHAT) { if($order['order_source']!=OrderTypeEnum::ZA){ return $this->onPaymentByWechat($order); } return $this->onPrePayByWechat($order,$order['order_source']); } return []; } // 预调起支付 public function onPrePayByWechat(array $order,$order_type){ return PaymentService::wechat( $order['order_id'], $order['order_no'], $order['pay_price'], $order_type // OrderTypeEnum::ORDER ); } /** * 构建微信支付请求 * @param self $order 订单详情 * @return array * @throws BaseException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ protected function onPaymentByWechat(self $order) { return PaymentService::wechat( $order['order_id'], $order['order_no'], $order['pay_price'], OrderTypeEnum::ORDER ); } /** * 立即购买:获取订单商品列表 * @param int $goodsId 商品ID * @param string $goodsSkuId 商品SKU * @param int $goodsNum 购买数量 * @param int $staffUserId 分享链接用户ID 可不传 * @return mixed * @throws BaseException */ public function getOrderGoodsListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $staffUserId = 0) { // 获取商品列表 $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goodsId]); if ($goodsList->isEmpty()) { throwError('未找到商品信息2'); } // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); // 返回商品处理 // 获取链接分享者的用户ID和店铺ID $data = $this->getStaffUserId($staffUserId); foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); $item['staffUserId'] = $data['staffUserId']; $item['shopId'] = $data['shopId']; $item['distributorRadio'] = $data['distributorRadio']; } return $goodsList; } /** * 立即购买:获取订单商品列表 * @param int $goodsId 商品ID * @param string $goodsSkuId 商品SKU * @param int $goodsNum 购买数量 * @param int $bargainId 砍价活动ID * @return mixed * @throws BaseException */ public function getOrderGoodsZaListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $zaGoodsId,int $staffUserId = 0,bool $isReceive = false) { // 获取商品列表 $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goodsId]); if ($goodsList->isEmpty()) { throwError('未找到商品信息'); } //获取砍价数据 $user = UserService::getCurrentLoginUser(true); $zaGoods = ZaActivityGood::where('goods_id',$goodsId)->where('id',$zaGoodsId)->find(); if(empty($zaGoods)){ throwError('未找到买一赠一信息'); } if(!$isReceive){ if($zaGoods['stock_num']<=1){ throwError('该买一赠一商品库存不足'); } } // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); // 返回商品处理 $data = $this->getStaffUserId($staffUserId); foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); // 获取砍价活动的最终金额 // $item['bargain_price'] = $KjActivityJoin['kj_price']; // $item['bargain_id'] = $bargainId; $item['za_goods_id'] = $zaGoods['id']; $item['staffUserId'] = $data['staffUserId']; $item['shopId'] = $data['shopId']; $item['distributorRadio'] = $data['distributorRadio']; } return $goodsList; } /** * 立即购买:获取订单商品列表 * @param int $goodsId 商品ID * @param string $goodsSkuId 商品SKU * @param int $goodsNum 购买数量 * @param int $bargainId 砍价活动ID * @return mixed * @throws BaseException */ public function getOrderGoodsBargainListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $bargainId,int $staffUserId = 0) { // 获取商品列表 $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goodsId]); if ($goodsList->isEmpty()) { throwError('未找到商品信息2'); } //获取砍价数据 $user = UserService::getCurrentLoginUser(true); $KjActivityJoin = KjActivityJoin::where('user_id',$user['user_id'])->find($bargainId); if (!$KjActivityJoin) { throwError('未找到砍价信息'); } if($KjActivityJoin['is_submit_order']|| (strtotime($KjActivityJoin['end_time'])+3600*48)$goodsId,'activity_id'=>$KjActivityJoin['activity_id']])->find(); if($KjActivityGood['limit_stock']-$KjActivityGood['purchase_stock']<=0){ throwError('该砍价商品没有库存了'); } // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); // 返回商品处理 $data = $this->getStaffUserId($staffUserId); foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); // 获取砍价活动的最终金额 $item['bargain_price'] = $KjActivityJoin['kj_price']; $item['bargain_id'] = $bargainId; $item['bargain_activity_id'] = $KjActivityJoin['activity_id']; $item['staffUserId'] = $data['staffUserId']; $item['shopId'] = $data['shopId']; $item['distributorRadio'] = $data['distributorRadio']; } return $goodsList; } //当前秒杀活动商品买了多少件 public function miaoshaHaveBuyCnt($ms_goods_id,$user_id){ $order_id_arr = Order::where('order_source',OrderSourceEnum::MIAOSHA)->where('order_source_id',$ms_goods_id)->where('user_id', $user_id)->where('pay_status',PayStatusEnum::SUCCESS)->column("order_id"); if(count($order_id_arr)==0){ return 0; } else if(count($order_id_arr)>0){ $total_num = OrderGoodsModel::where("order_id",'in',$order_id_arr)->sum('total_num'); return $total_num; } } /** * 立即购买:获取订单商品列表 * @param int $goodsId 商品ID * @param string $goodsSkuId 商品SKU * @param int $goodsNum 购买数量 * @param int $bargainId 砍价活动ID * @return mixed * @throws BaseException */ public function getOrderGoodsMiaoshaListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $msId,int $staffUserId = 0) { // 获取商品列表 $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goodsId]); if ($goodsList->isEmpty()) { throwError('未找到商品信息2'); } //获取秒杀数据 $user = UserService::getCurrentLoginUser(true); $msGood = MsActivityGood::where('id',$msId)->find(); if (!$msGood) { throwError('未找到秒杀信息'); } if($goodsNum>$msGood->stock_num){ throwError("库存不足"); } if(time()>strtotime($msGood->end_time)){ throwError("秒杀活动已结束"); } $activity = MsActivity::where("id",$msGood->ms_activity_id)->find(); if($activity->is_up==0||$activity->audit_status!=1){ throwError("秒杀活动已结束!"); } if($msGood->limit_mount>0&&$goodsNum>$msGood->limit_mount){ throwError("超过限购数量"); } if($msGood->limit_mount>0){ $order_id_arr = Order::where('order_source',OrderSourceEnum::MIAOSHA)->where('order_source_id',$msGood->id)->where('user_id', $user->user_id)->where('pay_status',PayStatusEnum::SUCCESS)->column("order_id"); if(count($order_id_arr)>0){ $total_num = OrderGoodsModel::where("order_id",'in',$order_id_arr)->sum('total_num'); if($total_num>=$msGood->limit_mount){ throwError("限购".$msGood->limit_mount."件!"); } } } // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); // 返回商品处理 $data = $this->getStaffUserId($staffUserId); foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); // 获取秒杀活动的最终金额 $item['ms_price'] = $msGood['ms_price']; $item['ms_id'] = $msId; $item['staffUserId'] = $data['staffUserId']; $item['shopId'] = $data['shopId']; $item['distributorRadio'] = $data['distributorRadio']; $item['limit_mount'] = $msGood['limit_mount']; } return $goodsList; } /** * 立即购买:获取订单商品列表 * @param int $goodsId 商品ID * @param string $goodsSkuId 商品SKU * @param int $goodsNum 购买数量 * @param int $activity_id 拼团活动ID * @return mixed * @throws BaseException */ public function getOrderGoodsGroupListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $joinId=0,int $activity_id=0,int $staffUserId = 0) { // 获取商品列表 $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goodsId]); if ($goodsList->isEmpty()) { throwError('未找到商品信息'); } //获取砍价数据 $user = UserService::getCurrentLoginUser(true); $now = Date("Y-m-d H:i:s",time()); if($joinId>0){ $join = GroupBuyJoin::where('id',$joinId)->lock('for update')->find(); $helpCnt = GroupBuyHelp::where("join_id",$join->id)->where('pay_state','in',[0,1])->count(); $have = GroupBuyHelp::where("join_id",$join->id)->where('user_id',$user->user_id)->where('pay_state','in',[0,1])->find(); if($have&&$have->pay_state==0){ throwError("你有一个待支付的拼团"); } if($have&&$have->pay_state==1){ throwError("你已经参与该拼团"); } if($helpCnt>=$join->people_count){ throwError("拼团人数已够"); } if($now>$join->end_time){ throwError('拼团已结束'); } if($join->status==1){ throwError("拼团已完成"); } if($join->status==2){ throwError("拼团结束"); } $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$join['group_buy_activity_id'])->find(); if(empty($groupgoods)){ throwError('找不到商品'); } if($groupgoods->goods_id!=$goodsId){ throwError('商品id跟活动商品id对不上'); } if($goodsNum>$groupgoods->limit_mount){ throwError('超过限购数量'); } if($goodsNum>$groupgoods->residue_stock){ throwError('拼团活动库存不足'); } } else if($activity_id>0){ $activity = GroupBuyActivity::where("id",$activity_id)->find(); if(empty($activity)){ throwError("找不到拼团活动"); } if($now>$activity->end_time){ throwError('拼团活动已结束'); } if($activity->audit_status!=1||$activity->status!=1){ throwError('拼团活动不存在'); } $join = GroupBuyJoin::where('user_id',$user->user_id)->where('group_buy_activity_id',$activity_id)->where('status',0)->where('end_time',">",$now)->find(); if($join){ throwError('你有一个拼团正在进行中'); } $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$activity_id)->find(); if(empty($groupgoods)){ throwError('找不到商品'); } if($groupgoods->goods_id!=$goodsId){ throwError('商品id跟活动商品id对不上'); } if($goodsNum>$groupgoods->limit_mount){ throwError('超过限购数量'); } //判断库存数量 if($groupgoods->limit_stock - $groupgoods->purchase_stock <=0){ throwError('活动已结束~'); } } if(empty($groupgoods)){ throwError("找不到商品"); } // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); // 返回商品处理 $data = $this->getStaffUserId($staffUserId); foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); // 获取最终拼团单价金额 $item['group_price'] = $groupgoods['group_price']; $item['group_buy_id'] = $joinId>0 ? $join['group_buy_activity_id'] : $activity_id; $item['join_id'] = $joinId; $item['limit_mount'] = $groupgoods['limit_mount']; $item['staffUserId'] = $data['staffUserId']; $item['shopId'] = $data['shopId']; $item['distributorRadio'] = $data['distributorRadio']; } return $goodsList; } /**拼团裂变 * 立即购买:获取订单商品列表 * @param int $goodsId 商品ID * @param string $goodsSkuId 商品SKU * @param int $goodsNum 购买数量 * @param int $bargainId 砍价活动ID * @return mixed * @throws BaseException */ public function getOrderGoodsGroupLbListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $joinId=0,int $activity_id=0) { // 获取商品列表 $model = new GoodsModel; $goodsList = $model->getListByIdsFromApi([$goodsId]); if ($goodsList->isEmpty()) { throwError('未找到商品信息'); } //获取砍价数据 $user = UserService::getCurrentLoginUser(true); $now = Date("Y-m-d H:i:s",time()); if($joinId>0){ $join = GroupBuyLbJoin::where('id',$joinId)->lock('for update')->find(); $helpCnt = GroupBuyLbHelp::where("join_id",$join->id)->where('pay_state','in',[0,1])->count(); $have = GroupBuyLbHelp::where("join_id",$join->id)->where('user_id',$user->user_id)->where('pay_state','in',[0,1])->find(); if($have&&$have->pay_state==0){ throwError("你有一个待支付的拼团"); } if($have&&$have->pay_state==1){ throwError("你已经参与该拼团"); } if($helpCnt>=$join->people_count){ throwError("拼团人数已够"); } if($now>$join->end_time){ throwError('拼团已结束'); } if($join->status==1){ throwError("拼团已完成"); } if($join->status==2){ throwError("拼团结束"); } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$join['group_buy_lb_activity_id'])->find(); if(empty($groupgoods)){ throwError('找不到商品'); } if($groupgoods->goods_id!=$goodsId){ throwError('商品id跟活动商品id对不上'); } if($goodsNum>$groupgoods->limit_mount){ throwError('超过限购数量'); } } else if($activity_id>0){ $activity = GroupBuyLbActivity::where("id",$activity_id)->find(); if(empty($activity)){ throwError("找不到拼团活动"); } if($now>$activity->end_time){ throwError('拼团活动已结束'); } if($activity->audit_status!=1||$activity->status!=1){ throwError('拼团活动不存在'); } $join = GroupBuyLbJoin::where('user_id',$user->user_id)->where('group_buy_lb_activity_id',$activity_id)->where('status',0)->where('end_time',">",$now)->find(); if($join){ // throwError('你有一个拼团正在进行中'); } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$activity_id)->find(); if(empty($groupgoods)){ throwError('找不到商品'); } if($groupgoods->goods_id!=$goodsId){ throwError('商品id跟活动商品id对不上'); } if($goodsNum>$groupgoods->limit_mount){ throwError('超过限购数量'); } //判断库存数量 if($groupgoods->limit_stock - $groupgoods->purchase_stock <=0){ throwError('活动已结束~'); } } if(empty($groupgoods)){ throwError("找不到商品"); } // 隐藏冗余的属性 $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images'])); // 返回商品处理 foreach ($goodsList as &$item) { // 商品sku信息 $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId); // 商品单价 $item['goods_price'] = $item['skuInfo']['goods_price']; // 商品购买数量 $item['total_num'] = $goodsNum; // 商品SKU索引 $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id']; // 商品购买总金额 $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum); // 获取最终拼团单价金额 $item['group_price'] = $groupgoods['group_price']; $item['join_id'] = $joinId; $item['group_buy_lb_id'] = $joinId>0 ? $join['group_buy_lb_activity_id'] : $activity_id; $item['limit_mount'] = $groupgoods['limit_mount']; } return $goodsList; } /** * 余额支付标记订单已支付 * @param string $orderNo 订单号 * @return bool */ public function onPaymentByBalance(string $orderNo) { // 获取订单详情 $service = new OrderPaySuccesService($orderNo); // 发起余额支付 $status = $service->onPaySuccess(OrderPayTypeEnum::BALANCE); if (!$status) { $this->error = $service->getError(); } return $status; } /** * 积分兑换支付标记订单已支付 * @param string $orderNo 订单号 * @return bool */ public function onPaymentByAccumulatePoints(string $orderNo) { // 获取订单详情 $service = new OrderPaySuccesService($orderNo); // 发起积分支付 $status = $service->onPaySuccess(OrderPayTypeEnum::EXCHANGE); if (!$status) { $this->error = $service->getError(); } return $status; } /** * 获取用户订单列表 * @param string $type 订单类型 (all全部 payment待付款 delivery待发货 received待收货 completed已完成 comment待评价) * @param boolean $isExchange 是否积分兑换订单 * @return \think\Paginator * @throws BaseException * @throws \think\db\exception\DbException */ public function getList($type = 'all',$isExchange = false) { /* // 筛选条件 $filter = []; // 订单数据类型 switch ($type) { case 'all': break; case 'payment': $filter['pay_status'] = PayStatusEnum::PENDING; $filter['order_status'] = OrderStatusEnum::NORMAL; break; // case 'delivery': // $filter['pay_status'] = PayStatusEnum::SUCCESS; // $filter['delivery_status'] = DeliveryStatusEnum::NOT_DELIVERED; // $filter['order_status'] = OrderStatusEnum::NORMAL; // break; case 'received': $filter['pay_status'] = PayStatusEnum::SUCCESS; // $filter['delivery_status'] = DeliveryStatusEnum::DELIVERED; $filter['receipt_status'] = ReceiptStatusEnum::NOT_RECEIVED; $filter['order_status'] = OrderStatusEnum::NORMAL; break; case 'completed': $filter['is_comment'] = 0; $filter['order_status'] = OrderStatusEnum::COMPLETED; break; case 'comment': $filter['is_comment'] = 0; $filter['order_status'] = OrderStatusEnum::COMPLETED; break; }*/ $filter = $this->getFilter($type); if ($isExchange){ $filter['pay_type'] = PayType::EXCHANGE; } // 当前用户ID $userId = UserService::getCurrentLoginUserId(); // 查询列表数据 return $this->with(['goods.image']) ->where($filter) ->where('user_id', '=', $userId) ->where('is_delete', '=', 0) ->order(['create_time' => 'desc']) ->paginate(15)->each(function($e){ $e['goods_total_num'] = 0; foreach ($e['goods'] as $good){ $e['goods_total_num'] += $good['total_num']; } $e['za'] =null; if($e['order_source']==OrderSourceEnum::ZA){ //OrderPayTypeEnum::ACTIVITY 这个类型肯定是领取人 if($e['pay_type']!=OrderPayTypeEnum::ACTIVITY){ $za = ZaActivityRelation::where("order_id",$e['order_id'])->where('is_pay',1)->field('sign_str,receive_state,expire_time,is_pay,za_activity_id')->find(); if($za){ $now = Date("Y-m-d H:i:s",time()); $data['is_expire'] =$now > $za->expire_time ? true: false; $data['sign_str'] = $za->sign_str; $data['is_receive'] = $za->receive_state; $data['expire_time'] = $za->expire_time; $data['share_title'] = ZaActivity::where("id",$za->za_activity_id)->value("share_title")??''; $e['za'] = $data; } } } }); } public function getFilter($type){ // 筛选条件 $filter = []; // 订单数据类型 switch ($type) { case 'all': break; case 'payment': $filter['pay_status'] = PayStatusEnum::PENDING; $filter['order_status'] = OrderStatusEnum::NORMAL; break; // case 'delivery': // $filter['pay_status'] = PayStatusEnum::SUCCESS; // $filter['delivery_status'] = DeliveryStatusEnum::NOT_DELIVERED; // $filter['order_status'] = OrderStatusEnum::NORMAL; // break; case 'received': $filter['pay_status'] = PayStatusEnum::SUCCESS; // $filter['delivery_status'] = DeliveryStatusEnum::DELIVERED; $filter['receipt_status'] = ReceiptStatusEnum::NOT_RECEIVED; $filter['order_status'] = OrderStatusEnum::NORMAL; break; case 'completed': // $filter['is_comment'] = 0; $filter['order_status'] = OrderStatusEnum::COMPLETED; break; case 'comment': $filter['is_comment'] = 0; $filter['order_status'] = OrderStatusEnum::COMPLETED; break; case 'cancel': $filter['order_status'] = OrderStatusEnum::CANCELLED; break; case 'close': $filter['order_status'] = OrderStatusEnum::CLOSE; break; } return $filter; } /** * 取消订单 * @return bool|mixed */ public function cancel() { if ($this['pay_status'] == PayStatusEnum::SUCCESS) { $this->error = '已支付订单不可取消'; return false; } if ($this['delivery_status'] == DeliveryStatusEnum::DELIVERED) { $this->error = '已发货订单不可取消'; return false; } // 订单取消事件 return $this->transaction(function () { // 订单是否已支付 $isPay = $this['pay_status'] == PayStatusEnum::SUCCESS; // 订单取消事件 $isPay == false && OrderService::cancelEvent($this); // 更新订单状态: 已付款的订单设置为"待取消", 等待后台审核 return $this->save(['order_status' => $isPay ? OrderStatusEnum::APPLY_CANCEL : OrderStatusEnum::CANCELLED]); }); } /** * 删除指定订单记录 * @return bool * @throws BaseException */ public function clear() { // 验证订单是否合法 // 条件1: 订单必须已取消 // 条件2: 订单必须已完成 // 条件3: 订单必须已关闭 if ($this['order_status'] != 20 && $this['order_status'] != 30 && $this['order_status'] != 40) { $this->error = '该订单不能删除'; return false; } // 获取当前用户ID $userId = UserService::getCurrentLoginUserId(); // 设置更新条件 $where = [['user_id', '=', $userId], ['order_id', '=', $this['order_id']]]; // 更新记录 return static::updateBase(['is_delete'=>1],$where); } /** * 确认收货 * @return bool|mixed */ public function receipt() { // 验证订单是否合法 // 条件1: 订单必须已发货 // 条件2: 订单必须未收货 if ($this['delivery_status'] != 20 || $this['receipt_status'] != 10) { $this->error = '该订单不合法'; return false; } return $this->transaction(function () { // 更新订单状态 $status = $this->save([ 'receipt_status' => 20, 'receipt_time' => time(), 'order_status' => $this['order_status']==10 ? 30 : $this['order_status'], ]); // 执行订单完成后的操作 // $OrderCompleteService = new OrderCompleteService(OrderTypeEnum::ORDER); // $OrderCompleteService->complete([$this], static::$storeId); return $status; }); } /** * 确认核销并确认收货 * @return bool|mixed */ public function writeOff() { // 验证订单是否合法 // 条件1: 订单必须未过提货截止时间 if ($this['pickup_deadline'] < date('Y-m-d H:i:s')) { $this->error = '该订单已超过提货截止时间'; return false; } // 条件1: 订单必须未核销 // 条件2: 订单必须未收货 if ($this['hx_status'] != 10 || $this['receipt_status'] != 10) { $this->error = '该订单已核销'; return false; } if ($this['refund'] && $this['refund']['status'] == 0) { $this->error = '该订单在售后中'; return false; } if ($this['order_status'] != 10) { $this->error = '该订单已取消或已退款'; return false; } return $this->transaction(function () { // 更新订单状态 $status = $this->save([ 'receipt_status' => ReceiptStatusEnum::RECEIVED,//收货状态(10未收货 20已收货) 'receipt_time' => time(),//收货时间 'delivery_status' => DeliveryStatusEnum::DELIVERED, // 发货状态(10未发货 20已发货) 'delivery_time' => time(), // 发货时间 'order_status' => 30,//订单状态(10进行中 20取消 21待取消 30已完成) 'hx_status' => 20,//核销状态(10未核销 20已核销)', 'pickup_time' => time(),//提货时间 'hx_user_id' => UserService::getCurrentLoginUserId(),//核销人用户ID ]); $orderGoodsIds = helper::getArrayColumn($this['goods'],'order_goods_id'); static::setSignTime($orderGoodsIds,$this['order_id']); return $status; }); } /** * 核销后结算时间 * @param $orderGoodsIds * @param $orderId * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author: zjwhust * @Time: 2021/12/10 14:48 */ public static function setSignTime($orderGoodsIds,$orderId){ // 自动关闭订单的分钟数 $provider_days = SettingModel::getItem('provider_settlement')['provider_days'];//供应商结算时间 $refund = SettingModel::getItem('shops');//门店自提订单配置 $data = [ 'provider_settlement_time' => time()+$provider_days*86400, 'commission_settlement_time' => time()+$refund['commission_days']*86400, 'refund_time' => time()+$refund['refund_days']*86400, 'auto_receipt_time' => time(), 'sign_time' => time(), 'receipt_status' => ReceiptStatusEnum::RECEIVED,//收货状态(10未收货 20已收货) 'receipt_time' => time(),//收货时间 'delivery_status' => DeliveryStatusEnum::DELIVERED, // 发货状态(10未发货 20已发货) 'delivery_time' => time(), // 发货时间 ]; $dataOrder = [ 'commission_settlement_time' => time()+$refund['commission_days']*86400, 'refund_time' => time()+$refund['refund_days']*86400, ]; //添加测试的时间 if(env('SERVE_ENV')=='test') { $data = [ 'provider_settlement_time' => time() + 300,//供应商结算开始时间5分钟后 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后 'refund_time' => time() + 300,//关闭售后时间5分钟 'auto_receipt_time' => time(),//自动收货最晚时间5分钟后 'sign_time' => time(),//记录签到时间 'receipt_status' => 20,//收货状态(10未收货 20已收货) 'receipt_time' => time(),//收货时间 'delivery_status' => DeliveryStatusEnum::DELIVERED, // 发货状态(10未发货 20已发货) 'delivery_time' => time(), // 发货时间 //售后退款用户退货发货超时5分钟 ]; $dataOrder = [ 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后 'refund_time' => time() + 300,//关闭售后时间5分钟 ]; } OrderGoodsModel::updateBase($data, [['order_goods_id', 'in', $orderGoodsIds]]); self::updateBase($dataOrder,['order_id'=>$orderId]); } /** * 获取当前用户订单数量 * @param string $type 订单类型 (all全部 payment待付款 received待发货 deliver待收货 comment待评价) * @return int * @throws BaseException */ public function getCount($type = 'all') { // 筛选条件 $filter = []; // 订单数据类型 switch ($type) { case 'all': break; case 'payment': $filter['pay_status'] = PayStatusEnum::PENDING; break; case 'received': $filter['pay_status'] = PayStatusEnum::SUCCESS; $filter['delivery_status'] = DeliveryStatusEnum::DELIVERED; $filter['receipt_status'] = ReceiptStatusEnum::NOT_RECEIVED; break; case 'delivery': $filter['pay_status'] = PayStatusEnum::SUCCESS; $filter['delivery_status'] = DeliveryStatusEnum::NOT_DELIVERED; $filter['order_status'] = OrderStatusEnum::NORMAL; break; case 'comment': $filter['is_comment'] = 0; $filter['order_status'] = OrderStatusEnum::COMPLETED; break; } // 当前用户ID $userId = UserService::getCurrentLoginUserId(); // 查询数据 return $this->where('user_id', '=', $userId) ->where('order_status', '<>', 20) ->where($filter) ->where('is_delete', '=', 0) ->count(); } /** * 获取分享链接的用户ID * @param int $staffUserId * @return mixed * @author: zjwhust * @Time: 2021/9/30 13:32 */ private function getStaffUserId( int $staffUserId) { // 获取当前用户ID $user = UserService::getCurrentLoginUser(true); $is_staff = 1; if($staffUserId<=0 || $staffUserId==$user['user_id']){ if(in_array($user['role'],[1,99])){ $staffUserId = $user['upper_user_id']; $is_staff = 0; }else{ $staffUserId = 0; } } $data['staffUserId'] = $staffUserId; $data['shopId'] = 0; $data['distributorRadio'] = 0; if ($staffUserId>0) { // 获取分享链接的用户信息 $user_staff = User::detail($staffUserId); if($user_staff){ $data['shopId'] = !in_array($user_staff['role'],[1,99]) ? $user_staff['shop_id'] : $user_staff['bind_shop_id'];//获取分享链接用户的shop_id if($user['role']==99){ $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount']; }else{ if($user_staff['role'] == 99 && $is_staff){ $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount']; } } }else{ if($user['role']==99){ $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount']; } } }else{ if($user['role']==99){ $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount']; } } return $data; } /** * 获取用户订单详情(含关联数据) * @param int $orderId 订单ID * @return Order|array|null * @throws BaseException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function getUserOrderDetail(int $orderId) { // 关联查询 $with = [ 'goods' => ['image', 'refund', 'package'], 'address', 'express', 'shops', 'hxUser' ]; // 查询订单记录 $order = static::getDetail($orderId, $with); //重整订单列表结构 // static::restructureGoods($order); //添加订单商品售后状态 static::refundStatus($order); // 订单商品总数量 $order['orderTotalNum'] = helper::getArrayColumnSum($order['goods'], 'total_num'); // 该订单是否允许申请售后 // $order['isAllowRefund'] = static::isAllowRefund($order); // 订单是否允许申请开票 $order['isAllowInvoice'] = static::isAllowInvoice($order); return $order; } // 订单是否允许申请开票 public static function isAllowInvoice(self $order) { if($order['order_source']==OrderSourceEnum::ZA&&$order['pay_type']==OrderPayTypeEnum::ACTIVITY){ return false; } if ($order['invoice_deadline'] > 0 && ($order['invoice_deadline'] - time()) > 0) { return true; } return false; } //重构订单列表逻辑 public static function restructureGoods(self $order){ $mj_send_goods_list = []; foreach($order['goods'] as $key=>$goods){ if($goods['master_order_goods_id']>0){ $mj_send_goods_list[$goods['master_order_goods_id']][] = $goods; unset($order['goods'][$key]); } } foreach ($order['goods'] as $good){ $good['mj_send_goods_list'] = []; foreach ($mj_send_goods_list as $key => $list){ if($good['order_goods_id']==$key){ $good['mj_send_goods_list'] = $list; } } } } //处理订单商品当前的售后状态 public static function refundStatus(self $order){ $order['is_full_refund'] = true; $order['total_amount'] = helper::bcadd($order['total_price'],$order['express_price']); foreach($order['goods'] as $goods){ $goods['order_refund_status_text'] = ''; $goods['order_refund_status'] = 0; if($order['pay_status']==PayStatusEnum::SUCCESS && in_array($order['order_status'],[OrderStatusEnum::NORMAL,OrderStatusEnum::COMPLETED]) && $goods['goods_type']!=20) { //已支付并且不是赠品 if($goods['is_export'] || $goods['delivery_status'] == DeliveryStatusEnum::DELIVERED){ $order['is_full_refund'] = false; } if(($order['is_full_send']==1||$order['is_qc_send_send']==1) && $goods['delivery_status'] == DeliveryStatusEnum::NOT_DELIVERED) {//如果是满就送订单或者全场满件送订单,并且订单商品未发货 }else{ $order_refund_status_text = $goods['delivery_status'] == DeliveryStatusEnum::DELIVERED ? '申请售后' : '申请退款'; if (empty($goods['refund_time']) || $goods['refund_time'] > time()) {//申请售后的时间未过期 if ($goods['refund']) { $order['is_full_refund'] = false;//有了退款申请就不能在全部退款了 // if ($goods['is_export'] && $goods['refund']['status'] == 0){//导出并且在已退款中 // $goods['order_refund_status_text'] = '退款中'; // $goods['order_refund_status'] = 2; // }elseif($goods['is_export']){//导出不显示退款按钮 // $goods['order_refund_status'] = 0; // }else if ($goods['refund']['status'] == RefundStatusEnum::CANCELLED || $goods['refund']['status'] == RefundStatusEnum::CLOSE) { //导出未发货时不显示申请退款状态 if($goods['is_export'] && $goods['delivery_status'] == DeliveryStatusEnum::NOT_DELIVERED ) continue; $goods['order_refund_status_text'] = $order_refund_status_text; $goods['order_refund_status'] = 1; } elseif($goods['refund']['status'] == RefundStatusEnum::COMPLETED ) {//已完成 不在给第二次申请的机会 $goods['order_refund_status_text'] = '退款成功'; $goods['order_refund_status'] = 3; }else{ $goods['order_refund_status_text'] = '退款中'; $goods['order_refund_status'] = 2; } } else { //导出未发货时不显示申请退款状态 if($goods['is_export'] && $goods['delivery_status'] == DeliveryStatusEnum::NOT_DELIVERED ) { $order['is_full_refund'] = false; continue; } // 门店自提订单未核销时不显示申请退款状态 if ($order['delivery_type'] == 20 && $order['hx_status'] == 10 && count($order['goods']) > 1) { continue; } $goods['order_refund_status_text'] = $order_refund_status_text; $goods['order_refund_status'] = 1; } } else { //不在申请售后时间内 $order['is_full_refund'] = false; if ($goods['refund']) { if ($goods['refund']['status'] == RefundStatusEnum::CANCELLED || $goods['refund']['status'] == RefundStatusEnum::CLOSE) { $goods['order_refund_status_text'] = '已关闭'; $goods['order_refund_status'] = 3; } elseif($goods['refund']['status'] == RefundStatusEnum::COMPLETED ) {//已完成 不在给第二次申请的机会 $goods['order_refund_status_text'] = '退款成功'; $goods['order_refund_status'] = 3; } else { $goods['order_refund_status_text'] = '退款中'; $goods['order_refund_status'] = 2; } } } } } // if($order['order_source']==OrderSourceEnum::ZA&&$order['pay_type']==OrderPayTypeEnum::ACTIVITY){ $goods['order_refund_status_text'] = ''; $goods['order_refund_status'] = 0; } } return $order; } /** * 获取用户订单详情(仅订单记录) * @param int $orderId * @param array $with * @return Order|array|null * @throws BaseException */ public static function getDetail(int $orderId, $with = []) { // var_dump(UserService::getCurrentLoginUserId()); // die(); // 查询订单记录 $order = static::detail([ 'order_id' => $orderId, 'user_id' => UserService::getCurrentLoginUserId(), ], $with); empty($order) && throwError('订单不存在'); return $order; } /** * 当前订单是否允许申请售后 * @param Order $order * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ private static function isAllowRefund(self $order) { // 必须是已发货的订单 if ($order['delivery_status'] != DeliveryStatusEnum::DELIVERED) { return false; } // 允许申请售后期限(天) $refundDays = SettingModel::getItem(SettingEnum::TRADE)['order']['refund_days']; // 不允许售后 if ($refundDays == 0) { return false; } // 当前时间超出允许申请售后期限 if ( $order['receipt_status'] == ReceiptStatusEnum::RECEIVED && time() > ($order->getData('receipt_time') + ((int)$refundDays * 86400)) ) { return false; } return true; } /** * 获取当前用户待处理的订单数量 * @return array * @throws BaseException */ public function getTodoCounts() { return [ 'payment' => $this->getCount('payment'), // 待付款 'delivery' => $this->getCount('received') + $this->getCount('delivery'), // 待收货(包括待发货 'comment' => $this->getCount('comment'), // 待评价 'refund' => (new OrderRefund())->getCount() // 售后/退款订单数 ]; } /** * 待支付订单倒计时时间戳 * @param $value * @param $data * @return int * @author: zjwhust * @Time: 2021/10/8 17:06 */ public function getDjsTimeAttr($value, $data){ if(isset($data['pay_status']) && $data['pay_status']==10){ //待支付 $now = time(); $djs_time = 60 * (int)SettingModel::getItem('order_cancel', $this->storeId)['close_minutes']; // $delay_time = 60* (int)$this->getTradeSetting()['close_days']; if($now-$data['create_time']<$djs_time){ return $data['create_time']+$djs_time-$now; } } return 0; } /** * 待收货订单倒计时时间戳 * @param $value * @param $data * @return int * @author: zjwhust * @Time: 2021/10/8 17:06 */ public function getDshTimeAttr($value,$data){ if(isset($data['delivery_status']) && $data['delivery_status']==20&&$data['receipt_status']==10){ //已发货待收货状态 $now = time(); $delay_time = 86400 * (int)SettingModel::getItem('refund', $this->storeId)['receive_days']; // $delay_time = 60 * (int)$this->getTradeSetting()['receive_days']; if(($now-$data['delivery_time'])<$delay_time){ //发货时间15天内 return $data['delivery_time']+$delay_time-$now; } } return 0; } /** * 设置错误信息 * @param $error */ protected function setError($error) { empty($this->error) && $this->error = $error; } /** * 是否存在错误 * @return bool */ public function hasError() { return !empty($this->error); } public function dailySalesTj($shopId,$from,$to){ //统计前一天的数据 $res = $this->where('staff_shop_id',$shopId) ->where('pay_status',20) ->whereBetweenTime('create_time',$from,$to)//mysql 对int类型的 between and包含左右边界 ->field('sum(total_price + express_price) as total_price,sum(total_price) as total_goods_price,sum(pay_price + rice_card_money) as total_pay_price,sum(coupon_money) as coupon_money,count(order_id) as order_count,sum(express_price) as express_price') ->find(); $res['total_price'] = $res['total_price']?:0; $res['total_goods_price'] = $res['total_goods_price']?:0; $res['total_pay_price'] = $res['total_pay_price']?:0; $res['coupon_money'] = $res['coupon_money']?:0; $res['express_price'] = $res['express_price']?:0; //店老板基本分佣 $res['boss_comm_money'] = CommissionsDetailApi::sumUserCommission($shopId,User::SHOP_BOSS,$from,$to); //店长基本分佣 $res['mg_comm_money'] = CommissionsDetailApi::sumUserCommission($shopId,User::SHOP_MG,$from,$to); //店员基本分佣 $res['seller_comm_money'] = CommissionsDetailApi::sumUserCommission($shopId,User::SHOP_SELLER,$from,$to); return $res->toArray(); } /** * 商城统计时间区间的销售额和订单数 * @param $from * @param $to * @return Order|array|\think\Model|null * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function dailyStoreSaleVolumeSt($from,$to){ $res = $this->whereBetweenTime('create_time',$from,$to)//mysql 对int类型的 between and包含左右边界 ->where('pay_status',20) ->field('sum(pay_price + rice_card_money) as sale_volume,count(order_id) as order_count') ->find(); $res['sale_volume'] = $res['sale_volume']?:0; $res['order_count'] = $res['order_count']?:0; return $res; } /** * 统计成功支付的订单数1.3.92,2022年5月11日 18:31:31 * @param $shopId * @param $from * @param $to * @return int */ public static function getUserOrderCount39($shopId,$from,$to,$monthly=false) { $model = CommissionsDetail::field( 'distinct order_id') ->where('shop_id',$shopId) ->where('commission_level',1);//6.推荐官直接推广的订单计入奖励金,间接推广的订单不计入。 if($monthly == true){ $model->where('clearing_status',1); }else{ $model->where('clearing_status','<',2); } $orderIds = $model->whereBetweenTime('order_create_time', $from, $to)->column('order_id'); return count(array_unique($orderIds)); } }