first version

This commit is contained in:
liu
2026-07-23 20:41:25 +08:00
parent 00a0938a1b
commit 10cff754a4
211 changed files with 11577 additions and 842 deletions
+51
View File
@@ -0,0 +1,51 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* 客户等级模型(同一商品按客户等级定价)
*/
class CustomerLevelModel extends Model
{
use HasFactory;
/** 状态:停用 */
public const STATUS_DISABLED = 0;
/** 状态:正常 */
public const STATUS_NORMAL = 1;
protected $table = 'customer_level';
protected $primaryKey = 'id';
protected $fillable = [
'name',
'sort',
'status',
'remark',
];
protected $casts = [
'sort' => 'integer',
'status' => 'integer',
];
/**
* 该等级下的门店
*/
public function stores(): HasMany
{
return $this->hasMany(StoreModel::class, 'level_id', 'id');
}
/**
* 该等级下的商品价格
*/
public function prices(): HasMany
{
return $this->hasMany(ProductPriceModel::class, 'level_id', 'id');
}
}
+55
View File
@@ -0,0 +1,55 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* 通知模型(小程序端消息:订单 / 价格变更 / 系统;user_id=0 为全员广播)
*/
class NoticeModel extends Model
{
/** 通知类型:订单 */
public const TYPE_ORDER = 'order';
/** 通知类型:价格变更 */
public const TYPE_PRICE = 'price';
/** 通知类型:系统 */
public const TYPE_SYSTEM = 'system';
/** 未读 */
public const UNREAD = 0;
/** 已读 */
public const READ = 1;
/** 全员广播时的 user_id 约定值 */
public const BROADCAST_USER_ID = 0;
protected $table = 'notice';
protected $primaryKey = 'id';
protected $fillable = [
'user_id',
'type',
'title',
'content',
'data',
'is_read',
'read_at',
];
protected $casts = [
'data' => 'array',
'is_read' => 'integer',
'user_id' => 'integer',
'read_at' => 'datetime',
];
/**
* 接收用户(user_id=0 表示全员广播,无对应用户)
*/
public function user(): BelongsTo
{
return $this->belongsTo(UserModel::class, 'user_id', 'id');
}
}
+98
View File
@@ -0,0 +1,98 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* 商品分类模型(蔬菜/水果/其他,多级分类自关联)
*/
class ProductCategoryModel extends Model
{
/** 状态:停用 */
public const STATUS_DISABLED = 0;
/** 状态:正常 */
public const STATUS_NORMAL = 1;
protected $table = 'product_category';
protected $primaryKey = 'id';
protected $fillable = [
'parent_id',
'name',
'sort',
'status',
];
protected $casts = [
'parent_id' => 'integer',
'sort' => 'integer',
'status' => 'integer',
];
/**
* 父分类
*/
public function parent(): BelongsTo
{
return $this->belongsTo(self::class, 'parent_id', 'id');
}
/**
* 子分类
*/
public function children(): HasMany
{
return $this->hasMany(self::class, 'parent_id', 'id')->orderBy('sort');
}
/**
* 分类下的商品
*/
public function products(): HasMany
{
return $this->hasMany(ProductModel::class, 'category_id', 'id');
}
/**
* 获取分类树(树表展示 / 级联下拉选项复用)
*
* @param bool $onlyEnabled 是否仅返回启用分类
* @return array<int, array{id: int, name: string, parent_id: int, sort: int, status: int, children?: array}>
*/
public static function getTreeData(bool $onlyEnabled = false): array
{
$query = static::query()->orderBy('sort')->orderBy('id');
if ($onlyEnabled) {
$query->where('status', self::STATUS_NORMAL);
}
return static::buildTree($query->get()->toArray());
}
/**
* 将扁平分类列表组装为树
*
* @param array<int, array<string, mixed>> $items
* @param int $parentId
* @return array<int, array<string, mixed>>
*/
public static function buildTree(array $items, int $parentId = 0): array
{
$tree = [];
foreach ($items as $item) {
if ((int) $item['parent_id'] !== $parentId) {
continue;
}
$children = static::buildTree($items, (int) $item['id']);
if ($children !== []) {
$item['children'] = $children;
}
$tree[] = $item;
}
return $tree;
}
}
+69
View File
@@ -0,0 +1,69 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* 商品档案模型(品名/规格包规/供应商/等级/多等级价格体系)
*/
class ProductModel extends Model
{
use SoftDeletes, HasFactory;
/** 状态:下架 */
public const STATUS_OFF = 0;
/** 状态:上架 */
public const STATUS_ON = 1;
protected $table = 'product';
protected $primaryKey = 'id';
protected $fillable = [
'category_id',
'supplier_id',
'name',
'spec',
'grade',
'unit',
'image',
'sort',
'status',
'remark',
];
protected $casts = [
'category_id' => 'integer',
'supplier_id' => 'integer',
'sort' => 'integer',
'status' => 'integer',
];
/**
* 所属分类
*/
public function category(): BelongsTo
{
return $this->belongsTo(ProductCategoryModel::class, 'category_id', 'id');
}
/**
* 供货供应商
*/
public function supplier(): BelongsTo
{
return $this->belongsTo(SupplierModel::class, 'supplier_id', 'id');
}
/**
* 多等级价格(同一商品按客户等级定价)
*/
public function prices(): HasMany
{
return $this->hasMany(ProductPriceModel::class, 'product_id', 'id');
}
}
+54
View File
@@ -0,0 +1,54 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* 商品价格模型(同一商品按客户等级定价,联合键 product_id + level_id
*/
class ProductPriceModel extends Model
{
use HasFactory;
protected $table = 'product_price';
protected $primaryKey = 'id';
protected $fillable = [
'product_id',
'level_id',
'price',
];
protected $casts = [
'product_id' => 'integer',
'level_id' => 'integer',
'price' => 'decimal:2',
];
/**
* 所属商品
*/
public function product(): BelongsTo
{
return $this->belongsTo(ProductModel::class, 'product_id', 'id');
}
/**
* 所属客户等级
*/
public function level(): BelongsTo
{
return $this->belongsTo(CustomerLevelModel::class, 'level_id', 'id');
}
/**
* 按商品 + 等级筛选价格
*/
public function scopeForProductLevel($query, int $productId, int $levelId)
{
return $query->where('product_id', $productId)->where('level_id', $levelId);
}
}
+67
View File
@@ -0,0 +1,67 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* 采购金额分摊模型(实际采购金额按订货比例分摊到门店/单品,尾差修正保证金额守恒)
*/
class PurchaseAllocationModel extends Model
{
protected $table = 'purchase_allocation';
protected $primaryKey = 'id';
protected $fillable = [
'purchase_item_id',
'order_item_id',
'store_id',
'product_id',
'quantity',
'weight',
'amount',
];
protected $casts = [
'purchase_item_id' => 'integer',
'order_item_id' => 'integer',
'store_id' => 'integer',
'product_id' => 'integer',
'quantity' => 'decimal:2',
'weight' => 'decimal:3',
'amount' => 'decimal:2',
];
/**
* 来源采购明细
*/
public function purchaseItem(): BelongsTo
{
return $this->belongsTo(PurchaseOrderItemModel::class, 'purchase_item_id', 'id');
}
/**
* 溯源订货明细
*/
public function orderItem(): BelongsTo
{
return $this->belongsTo(StoreOrderItemModel::class, 'order_item_id', 'id');
}
/**
* 分摊门店
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 分摊商品
*/
public function product(): BelongsTo
{
return $this->belongsTo(ProductModel::class, 'product_id', 'id');
}
}
+87
View File
@@ -0,0 +1,87 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* 采购单明细模型(按商品+供应商聚合,快照品名/规格;实际金额录入后用于分摊)
*/
class PurchaseOrderItemModel extends Model
{
use HasFactory;
/** 未发送供应商 */
public const NOT_SENT = 0;
/** 已发送供应商 */
public const SENT = 1;
protected $table = 'purchase_order_item';
protected $primaryKey = 'id';
protected $fillable = [
'purchase_id',
'product_id',
'supplier_id',
'product_name',
'product_spec',
'price',
'quantity',
'weight',
'amount',
'sort',
'is_sent',
'sent_at',
'supplier_confirmed_at',
'remark',
];
protected $casts = [
'purchase_id' => 'integer',
'product_id' => 'integer',
'supplier_id' => 'integer',
'price' => 'decimal:2',
'quantity' => 'decimal:2',
'weight' => 'decimal:3',
'amount' => 'decimal:2',
'sort' => 'integer',
'is_sent' => 'integer',
'sent_at' => 'datetime',
'supplier_confirmed_at' => 'datetime',
];
/**
* 所属采购单
*/
public function purchase(): BelongsTo
{
return $this->belongsTo(PurchaseOrderModel::class, 'purchase_id', 'id');
}
/**
* 采购商品
*/
public function product(): BelongsTo
{
return $this->belongsTo(ProductModel::class, 'product_id', 'id');
}
/**
* 供货供应商
*/
public function supplier(): BelongsTo
{
return $this->belongsTo(SupplierModel::class, 'supplier_id', 'id');
}
/**
* 金额分摊记录(按订货比例摊到门店/单品)
*/
public function allocations(): HasMany
{
return $this->hasMany(PurchaseAllocationModel::class, 'purchase_item_id', 'id');
}
}
+67
View File
@@ -0,0 +1,67 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Modules\SystemUser\Models\SysUserModel;
/**
* 采购单模型(按门店订单汇总生成,按商品+供应商聚合)
*/
class PurchaseOrderModel extends Model
{
use HasFactory;
/** 状态:待发送 */
public const STATUS_PENDING = 0;
/** 状态:部分发送 */
public const STATUS_PART_SENT = 1;
/** 状态:全部发送 */
public const STATUS_ALL_SENT = 2;
/** 状态:已完成 */
public const STATUS_COMPLETED = 3;
protected $table = 'purchase_order';
protected $primaryKey = 'id';
protected $fillable = [
'purchase_no',
'purchase_date',
'status',
'total_quantity',
'total_weight',
'estimate_amount',
'actual_amount',
'operator_id',
'remark',
];
protected $casts = [
'purchase_date' => 'date:Y-m-d',
'status' => 'integer',
'total_quantity' => 'decimal:2',
'total_weight' => 'decimal:3',
'estimate_amount' => 'decimal:2',
'actual_amount' => 'decimal:2',
'operator_id' => 'integer',
];
/**
* 制单人(后台系统用户)
*/
public function operator(): BelongsTo
{
return $this->belongsTo(SysUserModel::class, 'operator_id', 'id');
}
/**
* 采购明细
*/
public function items(): HasMany
{
return $this->hasMany(PurchaseOrderItemModel::class, 'purchase_id', 'id')->orderBy('sort');
}
}
+92
View File
@@ -0,0 +1,92 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* 对账明细模型(订货量/称重/数量/金额可修改,diff = publish actual
*/
class ReconciliationItemModel extends Model
{
/** 未对账 */
public const NOT_RECONCILED = 0;
/** 已对账 */
public const RECONCILED = 1;
protected $table = 'reconciliation_item';
protected $primaryKey = 'id';
protected $fillable = [
'recon_id',
'store_id',
'purchase_item_id',
'order_item_id',
'product_id',
'product_name',
'quantity',
'weight',
'publish_amount',
'actual_amount',
'diff_amount',
'is_reconciled',
'store_remark',
'sort',
];
protected $casts = [
'recon_id' => 'integer',
'store_id' => 'integer',
'purchase_item_id' => 'integer',
'order_item_id' => 'integer',
'product_id' => 'integer',
'quantity' => 'decimal:2',
'weight' => 'decimal:3',
'publish_amount' => 'decimal:2',
'actual_amount' => 'decimal:2',
'diff_amount' => 'decimal:2',
'is_reconciled' => 'integer',
'sort' => 'integer',
];
/**
* 所属对账单
*/
public function recon(): BelongsTo
{
return $this->belongsTo(ReconciliationModel::class, 'recon_id', 'id');
}
/**
* 所属门店
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 对账商品
*/
public function product(): BelongsTo
{
return $this->belongsTo(ProductModel::class, 'product_id', 'id');
}
/**
* 来源采购明细
*/
public function purchaseItem(): BelongsTo
{
return $this->belongsTo(PurchaseOrderItemModel::class, 'purchase_item_id', 'id');
}
/**
* 溯源订货明细
*/
public function orderItem(): BelongsTo
{
return $this->belongsTo(StoreOrderItemModel::class, 'order_item_id', 'id');
}
}
+75
View File
@@ -0,0 +1,75 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Modules\SystemUser\Models\SysUserModel;
/**
* 财务对账模型(公布金额 vs 实际金额 vs 差额,按品类/供应商筛选)
*/
class ReconciliationModel extends Model
{
/** 状态:草稿 */
public const STATUS_DRAFT = 0;
/** 状态:对账中 */
public const STATUS_WORKING = 1;
/** 状态:已结算 */
public const STATUS_SETTLED = 2;
protected $table = 'reconciliation';
protected $primaryKey = 'id';
protected $fillable = [
'recon_no',
'title',
'period_start',
'period_end',
'category_id',
'supplier_id',
'publish_amount',
'actual_amount',
'diff_amount',
'status',
'operator_id',
'remark',
];
protected $casts = [
'period_start' => 'date:Y-m-d',
'period_end' => 'date:Y-m-d',
'category_id' => 'integer',
'supplier_id' => 'integer',
'publish_amount' => 'decimal:2',
'actual_amount' => 'decimal:2',
'diff_amount' => 'decimal:2',
'status' => 'integer',
'operator_id' => 'integer',
];
/**
* 制单人(后台系统用户)
*/
public function operator(): BelongsTo
{
return $this->belongsTo(SysUserModel::class, 'operator_id', 'id');
}
/**
* 对账明细
*/
public function items(): HasMany
{
return $this->hasMany(ReconciliationItemModel::class, 'recon_id', 'id')->orderBy('sort');
}
/**
* 结算表
*/
public function settlements(): HasMany
{
return $this->hasMany(SettlementModel::class, 'recon_id', 'id');
}
}
+74
View File
@@ -0,0 +1,74 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Modules\SystemUser\Models\SysUserModel;
/**
* 结算表模型(对账结算按门店聚合生成,可导出存档)
*/
class SettlementModel extends Model
{
/** 状态:待结算 */
public const STATUS_PENDING = 0;
/** 状态:已结算 */
public const STATUS_SETTLED = 1;
protected $table = 'settlement';
protected $primaryKey = 'id';
protected $fillable = [
'settlement_no',
'recon_id',
'store_id',
'period_start',
'period_end',
'total_amount',
'actual_amount',
'diff_amount',
'status',
'file_path',
'operator_id',
'settled_at',
'remark',
];
protected $casts = [
'recon_id' => 'integer',
'store_id' => 'integer',
'period_start' => 'date:Y-m-d',
'period_end' => 'date:Y-m-d',
'total_amount' => 'decimal:2',
'actual_amount' => 'decimal:2',
'diff_amount' => 'decimal:2',
'status' => 'integer',
'operator_id' => 'integer',
'settled_at' => 'datetime',
];
/**
* 来源对账单
*/
public function recon(): BelongsTo
{
return $this->belongsTo(ReconciliationModel::class, 'recon_id', 'id');
}
/**
* 结算门店
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 制单人(后台系统用户)
*/
public function operator(): BelongsTo
{
return $this->belongsTo(SysUserModel::class, 'operator_id', 'id');
}
}
+78
View File
@@ -0,0 +1,78 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* 门店对账单明细模型(快照商品名/单价/数量/金额)
*/
class StatementItemModel extends Model
{
/** 未对账 */
public const NOT_RECONCILED = 0;
/** 已对账 */
public const RECONCILED = 1;
protected $table = 'statement_item';
protected $primaryKey = 'id';
protected $fillable = [
'statement_id',
'order_id',
'order_item_id',
'product_id',
'product_name',
'price',
'quantity',
'weight',
'amount',
'is_reconciled',
'store_remark',
];
protected $casts = [
'statement_id' => 'integer',
'order_id' => 'integer',
'order_item_id' => 'integer',
'product_id' => 'integer',
'price' => 'decimal:2',
'quantity' => 'decimal:2',
'weight' => 'decimal:3',
'amount' => 'decimal:2',
'is_reconciled' => 'integer',
];
/**
* 所属对账单
*/
public function statement(): BelongsTo
{
return $this->belongsTo(StatementModel::class, 'statement_id', 'id');
}
/**
* 来源订单
*/
public function order(): BelongsTo
{
return $this->belongsTo(StoreOrderModel::class, 'order_id', 'id');
}
/**
* 来源订单明细
*/
public function orderItem(): BelongsTo
{
return $this->belongsTo(StoreOrderItemModel::class, 'order_item_id', 'id');
}
/**
* 对账商品
*/
public function product(): BelongsTo
{
return $this->belongsTo(ProductModel::class, 'product_id', 'id');
}
}
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* 门店对账单模型(门店自助生成,快照回款周期:settlement_date = period_end + payment_cycle_days
*/
class StatementModel extends Model
{
/** 状态:待对账 */
public const STATUS_PENDING = 0;
/** 状态:已对账 */
public const STATUS_RECONCILED = 1;
/** 状态:已结算 */
public const STATUS_SETTLED = 2;
protected $table = 'statement';
protected $primaryKey = 'id';
protected $fillable = [
'statement_no',
'store_id',
'period_start',
'period_end',
'total_amount',
'payment_cycle_days',
'settlement_date',
'status',
'reconciled_at',
'settled_at',
'remark',
];
protected $casts = [
'store_id' => 'integer',
'period_start' => 'date:Y-m-d',
'period_end' => 'date:Y-m-d',
'total_amount' => 'decimal:2',
'payment_cycle_days' => 'integer',
'settlement_date' => 'date:Y-m-d',
'status' => 'integer',
'reconciled_at' => 'datetime',
'settled_at' => 'datetime',
];
/**
* 所属门店
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 对账单明细
*/
public function items(): HasMany
{
return $this->hasMany(StatementItemModel::class, 'statement_id', 'id');
}
}
+75
View File
@@ -0,0 +1,75 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* 门店模型(小程序下单主体)
*/
class StoreModel extends Model
{
use SoftDeletes, HasFactory;
/** 状态:停用 */
public const STATUS_DISABLED = 0;
/** 状态:正常 */
public const STATUS_NORMAL = 1;
protected $table = 'store';
protected $primaryKey = 'id';
protected $fillable = [
'name',
'code',
'level_id',
'contact',
'phone',
'address',
'payment_cycle_days',
'status',
'remark',
];
protected $casts = [
'level_id' => 'integer',
'payment_cycle_days' => 'integer',
'status' => 'integer',
];
/**
* 所属客户等级(决定商品展示价格)
*/
public function level(): BelongsTo
{
return $this->belongsTo(CustomerLevelModel::class, 'level_id', 'id');
}
/**
* 门店订单
*/
public function orders(): HasMany
{
return $this->hasMany(StoreOrderModel::class, 'store_id', 'id');
}
/**
* 绑定本门店的小程序用户
*/
public function users(): HasMany
{
return $this->hasMany(UserModel::class, 'store_id', 'id');
}
/**
* 门店对账单
*/
public function statements(): HasMany
{
return $this->hasMany(StatementModel::class, 'store_id', 'id');
}
}
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* 门店订单明细模型(快照下单时的商品名/规格/等级价,历史单据不受调价影响)
*/
class StoreOrderItemModel extends Model
{
use HasFactory;
protected $table = 'store_order_item';
protected $primaryKey = 'id';
protected $fillable = [
'order_id',
'store_id',
'product_id',
'product_name',
'product_spec',
'price',
'quantity',
'weight',
'amount',
'remark',
];
protected $casts = [
'order_id' => 'integer',
'store_id' => 'integer',
'product_id' => 'integer',
'price' => 'decimal:2',
'quantity' => 'decimal:2',
'weight' => 'decimal:3',
'amount' => 'decimal:2',
];
/**
* 所属订单
*/
public function order(): BelongsTo
{
return $this->belongsTo(StoreOrderModel::class, 'order_id', 'id');
}
/**
* 下单门店
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 下单商品
*/
public function product(): BelongsTo
{
return $this->belongsTo(ProductModel::class, 'product_id', 'id');
}
}
+66
View File
@@ -0,0 +1,66 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* 门店订单模型(小程序下单,快照等级价)
*/
class StoreOrderModel extends Model
{
use HasFactory;
/** 状态:待汇总(可被采购单生成归集、可取消) */
public const STATUS_PENDING = 0;
/** 状态:已汇总(已生成采购单) */
public const STATUS_SUMMARIZED = 1;
/** 状态:配送中 */
public const STATUS_DELIVERING = 2;
/** 状态:已完成 */
public const STATUS_COMPLETED = 3;
/** 状态:已取消 */
public const STATUS_CANCELLED = 9;
protected $table = 'store_order';
protected $primaryKey = 'id';
protected $fillable = [
'order_no',
'store_id',
'order_date',
'total_quantity',
'total_weight',
'total_amount',
'status',
'remark',
];
protected $casts = [
'store_id' => 'integer',
'order_date' => 'date:Y-m-d',
'total_quantity' => 'decimal:2',
'total_weight' => 'decimal:3',
'total_amount' => 'decimal:2',
'status' => 'integer',
];
/**
* 下单门店
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 订单明细
*/
public function items(): HasMany
{
return $this->hasMany(StoreOrderItemModel::class, 'order_id', 'id');
}
}
+62
View File
@@ -0,0 +1,62 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
* 供应商模型(采购单接收方)
*/
class SupplierModel extends Model
{
use SoftDeletes, HasFactory;
/** 状态:停用 */
public const STATUS_DISABLED = 0;
/** 状态:正常 */
public const STATUS_NORMAL = 1;
protected $table = 'supplier';
protected $primaryKey = 'id';
protected $fillable = [
'name',
'contact',
'phone',
'address',
'main_products',
'status',
'remark',
];
protected $casts = [
'status' => 'integer',
];
/**
* 供应商供货的商品
*/
public function products(): HasMany
{
return $this->hasMany(ProductModel::class, 'supplier_id', 'id');
}
/**
* 供应商的采购明细行
*/
public function purchaseItems(): HasMany
{
return $this->hasMany(PurchaseOrderItemModel::class, 'supplier_id', 'id');
}
/**
* 绑定本供应商的小程序用户
*/
public function users(): HasMany
{
return $this->hasMany(UserModel::class, 'supplier_id', 'id');
}
}
+66 -2
View File
@@ -2,17 +2,31 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
/**
* APP 用户模型
* APP 用户模型(小程序端:门店 / 供应商用户)
*/
class UserModel extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/** 用户类型:待绑定(手机号未匹配到门店/供应商,需后台人工绑定) */
public const TYPE_PENDING = 0;
/** 用户类型:门店 */
public const TYPE_STORE = 1;
/** 用户类型:供应商 */
public const TYPE_SUPPLIER = 2;
/** 状态:停用 */
public const STATUS_DISABLED = 0;
/** 状态:正常 */
public const STATUS_NORMAL = 1;
protected $table = 'user';
protected $primaryKey = 'id';
@@ -23,10 +37,60 @@ class UserModel extends Authenticatable
];
protected $fillable = [
'mobile',
'username',
'email',
'password',
'nickname',
'openid',
'unionid',
'phone',
'avatar',
'type',
'store_id',
'supplier_id',
'status',
'last_login_at',
];
protected $casts = [
'email_verified_at' => 'datetime',
'last_login_at' => 'datetime',
'type' => 'integer',
'store_id' => 'integer',
'supplier_id' => 'integer',
'status' => 'integer',
];
/**
* 关联门店(type=1 时有效)
*/
public function store(): BelongsTo
{
return $this->belongsTo(StoreModel::class, 'store_id', 'id');
}
/**
* 关联供应商(type=2 时有效)
*/
public function supplier(): BelongsTo
{
return $this->belongsTo(SupplierModel::class, 'supplier_id', 'id');
}
/**
* 用户通知
*/
public function notices(): HasMany
{
return $this->hasMany(NoticeModel::class, 'user_id', 'id');
}
/**
* 是否已绑定业务主体(门店或供应商)
*/
public function isBound(): bool
{
return $this->type === self::TYPE_STORE && $this->store_id > 0
|| $this->type === self::TYPE_SUPPLIER && $this->supplier_id > 0;
}
}