cqpCow 8 miesięcy temu
rodzic
commit
2746c886ba

+ 2 - 2
app/Model/SalesOrder.php

@@ -70,8 +70,8 @@ class SalesOrder extends UseScopeBaseModel
     const State_eight = 8;//完结 客户
 
     const special_status = -100;
-    //审核通过条件  安装件 且 线上订单的已审核是2  其它是3
-    const search = "(sales_order_type = " . SalesOrder::Order_type_one . " and ((model_type = " . SalesOrder::Model_type_four ." and state = " . SalesOrder::State_two.") or (model_type <> " . SalesOrder::Model_type_four ." and state = " . SalesOrder::State_three.")))";
+    //审核通过条件  安装件 且 线上订单 补贴订单 的已审核是2  其它是3
+    const search = "(sales_order_type = " . SalesOrder::Order_type_one . " and ((model_type IN( " . SalesOrder::Model_type_four ." , " . SalesOrder::Model_type_seven .") and state = " . SalesOrder::State_two.") or (model_type Not IN (" . SalesOrder::Model_type_four ." , " . SalesOrder::Model_type_seven .") and state = " . SalesOrder::State_three.")))";
     public static $state = [
         self::State_minus_one => '已驳回',
         self::State_zero => '待创建人确认',

+ 6 - 6
app/Service/CheckService.php

@@ -893,8 +893,8 @@ class CheckService extends Service
 
         if($data['type'] == self::TYPE_ONE){
             $state = SalesOrder::State_three;
-            if($model->model_type == SalesOrder::Model_type_four){
-                //线上订单
+            if(in_array($model->model_type,[SalesOrder::Model_type_four,SalesOrder::Model_type_seven])){
+                //线上订单 补贴订单
                 $state = SalesOrder::State_two;
             }
             $model->state = $state;
@@ -912,13 +912,13 @@ class CheckService extends Service
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '合同不存在或已被删除'];
-        //安装件
 
-        if($model->model_type == SalesOrder::Model_type_four){
-            //线上订单
+        //安装件
+        if(in_array($model->model_type,[SalesOrder::Model_type_four,SalesOrder::Model_type_seven])){
+            //线上订单 补贴订单
             if($model->state != SalesOrder::State_two) return [false, '请确认合同状态,操作失败'];
         }else{
-            //除线上订单之外
+            //除线上订单 补贴订单 之外
             if($model->state != SalesOrder::State_three) return [false, '请确认合同状态,操作失败'];
         }
 

+ 258 - 0
app/Service/ImportService.php

@@ -28,6 +28,7 @@ class ImportService extends Service
         'product', //产品
         'customer', //客户
         'salesOnline', //线上订单
+        'btOnline' //补贴订单
     ];
 
     //写活的导入------------------- 暂时不好用
@@ -192,6 +193,17 @@ class ImportService extends Service
         return [true, $config_array,$filename];
     }
 
+    private function btOnline($data,$user){
+        //生成下载文件
+        $filename =  "补贴订单模板_" . time() . '.' . 'xlsx';
+
+        //获取配置文件
+        $config = "excel.salesOnlineTable";
+        $config_array = config($config) ?? [];
+        if(empty($config_array)) return [false, '配置文件不存在',''];
+        return [true, $config_array,$filename];
+    }
+
     //导入入口
     public function importAll($data,$user){
 //        //不超时
@@ -917,5 +929,251 @@ class ImportService extends Service
 
         return [true, ''];
     }
+
+    public function btOnlineImport($array, $user){
+        $head = $user['head']['id'] ?? 0;
+
+        // 去除表头
+        unset($array[0]);
+        if(empty($array)) return [false, '导入数据不能为空'];
+
+        $basic = (new BasicTypeService())->getMyBasicList($user, [18,23,24,29]);
+        $basic_list = [];
+        foreach ($basic as $value){
+            if($value['type'] == 18){
+                $basic_list[9][$value['title']] = $value['id'];
+            }elseif ($value['type'] == 23){
+                $basic_list[10][$value['title']] = $value['id'];
+            }elseif ($value['type'] == 24){
+                $basic_list[3][$value['title']] = $value['id'];
+            }elseif ($value['type'] == 29){
+                $basic_list[2][$value['title']] = $value['id'];
+            }
+        }
+
+        $search = "";
+        $customer = [];
+        foreach ($array as $key => $value){
+            $rowData = array_filter($value);
+            if (empty($rowData)) {
+                unset($array[$key]);
+            } elseif(empty($value[0]) || empty($value[1]) || empty($value[2]) || empty($value[3]) || empty($value[4]) || empty($value[5]) || $value[6] === null) {
+                return [false, '带*号的字段项必填'];
+            }else{
+                foreach ($value as $k => $v){
+                    $value[$k] = trim($v);
+                }
+                if(! isset($basic_list[2][$value[2]])) return [false, '客户简称:' . $value[2] .'不存在'];
+                $value[2] = $basic_list[2][$value[2]];
+                if(! isset($basic_list[3][$value[3]])) return [false, '店铺(平台类型):' . $value[3] .'不存在'];
+                $value[3] = $basic_list[3][$value[3]];
+
+                if(! is_numeric($value[5])) return [false, '货品数量请填写正确的数值'];
+                if(! is_numeric($value[6])) return [false, '产品合同金额请填写正确的数值'];
+                if(! empty($value[8]) && ! is_numeric($value[8])) return [false, '订单优惠金额请填写正确的数值'];
+                if(! empty($value[9])){
+                    if(! isset($basic_list[9][$value[9]])) return [false, '安装方式:' . $value[9] .'不存在'];
+                    $value[9] = $basic_list[9][$value[9]];
+                }
+                if(! empty($value[10])){
+                    if(! isset($basic_list[10][$value[10]])) return [false, '安装地点:' . $value[10] .'不存在'];
+                    $value[10] = $basic_list[10][$value[10]];
+                }
+
+                if(! isset(SalesOrder::$order_type_name[$value[1]])) return [false, '产品类型填写错误'];
+                $value[1] = SalesOrder::$order_type_name[$value[1]];
+
+                if(! empty($value[11])) {
+                    list($status,$msg) = $this->changeAndReturnDate($value[11]);
+                    if(! $status) return [false,"施工日期请填写正确的日期格式,例如2023-05-01"];
+                    $value[11] = $msg;
+                }
+
+                if(! empty($value[12])) {
+                    list($status,$msg) = $this->changeAndReturnDate($value[12]);
+                    if(! $status) return [false,"交车日期请填写正确的日期格式,例如2023-05-01"];
+                    $value[12] = $msg;
+                }
+
+                $array[$key] = $value;
+                $search .= "(code = '".$value[4]."') or";
+
+                if(! empty($value[7]) && ! in_array($value[7], $customer)) $customer[] = $value[7];
+            }
+        }
+        if(empty($array)) return [false, '导入数据不能为空'];
+        $search = rtrim($search,' or');
+        $search = "($search)";
+        $model = Product::ProductClear($user,[]);
+        $product = $model->whereRaw($search)
+            ->where('del_time',0)
+            ->select('title','id','code','cost','retail_price')
+            ->get()->toArray();
+
+        $product_map = [];
+        foreach ($product as $value){
+            $product_map[$value['code']] = [
+                'id' => $value['id'],
+                'cost' => $value['cost'],
+                'retail_price' => $value['retail_price'],
+            ];
+        }
+
+        $time = time();
+
+        $model = Customer::Clear($user,[]);
+        $customer_map = $model->where('del_time',0)
+            ->whereIn('title',$customer)
+            ->pluck('id','title')
+            ->toArray();
+
+        $customer_info = CustomerInfo::where('del_time',0)
+            ->whereIn('customer_id',array_values($customer_map))
+            ->whereIn('type',[CustomerInfo::type_one,CustomerInfo::type_two])
+            ->select('customer_id','type','contact_info','data_id')
+            ->orderBy('id','asc')
+            ->get()->toArray();
+        $customer_contact = $customer_man = [];
+        foreach ($customer_info as $value){
+            if($value['type'] == CustomerInfo::type_one && ! isset($customer_contact[$value['customer_id']])){
+                $customer_contact[$value['customer_id']] = $value['contact_info'];
+            }elseif ($value['type'] == CustomerInfo::type_two){
+                $customer_man[$value['customer_id']][] = [
+                    'type' => SalesOrderInfo::type_two,
+                    'data_id' => $value['data_id'],
+                    'crt_time' => $time,
+                ];
+            }
+        }
+
+        $tmp = [
+            'model_type' => SalesOrder::Model_type_seven,
+            'sales_order_type' => 0,
+            'order_number' => '',
+            'customer_short_name' => '',
+            'plat_type' => '',
+            'plat_order' => '',
+            'sign_time' => $time,
+            'product_total' => 0,
+            'contract_fee' => 0,
+            'discount_fee' => 0,
+            'cdefine29' => '',//分社施工
+            'cdefine32' => '',//达人昵称
+            'cdefine30' => '',//业务员
+            'rate' => 100,
+            'depart_id' => $head,
+            'top_depart_id' => $head,
+            'crt_id' => $user['id'],
+            'crt_time' => $time,
+            'upd_time' => $time,
+        ];
+        $tmp_detail = [
+            'sales_order_id' => 0,
+            'product_id' => 0,
+            'cost' => 0,
+            'retail_price' => 0,
+            'basic_type_id' => 0,
+            'price' => 0,
+            'final_amount' => 0,
+            'number' => '',
+            'crt_time' => $time,
+        ];
+        $insert = $insert_detail = $insert_detail_man =  [];
+        $prefix = SalesOrder::$prefix[salesOrder::Model_type_four];
+        foreach ($array as $value){
+            $product_str = $value[4];
+            if(! isset($product_map[$product_str])) return [false, '产品:' . '[' . $value[4]. ']' . '不存在'];
+            $product_tmp = $product_map[$product_str] ?? [];
+
+            $customer_tmp = 0;
+            $customer_contact_tmp = "";
+            $customer_man_tmp = [];
+            if(! empty($value[7])){
+                $customer_tmp = $customer_map[$value[7]] ?? 0;
+                $customer_contact_tmp = $customer_contact[$customer_tmp] ?? "";
+                $customer_man_tmp = $customer_man[$customer_tmp] ?? [];
+            }
+            $customer_man_tmp[] = [
+                'type' => SalesOrderInfo::type_one,
+                'data_id' => $user['id'],
+                'crt_time' => $time,
+            ];
+
+            $tmp['product_total'] = $tmp['contract_fee'] = 0;
+            $keys = $value[0] . $value[1];
+            $insert_detail_man[$keys] = $customer_man_tmp;
+            if(! isset($insert[$keys])){
+                $tmp['order_number'] = OrderNoService::createSalesOrderNumberImport($prefix);
+                $tmp['sales_order_type'] = $value[1];
+                $tmp['customer_short_name'] = $value[2];
+                $tmp['customer_id'] = $customer_tmp;
+                $tmp['customer_contact'] = $customer_contact_tmp;
+                $tmp['plat_type'] = $value[3];
+                $tmp['plat_order'] = $value[0];
+                $tmp['discount_fee'] = $value[8] ?: 0;
+                $tmp['cdefine29'] = $value[13] ?? "";//分社施工
+                $tmp['cdefine32'] = $value[14] ?? "";//达人昵称
+                $tmp['cdefine30'] = $value[15] ?? "";//业务员
+                $tmp['product_total'] += $value[6];
+                $tmp['contract_fee'] += $value[6] - $tmp['discount_fee'];
+                $tmp['construction_time'] = $value[11] ?? 0;
+                $tmp['handover_time'] = $value[12] ?? 0;
+                $insert[$keys] = $tmp;
+            }else{
+                $insert[$keys]['product_total'] += $value[6];
+                $insert[$keys]['contract_fee'] += $value[6];
+            }
+
+            $tmp_detail['product_id'] = $product_tmp['id'];
+            $tmp_detail['cost'] = $product_tmp['cost'];
+            $tmp_detail['retail_price'] = $product_tmp['retail_price'];
+            $tmp_detail['price'] = $product_tmp['retail_price'];
+            $tmp_detail['final_amount'] = $value[6];
+            $tmp_detail['number'] = $value[5];
+
+            $insert_detail[$keys][] = $tmp_detail;
+        }
+
+        $insert_detail = array_values($insert_detail);
+        $insert_detail_man = array_values($insert_detail_man);
+        try{
+            DB::beginTransaction();
+            if(! empty($insert)) SalesOrder::insert($insert);
+            $last_insert_id = SalesOrder::where('crt_time',$time)
+                ->select('id')
+                ->get()->toArray();
+            $last_insert_id = array_column($last_insert_id,'id');
+            if(! empty($insert_detail)){
+                $insert2 = [];
+                foreach ($last_insert_id as $key => $value){
+                    if(isset($insert_detail[$key])) {
+                        foreach ($insert_detail[$key] as $val){
+                            $val['sales_order_id'] = $value;
+                            $insert2[] = $val;
+                        }
+                    }
+                }
+                SalesOrderProductInfo::insert($insert2);
+            }
+            if(! empty($insert_detail_man)){
+                $insert3 = [];
+                foreach ($last_insert_id as $key => $value){
+                    if(isset($insert_detail_man[$key])) {
+                        foreach ($insert_detail_man[$key] as $val){
+                            $val['sales_order_id'] = $value;
+                            $insert3[] = $val;
+                        }
+                    }
+                }
+                SalesOrderInfo::insert($insert3);
+            }
+            DB::commit();
+        }catch (\Exception $e){
+            DB::rollBack();
+            return [false, $e->getMessage() . $e->getLine() . $e->getCode()];
+        }
+
+        return [true, ''];
+    }
 }
 

