RejectedBill.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <?php
  2. namespace App;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Controllers\LogisticNumberFeatureController;
  5. use Carbon\Carbon;
  6. use Illuminate\Database\Eloquent\Model;
  7. use Illuminate\Database\Eloquent\SoftDeletes;
  8. use Illuminate\Support\Facades\Auth;
  9. use Overtrue\LaravelPinyin\Facades\Pinyin;
  10. /**
  11. * @method static find(array|string|null $param)
  12. */use App\Traits\ModelTimeFormat;
  13. use App\Traits\LogModelChanging;
  14. class RejectedBill extends Model
  15. {
  16. use LogModelChanging;
  17. use ModelTimeFormat;
  18. use SoftDeletes;
  19. protected $fillable=['id_owner','order_number','sender','mobile_sender',
  20. 'logistic_number','logistic_number_return','id_logistic_return',
  21. 'is_loaded','fee_collected','remark','id_operator','is_checked',
  22. 'is_finished','checked_numbers','remark','common_01','common_02'];
  23. /*
  24. * id_owner 货主
  25. * order_number 订单号 OracleDOCOrderHeader->SOReference1
  26. * mobile_sender 电话 OracleDOCOrderHeader->[c_tell1,c_tell2]
  27. * logistic_number 原单单号
  28. * logistic_number_return 退回单号
  29. * id_logistic_return
  30. * is_loaded 是否入库
  31. * fee_collected 到付费用
  32. * remark 备注 OracleDOCOrderHeader->notes
  33. * id_operator
  34. * is_checked 是否审核
  35. * is_finished 是否完结
  36. * checked_numbers 审核编号
  37. */
  38. protected $appends = ['owner_name','logistic_name'
  39. ,'is_loaded_str','goods_amount','is_loaded_null','operator_name'];
  40. function owner(){
  41. return $this->hasOne('App\Owner','id','id_owner');
  42. }
  43. function logistic(){
  44. return $this->hasOne('App\Logistic','id','id_logistic_return');
  45. }
  46. function items(){
  47. return $this->hasMany('App\RejectedBillItem','id_rejected_bill','id');
  48. }
  49. function user(){
  50. return $this->hasOne('App\User','id','id_operator');
  51. }
  52. function rejectedBillItems(){
  53. return $this->items();
  54. }
  55. function wmsReflectReceive(){
  56. return $this->belongsTo('App\WMSReflectReceive','id','id_rejected_bill');
  57. }
  58. function orderIssue()
  59. {
  60. return $this->hasOneThrough(OrderIssue::class,OrderIssueRejectedBill::class,'logistic_number_return','id','logistic_number_return','order_issue_id');
  61. }
  62. function orderIssueRejectedBill(){
  63. return $this->hasOne(OrderIssueRejectedBill::class,'logistic_number_return','logistic_number_return');
  64. }
  65. function setIsLoaded_toWaitConfirm(){
  66. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"将待推单修改为待确认! 退单号:".$this['logistic_number_return'],Auth::user()['id']);
  67. $bill=RejectedBill::find($this['id']);
  68. $bill['is_loaded']=4;
  69. $bill->save();
  70. }
  71. function logisticName(){
  72. $logistic=$this->hasOne('App\Logistic','id','id_logistic_return')->first();
  73. return $logistic?$logistic['name']:'';
  74. }
  75. function makeCheckedNumbers(){
  76. $owner = $this->owner()->first();
  77. if(!$owner)return '';
  78. $pinyinOwnerName=Pinyin::convert($owner->name);
  79. $pinyinArr=array_map(function($pinyin){
  80. return $pinyin[0];
  81. },$pinyinOwnerName);
  82. $initials=implode("", $pinyinArr);
  83. $this['checked_numbers']=$initials.Carbon::now()->format('Ymd').$owner->getIncreasedCheckingCount();
  84. return $this['checked_numbers'];
  85. }
  86. function update(array $attributes = [], array $options = [])
  87. {
  88. (new LogisticNumberFeatureController())->createFeatures($this['logistic_number_return'],$this['id_logistic_return']);
  89. return parent::update($attributes, $options);
  90. }
  91. function save(array $options = [])
  92. {
  93. if($this['logistic_number_return'])(new LogisticNumberFeatureController())->createFeatures($this['logistic_number_return'],$this['id_logistic_return']);
  94. return parent::save($options);
  95. }
  96. public function getOwnerNameAttribute(){
  97. return $this->owner['name']??'';
  98. }
  99. public function getLogisticNameAttribute(){
  100. return $this->logistic['name']??'';
  101. }
  102. public function getIsLoadedStrAttribute(){
  103. $val=$this['is_loaded']===null?'null':$this['is_loaded'];
  104. $val=$val===0?'0':$val;
  105. switch ($val){
  106. case 'null':return '无需入库';
  107. case '0':return '否';
  108. case 1:return '是';
  109. case 2:return '待推单';
  110. case 3:return '上传异常';
  111. }
  112. return '';
  113. }
  114. public function getGoodsAmountAttribute(){
  115. $amount=0;
  116. $this->items->each(function (RejectedBillItem $item)use(&$amount){
  117. $amount+=$item['amount'];
  118. });
  119. return $amount;
  120. }
  121. public function getOperatorNameAttribute(){
  122. return $this['user'] ? $this['user']['name'] : null;
  123. }
  124. public function getIsLoadedNullAttribute(){
  125. if($this['is_loaded']===null) return 'null';
  126. return $this['is_loaded'];
  127. }
  128. public function changeIsLoaded_ifItemsAllLoaded(){
  129. $allItemsAreLoaded=true;
  130. $this->items->each(function (RejectedBillItem $item)use(&$allItemsAreLoaded){
  131. if($item['is_loaded']=='未入库'){
  132. $allItemsAreLoaded=false;
  133. return false;
  134. }
  135. });
  136. if($allItemsAreLoaded){
  137. $this['is_loaded']=1;
  138. }else{
  139. $this['is_loaded']=0;
  140. }
  141. $this->update();
  142. return $this['is_loaded'];
  143. }
  144. public function 同步问题件退件状态()
  145. {
  146. $orderIssue = $this->orderIssue()->first();
  147. if ($orderIssue ?? false) {
  148. // $this->同步退单状态();
  149. $orderIssue->update(['is_new_rejecting' => '有']);
  150. } else {
  151. OrderIssue::query()->where('logistic_number_return', $this->logistic_number_return)->update(['is_new_rejecting' => '有']);
  152. }
  153. }
  154. public function 同步问题件()
  155. {
  156. $orderIssue = $this->orderIssue()->first();
  157. if(!isset($orderIssue)){
  158. if(isset($this->order_number)){
  159. $orderNumber = $this->order_number;
  160. $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderNumber){
  161. $query->where('client_code',$orderNumber);
  162. })->first();
  163. }
  164. if(isset($this->logistic_number_return) && !isset($orderIssue)){
  165. $logistic_number_return = $this->logistic_number_return;
  166. $orderHeader = OracleDOCOrderHeader::query()->where('soreference1',function($query)use($logistic_number_return){
  167. $query->select('asnreference2')->from('DOC_ASN_HEADER')->where('asnreference3',$logistic_number_return)->first();
  168. })->first();
  169. $orderIssue = OrderIssue::query()->with('order')->whereHas('order',function($query)use($orderHeader){
  170. $query->where('code',$orderHeader->orderno);
  171. })->first();
  172. }
  173. }
  174. if(isset($orderIssue)){
  175. // $orderIssue->同步退单状态();
  176. $orderIssue->update(['is_new_rejecting' => '有']);
  177. }
  178. }
  179. private function 同步退单状态()
  180. {
  181. /** @var OrderIssue $orderIssue */
  182. $orderIssue = $this->orderIssue()->first();
  183. if($orderIssue ?? false)
  184. $orderIssue->同步退单状态();
  185. }
  186. public function delete()
  187. {
  188. /** @var OrderIssue $orderIssue */
  189. $orderIssue = $this->orderIssue;
  190. if($orderIssue){
  191. $orderIssue->unJoinRejectedBill($this->logistic_number_return);
  192. $orderIssue->update(['is_new_rejecting'=>'无']);
  193. $orderIssue->syncRejectingStatus();
  194. }
  195. return parent::delete(); // TODO: Change the autogenerated stub
  196. }
  197. public function syncOrderInfo()
  198. {
  199. if(!$this['id'])return;
  200. $order = $this->orderIssue->order ?? null;
  201. if(!$order)return;
  202. if($order->client_code)$this['order_number'] ?: $this['order_number'] =$order->client_code;
  203. if($order->consignee_name)$this['sender'] ?: $this['sender'] = $order->consignee_name;
  204. if($order->consignee_phone)$this['mobile_sender'] ?: $this['mobile_sender'] =$order->consignee_phone;
  205. $this->save();
  206. }
  207. public function syncOrderIssue()
  208. {
  209. if(isset($this->orderIssue)){
  210. $this->orderIssue->syncRejectingStatus();
  211. $this->syncOrderInfo();
  212. return;
  213. }
  214. /** @var OrderIssue $orderIssue */
  215. $orderIssue = null;
  216. // 原单退回
  217. if($this->logistic_number === '原单退回' || $this->logistic_number_return){
  218. $orderIssue = OrderIssue::query()->where('order_id',function ($query){
  219. $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
  220. })->first();
  221. }
  222. if(!$orderIssue){
  223. $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) {
  224. $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $this->logistic_number_return)->first();
  225. })->first();
  226. if(!$orderHeader)return;
  227. $orderIssue = OrderIssue::query()->where('order_id',function($query)use($orderHeader){
  228. $query->from('orders')->select('id')->where('code',$orderHeader->orderno);
  229. })->first();
  230. }
  231. if(!$orderIssue)return;
  232. if(!OrderIssueRejectedBill::isExit($orderIssue->id,$this->logistic_number_return)) $orderIssue->update(['is_new_rejecting' => '有']);
  233. $orderIssue->joinRejectedBill($this->logistic_number_return);
  234. $orderIssue->syncRejectingStatus();
  235. $this->syncOrderInfo();
  236. }
  237. }