Browse Source

Merge remote-tracking branch 'origin/develop' into develop

develop
李可松 5 years ago
parent
commit
5b2b62cd39
  1. 11
      MySQL_change.sql
  2. 71
      app/Admin/Controllers/DemandProductController.php
  3. 7
      app/Admin/Controllers/GuideController.php
  4. 8
      app/Admin/Controllers/SupplierController.php
  5. 2
      app/Admin/Extensions/Grid/AuditAgent.php
  6. 57
      app/Admin/Extensions/Grid/AuditDemandProduct.php
  7. 2
      app/Admin/Extensions/Grid/AuditGuide.php
  8. 2
      app/Admin/Extensions/Grid/AuditSupplier.php
  9. 1
      app/Admin/routes.php
  10. 87
      app/AdminAgent/Actions/Grid/DemandConfirm.php
  11. 26
      app/AdminAgent/Controllers/AgentProductController.php
  12. 5
      app/AdminAgent/Controllers/CategoryController.php
  13. 21
      app/AdminAgent/Controllers/DemandBiddingController.php
  14. 71
      app/AdminAgent/Controllers/DemandController.php
  15. 132
      app/AdminAgent/Controllers/MyDemandController.php
  16. 71
      app/AdminAgent/Controllers/MyDemandProductController.php
  17. 2
      app/AdminAgent/Controllers/OrderController.php
  18. 10
      app/AdminAgent/Forms/Setting.php
  19. 2
      app/AdminAgent/Renderable/SelectProduct.php
  20. 2
      app/AdminAgent/routes.php
  21. 99
      app/AdminGuide/Controllers/DemandBiddingController.php
  22. 213
      app/AdminGuide/Controllers/DemandController.php
  23. 79
      app/AdminGuide/Controllers/MyDemandProductController.php
  24. 16
      app/AdminGuide/Repositories/Demand.php
  25. 16
      app/AdminGuide/Repositories/DemandBidding.php
  26. 3
      app/AdminGuide/routes.php
  27. 172
      app/AdminSupplier/Controllers/DemandBiddingController.php
  28. 225
      app/AdminSupplier/Controllers/DemandController.php
  29. 139
      app/AdminSupplier/Controllers/DemandProductController.php
  30. 71
      app/AdminSupplier/Controllers/MyDemandProductController.php
  31. 47
      app/AdminSupplier/Renderable/SelectProduct.php
  32. 16
      app/AdminSupplier/Repositories/Demand.php
  33. 16
      app/AdminSupplier/Repositories/DemandBidding.php
  34. 16
      app/AdminSupplier/Repositories/DemandProduct.php
  35. 7
      app/AdminSupplier/routes.php
  36. 8
      app/Common/PayType.php
  37. 51
      app/Http/Controllers/Api/OrderController.php
  38. 2
      app/Http/Controllers/Api/TestController.php
  39. 2
      app/Http/Controllers/Api/WxpayController.php
  40. 2
      app/Models/Agent.php
  41. 5
      app/Models/AgentSetting.php
  42. 16
      app/Models/Demand.php
  43. 5
      app/Models/DemandBidding.php
  44. 52
      app/Models/DemandProduct.php
  45. 50
      app/Providers/DemandBiddingServiceProvider.php
  46. 115
      app/Service/SmsService.php
  47. 18
      app/Traits/DemandTraits.php
  48. 3
      composer.json
  49. 154
      composer.lock
  50. 2
      config/app.php
  51. 16
      config/sms.php
  52. 4
      resources/lang/zh_CN/agent-product.php
  53. 25
      resources/lang/zh_CN/demand-product.php
  54. 21
      resources/lang/zh_CN/my-demand-product.php
  55. 4
      resources/lang/zh_CN/setting.php

11
MySQL_change.sql

@ -210,3 +210,14 @@ ALTER TABLE `notices`
ADD COLUMN `author` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '作者' COLLATE 'utf8_general_ci' AFTER `sort`;
ALTER TABLE `articles`
ADD COLUMN `agent_product_ids` TEXT NULL DEFAULT NULL COMMENT '绑定产品' AFTER `sort`;
# 9:28 2021/8/30
ALTER TABLE `agent_products`
ADD COLUMN `deposit` DECIMAL(20,2) NOT NULL DEFAULT 0 COMMENT '订金' AFTER `content`,
ADD COLUMN `deposit_timeout` INT NOT NULL DEFAULT 0 COMMENT '订金支付超时时间,单位:分钟' AFTER `deposit`,
ADD COLUMN `earnest` DECIMAL(20,2) NOT NULL DEFAULT '0' COMMENT '定金' AFTER `deposit_timeout`,
ADD COLUMN `earnest_timeout` INT NOT NULL DEFAULT 0 COMMENT '定金支付超时时间,单位:分钟' AFTER `earnest`;
# 10:58 2021/8/30
ALTER TABLE `orders`
ADD COLUMN `timeout` TIMESTAMP NULL DEFAULT NULL COMMENT '订单超时时间,超过这个时间,订单将变为“已取消”' AFTER `verify_code`;

71
app/Admin/Controllers/DemandProductController.php

@ -0,0 +1,71 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Extensions\Grid\AuditDemandProduct;
use App\Admin\Repositories\Product;
use App\Common\ProductStatus;
use App\Common\UserStatus;
use App\Models\Category;
use App\Models\DemandProduct;
use App\Models\Supplier;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Illuminate\Support\Facades\Route;
class DemandProductController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new DemandProduct(['supplier:id,name', 'category:id,name']), function (Grid $grid) {
$grid->disableCreateButton();
//如果是审核页面,多加where条件判断
if (strpos(Route::current()->uri, 'audit')) {
$grid->model()->where('status', ProductStatus::UNAUDITED);
}
$grid->column('id')->sortable();
$grid->column('category.name', '分类');
$grid->column('picture')->image('', 60, 60);
$grid->column('title');
$grid->column('sale');
$grid->column('supplier.name', '供应商');
$grid->column('status')
->if(fn() => $this->status == ProductStatus::UNAUDITED)
->display('')
->then(function ($column) {
$column->append((new AuditDemandProduct(null, 1))->setKey($this->id))->append('&nbsp;');
$column->append((new AuditDemandProduct(null, 2))->setKey($this->id));
})
->else()
->using(ProductStatus::array())
->dot([
ProductStatus::ON_SALE => 'success',
ProductStatus::UNAUDITED => '',
ProductStatus::REFUSE => 'danger',
ProductStatus::SOLD_OUT => 'warning',
], 'primary');
$grid->column('created_at');
$grid->column('updated_at');
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->panel();
$filter->equal('id')->width(2);
$filter->like('title')->width(3);
$filter->equal('status')->select(ProductStatus::array())->width(2);
});
});
}
}

7
app/Admin/Controllers/GuideController.php

@ -9,6 +9,7 @@ use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
class GuideController extends AdminController
@ -131,6 +132,12 @@ class GuideController extends AdminController
$form->$k = '';
}
}
})->saved(function (Form $form) {
//插入权限表
if ($form->status == UserStatus::NORMAL) {
DB::table(config('admin-guide.database.role_users_table'))
->insertOrIgnore(['role_id' => 1, 'user_id' => $form->getKey()]);
}
});
}
}

8
app/Admin/Controllers/SupplierController.php

@ -7,10 +7,12 @@ use App\Admin\Repositories\Supplier;
use App\Common\ProductStatus;
use App\Common\UserStatus;
use App\Models\Product;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
class SupplierController extends AdminController
@ -150,6 +152,12 @@ class SupplierController extends AdminController
if ($form->status == UserStatus::DISABLED) {
Product::where('supplier_id', $form->getKey())->update(['status' => ProductStatus::SOLD_OUT]);
}
//插入权限表
if ($form->status == UserStatus::NORMAL) {
DB::table(config('admin-supplier.database.role_users_table'))
->insertOrIgnore(['role_id' => 1, 'user_id' => $form->getKey()]);
}
});
}
}

2
app/Admin/Extensions/Grid/AuditAgent.php

@ -111,7 +111,7 @@ class AuditAgent extends RowAction
//插入权限表
if ($user->status == UserStatus::NORMAL) {
DB::table(config('admin-agent.database.role_users_table'))
->insertOrIgnore(['role_id' => 1, 'user_id' => Admin::user()->id]);
->insertOrIgnore(['role_id' => 1, 'user_id' => $this->getKey()]);
}
//TODO 还需要插入 演示产品、公告、专题等

57
app/Admin/Extensions/Grid/AuditDemandProduct.php

@ -0,0 +1,57 @@
<?php
namespace App\Admin\Extensions\Grid;
use App\Common\ProductStatus;
use App\Models\DemandProduct;
use App\Models\Product;
use Dcat\Admin\Grid\RowAction;
use Illuminate\Http\Request;
/**
* 供应商审核
* Class AuditSupplier
* @package App\Admin\Extensions\Grid
*/
class AuditDemandProduct extends RowAction
{
private $action;
public function __construct($title = null, $action = 1)
{
parent::__construct($title);
$this->action = $action; //$action:1=通过;2=拒绝
$this->title = $action == 1 ? '通过' : '拒绝';
}
protected function html()
{
$class = $this->action == 1 ? 'btn btn-sm btn-success' : 'btn btn-sm btn-danger';
$this->appendHtmlAttribute('class', $class);
$this->defaultHtmlAttribute('href', 'javascript:;');
return "<a {$this->formatHtmlAttributes()}>{$this->title}</a>";
}
public function handle(Request $request)
{
try {
$product = DemandProduct::find($this->getKey());
$product->status = $request->action == 1 ? ProductStatus::ON_SALE : ProductStatus::REFUSE;
$product->save();
return $this->response()->success("审核成功")->refresh();
} catch (\Exception $e) {
return $this->response()->error($e->getMessage());
}
}
public function confirm()
{
return ['确定要'.$this->title.'该产品吗?', ''];
}
public function parameters()
{
return ['action' => $this->action];
}
}

