RejectedBill.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. namespace App;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Controllers\LogisticNumberFeatureController;
  5. use App\Services\OrderPackageCommoditiesService;
  6. use Carbon\Carbon;
  7. use Illuminate\Database\Eloquent\Model;
  8. use Illuminate\Database\Eloquent\SoftDeletes;
  9. use Illuminate\Support\Arr;
  10. use Illuminate\Support\Facades\Auth;
  11. use Overtrue\LaravelPinyin\Facades\Pinyin;
  12. /**
  13. * @method static find(array|string|null $param)
  14. */use App\Traits\ModelTimeFormat;
  15. class RejectedBill extends Model
  16. {
  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. protected $appends = ['owner_name','logistic_name','created_at_short'
  24. ,'is_loaded_str','goods_amount','is_loaded_null','operator_name'];
  25. function owner(){
  26. return $this->hasOne('App\Owner','id','id_owner');
  27. }
  28. function logistic(){
  29. return $this->hasOne('App\Logistic','id','id_logistic_return');
  30. }
  31. function items(){
  32. return $this->hasMany('App\RejectedBillItem','id_rejected_bill','id');
  33. }
  34. function rejectedBillItems(){
  35. return $this->items();
  36. }
  37. function wmsReflectReceive(){
  38. return $this->belongsTo('App\WMSReflectReceive','id','id_rejected_bill');
  39. }
  40. function setIsLoaded_toWaitConfirm(){
  41. if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"将待推单修改为待确认! 退单号:".$this['logistic_number_return'],Auth::user()['id']);
  42. $bill=RejectedBill::find($this['id']);
  43. $bill['is_loaded']=4;
  44. $bill->save();
  45. }
  46. function logisticName(){
  47. $logistic=$this->hasOne('App\Logistic','id','id_logistic_return')->first();
  48. return $logistic?$logistic['name']:'';
  49. }
  50. function makeCheckedNumbers(){
  51. $owner = $this->owner()->first();
  52. if(!$owner)return '';
  53. $pinyinOwnerName=Pinyin::convert($owner->name);
  54. $pinyinArr=array_map(function($pinyin){
  55. return $pinyin[0];
  56. },$pinyinOwnerName);
  57. $initials=implode("", $pinyinArr);
  58. $this['checked_numbers']=$initials.Carbon::now()->format('Ymd').$owner->getIncreasedCheckingCount();
  59. return $this['checked_numbers'];
  60. }
  61. function orderIssue(){
  62. return $this->hasOne('App\OrderIssue','rejected_bill_id','id');
  63. }
  64. function update(array $attributes = [], array $options = [])
  65. {
  66. (new LogisticNumberFeatureController())->createFeatures($this['logistic_number_return'],$this['id_logistic_return']);
  67. return parent::update($attributes, $options);
  68. }
  69. function save(array $options = [])
  70. {
  71. (new LogisticNumberFeatureController())->createFeatures($this['logistic_number_return'],$this['id_logistic_return']);
  72. return parent::save($options);
  73. }
  74. public function getOwnerNameAttribute(){
  75. $id_owner=$this['id_owner']??0;
  76. $owner=Owner::find($id_owner);
  77. return $this['owner_name']=$owner['name'];
  78. }
  79. public function getLogisticNameAttribute(){
  80. $id_logistic=$this['id_logistic_return']??0;
  81. $logistic=Logistic::find($id_logistic);
  82. return $this['logistic_name']=$logistic['name'];
  83. }
  84. public function getIsLoadedStrAttribute(){
  85. $val=$this['is_loaded']===null?'null':$this['is_loaded'];
  86. $val=$val===0?'0':$val;
  87. switch ($val){
  88. case 'null':return '无需入库';
  89. case '0':return '否';
  90. case 1:return '是';
  91. case 2:return '待推单';
  92. case 3:return '上传异常';
  93. }
  94. return '';
  95. }
  96. public function getCreatedAtShortAttribute(){
  97. return $this['created_at']?$this['created_at_short']=$this['created_at']->format('m-d H:i:s'):'';
  98. }
  99. public function getGoodsAmountAttribute(){
  100. $amount=0;
  101. $this->items()->get()->each(function (RejectedBillItem $item)use(&$amount){
  102. $amount+=$item['amount'];
  103. });
  104. return $amount;
  105. }
  106. public function getOperatorNameAttribute(){
  107. if(!$this['id_operator']){return '';}
  108. $user=User::find($this['id_operator']);
  109. return $user['name'];
  110. }
  111. public function getIsLoadedNullAttribute(){
  112. if($this['is_loaded']===null) return 'null';
  113. return $this['is_loaded'];
  114. }
  115. public function changeIsLoaded_ifItemsAllLoaded(){
  116. $allItemsAreLoaded=true;
  117. $this->items->each(function (RejectedBillItem $item)use(&$allItemsAreLoaded){
  118. if($item['is_loaded']=='未入库'){
  119. $allItemsAreLoaded=false;
  120. return false;
  121. }
  122. });
  123. if($allItemsAreLoaded){
  124. $this['is_loaded']=1;
  125. }else{
  126. $this['is_loaded']=0;
  127. }
  128. $this->update();
  129. return $this['is_loaded'];
  130. }
  131. public function syncOrderIssue(){
  132. $orderIssue = $this->orderIssue()->first();
  133. if(isset($orderIssue)){
  134. $this-> judgeRejectingStatus($orderIssue);
  135. OrderIssue::where('id',$orderIssue['id'])->update(['is_new_rejecting'=>'有']);
  136. }
  137. }
  138. private function judgeRejectingStatus(OrderIssue $orderIssue)
  139. {
  140. $orderPackageCommoditiesService = new OrderPackageCommoditiesService();
  141. $rejectedItems = [];
  142. $orderItems = [];
  143. if ($orderIssue->rejected_bill_id) {
  144. $rejectedBill = RejectedBill::find($orderIssue->rejected_bill_id)->first();
  145. $rejectedBillItems = RejectedBillItem::where('id_rejected_bill', $rejectedBill->id)->get();
  146. if ($rejectedBillItems) {
  147. foreach ($rejectedBillItems as $item) {
  148. if(!isset($rejectedItems[$item->barcode_goods])){
  149. $rejectedItems[$item->barcode_goods] =0;
  150. }
  151. $rejectedItems[$item->barcode_goods] = $item->amount + $rejectedItems[$item->barcode_goods] ?? 0;
  152. }
  153. }
  154. } else {
  155. $orderIssue->update(['rejecting' => '无']);
  156. $orderIssue->save();
  157. return;
  158. }
  159. if ($orderIssue->order_id) {
  160. $orderPackageCommodities = $orderPackageCommoditiesService->getOrderPackageCommoditiesByOrderId($orderIssue->order_id);
  161. if ($orderPackageCommodities) {
  162. foreach ($orderPackageCommodities as $key => $item) {
  163. if (!isset($orderItems[$item->commodity->sku])) {
  164. Arr::add($orderItems,$item->commodity->sku,0);
  165. }
  166. $orderItems[$item->commodity->sku] = $orderItems[$item->commodity->sku] ?? 0 + $item->amount;
  167. }
  168. } else {
  169. $orderIssue->update(['rejecting_status' => '未退回']);
  170. $orderIssue->save();
  171. return;
  172. }
  173. }
  174. $rejectedExcess = 0; // 退回差异
  175. $rejectedReview = 0; // 退回复核 $rejectedItems == $orderItems
  176. foreach ($rejectedItems as $key => $items) {
  177. if (!isset($orderItems[$key])) {
  178. $rejectedExcess++;
  179. } else {
  180. if ($rejectedItems[$key] == $orderItems[$key]) {
  181. $rejectedReview++;
  182. }
  183. }
  184. }
  185. if ($rejectedExcess > 0) {
  186. $orderIssue->update(['rejecting_status' => '差异退回']);
  187. $orderIssue->save();
  188. return;
  189. }
  190. $isExcess = 0; // 超量 $orderItems < $rejectedItems
  191. $isDiff = 0; // 部分 $orderItems > $rejectedItems
  192. $isAccord = 0; // 相同 $orderItems == $rejectedItems
  193. $isLack = 0; // 缺少 $orderItems != $rejectedItems
  194. foreach ($orderItems as $key => $item) {
  195. if (isset($rejectedItems[$key])) {
  196. if ($orderItems[$key] > $rejectedItems[$key]) {
  197. $isExcess++;
  198. } else if ($orderItems[$key] < $rejectedItems[$key]) {
  199. $isDiff++;
  200. } else if ($orderItems[$key] == $rejectedItems[$key]) {
  201. $isAccord++;
  202. }
  203. } else {
  204. $isLack++;
  205. }
  206. }
  207. if ($isAccord == $rejectedReview) {
  208. $orderIssue->update(['rejecting_status' => '全部退回']);
  209. $orderIssue->save();
  210. return;
  211. } else if ($isDiff > 0 and $isLack >= 0) {
  212. $orderIssue->update(['rejecting_status' => '部分退回']);
  213. $orderIssue->save();
  214. return;
  215. } else if ($isExcess > 0 and $isDiff == 0) {
  216. $orderIssue->update(['rejecting_status' => '超量退回']);
  217. $orderIssue->save();
  218. return;
  219. }
  220. }
  221. }