[已处理,已签收] 宝时审核->[`无法拦截`,`成功已退回,不赔偿`,`拦截在途丢件,赔偿`]
// 信息更改: 承运商->[已处理,无法更改] 宝时审核->[更改成功,更改失败]
// 快递异常: 承运商->[已处理,已拦截] 宝时审核->[丢件赔偿,签收成功]
// 错漏发: 宝时处理->[已核实] 商家处理->[补发,不补发]
// 破损: 承运商->[核实全部破损,核实部分破损,核实未破损] 宝时终审->[核实全部破损,核实部分破损,核实未破损]
// 快递丢件: 待商家处理 待终审 完结
// -----------------------------------
'type', // 快递异常填写:在途异常,签收未收到
'status', // 审核状态
'review_at', // 审核时间
'uniquely_tag', // 唯一标识
'remark', // 工单信息描述
'work_order_status', // 1 为创建状态 0 为处理状态
'logistic_tag', // 待承运商处理标记 0 为默认状态 1无 2 滞 3新
'bao_shi_tag', // 待宝时处理标记 0 为默认状态 1无 2 滞 3新
'owner_tag', // 待货主处理标记 0 为默认状态 1无 2 滞 3新
"is_new_rejecting", // 回库标记
'created_at',
'rejecting_status', // 退回状态
'logistic_indemnity_money', // 承运商赔偿金额
'logistic_express_remission', // 承运商减免
'bao_shi_indemnity_money', // 宝时赔偿金额
'bao_shi_express_remission', // 宝时减免
'user_owner_group_id',
'custom_rejected_status', // 自定义退回标记
];
/**
* @var int 默认
*/
public static $DEFAULT_STATUS = 0;
/**
* @var int 宝时处理
*/
public static $BAO_SHI_HANDLER_STATUS = 1;
/**
* @var int 货主处理
*/
public static $OWNER_HANDLER_STATUS = 2;
/**
* @var int 承运商处理
*/
public static $LOGISTIC_HANDLER_STATUS = 3;
/**
* @var int 宝时终审
*/
public static $BAO_SHI_REVIEW_STATUS = 4;
/**
* @var int 完成
*/
public static $END_STATUS = 5;
/**
* @var int 待货主完结
*/
public static $TO_BO_OWNER_END_STATUS = 6;
/**
* @var int `新`标记
*/
public static $NEW_TAG = 3;
/**
* @var int `滞`标记
*/
public static $STRAND_TAG = 2;
/**
* @var int `无`标记
*/
public static $NO_STATE_TAG = 1;
/**
* @var int 默认标记
*/
public static $DEFAULT_TAG = 0;
static public $enums = [
'status' => [
'' => 0,
'宝时处理' => 1,
'货主处理' => 2,
'承运商处理' => 3,
'宝时终审' => 4,
'完成' => 5,
'待货主完结' => 6,
],
'last_status' => [
'' => 0,
'宝时处理' => 1,
'货主处理' => 2,
'承运商处理' => 3,
'宝时终审' => 4,
'完成' => 5,
'待货主完结' => 6,
],
'is_new_rejecting' => [
'' => 0,
'回库' => 1,
],
];
function __construct(array $attributes = [])
{
foreach (self::$enums as &$enum) {
$enum = $enum + array_flip($enum);
}
parent::__construct($attributes);
}
public function getIsNewRejectingAttribute($value)
{
if (!$value) return '';
return self::$enums['is_new_rejecting'][$value];
}
public function setIsNewRejectingAttribute($value)
{
if (!$value) return;
if (is_numeric($value)) {
$this->attributes['is_new_rejecting'] = $value;
} else {
$this->attributes['is_new_rejecting'] = self::$enums['is_new_rejecting'][$value];
}
}
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 getLastStatusAttribute($value)
{
if (!$value) return '';
return self::$enums['last_status'][$value];
}
public function setLastStatusAttribute($value)
{
if (!$value) return;
if (is_numeric($value)) {
$this->attributes['last_status'] = $value;
} else {
$this->attributes['last_status'] = self::$enums['last_status'][$value];
}
}
// 关联订单
public function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}
// 关联货主
public function owner(): BelongsTo
{
return $this->belongsTo(Owner::class, 'owner_id');
}
// 关联承运商
public function logistic(): BelongsTo
{
return $this->belongsTo(Logistic::class);
}
// 创建人
public function creator(): BelongsTo
{
return $this->belongsTo(User::class, 'creator_id');
}
public function lastHandler(): BelongsTo
{
return $this->belongsTo(User::class, 'last_handler_id');
}
// 审核人
public function reviewer(): BelongsTo
{
return $this->belongsTo(User::class, 'reviewer_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 details(): HasMany
{
return $this->hasMany(WorkOrderDetail::class);
}
public function orderDetail(): BelongsTo
{
return $this->belongsTo(OrderDetail::class,'order_id','order_id');
}
public function userWorkGroups(): BelongsToMany
{
return $this->belongsToMany(UserWorkgroup::class,'work_order_user_workgroup');
}
public function userOwnerGroup(): BelongsTo
{
return $this->BelongsTo(UserOwnerGroup::class);
}
public function detail(): BelongsTo
{
return $this->belongsTo(WorkOrderDetail::class,'work_order_detail_id','id');
}
public function scopeFilter($query, $filters)
{
return $filters->apply($query);
}
public function orderIssueRejectedBills(): HasMany
{
return $this->hasMany(OrderIssueRejectedBill::class,'order_id','order_id');
}
/** 默认 with 参数 */
public function scopeDefaultWith($query)
{
$query->with($this->defaultWith());
}
public function defaultWith(): array
{
return ['owner', 'logistic', 'issueType', 'creator', 'lastHandler','orderDetail','orderIssueRejectedBills.rejectedBill.items',
'userWorkGroups','details' => function ($query) {
return $query->with(['commodities.commodity', 'logs' => function ($query) {
if(Gate::denies('订单管理-工单处理-宝时编辑')){
return $query->with('creator')->orderByDesc('created_at');
} else {
return $query->with('creator')->where('tag','!=','1')->orderByDesc('created_at');
}
}, 'images.uploadFile', 'issueType', 'processLogs' => function ($query) {
return $query->with('user')->orderByDesc('created_at');
}]);
},
'reviewer',
'order'=> function($query){
return $query->with('packages.commodities.commodity','shop','warehouse');
},
'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($this->defaultWith());
}
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 saveWorkOrderDetail($params)
{
$param = (new WorkOrderDetail($params))->getAttributes();
$this->details()->create($param);
$this->loadMissing('details');
}
// 工单完结
public function end()
{
$this->update(['status' => 5, 'work_order_status' => 0]);
}
/**
* 工单状态
*/
public function changeStatus($status)
{
$this->status = $status;
$this->update();
}
/**
* 处理进度
*/
public function changeProcessProgress($process_progress)
{
$this->update(['process_progress' => $process_progress]);
}
/**
* 工单状态 and 处理状态 and 处理人
* @param $status
* @param $process_progress
* @param $last_status
*/
public function change($status, $process_progress, $last_status)
{
$this->last_status = $last_status;
$this->status = $status;
$this->process_progress = $process_progress;
$this->last_handler_id = Auth::id();
$this->update();
}
public function syncIntercept()
{
if ($this->status === '完成') return;
/** @var WorkOrderDetail $detail */
$detail = $this->details()->where('order_issue_type_id', $this->order_issue_type_id)
->whereIn('status', [1, 2, 3, 4, 5])
->orderByDesc('created_at')->first();
if (!$detail) return;
$process_progress = '成功已退回,不赔偿';
$detail->update([
'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
'process_progress' => $process_progress,
'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
]);
$this->update([
'status' => WorkOrder::$TO_BO_OWNER_END_STATUS,
'process_progress' => $process_progress,
'last_status' => WorkOrder::$BAO_SHI_REVIEW_STATUS,
'owner_tag' => WorkOrder::$STRAND_TAG,
'logistic_tag' => WorkOrder::$DEFAULT_TAG,
'bao_shi_tag' => WorkOrder::$DEFAULT_TAG,
]);
app(WorkOrderLogService::class)->createLog($detail, '终审', '自动终审');
}
}