Browse Source

refactor: 发货功能重构

wechat_public_accounts
travis 5 years ago
parent
commit
600bc7154c
  1. 2
      backend/modules/shop/controllers/OrderController.php
  2. 103
      backend/modules/shop/logic/delivery/DeliveryManager.php
  3. 25
      backend/modules/shop/views/delivery/delivery_goods.php
  4. 37
      backend/modules/shop/views/delivery/logistics.php
  5. 43
      backend/modules/shop/views/delivery/view.php
  6. 217
      backend/modules/shop/views/order/delivery_goods.php
  7. 2
      backend/modules/shop/views/order/logistics.php

2
backend/modules/shop/controllers/OrderController.php

@ -176,7 +176,7 @@ class OrderController extends Controller
return $this->render('delivery', [ return $this->render('delivery', [
'order' => $order, 'order' => $order,
'delivery' => $delivery, 'delivery' => $delivery,
'deliveryGoods' => json_encode($deliveryGoods)
'deliveryGoods' => $deliveryGoods
]); ]);
} }

103
backend/modules/shop/logic/delivery/DeliveryManager.php

@ -10,6 +10,7 @@ use backend\modules\shop\models\ars\Order;
use backend\modules\shop\models\ars\OrderGoods; use backend\modules\shop\models\ars\OrderGoods;
use Yii; use Yii;
use yii\db\Exception; use yii\db\Exception;
use yii\helpers\ArrayHelper;
class DeliveryManager class DeliveryManager
{ {
@ -27,35 +28,20 @@ class DeliveryManager
if (empty($data['deliveryGoods'])) { if (empty($data['deliveryGoods'])) {
throw new Exception('缺少发货商品信息'); throw new Exception('缺少发货商品信息');
} }
$deliveryGoods = json_decode($data['deliveryGoods']);
$delivery->load($data); $delivery->load($data);
$delivery->order_id = $order->id; $delivery->order_id = $order->id;
if (!$delivery->save()) { if (!$delivery->save()) {
throw new Exception('保存物流信息失败'); throw new Exception('保存物流信息失败');
} }
$order->status = Order::STATUS_SHIPMENT_ALL;
/*发货商品数据*/ /*发货商品数据*/
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_count = $value->goods_count;
/*如果是部分发货*/
if ($model->goods_count < $value->lack_number) {
$order->status = Order::STATUS_SHIPMENT_PORTION;
}
if (!$model->save()) {
throw new Exception('delivery_goods save false');
}
}
$orderStatus = self::saveDeliveryGoods($data['deliveryGoods'], $delivery->id);
$order->status = $orderStatus;
if (!$order->save()) { if (!$order->save()) {
throw new Exception('order shipping_status update false'); throw new Exception('order shipping_status update false');
} }
if ($order->status == Order::STATUS_SHIPMENT_PORTION|| Delivery::findOne(['!=', 'id', $delivery->id])) {
if ($orderStatus == Order::STATUS_SHIPMENT_PORTION || Delivery::findOne(['!=', 'id', $delivery->id])) {
$delivery->type = Delivery::TYPE_SHIPMENT_PORTION; $delivery->type = Delivery::TYPE_SHIPMENT_PORTION;
} else { } else {
$delivery->type = Delivery::TYPE_SHIPMENT_ALL; $delivery->type = Delivery::TYPE_SHIPMENT_ALL;
@ -72,6 +58,40 @@ class DeliveryManager
} }
} }
/**
* @param $deliveryGoods
* @param $delivery_id
* @return int
* @throws Exception
* 保存发货商品信息
*/
private static function saveDeliveryGoods($deliveryGoods, $delivery_id)
{
$status = Order::STATUS_SHIPMENT_ALL;
foreach ($deliveryGoods as $id => $goodsCount) {
$orderGoods = OrderGoods::findOne($id);
/*如果是发货数量不是全部,订单状态为部分发货*/
$deliveryGoodsCount = DeliveryGoods::find()->where(['order_goods_id' => $id])->sum('goods_count');
if (($deliveryGoodsCount + $goodsCount) < $orderGoods->goods_count) { //如果已发货数量未达到order_goods里的数量
$status = Order::STATUS_SHIPMENT_PORTION;
} elseif (($deliveryGoodsCount + $goodsCount) > $orderGoods->goods_count) {
throw new Exception('操作异常,现发货数量超过之前缺少的发货数量');
}
$model = new DeliveryGoods();
$model->delivery_id = $delivery_id;
$model->order_goods_id = $orderGoods->id;
$model->goods_id = $orderGoods->goods_id;
$model->goods_name = $orderGoods->goods_name;
$model->goods_count = $goodsCount;
if (!$model->save()) {
throw new Exception('delivery_goods save false');
}
}
return $status;
}
/** /**
* @param $order_id * @param $order_id
* @return array * @return array
@ -83,8 +103,8 @@ class DeliveryManager
$delivery = Delivery::find()->select('id')->where(['order_id' => $order_id])->all(); $delivery = Delivery::find()->select('id')->where(['order_id' => $order_id])->all();
/*如果该订单是首次发货*/ /*如果该订单是首次发货*/
if (!$delivery) { if (!$delivery) {
$unShippend = self::firstDelivery($order_id);
return ['unShipped' => $unShippend];
$unShippedGoods = OrderGoods::find()->where(['order_id' => $order_id])->asArray()->all();
return ['unShipped' => $unShippedGoods];
} }
$deliveryIds = []; $deliveryIds = [];
@ -111,29 +131,6 @@ class DeliveryManager
return self::getDeliveryGoodsInfo($filter, $order_id); return self::getDeliveryGoodsInfo($filter, $order_id);
} }
/**
* @param $order_id
* @return array
* 首次发货直接获取orderGoods的内容
*/
private 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,
'goods_count' => $v->goods_count,
'lack_number' => $v->goods_count,
'sku_value' => $v->sku_value,
];
}
return $unShippedGoods;
}
/** /**
* @param $filter * @param $filter
* @param $order_id * @param $order_id
@ -153,19 +150,8 @@ class DeliveryManager
$unShipped[] = $goodsData; $unShipped[] = $goodsData;
} }
} }
$shipped = self::getDeliveryInfo($order_id); //已发货商品信息
return ['shipped' => $shipped, 'unShipped' => $unShipped];
}
/**
* @param $order_id
* @return array
* @throws Exception
* 通过订单id获取发货信息
*/
public static function getDeliveryInfo($order_id)
{
$deliveryInfo = [];
$shipped = [];
$delivery = Delivery::findAll(['order_id' => $order_id]); $delivery = Delivery::findAll(['order_id' => $order_id]);
foreach ($delivery as $k => $value) { foreach ($delivery as $k => $value) {
// $expressTemplate = ExpressTemplate::find() // $expressTemplate = ExpressTemplate::find()
@ -176,9 +162,10 @@ class DeliveryManager
// 'exp_name'=> $expressTemplate ? $expressTemplate->name : '', // 'exp_name'=> $expressTemplate ? $expressTemplate->name : '',
// 'invoice_no'=> $value->invoice_no // 'invoice_no'=> $value->invoice_no
// ]; //物流公司和运单号 // ]; //物流公司和运单号
$deliveryInfo[$k]['goodsInfo'] = self::getDeliverGoodsInfo($value->id); //获取商品信息
$shipped[$k]['goodsInfo'] = self::getDeliverGoodsInfo($value->id); //获取商品信息
} }
return $deliveryInfo;
return ['shipped' => $shipped, 'unShipped' => $unShipped];
} }
/** /**

25
backend/modules/shop/views/delivery/delivery_goods.php

@ -0,0 +1,25 @@
<?php
use yii\widgets\DetailView;
use backend\modules\shop\models\ars\DeliveryGoods;
?>
<?php
$deliveryGoods = DeliveryGoods::findAll(['delivery_id' => $model->id]);
if ($deliveryGoods) {
echo '<table>';
foreach ($deliveryGoods as $value) {
echo
'<tr>' .
'<td>商品名称:</td>' .
'<td>' . $value->goods_name . '</td>' .
'</tr>' .
'<tr>' .
'<td>商品数量:</td>' .
'<td>' . $value->goods_count . '</td>' .
'</tr>';
}
echo '</table>';
}
?>

37
backend/modules/shop/views/delivery/logistics.php

@ -0,0 +1,37 @@
<?php
use yii\widgets\DetailView;
use backend\modules\shop\models\ars\Delivery;
?>
<?=
DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'order_id',
'shipping_name',
'shipping_id',
[
'attribute' => 'type',
'value' => function ($model) {
return Delivery::dropDown('type', $model->type);
}
],
'status',
'decription:ntext',
[
'attribute' => 'created_at',
'value' => function ($model) {
return date('Y-m-d H:i:s', $model->created_at);
}
],
[
'attribute' => 'updated_at',
'value' => function ($model) {
return date('Y-m-d H:i:s', $model->updated_at);
}
],
],
]);
?>

43
backend/modules/shop/views/delivery/view.php

@ -1,7 +1,7 @@
<?php <?php
use yii\helpers\Html; use yii\helpers\Html;
use yii\widgets\DetailView;
use kartik\tabs\TabsX;
/* @var $this yii\web\View */ /* @var $this yii\web\View */
/* @var $model backend\modules\shop\models\ars\Delivery */ /* @var $model backend\modules\shop\models\ars\Delivery */
@ -9,6 +9,7 @@ use yii\widgets\DetailView;
$this->title = $model->id; $this->title = $model->id;
$this->params['breadcrumbs'][] = ['label' => 'Deliveries', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => 'Deliveries', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title; $this->params['breadcrumbs'][] = $this->title;
Yii::$app->params['bsVersion'] = '4.x';
\yii\web\YiiAsset::register($this); \yii\web\YiiAsset::register($this);
?> ?>
<div class="delivery-view"> <div class="delivery-view">
@ -17,34 +18,26 @@ $this->params['breadcrumbs'][] = $this->title;
<?= Html::a('返回列表', ['index'], ['class' => 'btn btn-success']) ?> <?= Html::a('返回列表', ['index'], ['class' => 'btn btn-success']) ?>
</p> </p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'order_id',
'shipping_name',
'shipping_id',
<?php
echo TabsX::widget([
'bordered' => true,
'items' => [
[ [
'attribute' => 'type',
'value' => function ($model) {
return \backend\modules\shop\models\ars\Delivery::dropDown('type', $model->type);
}
'label' => '<i class="fas fa-user"></i> 物流信息',
'content' => $this->render('logistics', [
'model' => $model,
]),
], ],
'status',
'decription:ntext',
[ [
'attribute' => 'created_at',
'value' => function ($model) {
return date('Y-m-d H:i:s', $model->created_at);
}
],
[
'attribute' => 'updated_at',
'value' => function ($model) {
return date('Y-m-d H:i:s', $model->updated_at);
}
'label' => '<i class="fas fa-shopping-cart "></i> 发货商品信息',
'content' => $this->render('delivery_goods', [
'model' => $model,
]),
], ],
], ],
]) ?>
'position' => TabsX::POS_ABOVE,
'encodeLabels' => false
]);
?>
</div> </div>

