[
'' => 0,
'待审核' => 1,
'已处理' => 2,
],
'work_order_status' => [
'' => 0,
'信息未填写' => 1,
'信息已填写' => 2,
'快递已处理' => 3,
'工单完成' => 4,
],
'grad' => [
'' => 0,
'一般' => 1,
'重要' => 2,
'紧急' => 3,
'重要且紧急' => 4,
],
];
function __construct(array $attributes = [])
{
foreach (self::$enums as &$enum) {
$enum = $enum + array_flip($enum);
}
parent::__construct($attributes);
}
public function getStatusAttribute($value)
{
if (!$value) return '';
return self::$enums['status'][$value];
}
public function setStatusAttribute($value)
{
if (!$value) return ;
if (is_numeric($value)) {
$this->attributes['status'] = $value;
} else {
$this->attributes['status'] = self::$enums['status'][$value];
}
}
public function getWorkOrderStatusAttribute($value)
{
if (!$value) return '';
return self::$enums['work_order_status'][$value];
}
public function setWorkOrderStatusAttribute($value)
{
if (!$value) return ;
if (is_numeric($value)) {
$this->attributes['work_order_status'] = $value;
} else {
$this->attributes['work_order_status'] = self::$enums['work_order_status'][$value];
}
}
public function getGradAttribute($value)
{
if (!$value) return '';
return self::$enums['grad'][$value];
}
public function setGradAttribute($value)
{
if (!$value) return ;
if (is_numeric($value)) {
$this->attributes['grad'] = $value;
} else {
$this->attributes['grad'] = self::$enums['grad'][$value];
}
}
// 创建人
public function creator(): BelongsTo
{
return $this->belongsTo(User::class, 'creator_id');
}
// 审核人
public function reviewer(): BelongsTo
{
return $this->belongsTo(User::class, 'reviewer_id');
}
// 关联订单
public function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}
// 关联货主
public function owner(): BelongsTo
{
return $this->belongsTo(Owner::class, 'owner_id');
}
// 工单类型
public function type(): BelongsTo
{
return $this->BelongsTo(WorkOrderType::class, 'work_order_type_id');
}
// 生成问题件类型
public function issueType(): BelongsTo
{
return $this->belongsTo(OrderIssueType::class, 'order_issue_type_id');
}
/** 对应问题件 */
public function orderIssue(): BelongsTo
{
return $this->belongsTo(OrderIssue::class, 'order_id', 'order_id');
}
// 图片
public function image(): HasMany
{
return $this->hasMany(WorkOrderImage::class);
}
// 外包装图片
public function packageImages(): HasMany
{
return $this->hasMany(WorkOrderImage::class)->where('type', 1);
}
// 内物破损图片
public function commodityImages(): HasMany
{
return $this->hasMany(WorkOrderImage::class)->where('type', 2);
}
// 交易图片
public function dealImages(): HasMany
{
return $this->hasMany(WorkOrderImage::class)->where('type', 3);
}
// 退款图片
public function refundImages(): HasMany
{
return $this->hasMany(WorkOrderImage::class)->where('type', 4);
}
// 工单详情
public function details(): HasMany
{
return $this->hasMany(WorkOrderDetail::class);
}
// 工单商品信息
public function commodities(): HasMany
{
return $this->hasMany(WorkOrderCommodities::class);
}
// 宝时处理日志
public function processLog(): HasOne
{
return $this->hasOne(WorkOrderProcessLog::class)->where('type','1');
}
// 承运商处理日志
public function logisticLog(): HasOne
{
return $this->hasOne(WorkOrderProcessLog::class)->where('type','2');
}
public function scopeFilter($query, $filters)
{
return $filters->apply($query);
}
/** 默认 with 参数 */
public function scopeDefaultWith($query)
{
$query->with(['type', 'owner', 'issueType', 'creator','details','commodities.commodity',
'processLog.creator',
'logisticLog.creator',
'packageImages.uploadFile',
'commodityImages.uploadFile',
'dealImages.uploadFile',
'refundImages.uploadFile',
'reviewer',
'order' => function ($query) {
/** @var Builder $query */
$query->with('packages', 'logistic', 'owner');
}, 'orderIssue' => function ($query) {
/** @var Builder $query */
$query->with(['issueType', 'logs' => function ($query) {
if (Gate::denies('订单管理-问题件-客户不可见')) {
$query->with('user')->orderByDesc('created_at');
} else {
$query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
}
}]);
}]);
}
public function loadDefaultWith()
{
$this->loadMissing(['owner','type', 'issueType', 'creator','details','commodities.commodity',
'processLog.creator',
'logisticLog.creator',
'packageImages.uploadFile',
'commodityImages.uploadFile',
'dealImages.uploadFile',
'refundImages.uploadFile',
'reviewer',
'order' => function ($query) {
/** @var Builder $query */
$query->with('packages', 'logistic', 'owner');
}, 'orderIssue' => function ($query) {
/** @var Builder $query */
$query->with(['issueType', 'logs' => function ($query) {
if (Gate::denies('订单管理-问题件-客户不可见')) {
$query->with('user')->orderByDesc('created_at');
} else {
$query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
}
}]);
}]);
}
public function notification()
{
$user = Auth::user();
$this->loadMissing('owner', 'order');
$remark = $this->remark;
$ownerName = $this->owner->name ?? '';
$clientCode = $this->order->client_code ?? '';
$msg = $user["name"] . "建立了新工单
" . $ownerName . ":" . $clientCode . "
" . $remark;
NotificationService::SingleRegister($msg, $clientCode, "订单管理-问题件");
}
public function addPackageImage($images)
{ // 外包装图
foreach ($images as $image) {
/** @var UploadedFile $image */
$count = $this->packageImages()->count();
/** @var WorkOrderImage $workOrderImage */
$workOrderImage = $this->packageImages()->create(['type' => 0, 'amount' => ++$count]);
$workOrderImage->saveFile($image);
}
$this->loadMissing('packageImages');
}
public function addCommodityImage($images)
{ // 内物破损图
foreach ($images as $image) {
$count = $this->commodityImages()->count();
/** @var WorkOrderImage $workOrderImage */
$workOrderImage = $this->commodityImages()->create(['type' => 1, 'amount' => ++$count]);
$workOrderImage->saveFile($image);
}
$this->loadMissing('commodityImages');
}
public function addDealImage($images)
{ // 交易截图
foreach ($images as $image) {
$count = $this->dealImages()->count();
/** @var WorkOrderImage $workOrderImage */
$workOrderImage = $this->dealImages()->create(['type' => 2, 'amount' => ++$count]);
$workOrderImage->saveFile($image);
}
$this->loadMissing('dealImages');
}
public function addRefundImage($images)
{ // 退款截图
foreach ($images as $image) {
$count = $this->refundImages()->count();
/** @var WorkOrderImage $workOrderImage */
$workOrderImage = $this->refundImages()->create(['type' => 3, 'amount' => ++$count]);
$workOrderImage->saveFile($image);
}
$this->loadMissing('dealImages');
}
public function saveWorkOrderDetail($params)
{
$param = (new WorkOrderDetail($params))->getAttributes();
$this->details()->create($param);
$this->loadMissing('details');
}
}