|
@@ -0,0 +1,345 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Service;
|
|
|
+
|
|
|
+use App\Model\Depart;
|
|
|
+use App\Model\Employee;
|
|
|
+use App\Model\InvoiceOrder;
|
|
|
+use App\Model\InvoiceOrderInfo;
|
|
|
+use App\Model\ProductRange;
|
|
|
+use App\Model\ReturnExchangeOrder;
|
|
|
+use App\Model\ReturnExchangeOrderProductInfo;
|
|
|
+use App\Model\ReturnExchangeOrderRange;
|
|
|
+use App\Model\SalesOrder;
|
|
|
+use App\Model\TakeOrder;
|
|
|
+use App\Model\TakeOrderInfo;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+
|
|
|
+class ReturnExchangeOrderService extends Service
|
|
|
+{
|
|
|
+ public function edit($data,$user){
|
|
|
+ list($status,$msg) = $this->orderRule($data,$user,false);
|
|
|
+ if(!$status) return [$status,$msg];
|
|
|
+
|
|
|
+ try{
|
|
|
+ DB::beginTransaction();
|
|
|
+ $material_model = ReturnExchangeOrder::where('order_number',$data['order_number'])->first();
|
|
|
+ $material_model->sales_order_id = $data['sales_order_id'];
|
|
|
+ $material_model->difference_amount = $data['difference_amount'];
|
|
|
+ $material_model->mark = $data['mark'];
|
|
|
+ $material_model->save();
|
|
|
+ $time = time();
|
|
|
+
|
|
|
+ ReturnExchangeOrderProductInfo::where('del_time',0)
|
|
|
+ ->where('return_exchange_id',$data['id'])
|
|
|
+ ->update(['del_time' => $time]);
|
|
|
+ if(!empty($data['product_one'])){
|
|
|
+ $sub = [];
|
|
|
+ foreach ($data['product_one'] as $value){
|
|
|
+ $sub[] = [
|
|
|
+ 'return_exchange_id' => $material_model->id,
|
|
|
+ 'depart_id' => $data['depart_id'] ?? 0,
|
|
|
+ 'product_id' => $value['product_id'],
|
|
|
+ 'number' => $value['number'],
|
|
|
+ 'mark' => $value['mark'] ?? '',
|
|
|
+ 'title' => $value['title'],
|
|
|
+ 'code' => $value['code'] ?? '',
|
|
|
+ 'size' => $value['size'] ?? '',
|
|
|
+ 'unit' => $value['unit'] ?? 0,
|
|
|
+ 'bar_code' => $value['bar_code'] ?? '',
|
|
|
+ 'cost' => $value['cost'] ?? 0,
|
|
|
+ 'depart_price' => $value['depart_price'] ?? 0,
|
|
|
+ 'retail_price' => $value['retail_price'] ?? 0,
|
|
|
+ 'return_or_exchange' => ReturnExchangeOrderProductInfo::type_one
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderProductInfo::insert($sub);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!empty($data['product_two'])){
|
|
|
+ $sub = [];
|
|
|
+ foreach ($data['product_two'] as $value){
|
|
|
+ $sub[] = [
|
|
|
+ 'return_exchange_id' => $material_model->id,
|
|
|
+ 'depart_id' => $data['depart_id'] ?? 0,
|
|
|
+ 'product_id' => $value['product_id'],
|
|
|
+ 'number' => $value['number'],
|
|
|
+ 'mark' => $value['mark'] ?? '',
|
|
|
+ 'title' => $value['title'],
|
|
|
+ 'code' => $value['code'] ?? '',
|
|
|
+ 'size' => $value['size'] ?? '',
|
|
|
+ 'unit' => $value['unit'] ?? 0,
|
|
|
+ 'bar_code' => $value['bar_code'] ?? '',
|
|
|
+ 'cost' => $value['cost'] ?? 0,
|
|
|
+ 'depart_price' => $value['depart_price'] ?? 0,
|
|
|
+ 'retail_price' => $value['retail_price'] ?? 0,
|
|
|
+ 'return_or_exchange' => ReturnExchangeOrderProductInfo::type_two
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderProductInfo::insert($sub);
|
|
|
+ }
|
|
|
+
|
|
|
+ ReturnExchangeOrderRange::where('del_time',0)
|
|
|
+ ->where('return_exchange_id',$data['id'])
|
|
|
+ ->update(['del_time' => $time]);
|
|
|
+
|
|
|
+ if(! empty($data['depart'])){
|
|
|
+ $insert = [];
|
|
|
+ foreach ($data['depart'] as $value){
|
|
|
+ $insert[] = [
|
|
|
+ 'return_exchange_id' => $data['id'],
|
|
|
+ 'depart_id' => $value,
|
|
|
+ 'type' => ReturnExchangeOrderRange::type_one,
|
|
|
+ 'crt_time' => $time,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderRange::insert($insert);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(! empty($data['employee'])){
|
|
|
+ $insert = [];
|
|
|
+ foreach ($data['employee'] as $value){
|
|
|
+ $insert[] = [
|
|
|
+ 'return_exchange_id' => $data['id'],
|
|
|
+ 'employee_id' => $value,
|
|
|
+ 'type' => ReturnExchangeOrderRange::type_two,
|
|
|
+ 'crt_time' => $time,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderRange::insert($insert);
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ }catch (\Throwable $e){
|
|
|
+ DB::rollBack();
|
|
|
+ return [false,$e->getMessage()];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true,''];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function add($data,$user){
|
|
|
+ list($status,$msg) = $this->orderRule($data,$user);
|
|
|
+ if(!$status) return [$status,$msg];
|
|
|
+
|
|
|
+ try{
|
|
|
+ DB::beginTransaction();
|
|
|
+ $material_model = new ReturnExchangeOrder();
|
|
|
+ $material_model->model_type = $data['model_type'];
|
|
|
+ $material_model->order_number = $data['order_number'];
|
|
|
+ $material_model->sales_order_id = $data['sales_order_id'];
|
|
|
+ $material_model->difference_amount = $data['difference_amount'];
|
|
|
+ $material_model->mark = $data['mark'];
|
|
|
+ $material_model->depart_id = $data['depart_id'] ?? 0;
|
|
|
+ $material_model->top_depart_id = $data['top_depart_id'] ?? 0;
|
|
|
+ $material_model->crt_id = $user['id'];
|
|
|
+ $material_model->save();
|
|
|
+ $time = time();
|
|
|
+
|
|
|
+ if(!empty($data['product_one'])){
|
|
|
+ $sub = [];
|
|
|
+ foreach ($data['product_one'] as $value){
|
|
|
+ $sub[] = [
|
|
|
+ 'return_exchange_id' => $material_model->id,
|
|
|
+ 'depart_id' => $data['depart_id'] ?? 0,
|
|
|
+ 'product_id' => $value['product_id'],
|
|
|
+ 'number' => $value['number'],
|
|
|
+ 'mark' => $value['mark'] ?? '',
|
|
|
+ 'title' => $value['title'],
|
|
|
+ 'code' => $value['code'] ?? '',
|
|
|
+ 'size' => $value['size'] ?? '',
|
|
|
+ 'unit' => $value['unit'] ?? 0,
|
|
|
+ 'bar_code' => $value['bar_code'] ?? '',
|
|
|
+ 'cost' => $value['cost'] ?? 0,
|
|
|
+ 'depart_price' => $value['depart_price'] ?? 0,
|
|
|
+ 'retail_price' => $value['retail_price'] ?? 0,
|
|
|
+ 'return_or_exchange' => ReturnExchangeOrderProductInfo::type_one
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderProductInfo::insert($sub);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!empty($data['product_two'])){
|
|
|
+ $sub = [];
|
|
|
+ foreach ($data['product_two'] as $value){
|
|
|
+ $sub[] = [
|
|
|
+ 'return_exchange_id' => $material_model->id,
|
|
|
+ 'depart_id' => $data['depart_id'] ?? 0,
|
|
|
+ 'product_id' => $value['product_id'],
|
|
|
+ 'number' => $value['number'],
|
|
|
+ 'mark' => $value['mark'] ?? '',
|
|
|
+ 'title' => $value['title'],
|
|
|
+ 'code' => $value['code'] ?? '',
|
|
|
+ 'size' => $value['size'] ?? '',
|
|
|
+ 'unit' => $value['unit'] ?? 0,
|
|
|
+ 'bar_code' => $value['bar_code'] ?? '',
|
|
|
+ 'cost' => $value['cost'] ?? 0,
|
|
|
+ 'depart_price' => $value['depart_price'] ?? 0,
|
|
|
+ 'retail_price' => $value['retail_price'] ?? 0,
|
|
|
+ 'return_or_exchange' => ReturnExchangeOrderProductInfo::type_two
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderProductInfo::insert($sub);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(! empty($data['depart'])){
|
|
|
+ $insert = [];
|
|
|
+ foreach ($data['depart'] as $value){
|
|
|
+ $insert[] = [
|
|
|
+ 'return_exchange_id' => $data['id'],
|
|
|
+ 'depart_id' => $value,
|
|
|
+ 'type' => ReturnExchangeOrderRange::type_one,
|
|
|
+ 'crt_time' => $time,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderRange::insert($insert);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(! empty($data['employee'])){
|
|
|
+ $insert = [];
|
|
|
+ foreach ($data['employee'] as $value){
|
|
|
+ $insert[] = [
|
|
|
+ 'return_exchange_id' => $data['id'],
|
|
|
+ 'employee_id' => $value,
|
|
|
+ 'type' => ReturnExchangeOrderRange::type_two,
|
|
|
+ 'crt_time' => $time,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ ReturnExchangeOrderRange::insert($insert);
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ }catch (\Throwable $e){
|
|
|
+ DB::rollBack();
|
|
|
+ return [false,$e->getMessage()];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true,''];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function detail($data){
|
|
|
+ if($this->isEmpty($data,'id')) return [false,'请选择数据'];
|
|
|
+
|
|
|
+ $order = ReturnExchangeOrder::where('id',$data['id'])
|
|
|
+ ->where('del_time',0)
|
|
|
+ ->select('id','order_number','model_type','sales_order_id','difference_amount','crt_id','mark','state')
|
|
|
+ ->first();
|
|
|
+ if(empty($order)) return [false, '退换货订单不存在或已被删除'];
|
|
|
+ $order = $order->toArray();
|
|
|
+
|
|
|
+ $order['product_one'] = $order['product_two'] = [];
|
|
|
+ $info = ReturnExchangeOrderProductInfo::where('del_time',0)
|
|
|
+ ->where('return_exchange_id',$data['id'])
|
|
|
+ ->select('id','return_exchange_id','product_id','product_id','number','mark','title','code','size','unit','bar_code','cost','depart_price','retail_price','return_or_exchange')
|
|
|
+ ->get()->toArray();
|
|
|
+ foreach ($info as $value){
|
|
|
+ if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
|
|
|
+ $order['product_one'][] = $value;
|
|
|
+ }else{
|
|
|
+ $order['product_two'][] = $value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, $order];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function del($data){
|
|
|
+ if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
|
|
|
+
|
|
|
+ $bool = ReturnExchangeOrder::where('id',$data['id'])
|
|
|
+ ->where('state','>',ReturnExchangeOrder::State_zero)->exists();
|
|
|
+ if($bool) return [false,'退换货单已确认,删除失败!'];
|
|
|
+
|
|
|
+ try{
|
|
|
+ DB::beginTransaction();
|
|
|
+ ReturnExchangeOrder::where('id',$data['id'])->update([
|
|
|
+ 'del_time'=>time()
|
|
|
+ ]);
|
|
|
+ ReturnExchangeOrderProductInfo::where('return_exchange_id',$data['id'])->update([
|
|
|
+ 'del_time'=>time()
|
|
|
+ ]);
|
|
|
+ ReturnExchangeOrderRange::where('return_exchange_id',$data['id'])->update([
|
|
|
+ 'del_time'=>time()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ }catch (\Throwable $e){
|
|
|
+ DB::rollBack();
|
|
|
+ return [false,$e->getMessage()];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true,''];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function getList($data,$user){
|
|
|
+ $model = ReturnExchangeOrder::where('del_time',0)
|
|
|
+ ->select('id','order_number','sales_order_id','difference_amount','state','crt_time','crt_id','mark')
|
|
|
+ ->orderby('id', 'desc');
|
|
|
+ if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
|
|
|
+ if(isset($data['state'])) $model->where('state',$data['state']);
|
|
|
+ if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
|
|
|
+ $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
|
|
|
+ $model->whereBetween('crt_time',[$return[0],$return[1]]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $list = $this->limit($model,'',$data);
|
|
|
+ $list = $this->fillListData($list);
|
|
|
+
|
|
|
+ return [true, $list];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function fillListData($data){
|
|
|
+ if(empty($data['data'])) return $data;
|
|
|
+
|
|
|
+ $emp_id = array_unique(array_merge_recursive(array_column($data['data'],'crt_id')));
|
|
|
+ $emp_map = Employee::whereIn('id',$emp_id)
|
|
|
+ ->pluck('emp_name','id')
|
|
|
+ ->toArray();
|
|
|
+
|
|
|
+ foreach ($data['data'] as $key => $value){
|
|
|
+ $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']) : '';
|
|
|
+ $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
|
|
|
+ $data['data'][$key]['state_title'] = ReturnExchangeOrder::$state[$value['state']] ?? '';
|
|
|
+ }
|
|
|
+
|
|
|
+ return $data;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function orderRule(&$data, $user, $is_check = true){
|
|
|
+ if($this->isEmpty($data,'model_type')) return [false,'单据类型不能为空!'];
|
|
|
+ if(! isset(ReturnExchangeOrder::$model_type[$data['model_type']])) return [false,'单据类型不存在'];
|
|
|
+ if($this->isEmpty($data,'sales_order_id')) return [false,'合同不能为空!'];
|
|
|
+ if(empty($data['sales_order_id'])) return [false,'请选择合同'];
|
|
|
+ $sale = SalesOrder::where('del_time',0)->where('id',$data['sales_order_id'])->first();
|
|
|
+ if(empty($sale)) return [false,'合同不存在或已被删除'];
|
|
|
+ if($sale['state'] < SalesOrder::State_two) return [false,'合同未施工,不能进行退换货操作'];
|
|
|
+
|
|
|
+ foreach ($data['product_one'] as $value){
|
|
|
+ if(empty($value['number'])) return [false,'产品数量不能为空'];
|
|
|
+ $res = $this->checkNumber($value['number']);
|
|
|
+ if(! $res) return [false,'请输入正确的退货产品数量'];
|
|
|
+ }
|
|
|
+ if($data['model_type'] == ReturnExchangeOrder::Model_type_two){
|
|
|
+ foreach ($data['product_two'] as $value){
|
|
|
+ if(empty($value['number'])) return [false,'产品数量不能为空'];
|
|
|
+ $res = $this->checkNumber($value['number']);
|
|
|
+ if(! $res) return [false,'请输入正确的换货产品数量'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //所属部门 以及 顶级部门
|
|
|
+ if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user);
|
|
|
+ $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
|
|
|
+
|
|
|
+ if($is_check){
|
|
|
+ $prefix = ReturnExchangeOrder::$prefix[$data['model_type']] ?? "";
|
|
|
+ $order_number = (new OrderNoService())->createReturnExchangeOrderNumber($prefix);
|
|
|
+ if(empty($order_number)) return [false,'退换货单号生成失败!'];
|
|
|
+ $data['order_number'] = $order_number;
|
|
|
+ }else{
|
|
|
+ if($this->isEmpty($data,'order_number')) return [false,'退换货单号不能为空!'];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, ''];
|
|
|
+ }
|
|
|
+}
|