RejectedBill.php 9.0 KB

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