Browse Source

施工单完成一半

cqpCow 1 năm trước cách đây
mục cha
commit
7c26afc996

+ 85 - 0
app/Http/Controllers/Api/ConstructionController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\ConstructionService;
+use Illuminate\Http\Request;
+
+class ConstructionController extends BaseController
+{
+    public function constructionAdd(Request $request)
+    {
+        $service = new ConstructionService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->constructionAdd($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function constructionEdit(Request $request)
+    {
+        $service = new ConstructionService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->constructionEdit($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function constructionDel(Request $request)
+    {
+        $service = new ConstructionService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->constructionDel($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function constructionList(Request $request)
+    {
+        $service = new ConstructionService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->constructionList($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function constructionDetail(Request $request)
+    {
+        $service = new ConstructionService();
+        list($status,$data) = $service->constructionDetail($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function constructionGet(Request $request)
+    {
+        $service = new ConstructionService();
+        list($status,$data) = $service->constructionGet($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 2 - 0
app/Model/BasicType.php

@@ -29,5 +29,7 @@ class BasicType extends Model
         15 => '付款方式',
         16 => '发货状态',
         17 => '物流公司',
+        18 => '安装方式',
+        19 => '紧急程度',
     ];
 }

+ 24 - 0
app/Model/Construction.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Construction extends Model
+{
+    protected $table = "construction"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const Model_type_one = 1; // 总部安装
+    const Model_type_two = 2; // 分社网点安装
+    public static $model_type = [
+        self::Model_type_one,
+        self::Model_type_two,
+    ];
+
+    public static $prefix = [
+        self::Model_type_one => 'WO0.',
+        self::Model_type_two => 'T9SH.',
+    ];
+}

+ 17 - 0
app/Model/ConstructionInfo.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ConstructionInfo extends Model
+{
+    protected $table = "construction_info"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const type_one = 1; // 协同人
+    public static $type = [
+        self::type_one,
+    ];
+}

+ 13 - 0
app/Model/ConstructionProductInfo.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ConstructionProductInfo extends Model
+{
+    protected $table = "construction_product_info"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+}

+ 428 - 0
app/Service/ConstructionService.php

@@ -0,0 +1,428 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\BasicType;
+use App\Model\Construction;
+use App\Model\Customer;
+use App\Model\Employee;
+use App\Model\SalesOrder;
+use App\Model\SalesOrderInfo;
+use App\Model\SalesOrderProductInfo;
+use Illuminate\Support\Facades\DB;
+
+class ConstructionService extends Service
+{
+    public function constructionEdit($data,$user){
+        list($status,$msg) = $this->constructionRule($data,false);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            $model = Construction::where('id', $data['id'])->first();
+            $model->model_type = $data['model_type'];
+            $model->order_number = $data['order_number'];
+            $model->title = $data['title'] ?? '';
+            $model->selling_price = $data['selling_price'] ?? 0;
+            $model->vin_no = $data['vin_no'] ?? '';
+            $model->order_type = $data['order_type'] ?? 0;
+            $model->deal_type = $data['deal_type'] ?? 0;
+            $model->customer_id = $data['customer_id'] ?? 0;
+            $model->sign_time = $data['sign_time'] ?? 0;
+            $model->contract_state = $data['contract_state'] ?? 0;
+            $model->product_total = $data['product_total'] ?? 0;
+            $model->rate = $data['rate'] ?? 0;
+            $model->mark = $data['mark'] ?? '';
+            $model->construction_time = $data['construction_time'] ?? 0;
+            $model->handover_time = $data['handover_time'] ?? 0;
+            $model->expire_time = $data['expire_time'] ?? 0;
+            $model->other_fee = $data['other_fee'] ?? 0;
+            $model->discount_fee = $data['discount_fee'] ?? 0;
+            $model->contract_fee = $data['contract_fee'] ?? 0;
+            $model->contract_type = $data['contract_type'] ?? 0;
+            $model->pay_way = $data['pay_way'] ?? 0;
+            $model->logistics_company = $data['logistics_company'] ?? 0;
+            $model->logistics_number = $data['logistics_number'] ?? '';
+            $model->car_type = $data['car_type'] ?? 0;
+            $model->year = $data['year'] ?? '';
+            $model->mileage = $data['mileage'] ?? '';
+            $model->color = $data['color'] ?? '';
+            $model->original_set = $data['original_set'] ?? '';
+            $model->processing = $data['processing'] ?? '';
+            $model->save();
+            $time = time();
+
+            SalesOrderInfo::where('del_time',0)
+                ->where('sales_order_id',$data['id'])
+                ->update(['del_time' => $time]);
+            SalesOrderProductInfo::where('del_time',0)
+                ->where('sales_order_id',$data['id'])
+                ->update(['del_time' => $time]);
+
+            if(! empty($data['employee_one'])){
+                $insert = [];
+                foreach ($data['employee_one'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'employee_id' => $value,
+                        'type' => SalesOrderInfo::type_one,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderInfo::insert($insert);
+            }
+
+            if(! empty($data['employee_two'])){
+                $insert = [];
+                foreach ($data['employee_two'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'employee_id' => $value,
+                        'type' => SalesOrderInfo::type_two,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderInfo::insert($insert);
+            }
+
+            if(! empty($data['employee_three'])){
+                $insert = [];
+                foreach ($data['employee_three'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'employee_id' => $value,
+                        'type' => SalesOrderInfo::type_three,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderInfo::insert($insert);
+            }
+
+            if(! empty($data['product'])){
+                $insert = [];
+                foreach ($data['product'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'product_id' => $value['product_id'],
+                        'price' => $value['price'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'],
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderProductInfo::insert($insert);
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function constructionAdd($data,$user){
+        list($status,$msg) = $this->constructionRule($data);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            $model = new SalesOrder();
+            $model->model_type = $data['model_type'];
+            $model->order_number = $data['order_number'];
+            $model->title = $data['title'] ?? '';
+            $model->selling_price = $data['selling_price'] ?? 0;
+            $model->vin_no = $data['vin_no'] ?? '';
+            $model->order_type = $data['order_type'] ?? 0;
+            $model->deal_type = $data['deal_type'] ?? 0;
+            $model->customer_id = $data['customer_id'] ?? 0;
+            $model->sign_time = $data['sign_time'] ?? 0;
+            $model->contract_state = $data['contract_state'] ?? 0;
+            $model->product_total = $data['product_total'] ?? 0;
+            $model->rate = $data['rate'] ?? 0;
+            $model->mark = $data['mark'] ?? '';
+            $model->construction_time = $data['construction_time'] ?? 0;
+            $model->handover_time = $data['handover_time'] ?? 0;
+            $model->expire_time = $data['expire_time'] ?? 0;
+            $model->other_fee = $data['other_fee'] ?? 0;
+            $model->discount_fee = $data['discount_fee'] ?? 0;
+            $model->contract_fee = $data['contract_fee'] ?? 0;
+            $model->contract_type = $data['contract_type'] ?? 0;
+            $model->pay_way = $data['pay_way'] ?? 0;
+            $model->logistics_company = $data['logistics_company'] ?? 0;
+            $model->logistics_number = $data['logistics_number'] ?? '';
+            $model->car_type = $data['car_type'] ?? 0;
+            $model->year = $data['year'] ?? '';
+            $model->mileage = $data['mileage'] ?? '';
+            $model->color = $data['color'] ?? '';
+            $model->original_set = $data['original_set'] ?? '';
+            $model->processing = $data['processing'] ?? '';
+            $model->crt_id = $user['id'];
+            $model->save();
+            $time = time();
+
+            if(! empty($data['employee_one'])){
+                $insert = [];
+                foreach ($data['employee_one'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'employee_id' => $value,
+                        'type' => SalesOrderInfo::type_one,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderInfo::insert($insert);
+            }
+
+            if(! empty($data['employee_two'])){
+                $insert = [];
+                foreach ($data['employee_two'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'employee_id' => $value,
+                        'type' => SalesOrderInfo::type_two,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderInfo::insert($insert);
+            }
+
+            if(! empty($data['employee_three'])){
+                $insert = [];
+                foreach ($data['employee_three'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'employee_id' => $value,
+                        'type' => SalesOrderInfo::type_three,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderInfo::insert($insert);
+            }
+
+            if(! empty($data['product'])){
+                $insert = [];
+                foreach ($data['product'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $model->id,
+                        'product_id' => $value['product_id'],
+                        'price' => $value['price'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'],
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderProductInfo::insert($insert);
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function constructionDel($data){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+
+        try {
+            DB::beginTransaction();
+
+            SalesOrder::whereIn('id',$data['id'])->update([
+                'del_time'=> time()
+            ]);
+            SalesOrderInfo::where('del_time',0)
+                ->where('sales_order_id',$data['id'])
+                ->update(['del_time' => time()]);
+            SalesOrderProductInfo::where('del_time',0)
+                ->where('sales_order_id',$data['id'])
+                ->update(['del_time' => time()]);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function constructionDetail($data){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+
+        $sales = SalesOrderInfo::where('del_time',0)
+            ->where('id',$data['id'])
+            ->first();
+        if(empty($sales)) return [false,'销售订单不存在或已被删除'];
+        $sales = $sales->toArray();
+        $sales['employee_one'] = $sales['employee_two'] = $sales['employee_three'] = $sales['product'] = [];
+        $array = [
+            $sales['order_type'],
+            $sales['deal_type'],
+            $sales['contract_state'],
+            $sales['car_type'],
+            $sales['pay_way'],
+            $sales['logistics_company'],
+            $sales['state_type'],
+        ];
+        $basic_map = BasicType::whereIn('id',$array)
+            ->pluck('title','id')
+            ->toArray();
+        foreach ($sales as $key => $value){
+            $sales[$key]['order_type_title'] = $basic_map[$value['order_type']] ?? '';
+            $sales[$key]['deal_type_title'] = $basic_map[$value['deal_type']] ?? '';
+            $sales[$key]['contract_state_title'] = $basic_map[$value['contract_state']] ?? '';
+            $sales[$key]['car_type_title'] = $basic_map[$value['car_type']] ?? '';
+            $sales[$key]['pay_way_title'] = $basic_map[$value['pay_way']] ?? '';
+            $sales[$key]['logistics_company_title'] = $basic_map[$value['logistics_company']] ?? '';
+            $sales[$key]['state_type_title'] = $basic_map[$value['state_type']] ?? '';
+        }
+
+        $sales_info = SalesOrderInfo::where('del_time',0)
+            ->where('sales_order_id',$sales['id'])
+            ->select('id','sales_order_id','employee_id','type')
+            ->get()->toArray();
+        foreach ($sales_info as $value){
+            if($value['type'] == SalesOrderInfo::type_one){
+                $sales['employee_one'][] = [
+                    $value['employee_id']
+                ];
+            }elseif ($value['type'] == SalesOrderInfo::type_two){
+                $sales['employee_two'][] = [
+                    $value['employee_id']
+                ];
+            }elseif ($value['type'] == SalesOrderInfo::type_three){
+                $sales['employee_three'][] = [
+                    $value['employee_id']
+                ];
+            }
+        }
+
+        $sales_p_info = SalesOrderProductInfo::where('del_time',0)
+            ->where('sales_order_id',$sales['id'])
+            ->select('id','sales_order_id','product_id','mark','price','number')
+            ->get()->toArray();
+        foreach ($sales_p_info as $value){
+            $sales['product'][] = [
+                'product_id' => $value['product_id'],
+                'mark' => $value['mark'],
+                'price' => $value['price'],
+                'number' => $value['number'],
+            ];
+        }
+
+        return [true, $sales];
+    }
+
+    public function constructionList($data,$user){
+        $model = SalesOrder::where('del_time',0)
+            ->select('title','id','model_type','order_number','selling_price','vin_no','car_type','order_type','deal_type','customer_id','sign_time','contract_state','crt_id','crt_time','mark','product_total','rate','construction_time','handover_time','expire_time','other_fee','discount_fee','contract_fee','contract_type','pay_way','logistics_company','logistics_number','car_type','year','mileage','color','original_set','processing')
+            ->orderby('id', 'desc')
+            ->where('model_type',$data['model_type']);
+
+        if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
+
+        $list = $this->limit($model,'',$data);
+        $list = $this->fillData($list);
+
+        return [true, $list];
+    }
+
+    public function constructionRule(&$data, $is_add = true){
+        if(empty($data['model_type'])) return [false,'工单模板类型不能为空'];
+        if(! in_array($data['model_type'],Construction::$model_type)) return [false,'工单模板类型错误'];
+        if(empty($data['order_number'])) return [false,'合同编号不能为空'];
+        if(empty($data['construction_time'])) return [false,'实施日期不能为空'];
+        $data['construction_time'] = $this->changeDateToDateMin($data['construction_time']);
+        if(empty($data['product'])) return [false,'请选择产品'];
+        foreach ($data['product'] as $value){
+            if(empty($value['number'])) return [false,'产品数量不能为空'];
+            $res = $this->checkNumber($value['number']);
+            if(! $res) return [false,'请输入正确的产品数量'];
+
+            if(empty($value['price'])) return [false,'产品单价不能为空'];
+            $res = $this->checkNumber($value['price']);
+            if(! $res) return [false,'产品单价请输入不超过两位小数的数值'];
+        }
+        if(empty($data['construction_contact'])) return [false,'联系方式不能为空'];
+        if(! empty($data['construction_fee'])){
+            $res = $this->checkNumber($data['construction_fee']);
+            if(! $res) return [false,'施工费用请输入不超过两位小数的数值'];
+        }
+        if($data['model_type'] == Construction::Model_type_one){
+            if(empty($data['install_method'])) return [false,'安装方式不能为空'];
+            if(empty($data['install_position'])) return [false,'安装地点不能为空'];
+        }else{
+            if(empty($data['address1']) || empty($data['address2'])) return [false,'地址不能为空'];
+        }
+
+        if($is_add){
+            $bool = Construction::where('del_time',0)->where('order_number',$data['order_number'])->exists();
+            if($bool) return [false,'工单编号已存在,请重新获取'];
+
+            if(! empty($data['title'])){
+                $boolean = SalesOrder::where('del_time',0)
+                    ->where('title',$data['title'])
+                    ->where('model_type',$data['model_type'])
+                    ->exists();
+            }
+        }else{
+            if(empty($data['id'])) return [false,'ID不能为空'];
+            if(! empty($data['title'])){
+                $boolean = SalesOrder::where('del_time',0)
+                    ->where('id','<>',$data['id'])
+                    ->where('title',$data['title'])
+                    ->where('model_type',$data['model_type'])
+                    ->exists();
+            }
+        }
+        if(isset($boolean) && $boolean) return [false,'工单名称不能重复'];
+
+        return [true, $data];
+    }
+
+    public function fillData($data){
+        if(empty($data['data'])) return $data;
+
+        $array = array_unique(array_merge_recursive(array_column($data['data'],'order_type'),array_column($data['data'],'deal_type'),array_column($data['data'],'contract_state'),array_column($data['data'],'car_type'),array_column($data['data'],'pay_way'),array_column($data['data'],'logistics_company'),array_column($data['data'],'state_type')));
+        $basic_map = BasicType::whereIn('id',$array)
+            ->pluck('title','id')
+            ->toArray();
+        $emp = Employee::whereIn('id',array_unique(array_column($data['data'],'crt_id')))
+            ->pluck('emp_name','id')
+            ->toArray();
+        $customer = Customer::whereIn('id',array_unique(array_column($data['data'],'customer_id')))
+            ->pluck('title','id')
+            ->toArray();
+
+        foreach ($data['data'] as $key => $value){
+            $data['data'][$key]['order_type_title'] = $basic_map[$value['order_type']] ?? '';
+            $data['data'][$key]['deal_type_title'] = $basic_map[$value['deal_type']] ?? '';
+            $data['data'][$key]['contract_state_title'] = $basic_map[$value['contract_state']] ?? '';
+            $data['data'][$key]['car_type_title'] = $basic_map[$value['car_type']] ?? '';
+            $data['data'][$key]['pay_way_title'] = $basic_map[$value['pay_way']] ?? '';
+            $data['data'][$key]['logistics_company_title'] = $basic_map[$value['logistics_company']] ?? '';
+            $data['data'][$key]['state_type_title'] = $basic_map[$value['state_type']] ?? '';
+            $data['data'][$key]['customer_title'] = $customer[$value['customer_id']] ?? '';
+            $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
+            $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
+        }
+
+        return $data;
+    }
+
+    public function constructionGet($data){
+        if(empty($data['model_type'])) return [false,'工单模板类型不能为空'];
+        if(! isset(Construction::$prefix[$data['model_type']])) return [false,'工单模板类型错误'];
+        $prefix = Construction::$prefix[$data['model_type']];
+        $order_number = OrderNoService::createConstructionOrderNumber($prefix);
+        if(! $order_number) return [false,'工单编号生成失败!'];
+
+        return [false,$order_number];
+    }
+}

+ 3 - 2
app/Service/CustomerService.php

@@ -28,7 +28,7 @@ class CustomerService extends Service
             $model->consulting_product = $data['consulting_product'] ?? '';
             $model->intention_product = $data['intention_product'] ?? 0;
             $model->progress_stage = $data['progress_stage'] ?? 0;
-            $model->address1 = $data['address1'] ?? '';
+            $model->address1 = $data['address1'] ? json_encode($data['address1']) : '';
             $model->address2 = $data['address2'] ?? '';
             $model->mark = $data['mark'] ?? '';
             $model->importance = $data['importance'] ?? '';
@@ -150,7 +150,7 @@ class CustomerService extends Service
             $model->consulting_product = $data['consulting_product'] ?? '';
             $model->intention_product = $data['intention_product'] ?? 0;
             $model->progress_stage = $data['progress_stage'] ?? 0;
-            $model->address1 = $data['address1'] ?? '';
+            $model->address1 = $data['address1'] ? json_encode($data['address1']) : '';
             $model->address2 = $data['address2'] ?? '';
             $model->crt_id = $user['id'];
             $model->mark = $data['mark'] ?? '';
@@ -282,6 +282,7 @@ class CustomerService extends Service
             ->first();
         if(empty($customer)) return [false,'客户不存在或已被删除'];
         $customer = $customer->toArray();
+        if(! empty($customer['address1'])) $customer['address1'] = json_decode($customer['address1'],true);
         $customer['customer_contact'] = $customer['employee_one'] = $customer['employee_two'] = $customer['employee_three'] = $customer['img'] = $customer['file'] =[];
         $array = [
             $customer['customer_intention'],

+ 3 - 1
app/Service/FileUploadService.php

@@ -15,7 +15,9 @@ class FileUploadService extends Service
         'gif',
         'jpeg',
         'zip',
-        'rar'
+        'rar',
+        'xlsx',
+        'xls'
     ];
 
     public function uploadFile($file){

+ 2 - 3
app/Service/InvoiceOrderService.php

@@ -192,9 +192,8 @@ class InvoiceOrderService extends Service
 
         foreach ($data['product'] as $value){
             if(empty($value['number'])) return [false,'产品数量不能为空'];
-            if(! is_numeric($value['number']) || $value['number'] < 0)  return [false,'产品数量不正确'];
-            $formattedNumber = number_format($value['number'], 2, '.', '');
-            if($formattedNumber != $value['number']) return [false,'产品数量请不要超过两位小数'];
+            $res = $this->checkNumber($value['number']);
+            if(! $res) return [false,'请输入正确的产品数量'];
         }
 
         if($is_check){

+ 25 - 0
app/Service/OrderNoService.php

@@ -2,6 +2,7 @@
 
 namespace App\Service;
 
+use App\Model\Construction;
 use App\Model\SalesOrder;
 
 class OrderNoService extends Service
@@ -34,4 +35,28 @@ class OrderNoService extends Service
 
         return $number;
     }
+
+    //施工单订单合同号
+    public static function createConstructionOrderNumber($prefix){
+        $str = $prefix . date('Ymd',time());
+
+        $order_number = Construction::where('order_number','Like','%'. $str . '%')
+            ->max('order_number');
+
+        if(empty($order_number)){
+            $number = str_pad(1,3,'0',STR_PAD_LEFT);
+            $number = $str . $number;
+        }else{
+            $tmp = substr($order_number, -3);
+            $tmp = $tmp + 1;
+
+            //超过999
+            if(strlen($tmp) > 3) return '';
+
+            $number = str_pad($tmp,3,'0',STR_PAD_LEFT);
+            $number = $str . $number;
+        }
+
+        return $number;
+    }
 }

+ 2 - 3
app/Service/ProductService.php

@@ -400,9 +400,8 @@ class ProductService extends Service
         if(empty($data['product_category_id'])) return [false,'产品分类不能为空'];
         if(empty($data['code'])) return [false,'产品编码不能为空'];
         if(! empty($data['retail_price'])){
-            if(! is_numeric($data['retail_price']) || $data['retail_price'] < 0) return [false,'零售价请填写正确'];
-            $formattedNumber = number_format($data['retail_price'], 2, '.', '');
-            if($formattedNumber != $data['retail_price']) return [false,'零售价请不要超过两位小数'];
+            $res = $this->checkNumber($data['retail_price']);
+            if(! $res) return [false,'零售价请输入不超过两位小数的数值'];
         }
 
         if($is_add){

+ 2 - 3
app/Service/PurchaseOrderService.php

@@ -172,9 +172,8 @@ class PurchaseOrderService extends Service
 
         foreach ($data['product'] as $value){
             if(empty($value['number'])) return [false,'产品数量不能为空'];
-            if(! is_numeric($value['number']) || $value['number'] < 0)  return [false,'产品数量不正确'];
-            $formattedNumber = number_format($value['number'], 2, '.', '');
-            if($formattedNumber != $value['number']) return [false,'产品数量请不要超过两位小数'];
+            $res = $this->checkNumber($value['number']);
+            if(! $res) return [false,'请输入正确的产品数量'];
         }
 
         if($is_check){

+ 24 - 3
app/Service/SalesOrderService.php

@@ -344,10 +344,31 @@ class SalesOrderService extends Service
         if(empty($data['contract_state'])) return [false,'请选择合同状态'];
         if(empty($data['employee_two'])) return [false,'请选择负责人'];
         if(empty($data['product'])) return [false,'请选择产品'];
+        foreach ($data['product'] as $value){
+            if(empty($value['number'])) return [false,'产品数量不能为空'];
+            $res = $this->checkNumber($value['number']);
+            if(! $res) return [false,'请输入正确的产品数量'];
+
+            if(empty($value['price'])) return [false,'产品单价不能为空'];
+            $res = $this->checkNumber($value['price']);
+            if(! $res) return [false,'产品单价请输入不超过两位小数的数值'];
+        }
         if(empty($data['contract_fee'])) return [false,'合同金额不能为空'];
-        if(! is_numeric($data['contract_fee']) || $data['contract_fee'] < 0)  return [false,'合同金额不正确'];
-        $formattedNumber = number_format($data['contract_fee'], 2, '.', '');
-        if($formattedNumber != $data['contract_fee']) return [false,'合同金额请不要超过两位小数'];
+        $res = $this->checkNumber($data['contract_fee']);
+        if(! $res) return [false, '合同金额请输入不超过两位小数的数值'];
+
+        if(! empty($data['rate'])){
+            $res = $this->checkNumber($data['rate']);
+            if(! $res) return [false, '整单扣除率请输入不超过两位小数的数值'];
+        }
+        if(! empty($data['other_fee'])){
+            $res = $this->checkNumber($data['other_fee']);
+            if(! $res) return [false, '其它费用请输入不超过两位小数的数值'];
+        }
+        if(! empty($data['discount_fee'])){
+            $res = $this->checkNumber($data['discount_fee']);
+            if(! $res) return [false, '优惠金额请输入不超过两位小数的数值'];
+        }
 
         if($data['model_type'] == SalesOrder::Model_type_one){
             if(empty($data['order_type'])) return [false,'订单类型不能为空'];

+ 8 - 0
app/Service/Service.php

@@ -338,4 +338,12 @@ class Service
         OperationLog::dispatch($insert);
 
     }
+
+    public function checkNumber($number, $decimals = 2){
+        if(! is_numeric($number) || $number < 0)  return false;
+        $formattedNumber = number_format($number, $decimals, '.', '');
+        if($formattedNumber != $number) return false;
+
+        return true;
+    }
 }

+ 2 - 3
app/Service/TakeOrderService.php

@@ -184,9 +184,8 @@ class TakeOrderService extends Service
 
         foreach ($data['product'] as $value){
             if(empty($value['number'])) return [false,'产品数量不能为空'];
-            if(! is_numeric($value['number']) || $value['number'] < 0)  return [false,'产品数量不正确'];
-            $formattedNumber = number_format($value['number'], 2, '.', '');
-            if($formattedNumber != $value['number']) return [false,'产品数量请不要超过两位小数'];
+            $res = $this->checkNumber($value['number']);
+            if(! $res) return [false,'请输入正确的产品数量'];
         }
 
         if($is_check){

+ 8 - 0
routes/api.php

@@ -132,4 +132,12 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('salesOrderDetail', 'Api\SalesOrderController@salesOrderDetail');
     $route->any('salesOrderAdd', 'Api\SalesOrderController@salesOrderAdd');
     $route->any('salesOrderDel', 'Api\SalesOrderController@salesOrderDel');
+
+    //施工单
+    $route->any('constructionGet', 'Api\ConstructionController@constructionGet');
+    $route->any('constructionList', 'Api\ConstructionController@constructionList');
+    $route->any('constructionEdit', 'Api\ConstructionController@constructionEdit');
+    $route->any('constructionDetail', 'Api\ConstructionController@constructionDetail');
+    $route->any('constructionAdd', 'Api\ConstructionController@constructionAdd');
+    $route->any('constructionDel', 'Api\ConstructionController@constructionDel');
 });