From 436144dbe873ddb202e677d0df4358ea28c52857 Mon Sep 17 00:00:00 2001 From: travis <310243791@qq.com> Date: Fri, 6 Dec 2019 16:50:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=91=E8=B4=A7=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=89=88=EF=BC=88=E9=83=A8=E5=88=86=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=E5=BE=85=E5=AE=8C=E5=96=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shop/controllers/OrderController.php | 34 +++ .../shop/logic/delivery/DeliveryManager.php | 242 ++++++++++++++++++ ...206_024047_create_table_delivery_goods.php | 37 +++ .../modules/shop/models/ars/DeliveryGoods.php | 79 ++++++ .../shop/models/searchs/DeliverySearch.php | 2 +- .../shop/models/searchs/OrderSearch.php | 5 + backend/modules/shop/views/order/delivery.php | 56 ++++ .../shop/views/order/delivery_goods.php | 130 ++++++++++ .../modules/shop/views/order/logistics.php | 11 + .../shop/views/order/shipping_info.php | 5 +- console/controllers/TestController.php | 50 ++++ 11 files changed, 649 insertions(+), 2 deletions(-) create mode 100644 backend/modules/shop/logic/delivery/DeliveryManager.php create mode 100644 backend/modules/shop/migrations/m191206_024047_create_table_delivery_goods.php create mode 100644 backend/modules/shop/models/ars/DeliveryGoods.php create mode 100644 backend/modules/shop/views/order/delivery.php create mode 100644 backend/modules/shop/views/order/delivery_goods.php create mode 100644 backend/modules/shop/views/order/logistics.php diff --git a/backend/modules/shop/controllers/OrderController.php b/backend/modules/shop/controllers/OrderController.php index d18b007..5b318af 100755 --- a/backend/modules/shop/controllers/OrderController.php +++ b/backend/modules/shop/controllers/OrderController.php @@ -2,6 +2,8 @@ namespace backend\modules\shop\controllers; +use backend\modules\shop\logic\delivery\DeliveryManager; +use backend\modules\shop\models\ars\Delivery; use Yii; use backend\modules\shop\models\ars\Order; use backend\modules\shop\models\searchs\OrderSearch; @@ -146,4 +148,36 @@ class OrderController extends Controller 'columns' => $searchModel->columns() ]); } + + /** + * @param $id + * @return string|\yii\web\Response + * @throws NotFoundHttpException + * @throws \yii\db\Exception + * 订单发货 + */ + public function actionDelivery($id) + { + $order = $this->findModel($id); + $delivery = new Delivery(); + + if (Yii::$app->request->isPost) { + $res = DeliveryManager::orderDelivery($order, $delivery); + if ($res['status']) { + return $this->redirect(['index']); + } else { + Yii::$app->session->setFlash('error', $res['info']); + } + } + + /*获取发货商品信息(包括已发货和未发货)*/ + $deliveryGoods = DeliveryManager::deliveryGoodsInfo($id); + + return $this->render('delivery', [ + 'order' => $order, + 'delivery' => $delivery, + 'deliveryGoods' => json_encode($deliveryGoods) + ]); + } + } diff --git a/backend/modules/shop/logic/delivery/DeliveryManager.php b/backend/modules/shop/logic/delivery/DeliveryManager.php new file mode 100644 index 0000000..e40ec1d --- /dev/null +++ b/backend/modules/shop/logic/delivery/DeliveryManager.php @@ -0,0 +1,242 @@ +db->beginTransaction(); + try { + $data = Yii::$app->request->post(); + if (empty($data['deliveryGoods'])) { + throw new Exception('缺少发货商品信息'); + } + $deliveryGoods = json_decode($data['deliveryGoods']); + $delivery->load($data); + $delivery->order_id = $order->id; + if (!$delivery->save()) { + throw new Exception('保存物流信息失败'); + } + + /*发货商品数据*/ + self::deliveryGoods($delivery->id, $order, $deliveryGoods); + + $transaction->commit(); + return ['status' => true]; + } catch (Exception $e) { + $transaction->rollBack(); + return ['status' => false, 'info' => $e->getMessage()]; + } + } + + /** + * @param $delivery_id + * @param $order + * @param $deliveryGoods + * @throws Exception + * 发货商品数据 + */ + public static function deliveryGoods($delivery_id, $order, $deliveryGoods) + { + foreach ($deliveryGoods as $k => $value) { + $model = new DeliveryGoods(); + $model->delivery_id = $delivery_id; + $model->order_goods_id = $value->id; + $model->goods_id = $value->goods_id; + $model->goods_name = $value->goods_name; + $model->goods_number = $value->goods_number; + if ($model->goods_number < $value->lack_number) { + $order->status = Order::STATUS_SHIPMENT_PORTION; + } else { + $order->status = Order::STATUS_SHIPMENT_ALL; + } + if (!$order->save()) { + throw new Exception('order shipping_status update false'); + } + if (!$model->save()) { + throw new Exception('delivery_goods save false'); + } + } + } + + + /** + * @param $order + * @param $goodsStatus + * @throws Exception + * @name '修改发货状态' + */ + public function updateShippedStatus($order, $goodsStatus){ + + + } + + /** + * @param $order_id + * @return array + * @throws Exception + * 获取发货全部商品信息 + */ + public static function deliveryGoodsInfo($order_id) + { + $delivery = Delivery::find()->select('id')->where(['order_id' => $order_id])->all(); + /*如果该订单是首次发货*/ + if (!$delivery) { + $unShippend = self::firstDelivery($order_id); + return ['unShipped' => $unShippend]; + } + + $deliveryIds = []; + foreach ($delivery as $value) { + $deliveryIds[] = $value->id; + } + + $filter = []; + $deliveryGoods = DeliveryGoods::find()->where(['delivery_id' => $deliveryIds])->all(); + for ($i = 0; $i < count($deliveryGoods); $i++) { + $orderGoodsId = $deliveryGoods[$i]['order_goods_id']; + //以orderGoods的id为键名,以orderGoods的数量为键值,先保存到filter数组中 + $filter[$orderGoodsId] = $deliveryGoods[$i]['goods_number']; + for ($j = 0; $j < count($deliveryGoods); $j++) { + //如果发货商品中有其他相同orderGoods的商品 + if ($orderGoodsId == $deliveryGoods[$j]['order_goods_id'] && $i !== $j) { + //商品数量叠加起来并保存 + $filter[$orderGoodsId] += $deliveryGoods[$j]['goods_number']; + } + } + } + + /*获取订单已发的商品和未发的商品*/ + return self::getDeliveryGoodsInfo($filter, $order_id); + } + + /** + * @param $order_id + * @return array + * 首次发货直接获取orderGoods的内容 + */ + public static function firstDelivery($order_id) + { + $unShippedGoods = []; + $orderGoods = OrderGoods::find()->where(['order_id' => $order_id])->all(); + foreach ($orderGoods as $k => $v) { + $unShippedGoods[] = [ + 'id' => $v->id, + 'goods_id' => $v->goods_id, + 'goods_img' => $v->goods_img, + 'goods_name' => $v->goods_name, + 'price' => $v->price, + 'market_price' => $v->market_price, + 'goods_number' => $v->goods_count, + 'lack_number' => $v->goods_count, + 'sku_value' => $v->sku_value, + ]; + } + return $unShippedGoods; + } + + /** + * @param $filter + * @param $order_id + * @return array + * @throws Exception + * 获取订单已发的商品和未发的商品 + */ + public static function getDeliveryGoodsInfo($filter,$order_id) + { + $unShipped = []; //未发货商品 + foreach ($filter as $k => $value) { //键名为ordergoods_id,键值为对应的已发货数量 + $goodsData = self::getOrderGoodsInfo($k); + if ($value < $goodsData['goods_number']) { //如果已发货数量未达到order_goods里的数量 + $lack_number = $goodsData['goods_number'] - $value; + $goodsData['lack_number'] = $lack_number; + $goodsData['goods_number'] = $lack_number; + $unShipped[] = $goodsData; + } + } + $shipped = self::getDeliveryInfo($order_id); //已发货商品信息 + return ['shipped' => $shipped, 'unShipped' => $unShipped]; + } + + /** + * @param $order_id + * @return array + * @throws Exception + * 通过订单号获取发货信息 + */ + public static function getDeliveryInfo($order_id) + { + $deliveryInfo = []; + $delivery = Delivery::findAll(['order_id' => $order_id]); + foreach ($delivery as $k => $value) { + $expressTemplate = ExpressTemplate::find()->select('name')->where(['id' => $value->shipping_id])->one(); + $deliveryInfo[$k]['logisticInfo'] = [ + 'exp_name'=> $expressTemplate ? $expressTemplate->name : '', + 'invoice_no'=> $value->invoice_no + ]; //物流公司和运单号 + $deliveryInfo[$k]['goodsInfo'] = self::getDeliverGoodsInfo($value->id); //获取商品信息 + } + return $deliveryInfo; + } + + /** + * @param $delivery_id + * @return array + * @throws Exception + * 通过获取订单已发货的商品信息 + */ + public static function getDeliverGoodsInfo($delivery_id) + { + $goodsInfo = []; + $deliveryGoods = DeliveryGoods::find()->where(['delivery_id'=>$delivery_id])->andWhere(['>','goods_number',0])->all(); + foreach ($deliveryGoods as $value) { + $goodsData = self::getOrderGoodsInfo($value->order_goods_id); + $goodsData['delivery_number'] = $value->goods_number; + $goodsInfo[] = $goodsData; + } + return $goodsInfo; + } + + /** + * @param $orderGoodsId + * @return array + * @throws Exception + * 获取订单商品信息 + */ + private static function getOrderGoodsInfo($orderGoodsId) + { + $orderGoods = OrderGoods::findOne($orderGoodsId); //通过orderGoods_id找到订单商品 + if ($orderGoods) { + $goodsData = [ + 'id' => $orderGoods->id, + 'goods_id' => $orderGoods->goods_id, + 'goods_name' => $orderGoods->goods_name, + 'shop_price' => $orderGoods->shop_price, + 'goods_number' => $orderGoods->goods_number, + 'goods_img' => $orderGoods->goods_img, + 'sku_type' => $orderGoods->sku_type, + ]; + return $goodsData; + } else { + throw new Exception('order_goods not found'); + } + } + + +} \ No newline at end of file diff --git a/backend/modules/shop/migrations/m191206_024047_create_table_delivery_goods.php b/backend/modules/shop/migrations/m191206_024047_create_table_delivery_goods.php new file mode 100644 index 0000000..4c8b975 --- /dev/null +++ b/backend/modules/shop/migrations/m191206_024047_create_table_delivery_goods.php @@ -0,0 +1,37 @@ +createTable('ats_delivery_goods', [ + 'id' => $this->primaryKey(), + 'delivery_id' => $this->integer()->notNull()->defaultValue(0)->comment('物流id'), + 'order_goods_id' => $this->integer()->notNull()->defaultValue(0)->comment('订单商品id'), + 'goods_id' => $this->integer()->notNull()->defaultValue(0)->comment('商品id'), + 'goods_name' => $this->string()->notNull()->defaultValue('')->comment('商品名称'), + 'goods_number' => $this->integer()->notNull()->defaultValue(0)->comment('商品数量'), + 'created_at' => $this->integer()->notNull()->defaultValue(0)->comment('创建时间'), + 'updated_at' => $this->integer()->notNull()->defaultValue(0)->comment('更新时间'), + ], $tableOptions); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable('ats_delivery_goods'); + return true; + } + +} diff --git a/backend/modules/shop/models/ars/DeliveryGoods.php b/backend/modules/shop/models/ars/DeliveryGoods.php new file mode 100644 index 0000000..2f7ecb5 --- /dev/null +++ b/backend/modules/shop/models/ars/DeliveryGoods.php @@ -0,0 +1,79 @@ + 'id', + 'delivery_id' => '物流id', + 'order_goods_id' => '订单商品id', + 'goods_id' => '商品id', + 'goods_name' => '商品名称', + 'goods_number' => '商品数量', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + ]; + } + + + /** + * @author linyao + * @email 602604991@qq.com + * @created Nov 8, 2019 + * + * 行为存储创建时间和更新时间 + */ + public function behaviors() + { + return [ + [ + 'class' => TimestampBehavior::className(), + 'createdAtAttribute' => 'created_at', + 'updatedAtAttribute' => 'updated_at', + 'value' => function() { + return time(); + }, + ], + ]; + } +} diff --git a/backend/modules/shop/models/searchs/DeliverySearch.php b/backend/modules/shop/models/searchs/DeliverySearch.php index 27c8c96..43edd61 100644 --- a/backend/modules/shop/models/searchs/DeliverySearch.php +++ b/backend/modules/shop/models/searchs/DeliverySearch.php @@ -57,7 +57,7 @@ class DeliverySearch extends Delivery 'shipping_name', 'shipping_id', 'type', - 'goods', +// 'goods', 'status', 'decription', //'updated_at', diff --git a/backend/modules/shop/models/searchs/OrderSearch.php b/backend/modules/shop/models/searchs/OrderSearch.php index 717b768..18c491b 100755 --- a/backend/modules/shop/models/searchs/OrderSearch.php +++ b/backend/modules/shop/models/searchs/OrderSearch.php @@ -127,6 +127,11 @@ class OrderSearch extends Order 'icon' => 'list', 'title' => '详情', ], + [ + 'name' => 'delivery', + 'icon' => 'box', + 'title' => '发货', + ], [ 'name' => 'update', 'icon' => 'pencil', diff --git a/backend/modules/shop/views/order/delivery.php b/backend/modules/shop/views/order/delivery.php new file mode 100644 index 0000000..5ea40f5 --- /dev/null +++ b/backend/modules/shop/views/order/delivery.php @@ -0,0 +1,56 @@ +title = '订单发货:'. $order->order_sn; +$this->params['breadcrumbs'][] = ['label' => '订单列表', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +Yii::$app->params['bsVersion'] = '4.x'; +?> + +
+ + ['class' => 'container-fluid']]); + + echo TabsX::widget([ + 'bordered' => true, + 'items' => [ + [ + 'label' => ' 物流信息', + 'content' => $this->render('logistics', [ + 'order' => $order, + 'delivery' => $delivery, + 'form' => $form, + ]), + ], + [ + 'label' => ' 订单商品信息', + 'content' => $this->render('delivery_goods', [ + 'form' => $form, + 'deliveryGoods' => $deliveryGoods, + ]), + ], + ], + 'position' => TabsX::POS_ABOVE, + 'encodeLabels' => false + ]); + ?> + + +
+ 'btn btn-success']) ?> + 'btn btn-info']) ?> +
+ + + +
diff --git a/backend/modules/shop/views/order/delivery_goods.php b/backend/modules/shop/views/order/delivery_goods.php new file mode 100644 index 0000000..ff240cd --- /dev/null +++ b/backend/modules/shop/views/order/delivery_goods.php @@ -0,0 +1,130 @@ + + + + +
+
+
未发货商品
+ + + + + + + +
商品名称商品sku还需发货数量发货数量
+
+
+
已发货商品
+
+ +
+ + + + diff --git a/backend/modules/shop/views/order/logistics.php b/backend/modules/shop/views/order/logistics.php new file mode 100644 index 0000000..02e56b8 --- /dev/null +++ b/backend/modules/shop/views/order/logistics.php @@ -0,0 +1,11 @@ +
+ field($delivery, 'shipping_name')->textInput(['maxlength' => true]) ?> + + field($delivery, 'shipping_id')->textInput(['maxlength' => true]) ?> + + field($delivery, 'type')->textInput() ?> + + field($delivery, 'status')->textInput() ?> + + field($delivery, 'decription')->textarea(['rows' => 6]) ?> +
diff --git a/backend/modules/shop/views/order/shipping_info.php b/backend/modules/shop/views/order/shipping_info.php index a65e22c..5349d92 100644 --- a/backend/modules/shop/views/order/shipping_info.php +++ b/backend/modules/shop/views/order/shipping_info.php @@ -1,3 +1,6 @@ +