217
backend/modules/shop/views/order/delivery_goods.php

@ -18,6 +18,9 @@
border-radius: 10px; border-radius: 10px;
box-shadow:0 4px 30px 2px rgba(223, 225, 230, 0.5) !important; box-shadow:0 4px 30px 2px rgba(223, 225, 230, 0.5) !important;
} }
input {
width: 50%;
}
</style> </style>
<div> <div>
@ -25,118 +28,132 @@
<h5>未发货商品</h5> <h5>未发货商品</h5>
<table class="table unShipped-table"> <table class="table unShipped-table">
<tr> <tr>
<th>商品ID</th>
<th>商品名称</th> <th>商品名称</th>
<th>商品sku</th> <th>商品sku</th>
<th>还需发货数量</th> <th>还需发货数量</th>
<th>发货数量</th> <th>发货数量</th>
</tr> </tr>
<?php
foreach ($deliveryGoods['unShipped'] as $value) {
$lackNumber = isset($value['lack_number']) ? $value['lack_number'] : $value['goods_count'];
echo '<tr>' .
'<td>' . $value['goods_id'] . '</td>' .
'<td>' . $value['goods_name'] . '</td>' .
'<td>' . $value['sku_value'] . '</td>' .
'<td>' . $lackNumber . '</td>' .
"<td><input type='number' name='deliveryGoods[{$value['id']}]' max='{$lackNumber}' min='0' value={$lackNumber} /></td>" .
'</tr>';
}
?>
</table> </table>
</div> </div>
<div class="box shipped-box"> <div class="box shipped-box">
<h5>已发货商品</h5> <h5>已发货商品</h5>
</div> </div>
<input type="hidden" id="deliveryGoods" name="deliveryGoods"><!-- 用于保存商品json -->
</div> </div>
<?php <?php
$js = <<<SCRIPT
//初始化订单商品数据
var data = $deliveryGoods;
console.log(data);
var unShipped = {};
function init() {
unShipped = data.unShipped;
showUnShipped(unShipped);
if(data.shipped){
var shipped = data.shipped;
showShipped(shipped)
}
unShipped = JSON.stringify(unShipped);
$('#deliveryGoods').val(unShipped)
}
init();
//编辑发货数量
function updateGoods(ref){
ref = $(ref)[0].target;
$(ref).hide();
$(ref).next().show();
$(ref).parent().parent().find('.goods_count').removeAttr('disabled')
}
//保存编辑
function saveGoods(ref) {
if(typeof unShipped =='string'){
unShipped = JSON.parse(unShipped)
}
ref = $(ref)[0].target;
var tr = $(ref).parent().parent();
tr.find('.goods_count').attr('disabled','disabled');
var index = tr.attr('data-index');
var number = tr.find('.goods_count').val();
if (number < 0) {
alert('发货数量不能低于0');
tr.find('.goods_count').val(0);
return false;
}
unShipped[index].goods_count = number;
unShipped = JSON.stringify(unShipped);
$('#deliveryGoods').val(unShipped);
$(ref).hide();
$(ref).prev().show();
}
//显示未发货商品
function showUnShipped(unShipped) {
unShipped.forEach(function (item,index) {
var tr = "<tr data-index='" + index +"'>" +
"<td class='goods_name'>" + item.goods_name + "</td>" +
"<td class='goods_sku'>" + item.sku_value + "</td>" +
"<td class='lack_number'>" + item.lack_number + "</td>" +
"<td><input type='text' class='goods_count' value='"+item.lack_number+"' disabled/></td>" +
"<td>" +
"<input type='button' class='btn btn-primary btn-update' value='编辑'/>" +
"<input type='button' class='btn btn-primary btn-save' value='保存' style='display: none' />" +
"</td>" +
"</tr>";
$('.unShipped-table').append(tr)
});
}
//显示已发货商品
function showShipped(shipped) {
shipped.forEach(function(item,index){
var table = ' <table class="table shipped-table">' +
'<tr>' +
'<th>商品名称</th>' +
'<th>商品sku</th>' +
'<th>发货数量</th>' +
'</tr>' +
'</table>';
// var div = document.createElement('div');
// div.innerText = '运单号:' + item.logisticInfo.invoice_no + '快递公司:'+ item.logisticInfo.exp_name;
// $('.shipped-box').append(div);
$('.shipped-box').append(table);
table = $('.shipped-table').eq(index);
item.goodsInfo.forEach(function (item,index) {
var tr = "<tr data-index='" + index +"'>" +
"<td class='goods_name'>" + item.goods_name + "</td>" +
"<td class='goods_sku'>" + item.sku_value + "</td>" +
"<td class='goods_count'>" + item.delivery_number + "</td>" +
"</tr>";
$(table).append(tr);
});
})
}
var btnUpdate = $('.btn-update');
var btnSave = $('.btn-save');
for (i = 0; i < btnUpdate.length; i++) {
btnUpdate[i].addEventListener("click", updateGoods);
btnSave[i].addEventListener("click", saveGoods);
}
SCRIPT;
$this->registerJs($js);
?>
//$js = <<<SCRIPT
////初始化订单商品数据
/* var data = "<?php echo json_encode($deliveryGoods) ?>";*/
// console.log(data);
// var unShipped = {};
// function init() {
//<!-- unShipped = data.unShipped;-->
//<!-- showUnShipped(unShipped);-->
//<!-- if(data.shipped){-->
//<!-- var shipped = data.shipped;-->
//<!-- showShipped(shipped)-->
//<!-- }-->
// unShipped = JSON.stringify(unShipped);
// $('#deliveryGoods').val(unShipped)
// }
// init();
//
// //编辑发货数量
// function updateGoods(ref){
// ref = $(ref)[0].target;
// $(ref).hide();
// $(ref).next().show();
// $(ref).parent().parent().find('.goods_count').removeAttr('disabled')
// }
//
// //保存编辑
// function saveGoods(ref) {
// if(typeof unShipped =='string'){
// unShipped = JSON.parse(unShipped)
// }
// ref = $(ref)[0].target;
// var tr = $(ref).parent().parent();
// tr.find('.goods_count').attr('disabled', 'disabled');
// var index = tr.attr('data-index');
// var number = tr.find('.goods_count').val();
// if (number < 0) {
// alert('发货数量不能低于0');
// tr.find('.goods_count').val(0);
// return false;
// }
// unShipped[index].goods_count = number;
// unShipped = JSON.stringify(unShipped);
// $('#deliveryGoods').val(unShipped);
// $(ref).hide();
// $(ref).prev().show();
// }
//
// //显示未发货商品
// function showUnShipped(unShipped) {
// unShipped.forEach(function (item,index) {
// var tr = "<tr data-index='" + index +"'>" +
// "<td class='goods_id' name='goodsId[]'>" + item.goods_id + "</td>" +
// "<td class='goods_name'>" + item.goods_name + "</td>" +
// "<td class='goods_sku'>" + item.sku_value + "</td>" +
// "<td class='lack_number'>" + item.lack_number + "</td>" +
// "<td><input type='text' class='goods_count' value='"+item.lack_number+"' name='deliveryGoods' disabled/></td>" +
// "<td>" +
// "<input type='button' class='btn btn-primary btn-update' value='编辑'/>" +
// "<input type='button' class='btn btn-primary btn-save' value='保存' style='display: none' />" +
// "</td>" +
// "</tr>";
// $('.unShipped-table').append(tr)
// });
// }
//
// //显示已发货商品
// function showShipped(shipped) {
// shipped.forEach(function(item,index) {
// var table = ' <table class="table shipped-table">' +
// '<tr>' +
// '<th>商品名称</th>' +
// '<th>商品sku</th>' +
// '<th>发货数量</th>' +
// '</tr>' +
// '</table>';
// // var div = document.createElement('div');
// // div.innerText = '运单号:' + item.logisticInfo.invoice_no + '快递公司:'+ item.logisticInfo.exp_name;
// // $('.shipped-box').append(div);
// $('.shipped-box').append(table);
// table = $('.shipped-table').eq(index);
// item.goodsInfo.forEach(function (item,index) {
// var tr = "<tr data-index='" + index +"'>" +
// "<td class='goods_name'>" + item.goods_name + "</td>" +
// "<td class='goods_sku'>" + item.sku_value + "</td>" +
// "<td class='goods_count'>" + item.delivery_number + "</td>" +
// "</tr>";
// $(table).append(tr);
// });
// })
// }
//
// var btnUpdate = $('.btn-update');
// var btnSave = $('.btn-save');
// for (i = 0; i < btnUpdate.length; i++) {
// btnUpdate[i].addEventListener("click", updateGoods);
// btnSave[i].addEventListener("click", saveGoods);
// }
//SCRIPT;
//$this->registerJs($js);
//?>

2
backend/modules/shop/views/order/logistics.php

@ -3,8 +3,6 @@
<?= $form->field($delivery, 'shipping_id')->textInput(['maxlength' => true]) ?> <?= $form->field($delivery, 'shipping_id')->textInput(['maxlength' => true]) ?>
<?= $form->field($delivery, 'type')->textInput() ?>
<?= $form->field($delivery, 'status')->textInput() ?> <?= $form->field($delivery, 'status')->textInput() ?>
<?= $form->field($delivery, 'decription')->textarea(['rows' => 6]) ?> <?= $form->field($delivery, 'decription')->textarea(['rows' => 6]) ?>

Loading…
Cancel
Save