2
app/Admin/Extensions/Grid/AuditGuide.php

@ -43,7 +43,7 @@ class AuditGuide extends RowAction
//插入权限表
if ($user->status == UserStatus::NORMAL) {
DB::table(config('admin-guide.database.role_users_table'))
->insertOrIgnore(['role_id' => 1, 'user_id' => Admin::user()->id]);
->insertOrIgnore(['role_id' => 1, 'user_id' => $this->getKey()]);
}
return $this->response()->success("审核成功")->refresh();

2
app/Admin/Extensions/Grid/AuditSupplier.php

@ -43,7 +43,7 @@ class AuditSupplier extends RowAction
//插入权限表
if ($user->status == UserStatus::NORMAL) {
DB::table(config('admin-supplier.database.role_users_table'))
->insertOrIgnore(['role_id' => 1, 'user_id' => Admin::user()->id]);
->insertOrIgnore(['role_id' => 1, 'user_id' => $this->getKey()]);
}
return $this->response()->success("审核成功")->refresh();

1
app/Admin/routes.php

@ -26,4 +26,5 @@ Route::group([
$router->resource('category/list', 'CategoryController');
$router->resource('product/list', 'ProductController');
$router->resource('product/audit', 'ProductController');
$router->resource('demand/product', 'DemandProductController');
});

87
app/AdminAgent/Actions/Grid/DemandConfirm.php

@ -0,0 +1,87 @@
<?php
namespace App\AdminAgent\Actions\Grid;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Dcat\Admin\Grid\Tools\AbstractTool;
use Dcat\Admin\Traits\HasPermissions;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class DemandConfirm extends RowAction
{
protected $model;
public function __construct(string $model = null)
{
$this->model = $model;
}
/**
* 标题
*
* @return string
*/
public function title()
{
return 'Copy';
}
/**
* 设置确认弹窗信息,如果返回空值,则不会弹出弹窗
*
* 允许返回字符串或数组类型
*
* @return array|string|void
*/
public function confirm()
{
return [
// 确认弹窗 title
"您确定要复制这行数据吗?",
// 确认弹窗 content
$this->row->username,
];
}
/**
* 处理请求
*
* @param Request $request
*
* @return \Dcat\Admin\Actions\Response
*/
public function handle(Request $request)
{
// 获取当前行ID
$id = $this->getKey();
// 获取 parameters 方法传递的参数
$username = $request->get('username');
$model = $request->get('model');
// 复制数据
$model::find($id)->replicate()->save();
// 返回响应结果并刷新页面
return $this->response()->success("复制成功: [{$username}]")->refresh();
}
/**
* 设置要POST到接口的数据
*
* @return array
*/
public function parameters()
{
return [
// 发送当前行 username 字段数据到接口
'username' => $this->row->username,
// 把模型类名传递到接口
'model' => $this->model,
];
}
}

26
app/AdminAgent/Controllers/AgentProductController.php

