Browse Source

信息收集表处理

master
李可松 4 years ago
parent
commit
b202cd1fa6
  1. 156
      app/AdminAgent/Controllers/IndustryOrderController.php
  2. 29
      app/AdminAgent/Forms/IndustryProductBuy.php
  3. 21
      app/AdminSupplier/Controllers/IndustryOrderController.php

156
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 . '<img data-action="preview-img" src="' . $v3 . '" style="max-width:120px;max-height:200px;cursor:pointer" class="img img-thumbnail"> &nbsp;');
} else {
return '<img data-action="preview-img" src="' . $v['value'] . '" style="max-width:120px;max-height:200px;cursor:pointer" class="img img-thumbnail">';
}
} 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.*?>.*?<\/script>/is', '', $industry->know))->disable();
$form->display('', '产品详情')->default(fn() => preg_replace('/<script.*?>.*?<\/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('操作禁止');
});
}*/
}

29
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.*?>.*?<\/script>/is', '', $industry->know))->disable();
$this->display('', '产品详情')->default(fn() => preg_replace('/<script.*?>.*?<\/script>/is', '', $industry->content))->disable();
}

21
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 . '<img data-action="preview-img" src="' . $v3 . '" style="max-width:120px;max-height:200px;cursor:pointer" class="img img-thumbnail"> &nbsp;');
} else {
return '<img data-action="preview-img" src="' . $v['value'] . '" style="max-width:120px;max-height:200px;cursor:pointer" class="img img-thumbnail">';
}
} 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);

Loading…
Cancel
Save