Browse Source

Merge branch 'master' of ssh://8.134.10.79:222/Leadfyy.co/hainan

# Conflicts:
#	app/AdminAgent/Forms/AgentInfo.php
master
lemon 4 years ago
parent
commit
3d630b5443
  1. 10
      MySQL_change.sql
  2. 4
      app/Admin/Controllers/AgentController.php
  3. 74
      app/Admin/Controllers/ProductController.php
  4. 10
      app/AdminAgent/Controllers/AgentProductController.php
  5. 6
      app/AdminAgent/Forms/AgentInfo.php
  6. 7
      app/AdminSupplier/Controllers/ProductController.php
  7. 44
      app/Http/Controllers/Api/AgentProductController.php
  8. 41
      app/Http/Controllers/Api/OrderController.php
  9. 3
      app/Models/AgentProductSpec.php
  10. 3
      app/Models/ProductSpec.php
  11. 15
      resources/js/select-supplier-product-change.js

10
MySQL_change.sql

@ -130,3 +130,13 @@ ALTER TABLE `product_specs`
ALTER TABLE `agent_product_specs`
DROP COLUMN `name`,
DROP COLUMN `date`;
ALTER TABLE `product_specs`
ADD COLUMN `deleted_at` TIMESTAMP NULL DEFAULT NULL AFTER `price`;
ALTER TABLE `agent_product_specs`
ADD COLUMN `deleted_at` TIMESTAMP NULL DEFAULT NULL AFTER `price`;
ALTER TABLE `order_product_items`
ADD COLUMN `agent_product_spec_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '代理商产品规格ID' AFTER `price`,
ADD COLUMN `product_type` TINYINT NOT NULL DEFAULT 0 COMMENT '供应商产品的type' AFTER `agent_product_spec_id`,
CHANGE COLUMN `product_spec_id` `product_spec_id` BIGINT NOT NULL DEFAULT 0 COMMENT '供应商产品规格ID' AFTER `product_type`;

4
app/Admin/Controllers/AgentController.php

@ -66,7 +66,7 @@ class AgentController extends AdminController
$column->append((new AuditAgent(null, 1))->setKey($this->id))->append(' ');
$column->append((new AuditAgent(null, 2))->setKey($this->id));
})
->if(fn() => $this->status == UserStatus::NORMAL)
->if(fn() => $this->status == UserStatus::NORMAL && in_array($this->type, [AgentType::OPERATOR, AgentType::SUPPLIER]))
->display('')
->then(function ($column) use ($last_template_id) {
$is_success = $this->miniUpload->is_success ?? null;
@ -83,7 +83,7 @@ class AgentController extends AdminController
$column->append((new MiniProgramUpload(null, 1))->setKey($this->id));
$statusArr = [0 => '审核成功', 1 => '审核被拒绝', 2 => '审核中', 3 => '已撤回', 4 => '审核延后'];
if (isset($is_success, $statusArr[$is_success])) {
$column->append('<br>(' . $statusArr[$is_success] . ')');
$column->append('<br>(模板' . $template_id . $statusArr[$is_success] . ')');
}
}
});

74
app/Admin/Controllers/ProductController.php

@ -10,7 +10,9 @@ use App\Models\AgentProduct;
use App\Models\AgentProductItem;
use App\Models\Category;
use App\Models\Supplier;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Form\NestedForm;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
@ -122,6 +124,78 @@ class ProductController extends AdminController
->required();
$form->editor('know');
$form->editor('content');
$form->mobile('verify_mobile')->required();
$form->radio('type', '产品类型')
->options(admin_trans('product.options.publish_type'))->disable($form->isEditing())
->default(current(admin_trans('product.options.publish_type')))
->when(0, function (Form $form) { //旅游线路
if ($form->isEditing() && $form->model()->type != 0) {
return;
}
$form->table('extends.field_0_project', '包含项目', function (NestedForm $table) {
$table->text('name', '字段1');
$table->text('num', '字段2');
$table->text('price', '字段3');
})->help('第一行数据默认是表头,如:项目名称、数量、额外费用');
$form->dateRange('extends.field_0_date.start', 'extends.field_0_date.end', '行程时间');
})->when(1, function (Form $form) { //酒店
if ($form->isEditing() && $form->model()->type != 1) {
return;
}
$default = [
['tag' => '行李寄存'], ['tag' => '24小时前台'], ['tag' => '前台保险柜'], ['tag' => '唤醒服务'],
['tag' => '早餐'], ['tag' => '送餐服务'], ['tag' => '电梯'], ['tag' => '空调'],
['tag' => '新风系统'], ['tag' => '24小时热水'], ['tag' => '吹风机'], ['tag' => '加湿器'],
['tag' => '自动售货机'], ['tag' => '健身房'], ['tag' => '桌球室'], ['tag' => '洗衣服务']
];
$form->table('extends.field_1_tags', '酒店设施', function (NestedForm $table) {
$table->text('tag', '包含项目')->placeholder('如:24小时热水、干洗服务等');
})->value($default)->help('首次创建时,系统会默认填充基本服务,请根据本酒店情况进行删减或新增');
$form->text('extends.field_1_name', '酒店名');
$form->text('extends.field_1_address', '地址');
$form->map('extends.field_1_latitude', 'extends.field_1_longitude', '位置');
})->when(2, function (Form $form) { //景区
if ($form->isEditing() && $form->model()->type != 2) {
return;
}
$form->table('extends.field_2_open_time', '开放时间', function (NestedForm $table) {
$table->text('node', '字段1')->placeholder('如:周一至周五');
$table->text('summer', '字段2')->placeholder('如:08:00~19:00');
$table->text('winter', '字段3')->placeholder('如:08:00~18:00');
})->help('第一行数据默认是表头,如:项目名称、数量、额外费用');
$form->table('extends.field_2_project', '包含项目', function (NestedForm $table) {
$table->text('name', '字段1');
$table->text('num', '字段2');
$table->text('price', '字段3');
})->help('第一行数据默认是表头,如:项目名称、数量、额外费用');
$form->text('extends.field_2_name', '景区名');
$form->text('extends.field_2_address', '地址');
$form->map('extends.field_2_latitude', 'extends.field_2_longitude', '位置');
})->when(3, function (Form $form) { //餐厅
if ($form->isEditing() && $form->model()->type != 3) {
return;
}
$form->table('extends.field_3_open_time', '开放时间', function (NestedForm $table) {
$table->text('week', '字段1')->placeholder('如:周一至周五');
$table->text('section', '字段2')->placeholder('如:上午/下午');
$table->text('time', '字段3')->placeholder('如:08:00~18:00');
})->help('第一行数据默认是表头,如:项目名称、数量、额外费用');
$form->table('extends.field_3_package', '包含套餐', function (NestedForm $table) {
$table->text('name', '字段1')->placeholder('如:清蒸鱿鱼');
$table->text('num', '字段2')->placeholder('如:1条');
$table->text('price', '字段3')->placeholder('如:99元');
})->help('第一行数据默认是表头,如:项目名称、数量、额外费用');
$form->text('extends.field_3_name', '餐厅名');
$form->text('extends.field_3_address', '地址');
$form->map('extends.field_3_latitude', 'extends.field_3_longitude', '位置');
});
})->saving(function (Form $form) {
//不允许编辑的字段
if ($form->isEditing()) {

10
app/AdminAgent/Controllers/AgentProductController.php

@ -210,10 +210,10 @@ class AgentProductController extends AdminController
->script($js);
$form->hasMany('spec', function (Form\NestedForm $form) {
$form->hidden('id');
// $form->hidden('id'); hasMany时,ID会自动生成
$form->hidden('product_spec_id');
$form->text('supplier_name', '规格')->disable()->customFormat(fn() => $this->product_spec['name'] ?? '已删除规格');
$form->date('supplier_date', '日期')->disable()->customFormat(fn() => $this->product_spec['date'] ?? '已删除规格');
$form->text('supplier_name', '规格')->disable()->customFormat(fn() => $this->product_spec['name'] ?? '供应商已删除规格');
$form->date('supplier_date', '日期')->disable()->customFormat(fn() => $this->product_spec['date'] ?? '供应商已删除规格');
$form->text('supplier_stock', '供应商库存')->disable()->customFormat(fn() => $this->product_spec['stock'] ?? 0);
$form->text('supplier_price', '供应商价')->disable()->customFormat(fn() => $this->product_spec['price'] ?? 0);
$form->text('stock', '您的库存')->customFormat(fn() => isset($this->product_spec['stock'], $this->stock) && $this->stock > $this->product_spec['stock'] ? $this->product_spec['stock'] : $this->stock);
@ -419,8 +419,8 @@ class AgentProductController extends AdminController
$product = Product::find($form->product_id);
if ($product->status != ProductStatus::ON_SALE) {
return $form->response()->error('产品ID '. $form->product_id .' 已下架');
} else if ($product->stock < $form->stock) {
return $form->response()->error("供应商当前库存为{$product->stock},你设置的库存不能超过该数值");
/*} else if ($product->stock < $form->stock) {
return $form->response()->error("供应商当前库存为{$product->stock},你设置的库存不能超过该数值");*/
} else if ($form->price < $product->price) {
return $form->response()->error("产品售价不能小于供应商售价{$product->price}");
}

6
app/AdminAgent/Forms/AgentInfo.php

@ -50,9 +50,9 @@ class AgentInfo extends Form
public function form()
{
Admin::translation('agent');
$this->radio('type')
->options(AgentType::array())
->disable();
$this->select('type')->options(AgentType::array())->disable();
$this->text('name')->required();
$this->text('company_name')->required()->disable();
$this->text('province.name','省份')->disable();

7
app/AdminSupplier/Controllers/ProductController.php

@ -107,7 +107,7 @@ class ProductController extends AdminController
$form->text('title')->required();
// $form->currency('price')->symbol('¥')->required();
// $form->currency('original_price')->symbol('¥')->required();
$form->number('service_persons')->required();
$form->number('service_persons')->min(1)->required();
// $form->number('stock')->required();
$form->hasMany('spec', function (NestedForm $form) {
$form->hidden('id');
@ -249,6 +249,11 @@ class ProductController extends AdminController
$form->original_price = min(array_column($spec, 'original_price'));
$form->price = min(array_column($spec, 'price'));
//单库存服务用户数必须大于1
if ($form->service_persons < 1) {
return $form->response()->error('单库存服务用户数不能小于1');
}
//特殊字段处理
if ($form->isCreating()) {
$form->hidden(['status', 'supplier_id']); //表单没有的字段,必须加上这句才能重置值

44
app/Http/Controllers/Api/AgentProductController.php

@ -64,7 +64,13 @@ class AgentProductController extends Controller
} else {
$where = ['id' => $id, 'agent_id' => $this->agent_id, 'status' => ProductStatus::ON_SALE];
}
$agent_product = AgentProduct::with(['coupon:tag,agent_product_id', 'product:id,type,extends', 'spec.productSpec:id,name,date'])
$agent_product = AgentProduct::with([
'coupon:tag,agent_product_id',
'product:id,type,extends',
'spec' => function($query) {
return $query->has('productSpec')->with('productSpec:id,name,date');
}
])
->whereDoesntHave('agentProductItem', function ($query) {
return $query->whereHas('product', function ($query) {
return $query->where('stock', '<=', 0)->orWhere('status', '<>', ProductStatus::ON_SALE);
@ -100,6 +106,42 @@ class AgentProductController extends Controller
$agent_product->product = null;
}
//处理规格
if (!$agent_product->spec->isEmpty()) {
$specs = $agent_product->spec->toArray();
//二维数组转一维
$specs = array_map(function ($v) {
if (is_array($v['product_spec'])) {
unset($v['product_spec']['id']);
$v = array_merge($v, $v['product_spec']);
}
unset($v['agent_product_id'], $v['product_spec_id'], $v['product_spec'], $v['deleted_at']);
return $v;
}, $specs);
//去年name和date为空的数组
$specs = array_filter($specs, fn($v) => isset($v['name'], $v['date']));
$names = array_column($specs, 'name');
$names = array_values(array_unique($names));
$result = [];
foreach ($names as $name) {
$list = array_filter($specs, fn($v) => $v['name'] == $name);
$result[] = [
'name' => $name,
'date_start' => min(array_column($list, 'date')),
'date_end' => max(array_column($list, 'date')),
'original_price' => min(array_column($list, 'original_price')),
'price' => min(array_column($list, 'price')),
'list' => array_values($list),
];
}
unset($agent_product->spec);
$agent_product->spec = $result;
}
unset($agent_product->agent_id, $agent_product->status, $agent_product->deleted_at);
return $this->success($agent_product);
}

41
app/Http/Controllers/Api/OrderController.php

@ -156,7 +156,9 @@ class OrderController extends Controller
//0:单品销售;1:组合销售
if ($ap->type == 0) {
$spec = AgentProductSpec::where('agent_product_id', $formData['id'])->find($formData['spec_id']);
$spec = AgentProductSpec::with('productSpec')
->where('agent_product_id', $formData['id'])
->find($formData['spec_id']);
if (!$spec) {
return $this->error('你选择的产品规格不存在');
}
@ -314,25 +316,20 @@ class OrderController extends Controller
'info' => $order_info,
]);
//存入订单产品表
$supplier_product_info = Product::whereIn('id', $product_ids)
->orderBy('id')->get(['type', 'id AS product_id', 'supplier_id', 'price', 'service_persons'])->toArray();
$order_id = $order->id;
$agent_id = $this->agent_id;
$agent_product_id = $ap->id;
foreach ($supplier_product_info as &$v) {
$v['order_id'] = $order_id;
$v['agent_id'] = $agent_id;
$v['agent_product_id'] = $agent_product_id;
$v['num'] = $formData['num'];
if ($v['type'] == 0) { //TODO 此处未处理组合产品
$v['product_spec_id'] = $formData['spec_id'];
}
unset($v['type']);
}
OrderProductItem::insert($supplier_product_info);
//存入订单产品表,TODO 此处不考虑组合产品
OrderProductItem::insert([
'order_id' => $order->id,
'agent_id' => $this->agent_id,
'agent_product_id' => $ap->id,
'supplier_id' => $ap->product->supplier_id,
'product_id' => $ap->product->id,
'num' => $formData['num'],
'price' => $ap->product->price,
'agent_product_spec_id' => $formData['spec_id'],
'product_type' => $ap->product->type,
'product_spec_id' => $spec->productSpec->id,
'service_persons' => $ap->product->service_persons,
]);
DB::commit();
} catch (\Exception $e) {
@ -341,7 +338,7 @@ class OrderController extends Controller
}
if ($formData['pay_type'] == PayType::OFFLINE) { //线下支付
return $this->success(['id' => $order_id], '操作成功,请及时联系客服付款');
return $this->success(['id' => $order->id], '操作成功,请及时联系客服付款');
} else { //在线支付或定金支付
/*$config = $this->payConfig($order, $price);
if (!empty($config['paySign'])) {
@ -526,7 +523,7 @@ class OrderController extends Controller
$id = (int)request()->input('id');
$fields = ['id', 'agent_id', 'order_no', 'agent_product_id', 'num', 'price', 'name', 'mobile', 'title', 'picture', 'status',
'pay_type', 'coupon_id', 'paid_money', 'paid_at', 'refund_info', 'verify_code', 'created_at'];
'pay_type', 'coupon_id', 'paid_money', 'paid_at', 'refund_info', 'verify_code', 'info', 'created_at'];
$order = Order::with('agent:id,appid,appsecret')
->where('user_id', $this->user_id)
->find($id, $fields);

3
app/Models/AgentProductSpec.php

@ -4,10 +4,11 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class AgentProductSpec extends Model
{
use HasFactory;
use HasFactory, SoftDeletes;
protected $guarded = ['id'];

3
app/Models/ProductSpec.php

@ -4,10 +4,11 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductSpec extends Model
{
use HasFactory;
use HasFactory, SoftDeletes;
protected $guarded = ['id'];

15
resources/js/select-supplier-product-change.js

@ -7,8 +7,8 @@ $(function () {
data: {id: $(this).val(), _form_: '{{class}}'},
success: function (res) {
var fields = {
name: 'name',
date: 'date',
supplier_name: 'name',
supplier_date: 'date',
supplier_price: 'price',
supplier_stock: 'stock',
price: 'price',
@ -18,7 +18,16 @@ $(function () {
};
var data = res.data;
var forms = $('.has-many-spec-forms');
forms.html('');
//如果是原来数据库已经保存有id,调用click,提交的时候会同时删除数据库,否则直接remove掉,减小HTML体积
forms.children().each(function () {
if ($(this).find('.field_id').val()) {
$(this).find('.remove.btn').click();
} else {
$(this).remove();
}
});
for (var key in data) {
var row = $(template.replace(/new___LA_KEY__/g, key));
for(var key2 in fields) {

Loading…
Cancel
Save