WorkOrder.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace App;
  3. use App\Services\NotificationService;
  4. use App\Traits\ModelTimeFormat;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Database\Eloquent\Model;
  7. use App\Traits\ModelLogChanging;
  8. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  9. use Illuminate\Database\Eloquent\Relations\HasMany;
  10. use Illuminate\Database\Eloquent\SoftDeletes;
  11. use Illuminate\Support\Facades\Auth;
  12. use Illuminate\Support\Facades\Gate;
  13. class WorkOrder extends Model
  14. {
  15. use ModelLogChanging;
  16. use ModelTimeFormat;
  17. use SoftDeletes;
  18. // 工单 信息
  19. protected $fillable = [
  20. 'status', // 状态
  21. 'creator_id', // 创建人
  22. 'reviewer_id', // 审核人
  23. 'owner_id', // 货主
  24. 'order_issue_type_id', // 问题件类型
  25. 'work_order_type_id', // 工单类型
  26. 'grad', // 紧急等级
  27. 'remark', // 工单信息描述
  28. 'outer_table_name', // 链接表名
  29. 'review_at', // 审核时间
  30. 'order_id', // 订单id
  31. 'uniquely_tag', // 唯一标识
  32. ];
  33. static public $enums = [
  34. 'status' => [
  35. '' => 0,
  36. '待审核' => 1,
  37. '已处理' => 2,
  38. ],
  39. 'grad' => [
  40. '' => 0,
  41. '一般' => 1,
  42. '重要' => 2,
  43. '紧急' => 3,
  44. '重要且紧急' => 4,
  45. ],
  46. ];
  47. function __construct(array $attributes = [])
  48. {
  49. foreach (self::$enums as &$enum) {
  50. $enum = $enum + array_flip($enum);
  51. }
  52. parent::__construct($attributes);
  53. }
  54. public function getStatusAttribute($value)
  55. {
  56. if (!$value) return '';
  57. return self::$enums['status'][$value];
  58. }
  59. public function setStatusAttribute($value)
  60. {
  61. if (!$value) return 0;
  62. if (is_numeric($value)) {
  63. $this->attributes['status'] = $value;
  64. } else {
  65. $this->attributes['status'] = self::$enums['status'][$value];
  66. }
  67. }
  68. public function getGradAttribute($value)
  69. {
  70. if (!$value) return '';
  71. return self::$enums['grad'][$value];
  72. }
  73. public function setGradAttribute($value)
  74. {
  75. if (!$value) return 0;
  76. if (is_numeric($value)) {
  77. $this->attributes['grad'] = $value;
  78. } else {
  79. $this->attributes['grad'] = self::$enums['grad'][$value];
  80. }
  81. }
  82. // 创建人
  83. public function creator(): BelongsTo
  84. {
  85. return $this->belongsTo(User::class, 'creator_id');
  86. }
  87. // 审核人
  88. public function reviewer(): BelongsTo
  89. {
  90. return $this->belongsTo(User::class, 'reviewer_id');
  91. }
  92. // 关联订单
  93. public function order(): BelongsTo
  94. {
  95. return $this->belongsTo(Order::class);
  96. }
  97. // 关联货主
  98. public function owner(): BelongsTo
  99. {
  100. return $this->belongsTo(Owner::class, 'owner_id');
  101. }
  102. // 工单类型
  103. public function type(): BelongsTo
  104. {
  105. return $this->BelongsTo(WorkOrderType::class, 'work_order_type_id');
  106. }
  107. // 生成问题件类型
  108. public function issueType(): BelongsTo
  109. {
  110. return $this->belongsTo(OrderIssueType::class, 'order_issue_type_id');
  111. }
  112. /** 对应问题件 */
  113. public function orderIssue(): BelongsTo
  114. {
  115. return $this->belongsTo(OrderIssue::class, 'order_id', 'order_id');
  116. }
  117. // 图片
  118. public function image(): HasMany
  119. {
  120. return $this->hasMany(WorkOrderImage::class);
  121. }
  122. // 外包装图片
  123. public function packageImages(): HasMany
  124. {
  125. return $this->hasMany(WorkOrderImage::class)->where('type', 0);
  126. }
  127. // 内物破损图片
  128. public function commodityImage(): HasMany
  129. {
  130. return $this->hasMany(WorkOrderImage::class)->where('type', 1);
  131. }
  132. // 交易图片
  133. public function dealImages(): HasMany
  134. {
  135. return $this->hasMany(WorkOrderImage::class)->where('type', 2);
  136. }
  137. // 退款图片
  138. public function refundImages(): HasMany
  139. {
  140. return $this->hasMany(WorkOrderImage::class)->where('type', 3);
  141. }
  142. public function scopeFilter($query, $filters)
  143. {
  144. return $filters->apply($query);
  145. }
  146. /** 默认 with 参数 */
  147. public function scopeDefaultWith($query)
  148. {
  149. $query->with(['type', 'owner', 'issueType', 'creator', 'reviewer', 'order' => function ($query) {
  150. /** @var $query Builder */
  151. $query->with('packages', 'logistic', 'owner');
  152. }, 'orderIssue' => function ($query) {
  153. /** @var $query Builder */
  154. $query->with(['issueType', 'logs' => function ($query) {
  155. if (Gate::denies('订单管理-问题件-客户不可见')) {
  156. $query->with('user')->orderByDesc('created_at');
  157. } else {
  158. $query->with('user')->where('tag', '=', 0)->orderByDesc('created_at');
  159. }
  160. }]);
  161. }]);
  162. }
  163. public function notification()
  164. {
  165. $user = Auth::user();
  166. $this->loadMissing('owner', 'order');
  167. $remark = $this->remark;
  168. $ownerName = $this->owner->name ?? '';
  169. $clientCode = $this->order->client_code ?? '';
  170. $msg = $user["name"] . "建立了新工单<br/>" . $ownerName . ":" . $clientCode . "<br/>" . $remark;
  171. NotificationService::SingleRegister($msg, $clientCode, "订单管理-问题件");
  172. }
  173. public function addPackageImages($images)
  174. {
  175. foreach ($images as $image) {
  176. $count = $this->packageImages()->count();
  177. /** @var WorkOrderImage $workOrderImage */
  178. $workOrderImage = WorkOrderImage::query()->create(['type' => 0, 'amount' => ++$count]);
  179. $workOrderImage->saveFile($image);
  180. $this->packageImages()->save($workOrderImage);
  181. }
  182. }
  183. public function addCommodityImage($images)
  184. {
  185. foreach ($images as $image) {
  186. $count = $this->commodityImage()->count();
  187. /** @var WorkOrderImage $workOrderImage */
  188. $workOrderImage = WorkOrderImage::query()->create(['type' => 1, 'amount' => ++$count]);
  189. $workOrderImage->saveFile($image);
  190. $this->commodityImage()->save($workOrderImage);
  191. }
  192. }
  193. public function addDealImages($images)
  194. {
  195. foreach ($images as $image) {
  196. $count = $this->dealImages()->count();
  197. /** @var WorkOrderImage $workOrderImage */
  198. $workOrderImage = WorkOrderImage::query()->create(['type' => 2, 'amount' => ++$count]);
  199. $workOrderImage->saveFile($image);
  200. $this->dealImages()->save($workOrderImage);
  201. }
  202. }
  203. public function addRefundImage($images)
  204. {
  205. foreach ($images as $image) {
  206. $count = $this->refundImages()->count();
  207. /** @var WorkOrderImage $workOrderImage */
  208. $workOrderImage = WorkOrderImage::query()->create(['type' => 3, 'amount' => ++$count]);
  209. $workOrderImage->saveFile($image);
  210. $this->refundImages()->save($workOrderImage);
  211. }
  212. }
  213. }