+ 4 - 3
app/Service/SalesOrderService.php

@@ -1224,6 +1224,7 @@ class SalesOrderService extends Service
         if(empty($sale)) return [false,'合同不存在或已被删除'];
         $sale = $sale->toArray();
         if($sale['sales_order_type'] != SalesOrder::Order_type_one) return [false,'非安装件合同,操作失败'];
+        if(! in_array($sale['model_type'],[SalesOrder::Model_type_four,SalesOrder::Model_type_seven])) return [false,'非线上订单/补贴订单,线上派单操作失败'];
         if($sale['state'] < SalesOrder::State_two) return [false,'合同还未确认,操作失败'];
         if($sale['state'] > SalesOrder::State_three) return [false,'请确认合同状态,操作失败'];
         $bool = SalesOrderProductInfo::where('del_time',0)
@@ -1477,8 +1478,8 @@ class SalesOrderService extends Service
                 }
             }elseif($value['state'] == SalesOrder::State_zero){
                 $state = "待" . $value['crt_name'] . "提交";
-            }elseif($value['state'] == SalesOrder::State_three && $value['model_type'] != SalesOrder::Model_type_four){
-                // 除线上订单外 3状态即使审核通过(本来3是指派销售 除了线上订单 其它不需要)
+            }elseif($value['state'] == SalesOrder::State_three && ! in_array($value['model_type'], [SalesOrder::Model_type_four,SalesOrder::Model_type_seven])){
+                // 除线上订单 补贴订单 外 3状态即使审核通过(本来3是指派销售 除了线上订单 补贴订单 其它不需要)
                 $state = SalesOrder::$state[SalesOrder::State_two] ?? '';
             }else{
                 $state = SalesOrder::$state[$value['state']] ?? '';
@@ -1524,7 +1525,7 @@ class SalesOrderService extends Service
         foreach ($data['order_number'] as $value){
             if(! isset($result[$value])) return [false, $value . '不存在或已被删除'];
             $tmp =  $result[$value];
-            if($tmp['model_type'] != SalesOrder::Model_type_four) return [false, '单据'. $value . '非线上订单,操作失败'];
+            if(! in_array($tmp['model_type'], [SalesOrder::Model_type_four,SalesOrder::Model_type_seven])) return [false, '单据'. $value . '非线上订单/补贴订单,操作失败'];
             if(! in_array($tmp['state'] , [SalesOrder::State_zero,SalesOrder::State_minus_one])) return [false, '请确认单据'. $value . '的状态,操作失败'];
         }
 

+ 6 - 2
app/Service/ScheduleService.php

@@ -10,6 +10,7 @@ use App\Model\Product;
 use App\Model\ProductActivity;
 use App\Model\ProductActivityPrice;
 use App\Model\RoleMenuButton;
+use App\Model\SalesOrder;
 use App\Model\Schedule;
 use App\Model\ScheduleDetail;
 use App\Model\ScheduleInfo;
@@ -611,9 +612,10 @@ class ScheduleService extends Service
         $construction = Construction::where('del_time',0)
             ->where('state','>=',Construction::STATE_TWO)
             ->whereIn('id',$order_id)
-            ->select('id','order_number','crt_id','start_time','end_time','state','product_introduction','vin_no')
+            ->select('id','order_number','crt_id','start_time','end_time','state','product_introduction','vin_no','sales_order_id')
             ->get()->toArray();
         if(empty($construction)) return [true, []];
+        $sales_order_map = SalesOrder::whereIn('id',array_column($construction,'sales_order_id'))->pluck('order_number','id')->toArray();
         $emp = Employee::whereIn('id',array_unique(array_column($construction,'crt_id')))
             ->pluck('emp_name','id')
             ->toArray();
@@ -682,6 +684,7 @@ class ScheduleService extends Service
             }
             $button = array_filter($button);
 
+            $sales_tmp = $sales_order_map[$value['sales_order_id']] ?? "";
             $tmp = [
                 'id' => $value['id'],
                 'employee' => $emp_tmp,
@@ -693,7 +696,8 @@ class ScheduleService extends Service
                 'crt_time' => $str,
                 'state' => $value['state'],
                 'state_title' => Construction::$name[$value['state']] ?? "",
-                'button' => $button
+                'button' => $button,
+                'sales_order_number' => $sales_tmp
             ];
 //            $tmp = $tmp + ($construction_oa[$value['order_number']] ?? []);
             $return[] = $tmp;