@ -125,6 +125,10 @@ class AgentProductController extends AdminController
$show->field('pictures')->image('', 80, 80);
$show->field('know')->unescape();
$show->field('content')->unescape();
$show->field('earnest');
$show->field('earnest_timeout');
$show->field('deposit');
$show->field('deposit_timeout');
$show->field('created_at');
$show->field('updated_at');
@ -152,7 +156,6 @@ class AgentProductController extends AdminController
{
return Form::make(new AgentProduct(), function (Form $form) {
$agent_id = Admin::user()->id;
//不允许查看非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
@ -185,7 +188,9 @@ class AgentProductController extends AdminController
$form->editor('know');
$form->editor('content');
});
$form->text('price')->required();
$form->text('title', '产品名称');
$form->text('price')->required();
$form->text('original_price')->required();
$form->text('sale')->default(0);
$form->text('stock')->default(8888)->required();
@ -222,6 +227,11 @@ class AgentProductController extends AdminController
->from(SelectGuide::make())
->model(Guide::class, 'id', 'name');
}
$form->text('earnest')->default(0)->help('单位:元。不输入或输入 0 则不支持定金支付,必须和定金超时时间同时设置才会生效');
$form->text('earnest_timeout')->default(0)->help('单位:分钟。超过这个时间未支付,订单将自动关闭');
$form->text('deposit')->default(0)->help('单位:元。不输入或输入 0 则不支持订金支付,必须和订金超时时间同时设置才会生效');
$form->text('deposit_timeout')->default(0)->help('单位:分钟。超过这个时间未支付,订单将自动关闭');
})->saving(function (Form $form) {
//不允许修改非自己的数据
if ($form->isEditing() && $form->model()->agent_id != Admin::user()->id) {
@ -305,12 +315,20 @@ class AgentProductController extends AdminController
//处理特殊字段
$form->hidden(['agent_id', 'status']); //表单没有的字段,必须加这句才能够重写
$form->agent_id = $agent_id;
if (array_key_exists($form->status, $form->input())) {
if (array_key_exists('status', $form->input())) {
$form->status = $form->status == ProductStatus::ON_SALE ? ProductStatus::ON_SALE : ProductStatus::SOLD_OUT;
}
if (array_key_exists($form->guide_id, $form->input())) {
if (array_key_exists('guide_id', $form->input())) {
$form->guide_id = $form->guide_id ?? 0;
}
if ($form->earnest <= 0 || $form->earnest_timeout <= 0) {
$form->earnest = 0;
$form->earnest_timeout = 0;
}
if ($form->deposit <= 0 || $form->deposit_timeout <= 0) {
$form->deposit = 0;
$form->deposit_timeout = 0;
}
//不允许编辑的字段
$form->ignore(['id', 'agent_id', 'status', 'created_at', 'updated_at', 'deleted_at']);

5
app/AdminAgent/Controllers/CategoryController.php

@ -100,8 +100,11 @@ class CategoryController extends AdminController
//不允许编辑的字段
$form->ignore(['id', 'deleted_at']);
$form->hidden(['agent_id']);
$form->agent_id = Admin::user()->id;
$form->sort = $form->sort ?? 255;
if (array_key_exists('sort', $form->input())) {
$form->sort = $form->sort ?? 255;
}
})->deleting(function (Form $form) {
//不允许修改非自己的数据
if (array_filter($form->model()->toArray(), fn($v) => $v['agent_id'] != Admin::user()->id)) {

21
app/AdminAgent/Controllers/DemandBiddingController.php

@ -21,11 +21,20 @@ class DemandBiddingController extends AdminController
*/
protected function grid()
{
return Grid::make(new DemandBidding(), function (Grid $grid) {
return Grid::make(new DemandBidding(['demand']), function (Grid $grid) {
$grid->model()->where(['bidding_user_id' => Admin::user()->id,'bidding_user_type' => Arr::first(DemandTraits::$col)]);
$grid->column('id')->sortable();
$grid->column('price');
$grid->column('comment');
$grid->column('demand.title','竞拍标题');
$grid->column('demand.comment','竞拍内容');
$grid->column('state','状态')->using(DemandTraits::$biddingState)->dot(
[
'yellow',
'success',
'danger',
]
);
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->disableDeleteButton();
@ -67,9 +76,12 @@ class DemandBiddingController extends AdminController
protected function form()
{
return Form::make(new DemandBidding(), function (Form $form) {
$form->display('id');
$form->disableEditingCheck();
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->display('id');
$form->text('price');
$form->text('comment');
$form->textarea('comment');
$form->hidden('demand_id')->value(request('demand_id',0));
$form->hidden('bidding_user_type');
$form->hidden('bidding_user_id');
@ -77,9 +89,10 @@ class DemandBiddingController extends AdminController
// 判断是否是新增操作
if ($form->isCreating()) {
//发布人身份
$form->bidding_user_type = 'App\models\Agent';
$form->bidding_user_type = DemandTraits::$col[0];
$form->bidding_user_id = Admin::user()->id;
}
$form->response()->success('操作成功')->redirect('demand_bidding');
});
});
}

71
app/AdminAgent/Controllers/DemandController.php

@ -2,6 +2,8 @@
namespace App\AdminAgent\Controllers;
use App\AdminAgent\Actions\Grid\DemandConfirm;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\Models\AgentProduct;
use App\Models\Product;
use App\Traits\ResponseHelper;
@ -32,6 +34,9 @@ class DemandController extends AdminController
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser']), function (Grid $grid) {
if (\request('self',0)) {
$grid->model()->where(['publisher_id' => Admin::user()->id,'publisher_type' => DemandTraits::$col[0]]);
}
$grid->column('id')->sortable();
$grid->column('title');
$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
@ -55,20 +60,37 @@ class DemandController extends AdminController
3 => 'danger',
]
);
//$grid->setActionClass(Grid\Displayers\Actions::class);
//
//$grid->actions(function (Grid\Displayers\Actions $actions) {
// $actions->append(new DemandConfirm(1));
//});
if (\request('self',0)) {
$grid->column('bidding','竞标明细')
->display(function (){
return '竞标数 : '. DemandBidding::query()->where('demand_id',$this->id)->count();
})
->modal('竞标明细',function () {
return DemandBiddingLazys::make(['demand_id' => $this->id]);
});
}else{
$grid->column('bidding','竞标')
->if(function (){
return $this->state == 1 && $this->bidding_user_type == Arr::first(DemandTraits::$col);
})
->then(function (Grid\Column $column) {
$column->append('<a class="btn btn-sm btn-primary" href="'.admin_url('/demand_bidding/create?demand_id='.$this->id).'">发起竞标</a>');
});
}
$grid->column('bidding','竞标')
->if(function (){
return $this->state == 1 && $this->bidding_user_type == Arr::first(DemandTraits::$col);
})
->then(function (Grid\Column $column) {
$column->append('<a class="btn btn-sm btn-primary" href="'.admin_url('/demand_bidding/create?demand_id='.$this->id).'">发起竞标</a>');
});
$grid->column('created_at')->sortable();
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
//$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
@ -127,8 +149,8 @@ class DemandController extends AdminController
$form->hidden('deadline');
$form->select('bidding_user_type','竞标用户类型')
->when([2],function (Form $form){
$form->select('product_id','产品')->options(function (){
return Product::query()->whereIn('agent_id',[0,Admin::user()->id])->pluck('title','id');
$form->select('agent_product_id','产品')->options(function (){
return AgentProduct::query()->where('agent_id',Admin::user()->id)->where('status',1)->pluck('title','id');
});
})
->options([
@ -144,7 +166,7 @@ class DemandController extends AdminController
// 判断是否是新增操作
if ($form->isCreating()) {
if ($form->bidding_user_type != 2) {
$form->product_id = 0;
$form->demand_product_id = 0;
}
$form->bidding_user_type = DemandTraits::$col[$form->bidding_user_type];
//处理流拍时间
@ -173,30 +195,19 @@ class DemandController extends AdminController
DB::beginTransaction();
try {
//新建供应商订单
$product = new Product();
$product->agent_id = $demand->publisher_id;
$product->title = $demand->title;
$product->pictures = $demand->images;
$product->price = $demand->price;
$product->original_price = $demand->price;
$product->stock = $demand->stock;
$product->state = 0;
$product->save();
//处理代理商订单
$agentProduct = new AgentProduct();
$agentProduct->agent_id = $demand->publisher_id;
$agentProduct->product_id = $product->id;
$agentProduct->stock = $demand->stock;
$agentProduct->price = $demand->price;
$agentProduct->original_price = $demand->price;
$agentProduct->state = 0;
$agentProduct->save();
$demandBidding->state = 1;
$demandBidding->save();
//改变订单状态
$demand->bidding_id = $demandBidding->id;
$demand->bidding_user_id = $demandBidding->bidding_user_id;
$demand->state = DemandTraits::$stateKey[1];
$demand->save();
//如果是地接类型 绑定地接到订单
if ($demand->bidding_user_type == DemandTraits::$col[2]){
$agentProduct = AgentProduct::find($demand->agent_product_id);
$agentProduct->guide_id = $demandBidding->bidding_user_id;
$agentProduct->save();
}
DB::commit();
} catch (\Exception $e) {
Log::error('选中竞标失败::'.$e->getTraceAsString());

132
app/AdminAgent/Controllers/MyDemandController.php

@ -1,132 +0,0 @@
<?php
namespace App\AdminAgent\Controllers;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\AdminAgent\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Support\Arr;
class MyDemandController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser']), function (Grid $grid) {
$grid->model()->where(['publisher_id' => Admin::user()->id,'publisher_type' => Arr::first(DemandTraits::$col)]);
$grid->column('id')->sortable();
$grid->column('title');
$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
$modal->xl();
return $this->comment;
});
$grid->column('images','图片')->display(function ($image) {
return json_decode($image,true);
})->image();
$grid->column('deadline');
$grid->column('biddingUser.name','中标人');
$grid->column('bidding_user_type','竞标用户类型')->using(DemandTraits::$polymorphic);
$grid->column('price');
$grid->column('stock');
$grid->column('state')->using(DemandTraits::$state)->dot(
[
1 => 'yellow',
2 => 'success',
3 => 'danger',
]
);
$grid->column('bidding','竞标明细')
->display(function (){
return '竞标数 : '. DemandBidding::query()->where('demand_id',$this->id)->count();
})
->modal('竞标明细',function () {
return DemandBiddingLazys::make(['demand_id' => $this->id]);
});
$grid->column('created_at')->sortable();
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new Demand(['publisher','biddingUser']), function (Show $show) {
$show->field('id');
$show->field('title');
$show->field('comment');
$show->field('images')->image();
$show->field('deadline');
$show->field('bidding_user_type','竞标用户类型')->using(DemandTraits::$polymorphic);
$show->field('price');
$show->field('stock');
$show->field('state')->using(DemandTraits::$state)->dot(
[
1 => 'yellow',
2 => 'danger',
3 => 'success',
]
);;
$show->field('created_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Demand(), function (Form $form) {
$form->display('id');
$form->text('title');
$form->text('comment');
$form->multipleImage('images','图片');
$form->hidden('deadline');
$form->select('bidding_user_type','竞标用户类型')->options([
'App\models\Supplier' => '供应商',
'App\models\Guides' => '地接'
]);
$form->decimal('price');
$form->number('stock');
$form->hidden('publisher_type');
$form->hidden('publisher_id');
$form->saving(function (Form $form) {
// 判断是否是新增操作
if ($form->isCreating()) {
//处理流拍时间
$form->deadline = now()->addDays(5);
//发布人身份
$form->publisher_type = 'App\models\Agent';
$form->publisher_id = Admin::user()->id;
}
});
});
}
}

71
app/AdminAgent/Controllers/MyDemandProductController.php

@ -0,0 +1,71 @@
<?php
namespace App\AdminAgent\Controllers;
use App\AdminAgent\Actions\Grid\DemandConfirm;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\Common\ProductStatus;
use App\Models\AgentProduct;
use App\Models\Product;
use App\Traits\ResponseHelper;
use App\AdminAgent\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
class MyDemandProductController extends AdminController
{
use ResponseHelper;
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser','product.category']), function (Grid $grid) {
$grid->model()
->where(['publisher_id' => Admin::user()->id,'publisher_type' => DemandTraits::$col[0]])
->where('product_id','>',0);
$grid->column('id')->sortable();
//$grid->column('title');
//$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
// $modal->xl();
// return $this->comment;
//});
$grid->column('biddingUser.name','中标人');
$grid->column('price','发标价格');
$grid->column('product.category.name', '产品分类');
$grid->column('product.title','产品标题');
$grid->column('product.picture','产品图片')->image('', 60, 60);
$grid->column('product.price','产品售价');
$grid->column('product.original_price','产品原价');
$grid->column('product.stock','产品库存');
$grid->column('product.sale','产品销量');
$grid->column('product.status','产品状态')->using(ProductStatus::array());
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
});
});
}
}

2
app/AdminAgent/Controllers/OrderController.php

@ -52,6 +52,7 @@ class OrderController extends AdminController
$grid->column('status')
->using(OrderStatus::array())
->if(fn() => in_array($this->status, [OrderStatus::REFUNDING, OrderStatus::REFUNDED, OrderStatus::REFUSED_REFUND]))
->display('<a style="cursor: pointer;" class="btn btn-sm btn-info" href="javascript:;">退款详情</a>&nbsp;')
->modal('查看退款详情', function (Grid\Displayers\Modal $modal) {
$modal->icon('');
if (!$this->refund_info) {
@ -74,7 +75,6 @@ class OrderController extends AdminController
];
return Table::make($refund_info);
})
->display('<a style="cursor: pointer;" class="btn btn-sm btn-info" href="javascript:;">退款详情</a>&nbsp;') //放在modal下面可以去掉空格
->then(function (Grid\Column $column) {
if ($this->status == OrderStatus::REFUNDING) {
$column->append((new AuditRefund(null, 1))->setKey($this->id))->append('&nbsp;');

10
app/AdminAgent/Forms/Setting.php

@ -21,7 +21,7 @@ class Setting extends Form
AgentSetting::updateOrCreate(
['agent_id' => Admin::user()->id],
['setting' => json_encode($input), 'agent_id' => Admin::user()->id],
['setting' => $input, 'agent_id' => Admin::user()->id],
);
return $this->response()->success('保存成功')->refresh();
@ -32,8 +32,10 @@ class Setting extends Form
*/
public function form()
{
$this->text('earnest')->required()->help('用户支付订金、定金、首付款的金额');
$this->text('earnest_timeout')->required()->help('单位:分钟。当通过订金、定金、首付款支付时,用户超过该时间未支付将关闭订单,且定金不退');
$this->text('order_timeout')->required()->default(1440)
->help('订单超时时间,单位:分钟。(订金、定金支付的超时时间将根据产品设定的超时时间)');
$this->radio('auto_shelves')->options(['否', '是'])->required()->default(1)
->help('是否自动上架合作供应商的产品,如果选是,当合作供应商发布新产品之后,将自动上架供应商的产品');
}
/**
@ -44,6 +46,6 @@ class Setting extends Form
public function default()
{
$setting = AgentSetting::where('agent_id', Admin::user()->id)->value('setting');
return is_string($setting) ? json_decode($setting, true) : [];
return $setting ?? [];
}
}

2
app/AdminAgent/Renderable/SelectProduct.php

@ -28,7 +28,7 @@ class SelectProduct extends LazyRenderable
$grid->quickSearch(['title', 'supplier.name'])->placeholder('搜索产品名称、供应商');
$grid->column('id');
$grid->column('supplier.name', '供应商');
//$grid->column('supplier.name', '供应商');
$grid->column('title');
$grid->column('picture')->image('',60, 60);
$grid->column('sale');

2
app/AdminAgent/routes.php

@ -26,7 +26,7 @@ Route::group([
$router->resource('demand', 'DemandController');
$router->resource('demand_bidding', 'DemandBiddingController');
$router->resource('my_demand', 'MyDemandController');
$router->resource('my_demand_product', 'MyDemandProductController');
$router->resource('message/list', 'MessageController');
$router->resource('notice/list', 'NoticeController');

99
app/AdminGuide/Controllers/DemandBiddingController.php

@ -0,0 +1,99 @@
<?php
namespace App\AdminGuide\Controllers;
use App\AdminAgent\Repositories\DemandBidding;
use App\Traits\DemandTraits;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use http\Env\Request;
use Illuminate\Support\Arr;
class DemandBiddingController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new DemandBidding(['demand']), function (Grid $grid) {
$grid->model()->where(['bidding_user_id' => Admin::user()->id,'bidding_user_type' => DemandTraits::$col[2]]);
$grid->column('id')->sortable();
$grid->column('price');
$grid->column('comment');
$grid->column('demand.title','竞拍标题');
$grid->column('demand.comment','竞拍内容');
$grid->column('state','状态')->using(DemandTraits::$biddingState)->dot(
[
'yellow',
'success',
'danger',
]
);
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableCreateButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new DemandBidding(), function (Show $show) {
$show->field('id');
$show->field('price');
$show->field('comment');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new DemandBidding(), function (Form $form) {
$form->disableEditingCheck();
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->display('id');
$form->text('price');
$form->textarea('comment');
$form->hidden('demand_id')->value(request('demand_id',0));
$form->hidden('bidding_user_type');
$form->hidden('bidding_user_id');
$form->saving(function (Form $form) {
// 判断是否是新增操作
if ($form->isCreating()) {
//发布人身份
$form->bidding_user_type = DemandTraits::$col[2];
$form->bidding_user_id = Admin::user()->id;
}
$form->response()->success('操作成功')->redirect('demand_bidding');
});
});
}
}

213
app/AdminGuide/Controllers/DemandController.php

@ -0,0 +1,213 @@
<?php
namespace App\AdminGuide\Controllers;
use App\AdminAgent\Actions\Grid\DemandConfirm;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\Models\AgentProduct;
use App\Models\Product;
use App\Traits\ResponseHelper;
use App\AdminAgent\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
class DemandController extends AdminController
{
use ResponseHelper;
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser']), function (Grid $grid) {
if (\request('self',0)) {
$grid->model()->where(['publisher_id' => Admin::user()->id,'publisher_type' => DemandTraits::$col[2]]);
}
$grid->column('id')->sortable();
$grid->column('title');
$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
$modal->xl();
return $this->comment;
});
$grid->column('images','图片')->display(function ($image) {
return json_decode($image,true);
})->image();
$grid->column('deadline');
$grid->column('publisher.name','发布人');
$grid->column('publisher_type')->using(DemandTraits::$polymorphic);
$grid->column('biddingUser.name','中标人');
$grid->column('bidding_user_type','竞标用户类型')->using(DemandTraits::$polymorphic);
$grid->column('price');
$grid->column('stock');
$grid->column('state')->using(DemandTraits::$state)->dot(
[
1 => 'yellow',
2 => 'success',
3 => 'danger',
]
);
//$grid->setActionClass(Grid\Displayers\Actions::class);
//
//$grid->actions(function (Grid\Displayers\Actions $actions) {
// $actions->append(new DemandConfirm(1));
//});
if (\request('self',0)) {
$grid->column('bidding','竞标明细')
->display(function (){
return '竞标数 : '. DemandBidding::query()->where('demand_id',$this->id)->count();
})
->modal('竞标明细',function () {
return DemandBiddingLazys::make(['demand_id' => $this->id]);
});
}else{
$grid->column('bidding','竞标')
->if(function (){
return $this->state == 1 && $this->bidding_user_type == DemandTraits::$col[2];
})
->then(function (Grid\Column $column) {
$column->append('<a class="btn btn-sm btn-primary" href="'.admin_url('/demand_bidding/create?demand_id='.$this->id).'">发起竞标</a>');
});
}
$grid->column('created_at')->sortable();
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
//$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new Demand(['publisher','biddingUser']), function (Show $show) {
$show->field('id');
$show->field('title');
$show->field('comment');
$show->field('images')->image();
$show->field('deadline');
$show->field('bidding_user_type','竞标用户类型')->using(DemandTraits::$polymorphic);
$show->field('price');
$show->field('stock');
$show->field('publisher_type')->using(DemandTraits::$polymorphic);
$show->field('publisher.name','发布人');
$show->field('state')->using(DemandTraits::$state)->dot(
[
1 => 'yellow',
2 => 'danger',
3 => 'success',
]
);;
$show->field('created_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Demand(), function (Form $form) {
$form->disableEditingCheck();
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->display('id');
$form->text('title');
$form->text('comment');
$form->multipleImage('images','图片')->limit(5)->saving(function ($path) {
return json_encode($path);
});
$form->hidden('deadline');
$form->select('bidding_user_type','竞标用户类型')
->when([2],function (Form $form){
$form->select('demand_product_id','产品')->options(function (){
return Product::query()->whereIn('agent_id',[0,Admin::user()->id])->pluck('title','id');
});
})
->options([
1 => '供应商',
2 => '地接'
])
->default(1);
$form->decimal('price');
$form->number('stock');
$form->hidden('publisher_type');
$form->hidden('publisher_id');
$form->saving(function (Form $form) {
// 判断是否是新增操作
if ($form->isCreating()) {
if ($form->bidding_user_type != 2) {
$form->demand_product_id = 0;
}
$form->bidding_user_type = DemandTraits::$col[$form->bidding_user_type];
//处理流拍时间
$form->deadline = now()->addDays(5);
//发布人身份
$form->publisher_type = DemandTraits::$col[2];
$form->publisher_id = Admin::user()->id;
}
});
});
}
public function binding()
{
$demandBiddingId = request('demand_bidding_id',0);
$demandBidding = DemandBidding::find($demandBiddingId);
if (empty($demandBidding)) {
return false;
}
$demand = \App\Models\Demand::find($demandBidding->demand_id);
if (empty($demand)) {
return false;
}
DB::beginTransaction();
try {
$demandBidding->state = 1;
$demandBidding->save();
//改变订单状态
$demand->bidding_id = $demandBidding->id;
$demand->bidding_user_id = $demandBidding->bidding_user_id;
$demand->state = DemandTraits::$stateKey[1];
$demand->save();
DB::commit();
} catch (\Exception $e) {
Log::error('选中竞标失败::'.$e->getTraceAsString());
DB::rollBack();
return $this->jsonFail(1001,'选中竞标失败,稍后重试或联系管理员!'.$e->getMessage());
}
return back();
}
}

79
app/AdminGuide/Controllers/MyDemandProductController.php

@ -0,0 +1,79 @@
<?php
namespace App\AdminGuide\Controllers;
use App\AdminAgent\Actions\Grid\DemandConfirm;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\Common\ProductStatus;
use App\Models\AgentProduct;
use App\Models\Channel;
use App\Models\Product;
use App\Traits\ResponseHelper;
use App\AdminAgent\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
class MyDemandProductController extends AdminController
{
use ResponseHelper;
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser','agentProduct.category']), function (Grid $grid) {
$grid->model()
->where(['bidding_user_id' => Admin::user()->id,'bidding_user_type' => DemandTraits::$col[2]])
->where('agent_product_id','>',0);
$grid->column('id')->sortable();
//$grid->column('title');
//$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
// $modal->xl();
// return $this->comment;
//});
$grid->column('agentProduct.picture', '产品图片')->image('', 60, 60);
$grid->column('agentProduct.title', '产品名称')->limit(15);
$grid->column('agentProduct.price','产品价格');
$grid->column('agentProduct.original_price','产品原价');
$grid->column('agentProduct.sale','产品销量');
$grid->column('agentProduct.stock','产品库存');
$grid->column('channel_id', '频道')
->display(function ($modal) {
$channels = Channel::where('agent_id', $this->publisher_id)->pluck('name', 'id')->toArray();
$data = array_flip(explode(',', $this->channel_id));
return join(',',array_intersect_key($channels, $data));
})
->limit(10);
$grid->column('agentProduct.category.name', '分类');
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
});
});
}
}

16
app/AdminGuide/Repositories/Demand.php

@ -0,0 +1,16 @@
<?php
namespace App\AdminGuide\Repositories;
use App\Models\Demand as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class Demand extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

16
app/AdminGuide/Repositories/DemandBidding.php

@ -0,0 +1,16 @@
<?php
namespace App\AdminGuide\Repositories;
use App\Models\DemandBidding as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class DemandBidding extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

3
app/AdminGuide/routes.php

@ -16,4 +16,7 @@ Route::group([
$router->post('auth/login', 'AuthController@postLogin');
$router->resource('order/list', 'OrderController');
$router->resource('demand', 'DemandController');
$router->resource('demand_bidding', 'DemandBiddingController');
$router->resource('my_demand_product', 'MyDemandProductController');
});

172
app/AdminSupplier/Controllers/DemandBiddingController.php

@ -0,0 +1,172 @@
<?php
namespace App\AdminSupplier\Controllers;
use App\AdminSupplier\Renderable\SelectProduct;
use App\AdminSupplier\Repositories\DemandBidding;
use App\Models\AgentProduct;
use App\Models\AgentProductItem;
use App\Models\Demand;
use App\Models\DemandProduct;
use App\Models\Product;
use App\Traits\DemandTraits;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class DemandBiddingController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new DemandBidding(['demand']), function (Grid $grid) {
$grid->model()->where(['bidding_user_id' => Admin::user()->id,'bidding_user_type' => DemandTraits::$col[1]]);
$grid->column('id')->sortable();
$grid->column('price');
$grid->column('comment');
$grid->column('demand.title','竞拍标题');
$grid->column('demand.comment','竞拍内容');
$grid->column('state','状态')->using(DemandTraits::$biddingState)->dot(
[
'yellow',
'success',
'danger',
]
);
$grid->column('bidding','操作')
->if(function (){
return $this->state == 1 && $this->bidding_user_type == DemandTraits::$col[1] && empty($this->demand->demand_product_id);
})
->then(function (Grid\Column $column) {
$column->append('<a class="btn btn-sm btn-success" href="'.admin_url('/demand_bidding/'.$this->id.'/edit?is_bidding=true').'">绑定产品</a>');
})
->if(function (){
return $this->state == 1 && $this->bidding_user_type == DemandTraits::$col[1] && !empty($this->demand->demand_product_id);
})
->then(function (Grid\Column $column) {
$column->append('<a class="btn btn-sm btn-primary" href="'.admin_url('/demand_product/'.$this->demand->demand_product_id).'">查看产品</a>');
});
$grid->column('created_at');
$grid->column('updated_at')->sortable();
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableCreateButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new DemandBidding(), function (Show $show) {
$show->field('id');
$show->field('price');
$show->field('comment');
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new DemandBidding(), function (Form $form) {
$form->disableEditingCheck();
$form->disableCreatingCheck();
$form->disableDeleteButton();
$form->disableViewButton();
$form->disableViewCheck();
$form->display('id')->disable();
if(request('is_bidding',0)) {
$form->textarea('comment')->disable();
$form->selectTable('demand_product_id', '产品')
->title('选择产品')
->dialogWidth('50%;min-width:600px;') //不起作用
->from(SelectProduct::make())
->model(DemandProduct::class, 'id', 'title');
}else{
$form->text('price');
$form->textarea('comment');
}
$form->hidden('demand_id')->value(request('demand_id',0));
$form->hidden('bidding_user_type')->disable();
$form->hidden('bidding_user_id')->disable();
$form->saving(function (Form $form) {
$form->deleteInput('demand_product_id');
//发布人身份
$form->bidding_user_type = DemandTraits::$col[1];
$form->bidding_user_id = Admin::user()->id;
});
$form->saved(function (Form $form) {
if($form->isEditing()) {
$productId = request('demand_product_id', 0);
if (!empty($productId)) {
DB::beginTransaction();
try {
//处理订单
//将产品绑给代理商
$demand = Demand::find($form->model()->demand_id);
$demand->demand_product_id = $productId;
$demandProduct = DemandProduct::find($productId);
$product = new Product();
$product->supplier_id = $demandProduct->supplier_id;
$product->category_id = $demandProduct->category_id;
$product->title = $demandProduct->title;
$product->price = $form->model()->price;
$product->original_price = $form->model()->price;
$product->pictures = $demandProduct->pictures;
$product->stock = $demand->stock;
$product->know = $demandProduct->know;
$product->content = $demandProduct->content;
$product->agent_id = $form->model()->bidding_user_id;
$product->save();
//处理需求
$demand = Demand::find($form->model()->demand_id);
$demand->demand_product_id = $productId;
$demand->save();
$demand->product_id = $product->id;
$demand->save();
DB::commit();
} catch (\Exception $e) {
Log::error('分配订单失败::' . $e->getTraceAsString());
DB::rollBack();
return $form->response()->error('分配订单失败,稍后重试或联系管理员!' . $e->getMessage());
}
}
}
$form->response()->success('操作成功')->redirect('demand_bidding');
});
});
}
}

225
app/AdminSupplier/Controllers/DemandController.php

@ -0,0 +1,225 @@
<?php
namespace App\AdminSupplier\Controllers;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\Models\AgentProduct;
use App\Models\DemandProduct;
use App\Models\Product;
use App\Traits\ResponseHelper;
use App\AdminAgent\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
class DemandController extends AdminController
{
use ResponseHelper;
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser']), function (Grid $grid) {
if (\request('self',0)) {
$grid->model()->where(['publisher_id' => Admin::user()->id,'publisher_type' => DemandTraits::$col[1]]);
}
$grid->column('id')->sortable();
$grid->column('title');
$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
$modal->xl();
return $this->comment;
});
$grid->column('images','图片')->display(function ($image) {
return json_decode($image,true);
})->image();
$grid->column('deadline');
$grid->column('publisher.name','发布人');
$grid->column('publisher_type')->using(DemandTraits::$polymorphic);
$grid->column('biddingUser.name','中标人');
$grid->column('bidding_user_type','竞标用户类型')->using(DemandTraits::$polymorphic);
$grid->column('price');
$grid->column('stock');
$grid->column('state')->using(DemandTraits::$state)->dot(
[
1 => 'yellow',
2 => 'success',
3 => 'danger',
]
);
if (\request('self',0)) {
$grid->column('bidding','竞标明细')
->display(function (){
return '竞标数 : '. DemandBidding::query()->where('demand_id',$this->id)->count();
})
->modal('竞标明细',function () {
return DemandBiddingLazys::make(['demand_id' => $this->id]);
});
}else{
$grid->column('bidding','竞标')
->if(function (){
return $this->state == 1 && $this->bidding_user_type == DemandTraits::$col[1];
})
->then(function (Grid\Column $column) {
$column->append('<a class="btn btn-sm btn-primary" href="'.admin_url('/demand_bidding/create?demand_id='.$this->id).'">发起竞标</a>');
});
}
$grid->column('created_at')->sortable();
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new Demand(['publisher','biddingUser']), function (Show $show) {
$show->field('id');
$show->field('title');
$show->field('comment');
$show->field('images')->image();
$show->field('deadline');
$show->field('bidding_user_type','竞标用户类型')->using(DemandTraits::$polymorphic);
$show->field('price');
$show->field('stock');
$show->field('publisher_type')->using(DemandTraits::$polymorphic);
$show->field('publisher.name','发布人');
$show->field('state')->using(DemandTraits::$state)->dot(
[
1 => 'yellow',
2 => 'danger',
3 => 'success',
]
);;
$show->field('created_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new Demand(), function (Form $form) {
$form->disableEditingCheck();
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->display('id');
$form->text('title');
$form->text('comment');
$form->multipleImage('images','图片')->limit(5)->saving(function ($path) {
return json_encode($path);
});
$form->hidden('deadline');
$form->select('bidding_user_type','竞标用户类型')
->when([0],function (Form $form){
$form->select('demand_product_id','产品')->options(function (){
return DemandProduct::query()->where('supplier_id',Admin::user()->id)->where('status',1)->pluck('title','id');
});
})
->options([
'代理商'
])
->default(0);
$form->decimal('price');
$form->number('stock');
$form->hidden('publisher_type');
$form->hidden('publisher_id');
$form->saving(function (Form $form) {
// 判断是否是新增操作
if ($form->isCreating()) {
//if ($form->bidding_user_type != 2) {
// $form->demand_product_id = 0;
//}
$form->bidding_user_type = DemandTraits::$col[$form->bidding_user_type];
//处理流拍时间
$form->deadline = now()->addDays(5);
//发布人身份
$form->publisher_type = DemandTraits::$col[1];
$form->publisher_id = Admin::user()->id;
}
});
});
}
public function binding()
{
$demandBiddingId = request('demand_bidding_id',0);
$demandBidding = DemandBidding::find($demandBiddingId);
if (empty($demandBidding)) {
return false;
}
$demand = \App\Models\Demand::find($demandBidding->demand_id);
if (empty($demand)) {
return false;
}
DB::beginTransaction();
try {
$demandBidding->state = 1;
$demandBidding->save();
//改变订单状态
$demand->bidding_id = $demandBidding->id;
$demand->bidding_user_id = $demandBidding->bidding_user_id;
$demand->state = DemandTraits::$stateKey[1];
$demand->save();
//将产品绑给代理商
$demandProduct = DemandProduct::find($demand->demand_product_id);
$product = new Product();
$product->supplier_id = $demandProduct->supplier_id;
$product->category_id = $demandProduct->category_id;
$product->title = $demandProduct->title;
$product->price = $demandBidding->price;
$product->original_price = $demandBidding->price;
$product->pictures = $demandProduct->pictures;
$product->stock = $demand->stock;
$product->know = $demandProduct->know;
$product->content = $demandProduct->content;
$product->agent_id = $demandBidding->bidding_user_id;
$product->save();
$demand->product_id = $product->id;
$demand->save();
DB::commit();
} catch (\Exception $e) {
Log::error('选中竞标失败::'.$e->getTraceAsString());
DB::rollBack();
return $this->jsonFail(1001,'选中竞标失败,稍后重试或联系管理员!'.$e->getMessage());
}
return back();
}
}

139
app/AdminSupplier/Controllers/DemandProductController.php

@ -0,0 +1,139 @@
<?php
namespace App\AdminSupplier\Controllers;
use App\AdminSupplier\Repositories\DemandProduct;
use App\Common\ProductStatus;
use App\Models\AgentProduct;
use App\Models\Category;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Repositories\EloquentRepository;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use Illuminate\Support\Facades\DB;
class DemandProductController extends AdminController
{
protected $title = '产品';
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new DemandProduct(['category:id,name']), function (Grid $grid) {
$grid->model()->where('supplier_id', Admin::user()->id);
$grid->column('id')->sortable();
$grid->column('category.name', '产品分类');
$grid->column('title');
$grid->column('picture')->image('', 60, 60);
//$grid->column('price');
//$grid->column('original_price');
//$grid->column('stock');
$grid->column('sale');
$grid->column('status')->using(ProductStatus::array());
$grid->column('created_at');
$grid->column('updated_at');
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
});
});
}
/**
* Make a show builder.
*
* @param mixed $id
*
* @return Show
*/
protected function detail($id)
{
return Show::make($id, new DemandProduct(), function (Show $show) {
$show->field('id');
$show->field('supplier_id');
$show->field('category_id');
$show->field('title');
//$show->field('price');
//$show->field('original_price');
$show->field('pictures')->image('', 80, 80);
//$show->field('stock');
$show->field('sale');
$show->field('status');
$show->field('know')->unescape()->as(fn($v) => preg_replace('/<script.*?>.*?<\/script>/is', '', $v));
$show->field('content')->unescape()->as(fn($v) => preg_replace('/<script.*?>.*?<\/script>/is', '', $v));
$show->field('created_at');
$show->field('updated_at');
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new DemandProduct(), function (Form $form) {
//不允许编辑非自己数据
if ($form->isEditing() && $form->model()->supplier_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
}
$form->display('id');
$options = Category::selectOptions(fn($query) => $query->where('agent_id', 0));
$form->select('category_id')->options(array_slice($options, 1, null, true))->required();
$form->text('title')->required();
//$form->text('price')->required();
//$form->text('original_price')->required();
$form->multipleImage('pictures')->required()->removable(false)->retainable()->uniqueName();
//$form->text('stock')->default(9999)->required();
$form->editor('know');
$form->editor('content')->required();
if ($form->isEditing()) {
$form->confirm('提示', '编辑产品需要重新审核,同时<span class="btn-danger">下架所有</span>关联的代理商产品,是否继续?');
}
})->saving(function (Form $form) {
//不允许编辑非自己数据
if ($form->isEditing() && $form->model()->supplier_id != Admin::user()->id) {
return $form->response()->error('数据不存在');
}
//不允许编辑的字段 TODO 忽略字段不起作用
$form->ignore(['id', 'supplier_id', 'sale', 'status', 'created_at', 'updated_at', 'deleted_at']);
//null字段转为''
foreach ($form->input() as $k => $v) {
if (is_null($v)) {
$form->$k = '';
}
}
//特殊字段处理
$form->hidden(['status', 'supplier_id']); //表单没有的字段,必须加上这句才能重置值
$form->status = ProductStatus::UNAUDITED;
$form->supplier_id = Admin::user()->id;
})->saved(function (Form $form, $result) {
//下架代理商产品
if ($result) {
$id = $form->getKey();
AgentProduct::where('product_id', $id)
->orWhere(DB::raw('FIND_IN_SET(' . $id . ', product_ids)')) //TODO product_ids字段可能会去掉
->update(['status' => ProductStatus::SOLD_OUT]);
}
})->deleting(function (Form $form) {
//不允许删除非自己的数据
if (array_filter($form->model()->toArray(), fn($v) => $v['supplier_id'] != Admin::user()->id)) {
return $form->response()->error('数据不存在');
}
});
}
}

71
app/AdminSupplier/Controllers/MyDemandProductController.php

@ -0,0 +1,71 @@
<?php
namespace App\AdminSupplier\Controllers;
use App\AdminAgent\Actions\Grid\DemandConfirm;
use App\AdminAgent\Lazys\DemandBiddingLazys;
use App\Common\ProductStatus;
use App\Models\AgentProduct;
use App\Models\Product;
use App\Traits\ResponseHelper;
use App\AdminAgent\Repositories\Demand;
use App\Models\DemandBidding;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Show;
use Dcat\Admin\Http\Controllers\AdminController;
use App\Traits\DemandTraits;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\URL;
class MyDemandProductController extends AdminController
{
use ResponseHelper;
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new Demand(['publisher','biddingUser','product.category']), function (Grid $grid) {
$grid->model()
->where(['bidding_user_id' => Admin::user()->id,'bidding_user_type' => DemandTraits::$col[1]])
->where('product_id','>',0);
$grid->column('id')->sortable();
//$grid->column('title');
//$grid->column('detail','内容')->display('查看')->modal('详情',function ($modal) {
// $modal->xl();
// return $this->comment;
//});
$grid->column('biddingUser.name','中标人');
$grid->column('price','发标价格');
$grid->column('product.category.name', '产品分类');
$grid->column('product.title','产品标题');
$grid->column('product.picture','产品图片')->image('', 60, 60);
$grid->column('product.price','产品售价');
$grid->column('product.original_price','产品原价');
$grid->column('product.stock','产品库存');
$grid->column('product.sale','产品销量');
$grid->column('product.status','产品状态')->using(ProductStatus::array());
$grid->disableDeleteButton();
$grid->disableEditButton();
$grid->disableQuickEditButton();
$grid->disableViewButton();
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('id');
$filter->equal('bidding_user_type','竞标用户类型')->select(DemandTraits::$polymorphic);
});
});
}
}

47
app/AdminSupplier/Renderable/SelectProduct.php

@ -0,0 +1,47 @@
<?php
namespace App\AdminSupplier\Renderable;
use App\Common\ProductStatus;
use App\AdminAgent\Repositories\Product;
use App\Models\DemandProduct;
use Dcat\Admin\Admin;
use Dcat\Admin\Grid;
use Dcat\Admin\Grid\LazyRenderable;
/**
* 选择产品
* Class SelectProduct
* @package App\AdminAgent\Renderable
*/
class SelectProduct extends LazyRenderable
{
public function grid(): Grid
{
// 获取外部传递的参数
// $id = $this->id;
Admin::translation('product');
return Grid::make(new DemandProduct(['supplier:id,name']), function (Grid $grid) {
$grid->disableActions();
$grid->disableBatchDelete();
$grid->disableBatchActions();
//$grid->model()->where('status', ProductStatus::ON_SALE);
$grid->model()->where('supplier_id',Admin::user()->id);
$grid->quickSearch(['title', 'supplier.name'])->placeholder('搜索产品名称、供应商');
$grid->column('id');
$grid->column('supplier.name', '供应商');
$grid->column('title');
$grid->column('picture')->image('',60, 60);
$grid->column('sale');
$grid->column('updated_at');
$grid->paginate(15);
$grid->filter(function (Grid\Filter $filter) {
$filter->like('title')->width(4);
$filter->like('supplier.name', '供应商名称')->width(4);
});
});
}
}

16
app/AdminSupplier/Repositories/Demand.php

@ -0,0 +1,16 @@
<?php
namespace App\AdminSupplier\Repositories;
use App\Models\Demand as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class Demand extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

16
app/AdminSupplier/Repositories/DemandBidding.php

@ -0,0 +1,16 @@
<?php
namespace App\AdminSupplier\Repositories;
use App\Models\DemandBidding as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class DemandBidding extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

16
app/AdminSupplier/Repositories/DemandProduct.php

@ -0,0 +1,16 @@
<?php
namespace App\AdminSupplier\Repositories;
use App\Models\DemandProduct as Model;
use Dcat\Admin\Repositories\EloquentRepository;
class DemandProduct extends EloquentRepository
{
/**
* Model.
*
* @var string
*/
protected $eloquentClass = Model::class;
}

7
app/AdminSupplier/routes.php

@ -19,4 +19,11 @@ Route::group([
$router->resource('order/list', 'OrderController');
$router->resource('agent/list', 'AgentController');
$router->resource('supplier_info', 'SupplierInfoController');
$router->resource('demand', 'DemandController');
$router->resource('demand_bidding', 'DemandBiddingController');
$router->resource('demand_product', 'DemandProductController');
$router->resource('my_demand_product', 'MyDemandProductController');
//api
$router->any('/api/demand/binding', 'DemandController@binding');
});

8
app/Common/PayType.php

@ -16,10 +16,10 @@ class PayType
const OFFLINE = 1;
/** @var int 订金支付 */
const SUBSCRIPTION = 2;
const DEPOSIT_PAY = 2;
/** @var int 定金支付 */
const DEPOSIT = 3;
const EARNEST_PAY = 3;
/** @var int 尾款/多加支付 */
const DOWN_PAYMENT = 4;
@ -32,8 +32,8 @@ class PayType
return [
self::ONLINE => '在线支付',
self::OFFLINE => '线下支付',
self::SUBSCRIPTION => '订金支付',
self::DEPOSIT => '定金支付',
self::DEPOSIT_PAY => '订金支付',
self::EARNEST_PAY => '定金支付',
self::DOWN_PAYMENT => '首款支付',
self::BALANCE_PAY => '尾款/多加支付',
];

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

@ -6,14 +6,15 @@ use App\Common\PayType;
use App\Http\Controllers\Controller;
use App\Models\Agent;
use App\Models\AgentProduct;
use App\Models\AgentSetting;
use App\Models\Coupon;
use App\Models\Product;
use App\Models\User;
use App\Models\Order;
use EasyWeChat\Factory;
use EasyWeChat\Kernel\Exceptions\InvalidArgumentException;
use EasyWeChat\Kernel\Exceptions\InvalidConfigException;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Common\OrderStatus as Status;
@ -73,8 +74,8 @@ class OrderController extends Controller
}, $v['pictures']);
}
//10分钟内未付款订单提示付款
if ($v['status'] == Status::UNPAID) {
//10分钟内未付款订单提示付款 TODO 此部分由定时
/*if ($v['status'] == Status::UNPAID) {
$minute = $time - strtotime($v['created_at']);
//订单创建后10分钟内未付款则提示,否则取消订单
if ($minute < 600) {
@ -86,7 +87,7 @@ class OrderController extends Controller
//TODO 加回库存,未考虑到几天/几个月后再打开订单列表页的情况,需要定时任务处理
Product::query()->find($v['product_id'])->increment('stock', $v['num']);
}
}
}*/
}
//超时订单设置为已取消 TODO 测试阶段暂时注释
@ -144,7 +145,7 @@ class OrderController extends Controller
DB::beginTransaction();
try {
$price = $this->calc($ap->price, $ap->coupon, $formData['num'], $formData['pay_type']);
$price = $this->calc($ap->price, $formData['num'], $formData['pay_type'], $ap);
$title = $ap->title; //产品标题
//供应商产品表减库存
@ -153,6 +154,15 @@ class OrderController extends Controller
//代理商产品表减库存
$ap->decrement('stock', $formData['num']);
if ($formData['pay_type'] == PayType::DEPOSIT_PAY && $ap->deposit_timeout > 0) {
$timeout = date('Y-m-d H:i:s', time() + $ap->deposit_timeout * 60);
} else if ($formData['pay_type'] == PayType::EARNEST_PAY && $ap->earnest_timeout > 0) {
$timeout = date('Y-m-d H:i:s', time() + $ap->earnest_timeout * 60);
} else {
$order_timeout = AgentSetting::val($this->agent_id, 'order_timeout') ?? 1440;
$timeout = date('Y-m-d H:i:s', time() + $ap->earnest_timeout * $order_timeout);
}
// 存入订单表
$order = Order::query()->create([
'user_id' => $this->user_id,
@ -171,6 +181,7 @@ class OrderController extends Controller
'pay_type' => $formData['pay_type'],
'coupon_id' => join(',', $coupon_ids),
'guide_id' => $ap->guide_id,
'timeout' => $timeout,
]);
DB::commit();
@ -252,7 +263,7 @@ class OrderController extends Controller
$ap = AgentProduct::query()
->has('product')
->with('coupon:agent_product_id,type,detail,agent_id,tag,start_at,end_at')
->find($formData['id'], ['id', 'price', 'original_price', 'product_id', 'title', 'pictures']);
->find($formData['id'], ['id', 'price', 'original_price', 'product_id', 'title', 'pictures', 'earnest', 'earnest_timeout', 'deposit', 'deposit_timeout']);
if (!$ap) {
return $this->error('产品信息不存在');
@ -266,7 +277,7 @@ class OrderController extends Controller
$formData['pay_type'] = PayType::ONLINE;
}
$ap->final_price = $this->calc($ap->price, $ap->coupon, $formData['num'], $formData['pay_type']);
$ap->final_price = $this->calc($ap->price, $formData['num'], $formData['pay_type'], $ap);
$ap->num = $formData['num'];
return $this->success($ap);
}
@ -286,13 +297,13 @@ class OrderController extends Controller
return $this->error('订单不存在或已支付');
}
$coupon = Coupon::whereIn('id', $order['coupon_id'])->get();
$ap = AgentProduct::with('coupon')->find($order->agent_product_id);
//如果已经付定金或首付款,则仅支付尾款
if ($order->status == Status::PAY_EARNEST) {
$price = $order->price - $order->paid_money;
} else {
$price = $this->calc($order->price, $coupon, $order->num, $order->pay_type);
$price = $this->calc($order->price, $order->num, $order->pay_type, $ap);
}
$config = $this->payConfig($order, $price);
@ -371,21 +382,25 @@ class OrderController extends Controller
* 计算最终价格(扣除优惠券之后的价格)
* $price:原价;$coupon:优惠券;$num:产品数量;$pay_type:支付方式
* @param float $price
* @param Coupon $coupon
* @param int $num
* @param int $pay_type
* @param Model $agent_product
* @return float
*/
private function calc($price, $coupon, $num, $pay_type)
private function calc($price, $num, $pay_type, $agent_product)
{
//根据支付方式计算价格
if (in_array($pay_type, [PayType::SUBSCRIPTION, PayType::DEPOSIT, PayType::DOWN_PAYMENT])) {
return $this->earnest;
if (in_array($pay_type, [PayType::DEPOSIT_PAY, PayType::EARNEST_PAY, PayType::DOWN_PAYMENT])) {
if ($pay_type == PayType::DEPOSIT_PAY && $agent_product->deposit && $agent_product->deposit_timeout) {
return $agent_product->deposit;
}
if ($pay_type == PayType::EARNEST_PAY && $agent_product->earnest && $agent_product->earnest_timeout) {
return $agent_product->earnest;
}
}
//TODO 还要计算尾款支付金额
$total_price = $price * $num;
//没有任何优惠券时直接返回最终价
/*//没有任何优惠券时直接返回最终价
if ($coupon && $coupon->isEmpty()) {
return $total_price;
}
@ -393,14 +408,14 @@ class OrderController extends Controller
$coupon = $coupon->toArray();
foreach ($coupon as $v) {
// TODO 未判断优惠券有效期
/*if ($v['type'] == 1 && !empty($v['detail']['full']) && !empty($v['detail']['reduction'])) { //满减
if ($v['type'] == 1 && !empty($v['detail']['full']) && !empty($v['detail']['reduction'])) { //满减
if ($total_price >= $v['detail']['full']) {
$total_price -= $v['detail']['reduction'];
}
} else if ($v['type'] == 2 && !empty($v['detail']['discount'])) { //打折
$total_price *= $v['detail']['discount'];
}*/
}
}
}*/
return round($total_price, 2);
}

