diff --git a/MySQL_change.sql b/MySQL_change.sql
index 263f655..6375bcc 100644
--- a/MySQL_change.sql
+++ b/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`;
+
diff --git a/app/Admin/Controllers/AgentController.php b/app/Admin/Controllers/AgentController.php
index 6aa2020..b09abfa 100644
--- a/app/Admin/Controllers/AgentController.php
+++ b/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('
(' . $statusArr[$is_success] . ')');
+ $column->append('
(模板' . $template_id . $statusArr[$is_success] . ')');
}
}
});
diff --git a/app/Admin/Controllers/ProductController.php b/app/Admin/Controllers/ProductController.php
index 2fd83d6..ca57abd 100644
--- a/app/Admin/Controllers/ProductController.php
+++ b/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()) {
diff --git a/app/AdminAgent/Controllers/AgentProductController.php b/app/AdminAgent/Controllers/AgentProductController.php
index 286571b..1d7b059 100644
--- a/app/AdminAgent/Controllers/AgentProductController.php
+++ b/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}");
}
diff --git a/app/AdminAgent/Forms/AgentInfo.php b/app/AdminAgent/Forms/AgentInfo.php
index a5fc85e..5d8d62c 100644
--- a/app/AdminAgent/Forms/AgentInfo.php
+++ b/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();
diff --git a/app/AdminSupplier/Controllers/ProductController.php b/app/AdminSupplier/Controllers/ProductController.php
index cc0670b..cf9c140 100644
--- a/app/AdminSupplier/Controllers/ProductController.php
+++ b/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']); //表单没有的字段,必须加上这句才能重置值
diff --git a/app/Http/Controllers/Api/AgentProductController.php b/app/Http/Controllers/Api/AgentProductController.php
index c43ad15..1e23c43 100644
--- a/app/Http/Controllers/Api/AgentProductController.php
+++ b/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);
}
diff --git a/app/Http/Controllers/Api/OrderController.php b/app/Http/Controllers/Api/OrderController.php
index 2e6a29d..9c229d9 100644
--- a/app/Http/Controllers/Api/OrderController.php
+++ b/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);
diff --git a/app/Models/AgentProductSpec.php b/app/Models/AgentProductSpec.php
index 3f11256..67abe72 100644
--- a/app/Models/AgentProductSpec.php
+++ b/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'];
diff --git a/app/Models/ProductSpec.php b/app/Models/ProductSpec.php
index f6bb574..6ceabc6 100644
--- a/app/Models/ProductSpec.php
+++ b/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'];
diff --git a/resources/js/select-supplier-product-change.js b/resources/js/select-supplier-product-change.js
index 0a903d9..c787d03 100644
--- a/resources/js/select-supplier-product-change.js
+++ b/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) {