!255 商品列表统计

Merge pull request !255 from 杨建炊/fix-release-1.0.0/yjc-migrate
This commit is contained in:
杨建炊 2024-11-21 08:15:34 +00:00 committed by Gitee
commit b6855614d3
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
38 changed files with 589 additions and 623 deletions

View File

@ -50,6 +50,89 @@ class GoodsSkusController extends Controller
} }
public function index(Request $request) public function index(Request $request)
{
$ids = [];
$externals = $this->buildExternals($ids);
$builder = GoodsSku::query();
$this->preparQueryGoodsSkus($request, $builder);
$day = DateTimeUtils::getToday();
$sortField = $request->input('sort_field', 'id');//stock sale_stock order_goods_num
$sortValue = $request->input('sort_value', 'desc');
$goodsSkusBuilder = (clone $builder)->filter()->with(['goods' => function ($query) {
$query->with(['type' => function ($query) {
$query->with("parentType:id,name")->select(["id", "name", "parent_id"]);
}]);
}])
->with(['daily' => function ($query) use ($day) {
$query->where('day', $day);
}])
->where('is_combination', 0);
$sum = null;
if ($request->get('goods_title')) {
$fields = implode(',', [
'SUM(stock) as stock',
"GROUP_CONCAT(id) as ids"
]);
$sum = (clone $goodsSkusBuilder)->select(DB::raw($fields))->first();
$sum['goods_number'] = 0;
if (!empty($sum['ids'])) {
foreach (explode(",", $sum['ids']) as $item) {
$sum['goods_number'] += $ids[$item] ?? 0;
}
}
$sum['real_stock'] = ($sum['stock'] ?? 0) + $sum['goods_number'];
}
if ($sortField == "order_goods_num") {
$finalIds = [];
asort($ids);
foreach ($ids as $id => $number) {
$finalIds[] = $id;
}
if (empty($finalIds)) {
$goodsSkusBuilder->orderBy("id", $sortValue);
} else {
$idField = implode(',', $finalIds);
$goodsSkusBuilder->orderByRaw("FIELD(id,{$idField}) {$sortValue}");
}
} else {
$goodsSkusBuilder->orderBy($sortField, $sortValue);
}
$goodsSkus = $goodsSkusBuilder->paginate($request->get('per_page'));
$rolesName = $request->user()->getRoleNames()->toArray();
foreach ($goodsSkus as &$sku) {
$lastInventoryTime = !empty($sku['daily']['inventory_time']) ? $sku['daily']['inventory_time'] : date('Y-m-d 07:00:00');
if (isset($externals[$sku['id']])) {
$sku['order_detail'] = $externals[$sku['id']];
$sku['order_goods_num'] = $ids[$sku['id']] ?? 0;
} else {
$sku['order_detail'] = [];
$sku['order_goods_num'] = 0;
}
$sku['order_goods_num'] -= $sku['daily']['reissue_num'] ?? 0;
$sku['inventory_time'] = $lastInventoryTime;
if ('销售' === $rolesName[0]) {
$sku['cost'] = 0;
}
if (!empty($sku['yesterday_num'])) {
$sku['sale_ratio'] = round($sku['stock'] / $sku['yesterday_num'], 2) * 100;
} else {
$sku['sale_ratio'] = 0;
}
$sku['yesterday_num'] = bcadd($sku['stock'], $sku['order_goods_num']);
}
$data = [
"manage" => ["is_admin" => in_array($rolesName[0], ["运营", "超级管理员", "管理员", "系统管理员", "店铺运营"]) ? 1 : 0],
"sum" => $sum
];
return GoodsSkuResource::collection($goodsSkus)->additional($data);
}
private function buildExternals($ids)
{ {
$fields = implode(',', [ $fields = implode(',', [
'shop_id', 'shop_id',
@ -75,7 +158,7 @@ class GoodsSkusController extends Controller
->orderByDesc('number') ->orderByDesc('number')
->get() ->get()
->toArray(); ->toArray();
$ids = $externals = []; $externals = [];
foreach ($businessOrderItems as $businessOrderItem) { foreach ($businessOrderItems as $businessOrderItem) {
if (is_null($businessOrderItem['goods_sku'])) { if (is_null($businessOrderItem['goods_sku'])) {
continue; continue;
@ -85,6 +168,7 @@ class GoodsSkusController extends Controller
foreach ($businessOrderItem['goods_sku']['combination_goods'] ?? [] as $combinationGoods) { foreach ($businessOrderItem['goods_sku']['combination_goods'] ?? [] as $combinationGoods) {
$ids[$combinationGoods['item_id']] = ($ids[$combinationGoods['item_id']] ?? 0) $ids[$combinationGoods['item_id']] = ($ids[$combinationGoods['item_id']] ?? 0)
+ ((int)$businessOrderItem['number']) * $combinationGoods['item_num']; + ((int)$businessOrderItem['number']) * $combinationGoods['item_num'];
$businessOrderItem['goods_number'] = ((int)$businessOrderItem['number']) * $combinationGoods['item_num'];
$externals[$combinationGoods['item_id']][] = $businessOrderItem; $externals[$combinationGoods['item_id']][] = $businessOrderItem;
} }
} }
@ -96,67 +180,9 @@ class GoodsSkusController extends Controller
$externals[$id][] = $businessOrderItem; $externals[$id][] = $businessOrderItem;
} }
return $externals;
$builder = GoodsSku::query();
$this->preparQueryGoodsSkus($request, $builder);
$day = DateTimeUtils::getToday();
$sortField = $request->input('sort_field', 'id');//stock sale_stock order_goods_num
$sortValue = $request->input('sort_value', 'desc');
$goodsSkusBuilder = (clone $builder)->filter()->with(['goods' => function ($query) {
$query->with(['type' => function ($query) {
$query->with("parentType:id,name")->select(["id", "name", "parent_id"]);
}]);
}])
->with(['daily' => function ($query) use ($day) {
$query->where('day', $day);
}])
->where('is_combination', 0);
if ($sortField == "order_goods_num") {
$finalIds = [];
asort($ids);
foreach ($ids as $id => $number) {
$finalIds[] = $id;
}
if (empty($finalIds)) {
$goodsSkusBuilder->orderBy("id", $sortValue);
} else {
$idField = implode(',', $finalIds);
$goodsSkusBuilder->orderByRaw("FIELD(id,{$idField}) {$sortValue}");
} }
} else {
$goodsSkusBuilder->orderBy($sortField, $sortValue);
}
$goodsSkus = $goodsSkusBuilder->paginate($request->get('per_page'));
$rolesName = $request->user()->getRoleNames()->toArray();
foreach ($goodsSkus as &$sku) {
$lastInventoryTime = !empty($sku['daily']['inventory_time']) ? $sku['daily']['inventory_time'] : date('Y-m-d 07:00:00');
if (isset($externals[$sku['id']])) {
$sku['order_detail'] = $externals[$sku['id']];
$sku['order_goods_num'] = $ids[$sku['id']];
} else {
$sku['order_detail'] = [];
$sku['order_goods_num'] = 0;
}
$sku['order_goods_num'] -= $sku['daily']['reissue_num'] ?? 0;
$sku['inventory_time'] = $lastInventoryTime;
if ('销售' === $rolesName[0]) {
$sku['cost'] = 0;
}
if (!empty($sku['yesterday_num'])) {
$sku['sale_ratio'] = round($sku['stock'] / $sku['yesterday_num'], 2) * 100;
} else {
$sku['sale_ratio'] = 0;
}
$sku['yesterday_num'] = bcadd($sku['stock'], $sku['order_goods_num']);
}
$data = ["manage" => ["is_admin" => in_array($rolesName[0], ["运营", "超级管理员", "管理员", "系统管理员", "店铺运营"]) ? 1 : 0]];
return GoodsSkuResource::collection($goodsSkus)->additional($data);
}
private function preparQueryGoodsSkus(Request $request, &$builder) private function preparQueryGoodsSkus(Request $request, &$builder)
{ {

View File

@ -77,7 +77,7 @@ class PurchaseImport implements ToArray, SkipsEmptyRows
if (!empty($row[7])) { if (!empty($row[7])) {
$purchaseRecords->arrived_time = DateTimeUtils::excelUploadDateToString($row[7], $today,"Y-m-d H:i:s"); $purchaseRecords->arrived_time = DateTimeUtils::excelUploadDateToString($row[7], $today,"Y-m-d H:i:s");
}else{ }else{
$purchaseRecords->arrived_time = $today; $purchaseRecords->arrived_time = Carbon::now()->toDateTimeString();
} }
$purchaseRecords->buyer_user_id = $buyerUserIdKeyByNameMap[$row[4]] ?? 0; $purchaseRecords->buyer_user_id = $buyerUserIdKeyByNameMap[$row[4]] ?? 0;
$purchaseRecords->buyer_name = $row[4] ?? ''; $purchaseRecords->buyer_name = $row[4] ?? '';

View File

@ -69,7 +69,7 @@ class BusinessOrder extends Model
public function getShippingStatusAttribute($value) public function getShippingStatusAttribute($value)
{ {
$map = ['未发货', '已发货', '部分发货', '' => '']; $map = ['未发货', '已发货', '部分发货',"已收货", '' => ''];
return $map[$value]; return $map[$value];
} }

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-a256b434]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-a256b434]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.bgBox[data-v-a256b434]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-a256b434]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-a256b434]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-3852f03c]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-3852f03c]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.bgBox[data-v-3852f03c]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-3852f03c]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-3852f03c]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-03f5ca86]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-03f5ca86]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-03f5ca86]{margin-bottom:15px}.bgBox[data-v-03f5ca86]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 1px 0}.bgBox .close[data-v-03f5ca86]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-03f5ca86]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-475fb543]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-475fb543]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-475fb543]{margin-bottom:15px}.bgBox[data-v-475fb543]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 1px 0}.bgBox .close[data-v-475fb543]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-475fb543]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

