db->beginTransaction(); // 需要下检测一下商品 $totalPrice = 0; $orderGoods = []; // var_dump($this->goods_list);die; foreach($this->goods_list as $value){ // 商品数据 $goods = Goods::findOne($value['goods_id']); // 购买商品的规格数据 $attr = []; foreach ($value['attr'] as $attrItem) { if (!empty($attrItem['attr_id'])) { $attr[] = intval($attrItem['attr_id']); } } // 根据规格获取商品的库存及规格价格信息 $attr_info = $goods->getAttrInfo($attr); if ($value['new_price'] > 0) { $goods->price = $attr_info['price'] = $value['new_price']; } $goodsPrice = sprintf('%.2f',($goods->use_attr ? $attr_info['price'] : $goods->price) * $value['num']); // 整理detail数据 $dataItem = [ 'goods_id' => $goods->id, 'goods_name' => $goods->name, 'num' => $value['num'], 'total_price' => $goodsPrice, 'attr' => json_encode($attr, JSON_UNESCAPED_UNICODE), 'new_price' => $value['new_price'] ?: 0 ]; $orderGoods[] = $dataItem; // 商品的价格乘以商品的数量 $totalPrice += $goodsPrice; } try { if($this->id > 0){ $hangingOrder = HangingOrder::findOne($this->id); }else{ $hangingOrder = new HangingOrder(); } if (!$this->user_id) { return [ 'code' => 1, 'msg' => '生成挂单记录失败,挂单用户id不能为空' ]; } $hangingOrder->store_id = $this->store_id; $hangingOrder->user_id = $this->user_id; $hangingOrder->md_id = $this->md_id > 0 ? $this->md_id : 0; if($this->id <= 0){ // 不修改原来的挂单订单编号 $hangingOrder->order_no = self::createOrderNo(); } $hangingOrder->total_price = $totalPrice; $hangingOrder->create_at = time(); $hangingOrder->is_delete = 0; $hangingOrder->status = 0; if(!$hangingOrder->save()){ $t->rollBack(); return [ 'code' => 1, 'msg' => '生成挂单记录失败', 'data' => $hangingOrder->getErrors() ]; } // 先删除之前所有挂单商品 if($this->id > 0){ HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$hangingOrder->id]); } // 处理挂单商品信息 foreach($orderGoods as $detailItem){ $hangingOrderDetail = new HangingOrderDetail(); $hangingOrderDetail->order_id = $hangingOrder->id; $hangingOrderDetail->goods_id = $detailItem['goods_id']; $hangingOrderDetail->num = $detailItem['num']; $hangingOrderDetail->attr = $detailItem['attr']; $hangingOrderDetail->total_price = $detailItem['total_price']; $hangingOrderDetail->new_price = $detailItem['new_price']; $hangingOrderDetail->is_delete = 0; if(!$hangingOrderDetail->save()){ $t->rollBack(); return [ 'code' => 1, 'data' => $hangingOrderDetail->getErrors() ]; } } $t->commit(); return [ 'code' => 0, 'data' => '订单已挂起' ]; }catch (\Exception $e){ $t->rollBack(); return [ 'code' => 1, 'msg' => $e->getMessage() ]; } } /** * 生成订单号 * @return string * User: hankaige * DATE TIME: 2022/12/5 15:11 */ private static function createOrderNo(): string{ $order_no = null; while (true) { $order_no = HangingOrder::ORDER_PREFIX.date('YmdHis') . mt_rand(100000, 999999); $exist_order_no = HangingOrder::find()->where(['order_no' => $order_no])->exists(); if (!$exist_order_no) { break; } } return $order_no; } /** * 获取挂单订单列表 * @return array * User: hankaige * DATE TIME: 2022/12/6 09:31 */ public function getList(): array{ $query = HangingOrder::find()->with(['orderDetail','user'])->where(['is_delete'=>0,'store_id'=>$this->store_id]); if($this->user_id > 0){ $query->andWhere(['user_id'=>$this->user_id]); } if($this->order_no){ $query->andWhere(['like','order_no' , $this->order_no]); } if($this->dateStart){ $query->andWhere(['>=', 'create_at', strtotime($this->dateStart)]); } if($this->dateEnd){ $query->andWhere(['<=', 'create_at', strtotime($this->dateEnd)]); } if($this->md_id){ $query->andWhere(['md_id' => $this->md_id]); } $query->orderBy('create_at DESC'); $list = pagination_make($query); foreach($list['list'] as &$item){ foreach ($item['orderDetail'] as &$value){ $goods = Goods::findOne([ 'id' => $value['goods_id'], 'is_delete' => 0, 'status' => 1, ]); if (!$goods) { continue; } $goods_id_list[] = $value['goods_id']; $attr_list = Attr::find()->alias('a') ->select('ag.attr_group_name,a.attr_name,a.id as attr_id,a.attr_group_id') ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id') ->where(['a.id' => json_decode($value['attr'], true)]) ->asArray()->all(); $attr = $goods->attr; $price = $goods->price; $goodsData = [ 'attr' => $attr, 'price' => $price, 'is_level' => $goods->is_level, 'use_attr' => $goods->use_attr, ]; $user_id = $item['user_id']; $user = User::findOne($user_id); if ($user) { \Yii::$app->jwt->setUser($user); } $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($value['attr'], true)); $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic; $value['total_price'] = sprintf('%.2f', ($goods_attr_info['level_price'] * $value['num'])); $value['goods_name'] = $goods->name; $value['attr_list'] = $attr_list; $value['goods_pic'] = $goods_pic; } $total_price_arr = array_column($item['orderDetail'], 'total_price'); $item['total_price'] = round(array_sum($total_price_arr), 2); $item['create_at'] = date('Y-m-d H:i:s',$item['create_at']); } return [ 'code' => 0, 'data' => $list ]; } // 获取挂单商品列表 public function getOrderDetail(){ if(empty($this->id)){ return ['code' => 1,'msg' => '挂单订单ID有误']; } $query = HangingOrderDetail::find()->alias('hod')->leftJoin(['g'=>Goods::tableName()],'hod.goods_id = g.id')->where(['hod.order_id'=>$this->id,'hod.is_delete'=>0]); if($this->goods_name){ $query->andWhere(['like','g.name',$this->goods_name]); } $list = $query->select('hod.*,g.name')->asArray()->all(); $hangingOrder = HangingOrder::findOne($this->id); if ($hangingOrder) { $user_id = $hangingOrder->user_id; $user = User::findOne($user_id); if ($user) { \Yii::$app->jwt->setUser($user); } } foreach ($list as &$value){ $goods = Goods::findOne([ 'id' => $value['goods_id'], 'is_delete' => 0, 'status' => 1, ]); if (!$goods) { continue; } $goods_id_list[] = $value['goods_id']; $attr_list = Attr::find()->alias('a') ->select('ag.attr_group_name,a.attr_name,a.id as attr_id,a.attr_group_id') ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id') ->where(['a.id' => json_decode($value['attr'], true)]) ->asArray()->all(); $attr = $goods->attr; $price = $goods->price; if ($value['new_price'] > 0) { $mch_attr_id = json_decode($value['attr'], true); sort($mch_attr_id); $attr_ = json_decode($attr, true); foreach ($attr_ as &$goods_attr_item) { $goods_attr_id = array_column($goods_attr_item['attr_list'], 'attr_id'); sort($goods_attr_id); if (!array_diff($goods_attr_id, $mch_attr_id)) { $goods_attr_item['price'] = $value['new_price']; } } $attr = json_encode($attr_, JSON_UNESCAPED_UNICODE); $price = $value['new_price']; } $goodsData = [ 'attr' => $attr, 'price' => $price, 'is_level' => $goods->is_level, 'use_attr' => $goods->use_attr, ]; $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($value['attr'], true)); $goods_pic = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic; $value['goods_name'] = $goods->name; $value['attr_list'] = $attr_list; $value['price'] = isset($goods_attr_info['level_price']) && !empty($goods_attr_info['level_price']) ? $goods_attr_info['level_price'] : $goods->price; foreach($attr_list as $m){ $value['attr_text'] .= $m['attr_name'].' '; } $warn_goods_timeout = Goods::warn_goods_timeout($goods->store_id); $value['timeout_day'] = $goods->time_made_day ? date('Y-m-d', $goods->time_made_day + 86400 * $goods->time_shelf_life) : '--'; $value['is_warn_goods_timeout'] = ($goods->time_made_day && ($goods->time_made_day + 86400 * $goods->time_shelf_life) < (time() + $warn_goods_timeout * 86400)) ? 1 : 0; $value['total_price'] = $value['price'] * $value['num']; $value['pic'] = $goods_pic; } return [ 'code' => 0, 'data' => $list ]; } /** * 删除挂单订单 * @return array * User: hankaige * DATE TIME: 2022/12/6 09:36 */ public function delHanging(): array { if(empty($this->id)){ return ['code' => 1,'msg'=>'订单ID错误']; } $hangingModel = HangingOrder::findOne($this->id); if(!$hangingModel){ return ['code' => 1, 'msg' => '挂单不存在,请刷新再试']; } $t = \Yii::$app->db->beginTransaction(); try { $hangingModel->is_delete = 1; if(!$hangingModel->save()){ $t->rollBack(); return ['code' => 1, 'msg' => '删除失败']; } HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->id]); $t->commit(); return ['code' => 0, 'msg' => '挂单订单删除成功']; }catch (\Exception $e){ $t->rollBack(); return ['code' => 1, 'msg' => '系统错误', 'data' => $e->getMessage()]; } } /** * 删除挂单订单商品 * @return array * User: hankaige * DATE TIME: 2022/12/6 14:16 */ public function delHangingOrderDetail(): array { if(empty($this->id)){ return ['code' => 1,'msg'=>'订单商品ID错误']; } $hangingOrderDetail = HangingOrderDetail::findOne($this->id); if(empty($hangingOrderDetail)){ return ['code' => 1,'msg'=>'挂单订单商品不存在']; } $t = \Yii::$app->db->beginTransaction(); try { $hangingOrderDetail->is_delete = 1; if(!$hangingOrderDetail->save()){ $t->rollBack(); return ['code'=>1,'msg'=>'挂单商品不存在']; } // 修改挂单 $hangingOrderDetailAll = HangingOrderDetail::find()->where(['order_id'=>$hangingOrderDetail->order_id,'is_delete'=>0])->asArray()->all(); $hangingOrder = HangingOrder::findOne($hangingOrderDetail->order_id); $hangingOrder->total_price = array_sum(array_column($hangingOrderDetailAll,'total_price')); if(!$hangingOrder->save()){ $t->rollBack(); return ['code'=>1,'msg'=>'修改挂单信息失败']; } $t->commit(); return ['code'=>0,'msg'=>'删除挂单商品成功','data'=>['total_price'=>$hangingOrder->total_price]]; }catch (\Exception $e){ $t->rollBack(); return ['code' => 1, 'msg' => '系统错误', 'data' => $e->getMessage()]; } } /** * 取出挂单商品信息 * @return array * User: hankaige * DATE TIME: 2022/12/6 14:47 */ public function getHangingOrder(){ if(empty($this->id)){ return ['code' => 1,'msg'=>'订单ID错误']; } $hangingOrder = HangingOrder::find()->where(['id'=>$this->id])->with(['orderDetail','user'])->asArray()->one(); if ($hangingOrder) { $user_id = $hangingOrder['user_id']; $user = User::findOne($user_id); if ($user) { \Yii::$app->jwt->setUser($user); } } // 处理商品规格 foreach($hangingOrder['orderDetail'] as &$item){ $goods = Goods::findOne($item['goods_id']); $item['attr_list'] = Attr::find()->alias('a') ->select('ag.attr_group_name,a.attr_name,a.id as attr_id,a.attr_group_id') ->leftJoin(['ag' => AttrGroup::tableName()], 'a.attr_group_id=ag.id') ->where(['a.id' => json_decode($item['attr'], true)]) ->asArray()->all(); $attr = $goods->attr; $price = $goods->price; $mch_attr_id = json_decode($item['attr'], true); sort($mch_attr_id); $attr_ = json_decode($attr, true); foreach ($attr_ as &$goods_attr_item) { $goods_attr_id = array_column($goods_attr_item['attr_list'], 'attr_id'); sort($goods_attr_id); if (!array_diff($goods_attr_id, $mch_attr_id)) { $goods_attr_item['price'] = $item['new_price']; if ($goods_attr_item['old_price']) { $item['old_price'] = $goods_attr_item['old_price']; } } } $attr = json_encode($attr_, JSON_UNESCAPED_UNICODE); // $price = $item['new_price']; $goodsData = [ 'attr' => $attr, 'price' => $price, 'is_level' => $goods->is_level, 'use_attr' => $goods->use_attr, ]; $goods_attr_info = CommonGoods::currentGoodsAttr($goodsData, (array) json_decode($item['attr'], true)); $item['pic'] = isset($goods_attr_info['pic']) && !empty($goods_attr_info['pic']) ? $goods->getGoodsPic(0)->pic_url : $goods->cover_pic; $item['name'] = $goods->name; $item['price'] = isset($goods_attr_info['price']) && !empty($goods_attr_info['price']) ? $goods_attr_info['price'] : $goods->price; $item['goods_id'] = $goods->id; $item['level_price'] = sprintf('%.2f', $goods_attr_info['level_price']); } return [ 'code'=>0, 'msg' => '获取数据成功', 'data'=> $hangingOrder ]; } }