确认排单
This commit is contained in:
parent
c2e49f5ee1
commit
45e00b1cd2
78
app/Domains/Export/Services/ImportService.php
Normal file
78
app/Domains/Export/Services/ImportService.php
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domains\Export\Services;
|
||||||
|
|
||||||
|
use App\Core\Service;
|
||||||
|
use Illuminate\Http\UploadedFile;
|
||||||
|
use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use App\Exceptions\InvalidArgumentException;
|
||||||
|
|
||||||
|
class ImportService extends Service
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 导出
|
||||||
|
*/
|
||||||
|
public static function load(UploadedFile $file, $columns = null)
|
||||||
|
{
|
||||||
|
if ($columns !== null) {
|
||||||
|
if (!is_array($columns)) {
|
||||||
|
throw new InvalidArgumentException('columns not an array.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$columns = array_map('strtolower', $columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
$array = self::toArray($file);
|
||||||
|
|
||||||
|
$title = [];
|
||||||
|
$data = [];
|
||||||
|
|
||||||
|
foreach ($array as $index => $item) {
|
||||||
|
if (!$index) {
|
||||||
|
$title = $item;
|
||||||
|
} else {
|
||||||
|
$row = [];
|
||||||
|
foreach ($item as $key => $value) {
|
||||||
|
$column = strtolower($title[$key]);
|
||||||
|
if ($columns === null || in_array($column, $columns)) {
|
||||||
|
$row[$column] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
array_push($data, $row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入转为数组
|
||||||
|
*
|
||||||
|
* @param UploadedFile $file
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function toArray(UploadedFile $file)
|
||||||
|
{
|
||||||
|
if (!$file) {
|
||||||
|
throw new InvalidArgumentException('文件不存在');
|
||||||
|
}
|
||||||
|
|
||||||
|
$extension = $file->getClientOriginalExtension();
|
||||||
|
|
||||||
|
Validator::validate(['extension' => $extension], [
|
||||||
|
'extension' => ['in:xls,xlsx,csv'],
|
||||||
|
], ['extension.in' => '文件类型不正确']);
|
||||||
|
|
||||||
|
$type = ucfirst(strtolower($extension));
|
||||||
|
|
||||||
|
$reader = IOFactory::createReader($type);
|
||||||
|
|
||||||
|
$spreadsheet = $reader->load($file->getPathname());
|
||||||
|
|
||||||
|
$sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, false);
|
||||||
|
|
||||||
|
return $sheetData;
|
||||||
|
}
|
||||||
|
}
|
@ -7,8 +7,10 @@ use Illuminate\Http\Request;
|
|||||||
use App\Exceptions\NotExistException;
|
use App\Exceptions\NotExistException;
|
||||||
use App\Exceptions\NotAllowedException;
|
use App\Exceptions\NotAllowedException;
|
||||||
use App\Domains\Virtual\Exports\OrderExport;
|
use App\Domains\Virtual\Exports\OrderExport;
|
||||||
|
use App\Exceptions\InvalidArgumentException;
|
||||||
use App\Domains\Config\Services\ConfigService;
|
use App\Domains\Config\Services\ConfigService;
|
||||||
use App\Domains\Export\Services\ExportService;
|
use App\Domains\Export\Services\ExportService;
|
||||||
|
use App\Domains\Export\Services\ImportService;
|
||||||
use App\Domains\Virtual\Services\OrderService;
|
use App\Domains\Virtual\Services\OrderService;
|
||||||
use App\Domains\Virtual\Services\CommonService;
|
use App\Domains\Virtual\Services\CommonService;
|
||||||
use App\Domains\Virtual\Exports\OrderCardExport;
|
use App\Domains\Virtual\Exports\OrderCardExport;
|
||||||
@ -271,4 +273,50 @@ class OrderController extends Controller
|
|||||||
|
|
||||||
return res($url, '导出成功', 201);
|
return res($url, '导出成功', 201);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排单.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
public function ship()
|
||||||
|
{
|
||||||
|
$type = $this->request->get('type');
|
||||||
|
|
||||||
|
if (!in_array($type, [1, 2])) {
|
||||||
|
throw new InvalidArgumentException('排单方式不正确');
|
||||||
|
}
|
||||||
|
|
||||||
|
$orderId = $this->request->get('order_id');
|
||||||
|
|
||||||
|
$simArray = [];
|
||||||
|
|
||||||
|
if ($type == 1) {
|
||||||
|
$file = $this->request->file('file');
|
||||||
|
$simArray = ImportService::load($file, ['sim']);
|
||||||
|
$simArray = array_pluck($simArray, 'sim');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($type == 2) {
|
||||||
|
$segments = $this->request->get('segments');
|
||||||
|
|
||||||
|
if (!is_array($segments) || empty($segments)) {
|
||||||
|
throw new InvalidArgumentException('参数错误');
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($segments as $segment) {
|
||||||
|
for ($i = intval($segment['start_no']); $i <= intval($segment['end_no']); $i++) {
|
||||||
|
array_push($simArray, $i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$simArray = array_map(function ($item) {
|
||||||
|
return intval(trim(str_replace("\t", '', $item)));
|
||||||
|
}, $simArray);
|
||||||
|
|
||||||
|
$order = $this->orderService->ship($orderId, $simArray);
|
||||||
|
|
||||||
|
return res($order, '排单成功');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,6 +53,7 @@ $router->group(['prefix' => 'virtual', 'as' => 'virtual', 'middleware' => ['admi
|
|||||||
$router->get('/orders/export', ['as' => 'orders.export', 'uses' => 'OrderController@export']);
|
$router->get('/orders/export', ['as' => 'orders.export', 'uses' => 'OrderController@export']);
|
||||||
$router->get('/orders/cards', ['as' => 'orders.cards', 'uses' => 'OrderController@cards']);
|
$router->get('/orders/cards', ['as' => 'orders.cards', 'uses' => 'OrderController@cards']);
|
||||||
$router->get('/orders/cards-export', ['as' => 'orders.cardsExport', 'uses' => 'OrderController@cardsExport']);
|
$router->get('/orders/cards-export', ['as' => 'orders.cardsExport', 'uses' => 'OrderController@cardsExport']);
|
||||||
|
$router->post('/orders/ship', ['as' => 'orders.ship', 'uses' => 'OrderController@ship']);
|
||||||
|
|
||||||
// 客户管理
|
// 客户管理
|
||||||
$router->get('/cards/index', ['as' => 'cards.index', 'uses' => 'CardController@index']);
|
$router->get('/cards/index', ['as' => 'cards.index', 'uses' => 'CardController@index']);
|
||||||
|
@ -3,15 +3,16 @@ namespace App\Domains\Virtual\Services;
|
|||||||
|
|
||||||
use App\Dicts;
|
use App\Dicts;
|
||||||
use App\Core\Service;
|
use App\Core\Service;
|
||||||
|
use App\Models\Card\Card;
|
||||||
use App\Models\Virtual\Order;
|
use App\Models\Virtual\Order;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use App\Exceptions\NotExistException;
|
use App\Exceptions\NotExistException;
|
||||||
use App\Exceptions\NotAllowedException;
|
use App\Exceptions\NotAllowedException;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
use App\Models\Virtual\OrderCardPartition;
|
use App\Domains\Card\Services\CardService;
|
||||||
|
use App\Exceptions\InvalidArgumentException;
|
||||||
use Dipper\Foundation\Exceptions\HttpException;
|
use Dipper\Foundation\Exceptions\HttpException;
|
||||||
use Illuminate\Database\Query\Grammars\Grammar;
|
|
||||||
use App\Domains\Virtual\Services\CompanyService;
|
use App\Domains\Virtual\Services\CompanyService;
|
||||||
use App\Domains\Virtual\Services\PackageService;
|
use App\Domains\Virtual\Services\PackageService;
|
||||||
use App\Domains\Virtual\Repositories\OrderRepository;
|
use App\Domains\Virtual\Repositories\OrderRepository;
|
||||||
@ -20,8 +21,6 @@ use App\Models\Real\OrderCardPartition as RealOrderCardPartition;
|
|||||||
use App\Domains\Virtual\Repositories\OrderCardPartitionRepository;
|
use App\Domains\Virtual\Repositories\OrderCardPartitionRepository;
|
||||||
use App\Domains\Real\Repositories\OrderRepository as RealOrderRepository;
|
use App\Domains\Real\Repositories\OrderRepository as RealOrderRepository;
|
||||||
use App\Domains\Real\Repositories\OrderCardPartitionRepository as RealOrderCardPartitionRepository;
|
use App\Domains\Real\Repositories\OrderCardPartitionRepository as RealOrderCardPartitionRepository;
|
||||||
use App\Exceptions\InvalidArgumentException;
|
|
||||||
use App\Models\Card\Card;
|
|
||||||
|
|
||||||
class OrderService extends Service
|
class OrderService extends Service
|
||||||
{
|
{
|
||||||
@ -249,6 +248,18 @@ class OrderService extends Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($attributes['selected']) {
|
if ($attributes['selected']) {
|
||||||
|
if($attributes['type'] === 0){
|
||||||
|
$exists = $this->orderCardPartitionRepository->withConditions([
|
||||||
|
'type' => 0,
|
||||||
|
'sim' => array_pluck($attributes['selected'], 'sim')
|
||||||
|
])->count();
|
||||||
|
|
||||||
|
if ($exists) {
|
||||||
|
DB::rollBack();
|
||||||
|
throw new NotAllowedException("存在已被其他订单使用的卡");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->upsertOrderCards($attributes['selected'], $node);
|
$this->upsertOrderCards($attributes['selected'], $node);
|
||||||
$this->orderRepository->forgetCached();
|
$this->orderRepository->forgetCached();
|
||||||
@ -279,39 +290,6 @@ class OrderService extends Service
|
|||||||
return $node;
|
return $node;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function upsertOrderCards($array, $node)
|
|
||||||
{
|
|
||||||
$table = $this->tables[$node['type']];
|
|
||||||
|
|
||||||
$data = [];
|
|
||||||
|
|
||||||
foreach ($array as $card) {
|
|
||||||
$data[] = [
|
|
||||||
'sim' => $card['sim'],
|
|
||||||
'counts' => $card['counts'],
|
|
||||||
'type' => $node['type'],
|
|
||||||
'order_id' => $node['id'],
|
|
||||||
'company_id' => $node['company_id'],
|
|
||||||
'package_id' => $node['package_id'],
|
|
||||||
'unit_price' => $node['unit_price'],
|
|
||||||
'created_at' => $node['order_at'],
|
|
||||||
'updated_at' => date('Y-m-d H:i:s'),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($data)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (array_chunk($data, 1000) as $value) {
|
|
||||||
DB::table($table)->upsert($value, ['sim', 'order_id', 'deleted_at']);
|
|
||||||
$simArray = implode(',', array_pluck($value, 'sim'));
|
|
||||||
DB::statement("select fix_timelines('{{$simArray}}'::INT8[]);");
|
|
||||||
RealOrderCardPartition::whereIn('order_id', array_pluck($array, 'order_id'))
|
|
||||||
->whereIn('sim', array_pluck($value, 'sim'))->update(['virtual_order_id' => $node['id']]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 以卡续费/续费包/加油包
|
* 以卡续费/续费包/加油包
|
||||||
*
|
*
|
||||||
@ -683,4 +661,105 @@ class OrderService extends Service
|
|||||||
|
|
||||||
return $cards;
|
return $cards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排单
|
||||||
|
*
|
||||||
|
* @param int $orderId
|
||||||
|
* @param array $simArray
|
||||||
|
* @return Order
|
||||||
|
*/
|
||||||
|
public function ship($orderId, array $simArray)
|
||||||
|
{
|
||||||
|
if (!$order = $this->orderRepository->find($orderId)) {
|
||||||
|
throw new NotExistException('订单不存在或已删除');
|
||||||
|
}
|
||||||
|
|
||||||
|
$orderShipments = $this->orderCardPartitionRepository->select([
|
||||||
|
DB::raw('SUM(counts) as shipments'),
|
||||||
|
DB::raw('SUM(CASE WHEN refunded_at IS NULL THEN 0 ELSE 1 END) as refunds')
|
||||||
|
])->where('type', 0)->where('order_id', $orderId)->groupBy('order_id')->first();
|
||||||
|
|
||||||
|
$shipments = $orderShipments['shipments'] ?? 0;
|
||||||
|
$refunds = $orderShipments['refunds'] ?? 0;
|
||||||
|
|
||||||
|
if ($order->counts - ($shipments - $refunds) <= 0) {
|
||||||
|
throw new NotAllowedException('订单已排满');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($order->counts - ($shipments - $refunds) < count($simArray)) {
|
||||||
|
throw new NotAllowedException('排单卡量大于订单卡量');
|
||||||
|
}
|
||||||
|
|
||||||
|
$exists = $this->orderCardPartitionRepository->select('sim')->withConditions(['type' => 0, 'sim' => $simArray])->get()->pluck('sim')->toArray();
|
||||||
|
|
||||||
|
if (count($exists)) {
|
||||||
|
$exists = implode(',', $exists);
|
||||||
|
throw new NotAllowedException("存在已被其他订单使用的卡: ($exists)");
|
||||||
|
}
|
||||||
|
|
||||||
|
$cards = CardService::getMongoCardsInfo($simArray);
|
||||||
|
|
||||||
|
if (count($simArray) !== count($cards)) {
|
||||||
|
$diff = array_diff($simArray, array_pluck($cards, 'sim'));
|
||||||
|
$diff = implode(',', $diff);
|
||||||
|
throw new NotExistException("存在未入库的卡: ($diff)");
|
||||||
|
}
|
||||||
|
|
||||||
|
$array = array_map(function ($item) {
|
||||||
|
return ['sim' => $item, 'counts' => 1];
|
||||||
|
}, $simArray);
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$order->order_status = ($order->counts - ($shipments - $refunds) === count($simArray)) ? 2 : 0;
|
||||||
|
$order->save();
|
||||||
|
|
||||||
|
$this->upsertOrderCards($array, $order);
|
||||||
|
$this->orderRepository->forgetCached();
|
||||||
|
$this->orderCardPartitionRepository->forgetCached();
|
||||||
|
app(RealOrderCardPartitionRepository::class)->forgetCached();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
DB::rollBack();
|
||||||
|
throw new HttpException('操作失败');
|
||||||
|
}
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
|
||||||
|
return $order;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function upsertOrderCards($array, $node)
|
||||||
|
{
|
||||||
|
$table = $this->tables[$node['type']];
|
||||||
|
|
||||||
|
$data = [];
|
||||||
|
|
||||||
|
foreach ($array as $card) {
|
||||||
|
$data[] = [
|
||||||
|
'sim' => $card['sim'],
|
||||||
|
'counts' => $card['counts'],
|
||||||
|
'type' => $node['type'],
|
||||||
|
'order_id' => $node['id'],
|
||||||
|
'company_id' => $node['company_id'],
|
||||||
|
'package_id' => $node['package_id'],
|
||||||
|
'unit_price' => $node['unit_price'],
|
||||||
|
'created_at' => $node['order_at'],
|
||||||
|
'updated_at' => date('Y-m-d H:i:s'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($data)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (array_chunk($data, 1000) as $value) {
|
||||||
|
DB::table($table)->upsert($value, ['sim', 'order_id', 'deleted_at']);
|
||||||
|
$simArray = implode(',', array_pluck($value, 'sim'));
|
||||||
|
DB::statement("select fix_timelines('{{$simArray}}'::INT8[]);");
|
||||||
|
RealOrderCardPartition::whereIn('order_id', array_pluck($array, 'order_id'))
|
||||||
|
->whereIn('sim', array_pluck($value, 'sim'))->update(['virtual_order_id' => $node['id']]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ INSERT INTO vd.virtual_orders ("type", sn, "source", company_id, package_id, pay
|
|||||||
MIN(unit_price) * SUM(counts) AS total_price,
|
MIN(unit_price) * SUM(counts) AS total_price,
|
||||||
MIN(unit_price) * SUM(counts) AS custom_price,
|
MIN(unit_price) * SUM(counts) AS custom_price,
|
||||||
MIN(created_at) AS order_at,
|
MIN(created_at) AS order_at,
|
||||||
4,
|
5,
|
||||||
1,
|
1,
|
||||||
MIN(created_at) AS created_at,
|
MIN(created_at) AS created_at,
|
||||||
MIN(created_at) AS updated_at
|
MIN(created_at) AS updated_at
|
||||||
|
@ -90,3 +90,26 @@ export function destroy(data) {
|
|||||||
export function reset(data) {
|
export function reset(data) {
|
||||||
return service.post('api/virtual/orders/reset', data);
|
return service.post('api/virtual/orders/reset', data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [ship 排单]
|
||||||
|
* @param {[type]} data [description]
|
||||||
|
* @return {[type]} [description]
|
||||||
|
*/
|
||||||
|
export function ship(data) {
|
||||||
|
let params = new FormData();
|
||||||
|
|
||||||
|
for (const key in data) {
|
||||||
|
if (data.hasOwnProperty(key)) {
|
||||||
|
params.append(key, data[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let config = {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'multipart/form-data'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return service.post('api/virtual/orders/ship', params, config);
|
||||||
|
}
|
||||||
|
@ -186,6 +186,8 @@
|
|||||||
@store-success="handleOrderSuccess(1)"
|
@store-success="handleOrderSuccess(1)"
|
||||||
></ui-cards>
|
></ui-cards>
|
||||||
|
|
||||||
|
<ui-ship :data="shipObj.data" :show.sync="shipObj.show" @update-success="handleOrderSuccess(1)"></ui-ship>
|
||||||
|
|
||||||
<Modal v-model="orderConfirmShow" width="360">
|
<Modal v-model="orderConfirmShow" width="360">
|
||||||
<p slot="header" style="color:#f60;text-align:center">
|
<p slot="header" style="color:#f60;text-align:center">
|
||||||
<Icon type="ios-information-circle"></Icon>
|
<Icon type="ios-information-circle"></Icon>
|
||||||
|
@ -344,7 +344,6 @@ export default {
|
|||||||
this.params.company_name = this.orderObj.company_name;
|
this.params.company_name = this.orderObj.company_name;
|
||||||
this.params.package_name = this.orderObj.package_name;
|
this.params.package_name = this.orderObj.package_name;
|
||||||
}
|
}
|
||||||
window.t = this;
|
|
||||||
this.index();
|
this.index();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,18 +294,18 @@ export default {
|
|||||||
case '支付宝':
|
case '支付宝':
|
||||||
this.params.pay_channel = 'alipay';
|
this.params.pay_channel = 'alipay';
|
||||||
break;
|
break;
|
||||||
// case '余额支付':
|
// case '余额支付':
|
||||||
// this.params.pay_channel = 'account';
|
// this.params.pay_channel = 'account';
|
||||||
// break;
|
// break;
|
||||||
// case '天猫续费':
|
// case '天猫续费':
|
||||||
// this.params.pay_channel = 'tmall';
|
// this.params.pay_channel = 'tmall';
|
||||||
// break;
|
// break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.params.carrier_operator = order.carrier_operator;
|
this.params.carrier_operator = order.carrier_operator;
|
||||||
this.params.unit_price = order.unit_price;
|
this.params.unit_price = Number(order.unit_price);
|
||||||
|
|
||||||
this.params.order_at = order.order_at;
|
this.params.order_at = order.order_at;
|
||||||
this.params.transaction_no = order.transaction_no;
|
this.params.transaction_no = order.transaction_no;
|
||||||
|
@ -5,7 +5,8 @@ export default {
|
|||||||
components: {
|
components: {
|
||||||
UiEdit: resolve => require(['views/virtual/orders/edit'], resolve),
|
UiEdit: resolve => require(['views/virtual/orders/edit'], resolve),
|
||||||
UiDetail: resolve => require(['views/virtual/orders/detail'], resolve),
|
UiDetail: resolve => require(['views/virtual/orders/detail'], resolve),
|
||||||
UiCards: resolve => require(['views/virtual/orders/cards'], resolve)
|
UiCards: resolve => require(['views/virtual/orders/cards'], resolve),
|
||||||
|
UiShip: resolve => require(['views/virtual/orders/ship'], resolve)
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -37,6 +38,10 @@ export default {
|
|||||||
cardsObj: {
|
cardsObj: {
|
||||||
show: false
|
show: false
|
||||||
},
|
},
|
||||||
|
shipObj: {
|
||||||
|
show: false,
|
||||||
|
data: null
|
||||||
|
},
|
||||||
search: {
|
search: {
|
||||||
show: true
|
show: true
|
||||||
},
|
},
|
||||||
@ -586,6 +591,12 @@ export default {
|
|||||||
|
|
||||||
if (this.type === 0) {
|
if (this.type === 0) {
|
||||||
this.table_titles.splice(7, 0, {
|
this.table_titles.splice(7, 0, {
|
||||||
|
title: '排单量',
|
||||||
|
key: 'shipments',
|
||||||
|
width: 80
|
||||||
|
});
|
||||||
|
|
||||||
|
this.table_titles.splice(8, 0, {
|
||||||
title: '退货量',
|
title: '退货量',
|
||||||
key: 'refunds',
|
key: 'refunds',
|
||||||
width: 80
|
width: 80
|
||||||
@ -682,7 +693,7 @@ export default {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* [openCards 打开选卡弹窗]
|
* [openCards 打开选卡弹窗]
|
||||||
* source 0:选创建订单页面打开 1:从选卡按钮打开 2:从排单按钮打开
|
* source 0:选创建订单页面打开 1:从RD按钮打开 2:从排单按钮打开
|
||||||
* @return {[type]} [description]
|
* @return {[type]} [description]
|
||||||
*/
|
*/
|
||||||
openCards(bool, source, orderObj = {}) {
|
openCards(bool, source, orderObj = {}) {
|
||||||
@ -780,27 +791,17 @@ export default {
|
|||||||
// 订单排单
|
// 订单排单
|
||||||
orderShip() {
|
orderShip() {
|
||||||
let row = this.row;
|
let row = this.row;
|
||||||
this.$Modal.confirm({
|
|
||||||
title: '提示',
|
this.shipObj = {
|
||||||
content: '请确认订单是否已排单?',
|
show: true,
|
||||||
onOk: () => {
|
data: row
|
||||||
this.isShowLoading(true);
|
};
|
||||||
API.update({
|
|
||||||
order_status: 2
|
|
||||||
}, row.id).then(res => {
|
|
||||||
if (res.code == 0) {
|
|
||||||
this.$Message.success('修改成功');
|
|
||||||
this.orderConfirmShow = false;
|
|
||||||
this.request();
|
|
||||||
}
|
|
||||||
this.isShowLoading(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
handleOrderSuccess(value) {
|
handleOrderSuccess(value) {
|
||||||
let page = value ? this.list_data.current_page : 1;
|
let page = value ? this.list_data.current_page : 1;
|
||||||
this.cardsObj.show = false;
|
this.cardsObj.show = false;
|
||||||
|
this.shipObj.show = false;
|
||||||
|
this.orderConfirmShow = false;
|
||||||
this.$store.dispatch('initOrder');
|
this.$store.dispatch('initOrder');
|
||||||
this.index(page);
|
this.index(page);
|
||||||
},
|
},
|
||||||
|
97
frontend/src/views/virtual/orders/js/ship.js
Normal file
97
frontend/src/views/virtual/orders/js/ship.js
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
import * as API from 'api/virtual/orders';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
show: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
source: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
default: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
my_show: false,
|
||||||
|
loading: false,
|
||||||
|
type: 1,
|
||||||
|
params: {},
|
||||||
|
file: null,
|
||||||
|
segments: [{ start_no: '', end_no: '' }]
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
show(bool) {
|
||||||
|
this.my_show = bool;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
ok() {
|
||||||
|
let params = {};
|
||||||
|
params.type = this.type;
|
||||||
|
params.order_id = this.data.id;
|
||||||
|
|
||||||
|
if (this.type === 1) {
|
||||||
|
if (this.file === null) {
|
||||||
|
return this.$Message.error('请上传文件');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(this.file);
|
||||||
|
|
||||||
|
params.file = this.file;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (this.type === 2) {
|
||||||
|
for (let index = 0; index < this.segments.length; index++) {
|
||||||
|
const element = this.segments[index];
|
||||||
|
if (element.start_no === '' || element.end_no === '') {
|
||||||
|
return this.$Message.error('请输入起止卡号');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
params.segments = this.segments;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.$Modal.confirm({
|
||||||
|
title: '提示',
|
||||||
|
content: '请确认是否提交排单?',
|
||||||
|
onOk: () => {
|
||||||
|
this.loading = true;
|
||||||
|
API.ship(params).then(res => {
|
||||||
|
if (res.code == 0) {
|
||||||
|
this.$Message.success('修改成功');
|
||||||
|
this.$emit('update-success');
|
||||||
|
}
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
selectFile(file) {
|
||||||
|
this.file = file;
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
visibleChange(bool) {
|
||||||
|
if (!bool) {
|
||||||
|
this.$emit('update:show', false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
clear() {
|
||||||
|
this.file = null;
|
||||||
|
this.segments = [{ start_no: '', end_no: '' }];
|
||||||
|
this.my_show = false;
|
||||||
|
},
|
||||||
|
handleAdd() {
|
||||||
|
this.segments.push({ start_no: '', end_no: '' });
|
||||||
|
},
|
||||||
|
handleRemove(index) {
|
||||||
|
this.segments.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
94
frontend/src/views/virtual/orders/ship.vue
Normal file
94
frontend/src/views/virtual/orders/ship.vue
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<template>
|
||||||
|
<Modal
|
||||||
|
:closable="false"
|
||||||
|
:mask-closable="false"
|
||||||
|
:title="'确认排单'"
|
||||||
|
@on-visible-change="visibleChange"
|
||||||
|
v-model="my_show"
|
||||||
|
>
|
||||||
|
<div class="page-edit-wrap uinn-lr20">
|
||||||
|
<ui-loading :show="loading"></ui-loading>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li class="ui-list" v-if="data !== null">
|
||||||
|
<div class="ui-list-title">订单编号:</div>
|
||||||
|
<div class="ui-list-content">
|
||||||
|
<span class="lh-32">{{data.sn}}</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="ui-list">
|
||||||
|
<div class="ui-list-title"></div>
|
||||||
|
<div class="ui-list-content">
|
||||||
|
<RadioGroup v-model="type">
|
||||||
|
<Radio :label="1">导入方式</Radio>
|
||||||
|
<Radio :label="2">号段方式</Radio>
|
||||||
|
</RadioGroup>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<div v-if="type === 1">
|
||||||
|
<li class="ui-list">
|
||||||
|
<div class="ui-list-title">文件导入</div>
|
||||||
|
<div class="ui-list-content">
|
||||||
|
<Upload :before-upload="selectFile" action="/" :format="['xls','xlsx','csv']">
|
||||||
|
<Button icon="ios-cloud-upload-outline">选择文件</Button>
|
||||||
|
</Upload>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="ui-list" v-if="file !== null">
|
||||||
|
<div class="ui-list-title">已选文件</div>
|
||||||
|
<div class="ui-list-content">
|
||||||
|
<span class="lh-32">{{file.name}}</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
<div v-if="type === 2">
|
||||||
|
<li class="ui-list">
|
||||||
|
<div class="ui-list-title">号段范围</div>
|
||||||
|
<div class="ui-list-content">
|
||||||
|
<Form ref="formSegments">
|
||||||
|
<FormItem v-for="(item, index) in segments" :key="index">
|
||||||
|
<Row>
|
||||||
|
<Col span="9">
|
||||||
|
<Input type="text" v-model="item.start_no" placeholder="起始号码"></Input>
|
||||||
|
</Col>
|
||||||
|
<Col span="2" class="ta-c">-</Col>
|
||||||
|
<Col span="9">
|
||||||
|
<Input type="text" v-model="item.end_no" placeholder="结束号码"></Input>
|
||||||
|
</Col>
|
||||||
|
<Col span="1" offset="1" v-if="segments.length > 1">
|
||||||
|
<Button
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
shape="circle"
|
||||||
|
icon="md-remove"
|
||||||
|
@click="handleRemove(index)"
|
||||||
|
></Button>
|
||||||
|
</Col>
|
||||||
|
<Col span="1" offset="1">
|
||||||
|
<Button
|
||||||
|
size="small"
|
||||||
|
type="primary"
|
||||||
|
shape="circle"
|
||||||
|
icon="md-add"
|
||||||
|
@click="handleAdd"
|
||||||
|
></Button>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</FormItem>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<footer class="ta-c" slot="footer">
|
||||||
|
<Button @click="clear" class="w-80 umar-r5" ghost type="primary">取消</Button>
|
||||||
|
<Button :loading="loading" @click="ok" class="w-80" type="primary">确定</Button>
|
||||||
|
</footer>
|
||||||
|
</Modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./js/ship.js"></script>
|
2
public/css/chunk-bb3b064e.bc6b17af.css
Normal file
2
public/css/chunk-bb3b064e.bc6b17af.css
Normal file
File diff suppressed because one or more lines are too long
2
public/js/app.7ef53e3c.js
Normal file
2
public/js/app.7ef53e3c.js
Normal file
File diff suppressed because one or more lines are too long
1
public/js/app.7ef53e3c.js.map
Normal file
1
public/js/app.7ef53e3c.js.map
Normal file
File diff suppressed because one or more lines are too long
2
public/js/chunk-bb3b064e.b8bb8795.js
Normal file
2
public/js/chunk-bb3b064e.b8bb8795.js
Normal file
File diff suppressed because one or more lines are too long
1
public/js/chunk-bb3b064e.b8bb8795.js.map
Normal file
1
public/js/chunk-bb3b064e.b8bb8795.js.map
Normal file
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
|||||||
<!DOCTYPE html><html><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><script src=\config.js></script><title></title><link href=/css/chunk-25e2723d.f18e4df8.css rel=prefetch><link href=/css/chunk-996b1e80.5cadf3d0.css rel=prefetch><link href=/js/chunk-00ae0766.3874cd10.js rel=prefetch><link href=/js/chunk-07a274ec.c3ad5dec.js rel=prefetch><link href=/js/chunk-25e2723d.ce806521.js rel=prefetch><link href=/js/chunk-996b1e80.d3b45e46.js rel=prefetch><link href=/css/app.d71a8195.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.0a9cab31.js rel=preload as=script><link href=/js/chunk-vendors.ed6443e8.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.d71a8195.css rel=stylesheet></head><body><noscript><strong>很抱歉,如果没有启用JavaScript,程序不能正常工作,若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.ed6443e8.js></script><script src=/js/app.0a9cab31.js></script></body></html>
|
<!DOCTYPE html><html><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><script src=\config.js></script><title></title><link href=/css/chunk-996b1e80.5cadf3d0.css rel=prefetch><link href=/css/chunk-bb3b064e.bc6b17af.css rel=prefetch><link href=/js/chunk-00ae0766.3874cd10.js rel=prefetch><link href=/js/chunk-07a274ec.c3ad5dec.js rel=prefetch><link href=/js/chunk-996b1e80.d3b45e46.js rel=prefetch><link href=/js/chunk-bb3b064e.b8bb8795.js rel=prefetch><link href=/css/app.d71a8195.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.7ef53e3c.js rel=preload as=script><link href=/js/chunk-vendors.ed6443e8.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.d71a8195.css rel=stylesheet></head><body><noscript><strong>很抱歉,如果没有启用JavaScript,程序不能正常工作,若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.ed6443e8.js></script><script src=/js/app.7ef53e3c.js></script></body></html>
|
@ -1,42 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Carbon\Carbon;
|
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\File;
|
||||||
use Illuminate\Support\Facades\Schema;
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use App\Domains\Virtual\Services\OrderService;
|
||||||
|
|
||||||
require_once realpath(dirname(__FILE__) . '/TestCase.php');
|
require_once realpath(dirname(__FILE__) . '/TestCase.php');
|
||||||
|
|
||||||
Schema::table('virtual_order_cards_partition', function ($table) {
|
app(OrderService::class);
|
||||||
$table->timestamp('refunded_at')->nullable()->comment('退货时间');
|
|
||||||
});
|
|
||||||
|
|
||||||
Schema::table('real_order_cards_partition', function ($table) {
|
|
||||||
$table->timestamp('refunded_at')->nullable()->comment('退货时间');
|
|
||||||
});
|
|
||||||
|
|
||||||
dd();
|
|
||||||
|
|
||||||
$handle = fopen(__DIR__ . '/interval.csv', 'w');
|
|
||||||
|
|
||||||
$custom_no = DB::connection('vd_old')->table('ckb_custom_handle_log')->select('custom_no')->distinct()->where('type', 11)->get()->pluck('custom_no')->toArray();
|
|
||||||
|
|
||||||
fputcsv($handle, ['客户编号', '间隔时间']);
|
|
||||||
|
|
||||||
foreach (array_chunk($custom_no, 1000) as $values) {
|
|
||||||
$res = DB::connection('vd_old')->table('ckb_custom_handle_log')->whereIn('custom_no', $values)->whereIn('type', [10, 11])->orderBy('valid_start_time')->get()->groupBy('custom_no');
|
|
||||||
|
|
||||||
foreach ($res as $no => $group) {
|
|
||||||
echo $no . PHP_EOL;
|
|
||||||
for ($i=1; $i < count($group); $i++) {
|
|
||||||
$item1 = $group[$i - 1];
|
|
||||||
$item2 = $group[$i];
|
|
||||||
|
|
||||||
$interval = Carbon::createFromTimestamp(intval($item2->valid_start_time))->diffInMonths(Carbon::createFromTimestamp(intval($item1->valid_end_time)));
|
|
||||||
fputcsv($handle, [$no, $interval]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose($handle);
|
|
||||||
|
|
||||||
dd(1);
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user