diff --git a/app/AdminAgent/Controllers/IndustryOrderController.php b/app/AdminAgent/Controllers/IndustryOrderController.php index 5f356ed..96e4ff1 100644 --- a/app/AdminAgent/Controllers/IndustryOrderController.php +++ b/app/AdminAgent/Controllers/IndustryOrderController.php @@ -2,19 +2,15 @@ namespace App\AdminAgent\Controllers; -use App\AdminAgent\Renderable\SelectIndustryProductSpec; use App\AdminAgent\Repositories\IndustryOrder; use App\Common\OrderStatus; use App\Common\PayType; -use App\Common\ProductStatus; use App\Models\AdminSetting; -use App\Models\IndustryProduct; -use App\Models\IndustryProductSpec; use Dcat\Admin\Admin; -use Dcat\Admin\Form; use Dcat\Admin\Grid; use Dcat\Admin\Show; use Dcat\Admin\Http\Controllers\AdminController; +use Dcat\Admin\Widgets\Table; use EasyWeChat\Factory; use EasyWeChat\Kernel\Http\StreamResponse; use Illuminate\Support\Facades\Storage; @@ -43,6 +39,26 @@ class IndustryOrderController extends AdminController $grid->column('price'); $grid->column('name', '预留姓名'); $grid->column('mobile', '预留手机'); + $grid->column('info', '客户信息') + ->display('查看') + ->modal('客户信息', function ($modal) { + $info = $this->info ?? []; + $info = array_map(function($v) { + if (isset($v['value'], $v['type'])) { + if ($v['type'] == 'image') { + if (is_array($v['value'])) { + return array_reduce($v['value'], fn($v2, $v3) => $v2 . '  '); + } else { + return ''; + } + } else { + return is_string($v['value']) ? $v['value'] : join(',', $v['value']); + } + } + return is_string($v) ? $v : json_encode($v); + }, $info); + return Table::make([], $info); + })->xl(); $grid->column('title')->limit(15); $grid->column('picture')->image('', 80, 80); $grid->column('status') @@ -209,134 +225,4 @@ JS 'trade_type' => 'NATIVE', // 请对应换成你的支付方式对应的值类型 ]); } - - /** - * Make a form builder. - * - * @return Form - */ - /*protected function form() - { - $pid = request()->input('pid'); - $industry = IndustryProduct::with('diyForm.fields') - ->where([ - ['status', '=', ProductStatus::ON_SALE], - ['stock', '>', 0], - ])->find($pid); - - return Form::make(new IndustryOrder(), function (Form $form) use ($industry) { - if (!$industry) { - Admin::exit('订单不允许编辑'); - } - - $form->selectTable('industry_product_spec_id', '选择产品规格') - ->required() - ->title('选择产品规格') - ->dialogWidth('80%;min-width:825px;') - ->from(SelectIndustryProductSpec::make(['industry_product_id' => request()->input('pid')])) - ->model(IndustryProductSpec::class); - - $form->hidden('pid')->value($industry->id); //pid要跟上面的request中的一样,否则提交出错 - $form->number('num') - ->min($industry->min_sale)->required() - ->default($industry->min_sale); - $form->text('name')->default(Admin::user()->director)->required(); - $form->mobile('mobile')->default(Admin::user()->contact_phone)->required(); - - $pay_type = [PayType::ONLINE, PayType::OFFLINE]; - if ($industry->deposit) { //订金支付 - $pay_type = [...$pay_type, PayType::DEPOSIT_PAY]; - } - if ($industry->earnest) { //定金支付 - $pay_type = [...$pay_type, PayType::EARNEST_PAY]; - } - $options = array_filter(PayType::array(), fn($k) => in_array($k, $pay_type), ARRAY_FILTER_USE_KEY); - $form->select('pay_type')->options($options)->default(PayType::ONLINE)->required(); - - //信息收集表单 TODO 信息收集表单文件上传不了,不能用事务 - if (!empty($industry->diyForm->fields)) { - $form->divider(); - $fields = $industry->diyForm->fields->toArray(); - foreach ($fields as $v) { - if ($v['type'] == 'radio' || $v['type'] == 'checkbox') { - $form->{$v['type']}('info.' . $v['field'])->options($v['options'])->required((bool)$v['required']); - } else { - $form->{$v['type']}('info.' . $v['field'])->required((bool)$v['required']); - } - } - } - - $form->divider(); - $form->text('', '购买产品')->default($industry->title)->disable(); - $form->text('', '单价')->default($industry->price)->disable(); - $form->text('', '库存')->default($industry->stock)->disable(); - $form->text('', '起购数量')->default($industry->min_sale)->disable(); - $form->image('picture', '产品图')->default($industry->pictures)->disable(); - $form->display('', '旅游须知')->default(fn() => preg_replace('/.*?<\/script>/is', '', $industry->know))->disable(); - $form->display('', '产品详情')->default(fn() => preg_replace('/.*?<\/script>/is', '', $industry->content))->disable(); - })->saving(function (Form $form) use ($industry) { - //禁止编辑 - if ($form->isEditing()) { - return $form->response()->error('操作禁止'); - } - - //判断最小起购数 - if ($form->num < $industry->min_sale) { - return $form->response()->error('购买数量不能小于最低起购数:' . $industry->min_sale); - } - - //判断产品状态和库存 - if (!$industry || $industry->status != ProductStatus::ON_SALE || $industry->stock < $form->num) { - return $form->response()->error('产品已下架或库存不足'); - } - - //生成订单号 - list($micro, $sec) = explode(' ', microtime()); - $micro = str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT); - $order_no = date('ymdHis', $sec) . $micro . mt_rand(1000, 9999); - - //产品规格处理 - $spec = IndustryProductSpec::where('industry_product_id', $form->pid)->find($form->industry_product_spec_id); - if (!$spec) { - return $form->response()->error('您选择的产品规格不存在'); - } - - $form->deleteInput(['pid', 'picture']); - - $form->hidden(['industry_product_id', 'supplier_id', 'agent_id', 'order_no', 'price', 'title', 'picture', 'status', 'pay_type', 'paid_at', 'verify_code', 'trade_deposit', 'timeout']); - - $form->name = $form->name ?? Admin::user()->director; - $form->mobile = $form->mobile ?? Admin::user()->contact_phone; - - $form->industry_product_id = $industry->id; - $form->supplier_id = $industry->supplier_id; - $form->agent_id = Admin::user()->id; - $form->order_no = $order_no; - $form->price = $form->num * $spec->price; - $form->title = $industry->title; - $form->picture = $industry->pictures[0] ?? '' ; - $form->status = $form->pay_type == PayType::OFFLINE ? OrderStatus::OFFLINE_UNPAID : OrderStatus::UNPAID; - $form->paid_at = null; - $form->verify_code = ''; - $form->trade_deposit = $form->num * $industry->single_deposit; - $form->single_price = $industry->single_deposit; - $form->timeout = null; - - if ($form->pay_type == PayType::DEPOSIT_PAY) { - $form->prepay_price = $industry->deposit * $form->num; - } else if ($form->pay_type == PayType::EARNEST_PAY) { - $form->prepay_price = $industry->earnest * $form->num; - } else { - $form->prepay_price = 0; - } - - //产品规格表减库存 - $spec->stock = $spec->stock - $form->num; - $spec->save(); - })->saved(function (Form $form) { - return $form->response()->success('下单成功,请等待供应商审核订单')->redirect(admin_url('industry_order/list')); - })->deleting(function (Form $form) { - return $form->response()->error('操作禁止'); - }); - }*/ } diff --git a/app/AdminAgent/Forms/IndustryProductBuy.php b/app/AdminAgent/Forms/IndustryProductBuy.php index 2cfd15a..b1d9257 100644 --- a/app/AdminAgent/Forms/IndustryProductBuy.php +++ b/app/AdminAgent/Forms/IndustryProductBuy.php @@ -27,7 +27,7 @@ class IndustryProductBuy extends Form { $pid = request()->input('pid'); - $industry = IndustryProduct::where([ + $industry = IndustryProduct::with('diyForm')->where([ ['status', '=', ProductStatus::ON_SALE], ['stock', '>', 0], ])->find($pid); @@ -49,6 +49,19 @@ class IndustryProductBuy extends Form return $this->response()->error('产品规格不存在或库存不足'); } + //信息收集表处理,保留字段类型等信息,便于后台显示 + $order_info = $input['info'] ?? []; + if (!empty($industry->diyForm->fields) && !$industry->diyForm->fields->isEmpty()) { + $fields = array_column($industry->diyForm->fields->toArray(), null, 'field'); + foreach ($fields as &$field) { + if ($field['required'] && !isset($order_info[$field['field']])) { //判断是否必填 + return $this->error($field['field'] . '不能为空'); + } + $field['value'] = $order_info[$field['field']] ?? ''; + } + $order_info = $fields; + } + //生成订单号 list($micro, $sec) = explode(' ', microtime()); $micro = str_pad(floor($micro * 1000000), 6, 0, STR_PAD_LEFT); @@ -57,11 +70,11 @@ class IndustryProductBuy extends Form DB::beginTransaction(); try { //规格减库存 - $allow_row = IndustryProductSpec::where([ + $affect_row = IndustryProductSpec::where([ ['id', '=', $spec->id], ['stock', '>=', $input['num']], ])->decrement('stock', $input['num']); - if (!$allow_row) { + if (!$affect_row) { throw new \Exception('产品规格库存不足!'); } @@ -98,11 +111,11 @@ class IndustryProductBuy extends Form 'created_at' => now(), 'prepay_price' => $prepay_price, 'single_price' => $industry->single_deposit, - 'info' => $input['info'], + 'info' => $order_info, ]); DB::commit(); - return $this->response()->success('购买成功!')->redirect('industry_order/list/' . $order->id); + return $this->response()->success('购买成功,正在前往支付页面')->redirect('industry_order/list/' . $order->id); } catch (\Exception $e) { DB::rollBack(); return $this->response()->error($e->getMessage()); @@ -117,7 +130,7 @@ class IndustryProductBuy extends Form //处理图片上传 $_file = request()->file('_file_'); if ($_file && $_file->isValid()) { - $this->image(request()->input('upload_column'))->uniqueName()->saveFullUrl(); + $this->multipleImage(request()->input('upload_column'))->uniqueName()->saveFullUrl(); return true; } @@ -171,7 +184,7 @@ class IndustryProductBuy extends Form if ($v['type'] == 'radio' || $v['type'] == 'checkbox') { $this->{$v['type']}('info.' . $v['field'])->options(array_combine($v['options'], $v['options']))->required((bool)$v['required']); } else if ($v['type'] == 'image') { - $this->image('info.' . $v['field'])->uniqueName()->saveFullUrl()->required((bool)$v['required']); + $this->multipleImage('info.' . $v['field'])->uniqueName()->saveFullUrl()->required((bool)$v['required']); } else { $this->{$v['type']}('info.' . $v['field'])->required((bool)$v['required']); } @@ -183,7 +196,7 @@ class IndustryProductBuy extends Form $this->text('', '单价')->default($industry->price)->disable(); $this->text('', '库存')->default($industry->stock)->disable(); $this->text('', '起购数量')->default($industry->min_sale)->disable(); - $this->image('picture', '产品图')->default($industry->pictures)->disable(); + $this->multipleImage('pictures', '产品图')->default($industry->pictures)->disable(); $this->display('', '旅游须知')->default(fn() => preg_replace('/.*?<\/script>/is', '', $industry->know))->disable(); $this->display('', '产品详情')->default(fn() => preg_replace('/.*?<\/script>/is', '', $industry->content))->disable(); } diff --git a/app/AdminSupplier/Controllers/IndustryOrderController.php b/app/AdminSupplier/Controllers/IndustryOrderController.php index 98e4308..6438a6c 100644 --- a/app/AdminSupplier/Controllers/IndustryOrderController.php +++ b/app/AdminSupplier/Controllers/IndustryOrderController.php @@ -10,6 +10,7 @@ use Dcat\Admin\Form; use Dcat\Admin\Grid; use Dcat\Admin\Show; use Dcat\Admin\Http\Controllers\AdminController; +use Dcat\Admin\Widgets\Table; class IndustryOrderController extends AdminController { @@ -34,6 +35,26 @@ class IndustryOrderController extends AdminController $grid->column('price'); $grid->column('name'); $grid->column('mobile'); + $grid->column('info', '客户信息') + ->display('查看') + ->modal('客户信息', function ($modal) { + $info = $this->info ?? []; + $info = array_map(function($v) { + if (isset($v['value'], $v['type'])) { + if ($v['type'] == 'image') { + if (is_array($v['value'])) { + return array_reduce($v['value'], fn($v2, $v3) => $v2 . '  '); + } else { + return ''; + } + } else { + return is_string($v['value']) ? $v['value'] : join(',', $v['value']); + } + } + return is_string($v) ? $v : json_encode($v); + }, $info); + return Table::make([], $info); + })->xl(); $grid->column('industry_product_id', '产品ID'); $grid->column('title')->limit(15); $grid->column('picture')->image('', 60, 60);