1
public/dist/css/298.d943cf60.css vendored Normal file
View File

@ -0,0 +1 @@
.skuBox[data-v-4de310da]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-4de310da]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.skuBox[data-v-3dbf163e]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-3dbf163e]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.table[data-v-97b6b362]{margin-top:20px;position:relative}.btn[data-v-97b6b362]{float:right}.flex[data-v-97b6b362]{display:flex;align-items:center}.goodBox .Img[data-v-97b6b362]{width:50px;height:50px;margin-right:12px;border-radius:4px}.goodBox .tit[data-v-97b6b362]{color:#000;font-size:13px}.confirmbtn[data-v-97b6b362]{width:114px;height:44px;border-radius:3px;margin-top:21px;margin-bottom:8px}.import-right[data-v-97b6b362]{margin-top:30px}.import-right a[data-v-97b6b362]{color:#409eff}[data-v-97b6b362] .btn11{padding:0;width:14px;height:14px}[data-v-97b6b362] .btn11 img{width:100%;height:100%}.page[data-v-97b6b362]{margin-top:20px}.searchBox[data-v-97b6b362]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-97b6b362]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.titBox[data-v-97b6b362]{display:flex;align-items:center}.red[data-v-97b6b362]{color:red}

View File

@ -1 +0,0 @@
.skuBox[data-v-4de310da]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-4de310da]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.skuBox[data-v-3dbf163e]{border:1px solid #e5e5e5;border-radius:5px;padding:15px 0;margin-bottom:15px;background-color:#f3f3f3}.skuBox .tit[data-v-3dbf163e]{padding-left:40px;font-weight:600;font-size:15px;margin-bottom:15px}.table[data-v-5670c00d]{margin-top:20px;position:relative}.btn[data-v-5670c00d]{float:right}.flex[data-v-5670c00d]{display:flex;align-items:center}.goodBox .Img[data-v-5670c00d]{width:50px;height:50px;margin-right:12px;border-radius:4px}.goodBox .tit[data-v-5670c00d]{color:#000;font-size:13px}.confirmbtn[data-v-5670c00d]{width:114px;height:44px;border-radius:3px;margin-top:21px;margin-bottom:8px}.import-right[data-v-5670c00d]{margin-top:30px}.import-right a[data-v-5670c00d]{color:#409eff}[data-v-5670c00d] .btn11{padding:0;width:14px;height:14px}[data-v-5670c00d] .btn11 img{width:100%;height:100%}.page[data-v-5670c00d]{margin-top:20px}.searchBox[data-v-5670c00d]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-5670c00d]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.titBox[data-v-5670c00d]{display:flex;align-items:center}.red[data-v-5670c00d]{color:red}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.block[data-v-6141beb2]{margin-top:20px} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-44368138]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-44368138]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-44368138]{margin-bottom:15px}.bgBox[data-v-44368138]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-44368138]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-44368138]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-91e72f98]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-91e72f98]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.opaBox[data-v-91e72f98]{margin-bottom:15px}.bgBox[data-v-91e72f98]{position:relative;border-radius:5px;background-color:#f5f2f2;margin-bottom:15px;padding:15px 30px 15px 0}.bgBox .close[data-v-91e72f98]{color:red;position:absolute;right:5px;top:5px;font-size:20px;cursor:pointer}.btn[data-v-91e72f98]{display:flex;align-items:center;font-size:14px;color:#409eff;cursor:pointer;width:-moz-fit-content;width:fit-content}

View File

@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>erp</title><script defer="defer" src="js/chunk-vendors.04652b46.js"></script><script defer="defer" src="js/app.eb0ff1e5.js"></script><link href="css/chunk-vendors.77489a8d.css" rel="stylesheet"><link href="css/app.7e37f273.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but erp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>erp</title><script defer="defer" src="js/chunk-vendors.04652b46.js"></script><script defer="defer" src="js/app.304aa352.js"></script><link href="css/chunk-vendors.77489a8d.css" rel="stylesheet"><link href="css/app.7e37f273.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but erp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

2
public/dist/js/134.57e92ad2.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/134.57e92ad2.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/24.1eaace62.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/24.1eaace62.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/298.143f4f4b.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/298.143f4f4b.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/808.eabeec45.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/808.eabeec45.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/839.aa0c84c2.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/839.aa0c84c2.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/app.304aa352.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -64,8 +64,11 @@
<el-card> <el-card>
<div> <div>
<!-- 表格头部操作 --> <!-- 表格头部操作 -->
<div> <div style="display: flex;align-items: center;justify-content: space-between;">
<span>全部商品({{ total }})</span> <div style="display: flex;flex-wrap: wrap;">
<span style="margin-right: 20px;">全部商品({{ total }})</span>
<div v-if="sum" style="color: #f00;">销量{{ sum.goods_number }}实际库存{{ sum.real_stock }}剩余库存{{ sum.stock }}</div>
</div>
<div class="btn"> <div class="btn">
<el-button @click="resetOrderCount" icon="el-icon-refresh">订单重置</el-button> <el-button @click="resetOrderCount" icon="el-icon-refresh">订单重置</el-button>
<el-button type="primary" @click="petchEditStock" icon="el-icon-edit" :disabled="!chooseList.length">批量更新在售库存</el-button> <el-button type="primary" @click="petchEditStock" icon="el-icon-edit" :disabled="!chooseList.length">批量更新在售库存</el-button>
@ -120,7 +123,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="yesterday_num" label="实际库存" align="center"></el-table-column> <el-table-column prop="yesterday_num" label="实际库存" align="center"></el-table-column>
<el-table-column prop="sale_stock" label="可售库存" sortable="custom"> <el-table-column prop="sale_stock" label="可售库存" sortable="custom" width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="titBox" v-if="scope.row.edit"> <div class="titBox" v-if="scope.row.edit">
<el-input v-model="scope.row.sale_stock" placeholder="可售库存" size="mini" style="width: 100%;"></el-input> <el-input v-model="scope.row.sale_stock" placeholder="可售库存" size="mini" style="width: 100%;"></el-input>
@ -408,6 +411,7 @@
filterTime: [], filterTime: [],
sort_field: '', sort_field: '',
sort_value: '', sort_value: '',
sum: null
} }
}, },
methods: { methods: {
@ -456,6 +460,7 @@
sku_code: this.shopsData sku_code: this.shopsData
} }
this.is_admin = res.data.manage && res.data.manage.is_admin this.is_admin = res.data.manage && res.data.manage.is_admin
this.sum = params.goods_title ? res.data.sum : null
this.loading = false this.loading = false
}).catch(() => { }).catch(() => {
this.loading = false this.loading = false

View File

@ -1,16 +1,16 @@
<template> <template>
<div class="conent"> <div class="conent">
<el-card> <el-card>
<el-form ref="form" :inline="true" :model="form"> <el-form ref="form" :inline="true" label-width="90px">
<el-form-item label="所属店铺:"> <el-form-item label="所属店铺:">
<el-select v-model="form.shop_id" placeholder="店铺" @change="handleChoose()"> <el-select v-model="filter.shop_id" placeholder="店铺" @change="handleChoose()">
<el-option v-for="item in shops" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in shopsList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="发货状态:"> <el-form-item label="发货状态:">
<el-select v-model="form.shipping_status" placeholder="发货状态" @change="handleChoose()"> <el-select v-model="filter.shipping_status" placeholder="发货状态" @change="handleChoose()">
<el-option value="" label="全部"></el-option> <el-option value="" label="全部"></el-option>
<el-option value="0" label="未发货"></el-option> <el-option value="0" label="未发货"></el-option>
<el-option value="2" label="部分发货"></el-option> <el-option value="2" label="部分发货"></el-option>
@ -19,48 +19,40 @@
</el-form-item> </el-form-item>
<el-form-item label="订单类型:"> <el-form-item label="订单类型:">
<el-select v-model="form.is_supplier" placeholder="订单类型" @change="handleChoose()"> <el-select v-model="filter.is_supplier" placeholder="订单类型" @change="handleChoose()">
<el-option value="" label="全部订单"></el-option> <el-option value="" label="全部订单"></el-option>
<el-option value="1" label="自卖团订单"></el-option> <el-option :value="1" label="自卖团订单"></el-option>
<el-option value="0" label="帮卖团订单"></el-option> <el-option :value="0" label="帮卖团订单"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="订单状态:"> <el-form-item label="订单状态:">
<el-select v-model="form.cancel_status" placeholder="订单状态" @change="handleChoose()"> <el-select v-model="filter.cancel_status" placeholder="订单状态" @change="handleChoose()">
<el-option value="" label="全部"></el-option> <el-option value="" label="全部"></el-option>
<el-option value="0" label="未取消"></el-option> <el-option :value="0" label="未取消"></el-option>
<el-option value="1" label="已取消"></el-option> <el-option :value="1" label="已取消"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="售后状态:"> <el-form-item label="售后状态:">
<el-select v-model="form.after_sales_status" placeholder="售后状态" @change="handleChoose()"> <el-select v-model="filter.after_sales_status" placeholder="售后状态" @change="handleChoose()">
<el-option value="" label="全部"></el-option> <el-option value="" label="全部"></el-option>
<el-option value="0" label="未售后"></el-option> <el-option :value="0" label="未售后"></el-option>
<el-option value="1" label="有售后"></el-option> <el-option :value="1" label="有售后"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="商品数量:"> <el-form-item label="商品数量:">
<el-select v-model="form.goods_sku_num" placeholder="商品数量" @change="handleChoose()"> <el-select v-model="filter.goods_sku_num" placeholder="商品数量" @change="handleChoose()">
<el-option value="" label="全部"></el-option> <el-option value="" label="全部"></el-option>
<el-option value="1" label="1个商品"></el-option> <el-option :value="1" label="1个商品"></el-option>
<el-option value="2" label="2-5个商品"></el-option> <el-option :value="2" label="2-5个商品"></el-option>
<el-option value="6" label="6个以上商品"></el-option> <el-option :value="6" label="6个以上商品"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="打印状态:">
<el-select v-model="form.print_status" placeholder="打印状态">
<el-option value="" label="全部"></el-option>
<el-option value="0" label="未打印"></el-option>
<el-option value="1" label="已打印"></el-option>
</el-select>
</el-form-item> -->
<el-form-item label="订单商品:"> <el-form-item label="订单商品:">
<el-select v-model="form.external_sku_ids" multiple filterable remote reserve-keyword placeholder="订单商品" <el-select v-model="filter.external_sku_ids" multiple filterable remote reserve-keyword placeholder="订单商品"
:remote-method="remoteMethod" :loading="searchLoading"> :remote-method="remoteMethod" :loading="searchLoading">
<el-option v-for="item in options" :key="item.external_sku_id" :label="item.title" <el-option v-for="item in options" :key="item.external_sku_id" :label="item.title"
:value="item.external_sku_id"> :value="item.external_sku_id">
@ -75,31 +67,24 @@
</el-form-item> </el-form-item>
<el-form-item label="跟团号:"> <el-form-item label="跟团号:">
<el-input v-model="form.pno" placeholder="跟团号" @keyup.enter.native="handleChoose"> <el-input v-model="filter.pno" placeholder="跟团号" @keyup.enter.native="handleChoose"></el-input>
</el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleChoose">筛选</el-button> <el-button type="primary" @click="handleChoose">筛选</el-button>
<el-button plain @click="handleReChoose">重置筛选</el-button> <el-button plain @click="handleReChoose">重置筛选</el-button>
<el-button type="primary" @click="print">打印</el-button> <el-button type="primary" @click="print">打印</el-button>
<el-button v-if="form.goods_sku_num === 2" type="primary">配货单导出</el-button> <!-- <el-button v-if="form.goods_sku_num === 2" type="primary">配货单导出</el-button> -->
<el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button> <el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<el-card style="margin-top: 10px"> <el-card style="margin-top: 10px">
<el-table v-loading="loading" ref="multipleTable" :data="tableData" style="width: 100%" border <el-table v-loading="loading" ref="multipleTable" :data="orderList" style="width: 100%" border
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"> <el-table-column type="selection" width="55" align="center" />
</el-table-column> <el-table-column label="店铺名称" prop="shop.name" />
<el-table-column label="店铺名称">
<template slot-scope="scope">
{{ scope.row.shop.name }}
</template>
</el-table-column>
<el-table-column label="跟团号" align="center"> <el-table-column label="跟团号" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.is_supplier ? '自卖团: ' : '帮卖团: ' }} {{ scope.row.is_supplier ? '自卖团: ' : '帮卖团: ' }}
@ -127,14 +112,17 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="confirm_at" label="下单时间" width="150" align="center"></el-table-column> <el-table-column prop="confirm_at" label="下单时间" width="150" align="center"></el-table-column>
<!-- <el-table-column prop="print_status" label="打印次数"></el-table-column> -->
</el-table> </el-table>
<!-- 分页功能 --> <div class="page-pagination">
<div class="block"> <el-pagination
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" @size-change="handleSizeChange"
:current-page="current_page" :page-sizes="[15, 50, 100]" :page-size="per_page" @current-change="handleCurrentChange"
layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total"> :current-page="page"
:page-sizes="[10, 50, 100]"
:page-size="per_page"
layout="prev, pager, next, sizes, jumper, total"
:total="total">
</el-pagination> </el-pagination>
</div> </div>
</el-card> </el-card>
@ -145,51 +133,29 @@
import { platOrderList, printOrders, printSuccess, exportOrder } from "@/api/plat"; import { platOrderList, printOrders, printSuccess, exportOrder } from "@/api/plat";
import { storeList } from "@/api/shop" import { storeList } from "@/api/shop"
import { goodsSkusList } from "@/api/goods" import { goodsSkusList } from "@/api/goods"
import dayjs from 'dayjs'
export default { export default {
data() { data() {
return { return {
form: { filter: {
shop_id: "", shop_id: '',
// activity_no: "", shipping_status: '',
shipping_status: "", is_supplier: '',
// is_supplier: "", cancel_status: 0,
cancel_status: "0", after_sales_status: 0,
after_sales_status: "0", goods_sku_num: '',
// supply_participate_no: "", external_sku_ids: '',
// participate_no: "", pno: ''
goods_sku_num: "",
// print_status: "0",
external_sku_ids: [],
ids: [],
pno: '',
}, },
dialogVisible: false, loading: false,
loading: true,
searchLoading: false, searchLoading: false,
options: [], options: [],
tableData: [], orderList: [],
Paginationdata: {}, // total: 0,
current_page: 1, // page: 1, //
per_page: 10, // per_page: 10, //
shops: [], shopsList: [],
groupActivity: [],
exportForm: {
shop_id: "",
start_no: "",
end_no: "",
is_supplier: 1,
},
exportFormRules: {
shop_id: [
{ required: true, trigger: 'blur' }
],
start_no: [
{ required: true, trigger: 'blur' }
],
end_no: [
{ required: true, trigger: 'blur' }
],
},
confirmAt: [], confirmAt: [],
print_order_ids: '', print_order_ids: '',
print_documents: [], print_documents: [],
@ -203,101 +169,68 @@ export default {
taskIDArray: [], taskIDArray: [],
requestIDGetGlobalConfig: '', requestIDGetGlobalConfig: '',
exportLoading: false exportLoading: false
}; }
}, },
created() { created() {
this.initConfirmAt(); let start = dayjs().format('YYYY-MM-DD') + ' 00:00:00'
this.handleChoose(); let end = dayjs().format('YYYY-MM-DD') + ' 23:59:59'
// this.initWebSocket(); this.confirmAt = [start, end]
}, this.getOrderList()
mounted() { this.getShopsList()
//
this.getShopsList();
},
beforeDestroy() {
//
},
destroyed() {
}, },
methods: { methods: {
initConfirmAt() { getOrderList() {
const nowTimeDate = new Date(); this.loading = true
nowTimeDate.setHours(0, 0, 0, 0);
let start = nowTimeDate.toLocaleString('zh', { hour12: false }).replaceAll('/', '-');
nowTimeDate.setHours(23, 59, 59, 999);
let end = nowTimeDate.toLocaleString('zh', { hour12: false }).replaceAll('/', '-');
this.confirmAt = [start, end]
},
//
getPlatOrderList(params = {}) {
params.page = this.current_page;
params.per_page = this.per_page;
platOrderList(params).then((res) => {
this.tableData = res.data.data;
this.Paginationdata = res.data.meta;
});
},
getShopsList() {
let page = {
page: 0,
per_page: 99,
};
storeList(page).then((res) => {
this.shops = res.data.data;
});
this.loading = false;
},
//
handleSizeChange(val) {
//
this.current_page = 1;
this.per_page = val;
this.getPlatOrderList();
},
handleCurrentChange(val) {
//
this.current_page = val;
this.getPlatOrderList();
},
//
handleChoose() {
let params = { let params = {
...this.form, ...this.filter,
page: 1, page: this.page,
per_page: this.per_page, per_page: this.per_page,
confirm_at_start: this.confirmAt ? this.confirmAt[0] : '', confirm_at_start: this.confirmAt ? this.confirmAt[0] : '',
confirm_at_end: this.confirmAt ? this.confirmAt[1] : '' confirm_at_end: this.confirmAt ? this.confirmAt[1] : ''
};
this.getPlatOrderList(params)
},
//
handleReChoose() {
this.form = {
shop_id: "",
// activity_no: "",
shipping_status: "",
// is_supplier: "",
cancel_status: "0",
after_sales_status: "0",
// supply_participate_no: "",
// participate_no: "",
goods_sku_num: '',
// print_status: 0,
external_sku_ids: [],
ids: [],
pno: ''
};
this.getPlatOrderList();
},
derivation(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
window.open("/plat_orders/export?shop_id=" + this.exportForm.shop_id + '&start_no=' + this.exportForm.start_no + '&end_no=' + this.exportForm.end_no + '&is_supplier=' + this.exportForm.is_supplier);
} else {
return false;
} }
}); platOrderList(params).then((res) => {
this.orderList = res.data.data
this.total = res.data.meta.total
this.loading = false
}).catch(() => {
this.loading = false
})
},
getShopsList() {
let params = {
page: 0,
per_page: 99
}
storeList(params).then((res) => {
this.shopsList = res.data.data
})
},
handleSizeChange(val) {
this.page = 1
this.per_page = val
this.getOrderList()
},
handleCurrentChange(val) {
this.page = val
this.getOrderList()
},
handleChoose() {
this.page = 1
this.getOrderList()
},
handleReChoose() {
this.filter = {
shop_id: '',
shipping_status: '',
is_supplier: '',
cancel_status: 0,
after_sales_status: 0,
goods_sku_num: '',
external_sku_ids: '',
pno: ''
}
this.page = 1
this.getOrderList()
}, },
remoteMethod(query) { remoteMethod(query) {
if (query !== '') { if (query !== '') {
@ -321,7 +254,7 @@ export default {
spinner: 'el-icon-loading', spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)' background: 'rgba(0, 0, 0, 0.7)'
}); });
printOrders(this.form).then((res) => { printOrders(this.filter).then((res) => {
this.print_documents = res.data.documents; this.print_documents = res.data.documents;
this.print_order_ids = res.data.order_ids; this.print_order_ids = res.data.order_ids;
print_loading.close(); print_loading.close();
@ -329,11 +262,11 @@ export default {
}) })
}, },
handleSelectionChange(val) { handleSelectionChange(val) {
let ids = []; let ids = []
val.forEach((item) => { val.forEach((item) => {
ids.push(item.id); ids.push(item.id)
}) })
this.form.ids = ids; this.filter.ids = ids
}, },
initWebSocket() { initWebSocket() {
//weosocket //weosocket
@ -549,7 +482,5 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.block {
margin-top: 20px;
}
</style> </style>

View File

@ -102,6 +102,7 @@
import { getDailyStock, batchAddDailyStock } from "@/api/supplyChain" import { getDailyStock, batchAddDailyStock } from "@/api/supplyChain"
import axios from "axios" import axios from "axios"
import { goodsSkusList } from "@/api/goods" import { goodsSkusList } from "@/api/goods"
import dayjs from 'dayjs'
export default { export default {
data() { data() {
@ -240,6 +241,9 @@ export default {
} }
}, },
mounted() { mounted() {
let start = dayjs().subtract(7, 'day').format('YYYY-MM-DD') + ' 00:00:00'
let end = dayjs().format('YYYY-MM-DD hh:mm:ss')
this.addTime = [start, end]
this.fetchList() this.fetchList()
} }
} }

View File

@ -44,7 +44,7 @@
<el-table-column prop="cost" label="采购成本" /> <el-table-column prop="cost" label="采购成本" />
<el-table-column prop="buyer_name" label="采购人名称" /> <el-table-column prop="buyer_name" label="采购人名称" />
<!-- <el-table-column prop="status" label="状态" /> --> <!-- <el-table-column prop="status" label="状态" /> -->
<el-table-column prop="expire_time" label="到货时间" /> <el-table-column prop="arrived_time" label="到货时间" />
<el-table-column prop="supplier_name" label="供应商"> <el-table-column prop="supplier_name" label="供应商">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span> <span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span>

View File

@ -48,7 +48,7 @@
<el-table-column prop="cost" label="采购成本" /> <el-table-column prop="cost" label="采购成本" />
<el-table-column prop="buyer_name" label="采购人名称" /> <el-table-column prop="buyer_name" label="采购人名称" />
<!-- <el-table-column prop="status" label="状态" /> --> <!-- <el-table-column prop="status" label="状态" /> -->
<el-table-column prop="expire_time" label="到货时间" /> <el-table-column prop="arrived_time" label="到货时间" />
<el-table-column prop="supplier_name" label="供应商"> <el-table-column prop="supplier_name" label="供应商">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span> <span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span>