2
app/Http/Controllers/Api/TestController.php

@ -16,6 +16,6 @@ class TestController
public function index()
{
//test
return AgentSetting::val(1, 'earnest') ?? 198.88;
return AgentSetting::val(11, 'order_timeout') ?? 188;
}
}

2
app/Http/Controllers/Api/WxpayController.php

@ -66,7 +66,7 @@ class WxpayController
$pay_type = $order->pay_type;
$money = $message['total_fee'] / 100;
//定金支付和首付款支付
if (in_array($pay_type, [PayType::SUBSCRIPTION, PayType::DEPOSIT, PayType::DOWN_PAYMENT])) {
if (in_array($pay_type, [PayType::DEPOSIT_PAY, PayType::EARNEST_PAY, PayType::DOWN_PAYMENT])) {
if ($status == OrderStatus::UNPAID) {
$order->status = OrderStatus::PAY_EARNEST;
} else if ($status == OrderStatus::PAY_EARNEST) {

2
app/Models/Agent.php

@ -9,6 +9,8 @@ class Agent extends BaseModel
{
use HasFactory, SoftDeletes;
protected $table = 'agents';
public function agentInfo()
{
return $this->hasOne(AgentInfo::class);

5
app/Models/AgentSetting.php

@ -9,6 +9,7 @@ class AgentSetting extends BaseModel
use HasFactory;
protected $fillable = ['agent_id', 'setting'];
protected $casts = ['setting' => 'json'];
public function __construct(array $attributes = [])
{
@ -16,9 +17,9 @@ class AgentSetting extends BaseModel
$this->timestamps = false;
}
public function scopeVal($query, $agent_id, $key)
public static function val($agent_id, $key)
{
$setting = json_decode($query->where('agent_id', $agent_id)->value('setting'), true);
$setting = static::query()->where('agent_id', $agent_id)->value('setting');
return $setting[$key] ?? null;
}
}

16
app/Models/Demand.php

@ -9,11 +9,11 @@ use Illuminate\Database\Eloquent\Model;
class Demand extends BaseModel
{
use HasDateTimeFormatter;
use SoftDeletes;
use SoftDeletes;
protected $table = 'demand';
protected $table = 'demand';
public function publisher()
public function publisher()
{
return $this->morphTo();
}
@ -22,4 +22,14 @@ class Demand extends BaseModel
{
return $this->morphTo();
}
public function product()
{
return $this->hasOne(Product::class, 'id', 'product_id');
}
public function agentproduct()
{
return $this->hasOne(AgentProduct::class, 'id', 'agent_product_id');
}
}

5
app/Models/DemandBidding.php

@ -16,4 +16,9 @@ class DemandBidding extends BaseModel
{
return $this->morphTo();
}
public function demand()
{
return $this->belongsTo(Demand::class,'demand_id','id');
}
}

52
app/Models/DemandProduct.php

@ -0,0 +1,52 @@
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;
class DemandProduct extends Model
{
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'demand_products';
use HasFactory, SoftDeletes;
protected $guarded = ['id']; //不允许编辑的字段
// 获取所有产品图片
public function getPicturesAttribute($value): array
{
if (is_string($value)) {
$value = $value ? json_decode($value, true) : [];
}
$this->append('picture');
return $value ?? [];
}
// 获取第一张产品图片
public function getPictureAttribute($value): string
{
return $this->pictures[0] ?? '';
}
public function setPicturesAttribute($value)
{
if (is_array($value)) {
$this->attributes['pictures'] = json_encode(array_filter($value));
}
}
public function supplier()
{
return $this->belongsTo(Supplier::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
}

50
app/Providers/DemandBiddingServiceProvider.php

@ -0,0 +1,50 @@
<?php
namespace App\Providers;
use App\Models\Demand;
use App\Models\DemandBidding;
use App\Service\SmsService;
use App\Traits\DemandTraits;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\ServiceProvider;
class DemandBiddingServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//DemandBidding::created(function ($order) {
// $demand = Demand::query()->with(['publisher'])->where('id',$order->demand_id)->first();
// if(!empty($demand->publisher->contact_phone)) {
// $sms = new SmsService();
// $sms->send('bidding',[$order->biddingUser->name,$demand->id,DemandTraits::$polymorphic[$demand->publisher_type]],[$demand->publisher->contact_phone]);
// }
//});
//
//
//Demand::updated(function ($demand) {
// //如果状态改变了
// if($demand->isDirty('bidding_id')) {
// if(!empty($demand->publisher->contact_phone)) {
// $sms = new SmsService();
// $sms->send('bidding',[$demand->publisher->name,$demand->id,DemandTraits::$polymorphic[$demand->bidding_user_type]],[$demand->biddingUser->contact_phone]);
// }
// }
//});
}
}

115
app/Service/SmsService.php

@ -0,0 +1,115 @@
<?php
namespace App\Service;
use \Illuminate\Support\Facades\Log;
use TencentCloud\Sms\V20210111\SmsClient;
use TencentCloud\Sms\V20210111\Models\SendSmsRequest;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
class SmsService
{
private $client;
private $cfg;
function __construct()
{
/* 必要步骤:
* 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId,secretKey。
* 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。
* 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人,
* 以免泄露密钥对危及你的财产安全。
* CAM密匙查询: https://console.cloud.tencent.com/cam/capi
*/
$this->cfg = config('sms.tencent');
$cred = new Credential($this->cfg['secret_id'], $this->cfg['secret_key']);
// $cred = new Credential(getenv("TENCENTCLOUD_SECRET_ID"), getenv("TENCENTCLOUD_SECRET_KEY"));
// 实例化一个http选项,可选的,没有特殊需求可以跳过
$httpProfile = new HttpProfile();
// 配置代理
// $httpProfile->setProxy("https://ip:port");
$httpProfile->setReqMethod("GET"); // post请求(默认为post请求)
$httpProfile->setReqTimeout(30); // 请求超时时间,单位为秒(默认60秒)
$httpProfile->setEndpoint("sms.tencentcloudapi.com"); // 指定接入地域域名(默认就近接入)
// 实例化一个client选项,可选的,没有特殊需求可以跳过
$clientProfile = new ClientProfile();
$clientProfile->setSignMethod("TC3-HMAC-SHA256"); // 指定签名算法(默认为HmacSHA256)
$clientProfile->setHttpProfile($httpProfile);
// 实例化要请求产品(以sms为例)的client对象,clientProfile是可选的
// 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量
$this->client = new SmsClient($cred, 'ap-guangzhou', $clientProfile);
}
public function send($templateId, $templateParamSet, $phoneNumberSet, $signName = '领峰远扬')
{
//if (!config('sms.debug') || config('sms.debug') == 'yes') {
// Log::debug([$templateId, $templateParamSet, $phoneNumberSet, $signName]);
// return true;
//}
foreach ($phoneNumberSet as $key => $phone) {
if (!$phoneNumberSet[$key]) {
unset($phoneNumberSet[$key]);
} else {
$phoneNumberSet[$key] = '+86' . $phoneNumberSet[$key];
}
}
if (count($phoneNumberSet) == 0) {
return true;
}
if (!$signName) {
$signName = $this->cfg['sign_name'];
}
try {
// 实例化一个 sms 发送短信请求对象,每个接口都会对应一个request对象。
$req = new SendSmsRequest();
/* 填充请求参数,这里request对象的成员变量即对应接口的入参
* 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义
* 基本类型的设置:
* 帮助链接:
* 短信控制台: https://console.cloud.tencent.com/smsv2
* sms helper: https://cloud.tencent.com/document/product/382/3773
*/
/*
* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666
*/
$req->SmsSdkAppId = $this->cfg['sms_sdk_app_id'];
/* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */
$req->SignName = $signName;
/* 短信码号扩展号: 默认未开通,如需开通请联系 [sms helper] */
$req->ExtendCode = "";
/*
下发手机号码,采用 E.164 标准,+[国家或地区码][手机号]
* 示例如:+8613711112222 其中前面有一个+ ,86为国家码,13711112222为手机号,最多不要超过200个手机号
*/
$req->PhoneNumberSet = $phoneNumberSet;
/* 国际/港澳台短信 SenderId: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */
$req->SenderId = "";
/* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */
$req->SessionContext = "xxx";
/* 模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */
$req->TemplateId = $this->cfg['templates'][$templateId];
/* 模板参数: 若无模板参数,则设置为空*/
$req->TemplateParamSet = $templateParamSet;
// 通过client对象调用SendSms方法发起请求。注意请求方法名与请求对象是对应的
// 返回的resp是一个SendSmsResponse类的实例,与请求对象对应
$resp = $this->client->SendSms($req);
// 输出json格式的字符串回包
$res = json_decode($resp->toJsonString());
foreach ($res->SendStatusSet as $item) {
if ($item->Code != 'Ok') {
$tpl = $this->cfg['templates'][$templateId];
$param = json_encode($templateParamSet);
Log::error("SMS ERROR $item->Code[$tpl:$item->PhoneNumber:$param]$item->Message");
}
}
return True;
} catch (TencentCloudSDKException $e) {
Log::error($e);
}
return 0;
}
}

18
app/Traits/DemandTraits.php

@ -6,15 +6,15 @@ trait DemandTraits
{
public static $col = [
'App\models\Agent',
'App\models\Supplier',
'App\models\Guide',
'App\Models\Agent',
'App\Models\Supplier',
'App\Models\Guide',
];
public static $polymorphic = [
'App\models\Agent' => '代理商',
'App\models\Supplier' => '供应商',
'App\models\Guide' => '地接',
'App\Models\Agent' => '代理商',
'App\Models\Supplier' => '供应商',
'App\Models\Guide' => '地接',
];
public static $stateKey = [
@ -28,4 +28,10 @@ trait DemandTraits
2 => '已竞标' ,
3 => '流拍'
];
public static $biddingState = [
'待竞标' ,
'已中标' ,
'未中标'
];
}

3
composer.json

@ -12,7 +12,8 @@
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^8.40",
"laravel/tinker": "^2.5",
"overtrue/wechat": "~5.0"
"overtrue/wechat": "~5.0",
"tencentcloud/tencentcloud-sdk-php": "^3.0"
},
"require-dev": {
"facade/ignition": "^2.5",

154
composer.lock

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "7a150183291d25e55b752a22e9bd8d62",
"content-hash": "5dd2556c6bb5b2e049435c53c47893ff",
"packages": [
{
"name": "asm89/stack-cors",
@ -1426,16 +1426,16 @@
},
{
"name": "guzzlehttp/psr7",
"version": "2.0.0",
"version": "1.8.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7"
"reference": "dc960a912984efb74d0a90222870c72c87f10c91"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7",
"reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91",
"reference": "dc960a912984efb74d0a90222870c72c87f10c91",
"shasum": "",
"mirrors": [
{
@ -1445,19 +1445,16 @@
]
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0",
"ralouphie/getallheaders": "^3.0"
"php": ">=5.4.0",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4.1",
"http-interop/http-factory-tests": "^0.9",
"phpunit/phpunit": "^8.5.8 || ^9.3.10"
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@ -1465,13 +1462,16 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
"dev-master": "1.7-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
}
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -1486,11 +1486,6 @@
{
"name": "Tobias Schultze",
"homepage": "https://github.com/Tobion"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://sagikazarmark.hu"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
@ -1506,9 +1501,9 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.0.0"
"source": "https://github.com/guzzle/psr7/tree/1.8.2"
},
"time": "2021-06-30T20:03:07+00:00"
"time": "2021-04-26T09:17:50+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@ -3030,67 +3025,6 @@
},
"time": "2020-06-29T06:28:15+00:00"
},
{
"name": "psr/http-factory",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=7.0.0",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interfaces for PSR-7 HTTP message factories",
"keywords": [
"factory",
"http",
"message",
"psr",
"psr-17",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-factory/tree/master"
},
"time": "2019-04-30T12:38:16+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
@ -6497,6 +6431,60 @@
],
"time": "2021-06-27T09:16:08+00:00"
},
{
"name": "tencentcloud/tencentcloud-sdk-php",
"version": "3.0.467",
"source": {
"type": "git",
"url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git",
"reference": "11f0a41777f97cdc4226a9d1b0dea78eead42a24"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/11f0a41777f97cdc4226a9d1b0dea78eead42a24",
"reference": "11f0a41777f97cdc4226a9d1b0dea78eead42a24",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"guzzlehttp/guzzle": "^6.3 || ^7.0",
"guzzlehttp/psr7": "^1.8",
"php": ">=5.6.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/QcloudApi/QcloudApi.php"
],
"psr-4": {
"TencentCloud\\": "./src/TencentCloud"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "coolli",
"email": "tencentcloudapi@tencent.com",
"homepage": "https://cloud.tencent.com/document/sdk/PHP",
"role": "Developer"
}
],
"description": "TencentCloudApi php sdk",
"homepage": "https://github.com/TencentCloud/tencentcloud-sdk-php",
"support": {
"issues": "https://github.com/TencentCloud/tencentcloud-sdk-php/issues",
"source": "https://github.com/TencentCloud/tencentcloud-sdk-php/tree/3.0.467"
},
"time": "2021-08-30T01:17:41+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "2.2.3",

2
config/app.php

@ -174,7 +174,7 @@ return [
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\DemandBiddingServiceProvider::class,
],
/*

16
config/sms.php

@ -0,0 +1,16 @@
<?php
return [
'sender' => \App\Libraries\Sms\Tencent::class,
'type' => 'tencent',
//'debug' => env('SMS_DEBUG'),
'tencent' => [
'sms_sdk_app_id'=> env('SMS_SDK_APP_ID'),
'secret_id' => env('SECRET_ID'),
'secret_key' => env('SECRET_KEY'),
'sign_name' => '领峰远扬',
'templates' => [
'bidding' => '1100494' //{1}参与了您发起的竞标{2},详情请登录{3}查看。
]
]
];

4
resources/lang/zh_CN/agent-product.php

@ -21,6 +21,10 @@ return [
'know' => '旅游须知',
'pictures' => '产品图片',
'picture' => '产品图片',
'earnest' => '定金',
'earnest_timeout' => '定金超时时间',
'deposit' => '订金',
'deposit_timeout' => '订金超时时间',
'product' => trans('product.fields'),
],
'options' => [

25
resources/lang/zh_CN/demand-product.php

@ -0,0 +1,25 @@
<?php
return [
'labels' => [
'DemandProduct' => '需求市场产品',
'demand-product' => '需求市场产品',
'demand' => '需求市场',
'product' => '产品',
],
'fields' => [
'agent_id' => '代理商id 竞标特供',
'category_id' => '产品分类ID',
'content' => '产品详情',
'know' => '旅客须知',
'original_price' => '原价',
'picture' => '产品图片',
'price' => '价格',
'sale' => '销量',
'status' => '状态',
'stock' => '库存量',
'supplier_id' => '供应商ID',
'title' => '标题',
],
'options' => [
],
];

21
resources/lang/zh_CN/my-demand-product.php

@ -0,0 +1,21 @@
<?php
return [
'labels' => [
'MyDemandProduct' => '我的竞标产品库',
'my_demand_product' => '我的竞标产品库',
],
'fields' => [
'title' => '标题',
'comment' => '内容',
'deadline' => '流拍时间',
'type' => '类型',
'price' => '价格',
'stock' => '库存',
'publisher_type' => '发布人身份',
'publisher_id' => '发布人',
'state' => '状态',
'bidding_id' => '竞拍成功id 关联竞标表',
],
'options' => [
],
];

4
resources/lang/zh_CN/setting.php

@ -5,8 +5,8 @@ return [
'setting' => '系统设置',
],
'fields' => [
'earnest' => '定金金额',
'earnest_timeout' => '定金支付超时时间',
'order_timeout' => '订单超时时间',
'auto_shelves' => '自动上架',
],
'options' => [
],

Loading…
Cancel
Save