Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

gogs 1 tahun lalu
induk
melakukan
dc961e71a1

+ 2 - 2
app/Http/Controllers/Api/EmployeeController.php

@@ -51,7 +51,7 @@ class EmployeeController extends BaseController
     {
         $service = new EmployeeService();
         $user = $request->userData->toArray();
-        list($status,$data) = $service->employeeList($request->all());
+        list($status,$data) = $service->employeeList($request->all(),$user);
 
         if($status){
             return $this->json_return(200,'',$data);
@@ -185,7 +185,7 @@ class EmployeeController extends BaseController
     {
         $service = new EmployeeService();
         $user = $request->userData->toArray();
-        list($status,$data) = $service->departList($request->all());
+        list($status,$data) = $service->departList($request->all(),$user);
 
         if($status){
             return $this->json_return(200,'',$data);

+ 74 - 0
app/Http/Controllers/Api/InvoiceOrderController.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\InvoiceOrderService;
+use Illuminate\Http\Request;
+
+class InvoiceOrderController extends BaseController
+{
+    public function invoiceOrderAdd(Request $request)
+    {
+        $service = new InvoiceOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->add($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderEdit(Request $request)
+    {
+        $service = new InvoiceOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->edit($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderDetail(Request $request)
+    {
+        $service = new InvoiceOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->detail($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderDel(Request $request)
+    {
+        $service = new InvoiceOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->del($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderList(Request $request)
+    {
+        $service = new InvoiceOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->getList($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 13 - 0
app/Http/Controllers/Api/ProductController.php

@@ -113,4 +113,17 @@ class ProductController extends BaseController
             return $this->json_return(201,$data);
         }
     }
+
+    public function productDetail(Request $request)
+    {
+        $service = new ProductService();
+        $user = $request->userData->toArray();
+        list($status,$data) = $service->productDetail($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }

+ 88 - 0
app/Http/Controllers/Api/PurchaseOrderController.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\ProductService;
+use App\Service\PurchaseOrderService;
+use Illuminate\Http\Request;
+
+class PurchaseOrderController extends BaseController
+{
+    public function purchaseOrderAdd(Request $request)
+    {
+        $service = new PurchaseOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->add($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderEdit(Request $request)
+    {
+        $service = new PurchaseOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->edit($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderDetail(Request $request)
+    {
+        $service = new PurchaseOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->detail($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderDel(Request $request)
+    {
+        $service = new PurchaseOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->del($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderList(Request $request)
+    {
+        $service = new PurchaseOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->getList($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderConfirm(Request $request)
+    {
+        $service = new PurchaseOrderService();
+        $user = $request->userData->toArray();
+        list($status,$data) = $service->purchaseOrderConfirm($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 74 - 0
app/Http/Controllers/Api/TakeOrderController.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\TakeOrderService;
+use Illuminate\Http\Request;
+
+class TakeOrderController extends BaseController
+{
+    public function invoiceOrderAdd(Request $request)
+    {
+        $service = new TakeOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->add($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderEdit(Request $request)
+    {
+        $service = new TakeOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->edit($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderDetail(Request $request)
+    {
+        $service = new TakeOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->detail($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderDel(Request $request)
+    {
+        $service = new TakeOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->del($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function invoiceOrderList(Request $request)
+    {
+        $service = new TakeOrderService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->getList($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 5 - 2
app/Http/Middleware/CheckLogin.php

@@ -35,8 +35,11 @@ class CheckLogin
 
         //人员角色
         $data['role'] = EmployeeService::getPersonRole($result);
-        //部门权限
-        $data['rule_depart'] = EmployeeService::getPersonDepart($result);
+        //部门 是否有总社权限
+        list($depart, $is_main) = EmployeeService::getLoginDepart($result);
+        $data['rule_depart'] = $depart;
+        $data['is_main'] = $is_main;
+
         //写入user信息
         $request->userData = $data;
 

+ 1 - 0
app/Model/Depart.php

@@ -16,4 +16,5 @@ class Depart extends Model
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
     const RULE_DEPART = "ALL";
+    const IS_UES = 1;//启用
 }

+ 20 - 0
app/Model/InvoiceOrder.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class InvoiceOrder extends Model
+{
+    protected $table = "invoice_order"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const STATE_ZERO = 0;//未确认
+    const STATE_ONE = 1;//已确认
+    const prefix = 'FH';
+    public static $name = [
+        0 => '未确认',
+        1 => '已确认',
+    ];
+}

+ 13 - 0
app/Model/InvoiceOrderInfo.php

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

+ 22 - 0
app/Model/PurchaseOrder.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class PurchaseOrder extends Model
+{
+    protected $table = "purchase_order"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const STATE_ZERO = 0;//未审核
+    const STATE_ONE = 1;//待审核
+    const STATE_TWO = 2;//审核通过
+    const prefix = 'CG';
+    public static $name = [
+        0 => '未审核',
+        1 => '待审核',
+        2 => '审核通过'
+    ];
+}

+ 21 - 0
app/Model/PurchaseOrderInfo.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class PurchaseOrderInfo extends Model
+{
+    protected $table = "purchase_order_info"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const STATE_ZERO = 0;//未发货
+    const STATE_ONE = 1;//部分已发货
+    const STATE_TWO = 2;//已发货
+    public static $name = [
+        0 => '未发货',
+        1 => '部分已发货',
+        2 => '已发货'
+    ];
+}

+ 20 - 0
app/Model/TakeOrder.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class TakeOrder extends Model
+{
+    protected $table = "take_order"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const STATE_ZERO = 0;//未确认
+    const STATE_ONE = 1;//已确认
+    const prefix = 'SH';
+    public static $name = [
+        0 => '未确认',
+        1 => '已确认',
+    ];
+}

+ 13 - 0
app/Model/TakeOrderInfo.php

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

+ 28 - 6
app/Service/BasicTypeService.php

@@ -50,10 +50,28 @@ class BasicTypeService extends Service
     }
 
     public function basicTypeRule($data,$is_check = true){
-        if($this->isEmpty($data,'type')) return [false,'基础类型不能为空'];
-        if(! isset(BasicType::$type[$data['type']])) return [false,'基础类型不存在'];
         if($this->isEmpty($data,'data')) return [false,'数据不能为空!'];
 
+        $type = array_column($data['data'],'type');
+        $type = array_map(function($val) {
+            return $val !== null ? $val : 0;
+        }, $type);
+        foreach ($type as $value){
+            if(empty($value)) return [false,'类型不能为空!'];
+            if(! isset(BasicType::$type[$value])) return [false,'类型不存在!'];
+        }
+
+        $map = [];
+        foreach ($data['data'] as $value){
+            if(! isset($map[$value['title']])){
+                $map[$value['title']][] = $value['type'];
+            }else{
+                if(! in_array($value['type'],$map[$value['title']])){
+                    $map[$value['title']][] = $value['type'];
+                }
+            }
+        }
+
         $title = array_column($data['data'],'title');
         $title = array_map(function($val) {
             return $val !== null ? $val : 0;
@@ -61,22 +79,22 @@ class BasicTypeService extends Service
         $title_count = array_count_values($title);
         foreach ($title as $value){
             if(empty($value)) return [false,'名称不能为空!'];
-            if($title_count[$value] > 1) return [false,'名称不能重复'];
+            if($title_count[$value] > 1 && count($map[$value]) != $title_count[$value]) return [false,'同一归属类别下,名称不能重复'];
         }
 
         foreach ($data['data'] as $key => $value){
-            $data['data'][$key]['type'] = $data['type'];
+            $data['data'][$key]['type'] = $value['type'];
             $data['data'][$key]['upd_time'] = time();
             if($is_check){
                 $bool = BasicType::where('title',$value['title'])
-                    ->where('type',$data['type'])
+                    ->where('type',$value['type'])
                     ->where('del_time',0)
                     ->exists();
                 $data['data'][$key]['crt_time'] = time();
             }else{
                 if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
                 $bool = BasicType::where('title',$value['title'])
-                    ->where('type',$data['type'])
+                    ->where('type',$value['type'])
                     ->where('id','<>',$data['id'])
                     ->where('del_time',0)
                     ->exists();
@@ -90,6 +108,10 @@ class BasicTypeService extends Service
     public function fillData($data){
         if(empty($data['data'])) return $data;
 
+        foreach ($data['data'] as $key => $value){
+            $data['data'][$key]['type_name'] = BasicType::$type[$value['type']] ?? '';
+        }
+
         return $data;
     }
 }

+ 180 - 72
app/Service/EmployeeService.php

@@ -17,6 +17,7 @@ use App\Model\SysMenuButton;
 use App\Model\Team;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Hash;
+use Mockery\Exception;
 
 /**
  * 人员相关
@@ -28,48 +29,122 @@ class EmployeeService extends Service
         list($status,$msg) = $this->employeeRule($data,false);
         if(!$status) return [$status,$msg];
 
-        $model = new Employee();
-        $model = $model->where('id',$data['id'])->first();
-        $model->id_card = $data['id_card']??'';
-        $model->number = $data['number'] ;
-        $model->mobile = $data['mobile'];
-        $model->emp_name = $data['emp_name'];
-        $model->is_admin = $data['is_admin'];
-        if($model->is_admin == 1){
-            $model->account = $data['account'];
-            if($data['password'] !== '********'){
-                $model->password   = Hash::make($data['password']);
+        try {
+            DB::beginTransaction();
+            $model = new Employee();
+            $model = $model->where('id',$data['id'])->first();
+            $model->number = $data['number'];
+            $model->emp_name = $data['emp_name'];
+            $model->mobile = $data['mobile'] ?? '';
+            $model->leave_time = $data['leave_time'] ?? '';
+            $model->entry_time = $data['entry_time'] ?? '';
+            $model->is_admin = $data['is_admin'];
+            if($model->is_admin == 1){
+                $model->account = $data['number'];
+                if($data['password'] !== '********'){
+                    $model->password   = Hash::make($data['password']);
+                }
+            }
+            $model->save();
+
+            EmployeeDepartPermission::where('employee_id',$data['id'])->delete();
+            if(isset($data['depart'])){
+                $insert = [];
+                foreach ($data['depart'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'depart_id' => $value,
+                    ];
+                }
+                EmployeeDepartPermission::insert($insert);
+            }
+
+            EmployeeRole::where('employee_id',$data['id'])->update([
+                'del_time' => time()
+            ]);
+            if(isset($data['role'])){
+                $insert = [];
+                foreach ($data['role'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'role_id' => $value,
+                        'crt_time' => time(),
+                        'upd_time' => time(),
+                    ];
+                }
+                EmployeeRole::insert($insert);
             }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false, $exception->getMessage()];
         }
-        $model->save();
-        return [true,'保存成功!'];
+
+        return [true,''];
     }
 
     public function employeeAdd($data,$user){
         list($status,$msg) = $this->employeeRule($data);
         if(!$status) return [$status,$msg];
 
-        $model = new Employee();
-        $model->id_card = $data['id_card']??'';
-        $model->number = $data['number'] ;
-        $model->mobile = $data['mobile'];
-        $model->emp_name = $data['emp_name'];
-        $model->state = 1;
-        $model->crt_id = $user['id'];
-        $model->is_admin = $data['is_admin'];
-        if($model->is_admin == 1){
-            $model->account = $data['account'];
-            $model->password = Hash::make($data['password']);
+        try{
+            DB::beginTransaction();
+            $model = new Employee();
+
+            $model->number = $data['number'];
+            $model->emp_name = $data['emp_name'];
+            $model->mobile = $data['mobile'] ?? '';
+            $model->leave_time = $data['leave_time'] ?? '';
+            $model->entry_time = $data['entry_time'] ?? '';
+            $model->state = 1;
+            $model->crt_id = $user['id'];
+            $model->is_admin = $data['is_admin'];
+            if($model->is_admin == 1){
+                $model->account = $data['number'];
+                if($data['password'] !== '********'){
+                    $model->password   = Hash::make($data['password']);
+                }
+            }
+            $model->save();
+
+            if(isset($data['depart'])){
+                $insert = [];
+                foreach ($data['depart'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'depart_id' => $value,
+                    ];
+                }
+                EmployeeDepartPermission::insert($insert);
+            }
+
+            if(isset($data['role'])){
+                $insert = [];
+                foreach ($data['role'] as $value){
+                    $insert[] = [
+                        'employee_id' => $model->id,
+                        'role_id' => $value,
+                        'crt_time' => time(),
+                        'upd_time' => time(),
+                    ];
+                }
+                EmployeeRole::insert($insert);
+            }
+
+            DB::commit();
+        }catch (Exception $e){
+            DB::rollBack();
+            return [false, $e->getMessage()];
         }
-        $model->save();
 
-        return [true,'保存成功!'];
+        return [true,''];
     }
 
     public function employeeDel($data){
-        if($this->isEmpty($data,'id')) return [false,'ID必须!'];
+        if($this->isEmpty($data,'id')) return [false,'请选择删除的数据!'];
 
-        Employee::where('id',$data['id'])->update([
+        Employee::whereIn('id',$data['id'])->update([
             'del_time'=>time()
         ]);
 
@@ -78,16 +153,12 @@ class EmployeeService extends Service
 
     public function employeeList($data,$user){
         $model = Employee::where('del_time',0)
-            ->select('number','mobile','emp_name','id','entry_time','leave_time','is_technical','is_admin','state')
+            ->select('number','mobile','emp_name','id','entry_time','leave_time','is_admin','state')
             ->orderBy('id','desc');
 
-        if(! empty($data['depart_id'])) {
-            $depart = Depart::where('del_time',0)
-                ->select('id','parent_id')
-                ->get()->toArray();
-            $result = array_merge($this->getAllDescendants($depart,$data['depart_id']),[$data['depart_id']]);
+        if(! empty($data['depart'])) {
             $employee_id = DB::table('employee_depart_permission')
-                ->whereIn("depart_id", $result)
+                ->where("depart_id", $data['depart'])
                 ->select("employee_id")
                 ->get()->toArray();
             $employee_id = array_column($employee_id,'employee_id');
@@ -136,38 +207,41 @@ class EmployeeService extends Service
             ->select('a.employee_id','b.title','b.id')
             ->join('depart as b','a.depart_id','=','b.id')
             ->whereIn("a.employee_id",array_column($data['data'],'id'))
+            ->orderBy('b.id')
             ->get()->toArray();
-        $map = array_column($res,null,'employee_id');
+        $depart_title = $depart_id = [];
+        foreach ($res as $value){
+            if(isset($depart_title[$value->employee_id])){
+                $depart_title[$value->employee_id] .= ',' . $value->title;
+            }else{
+                $depart_title[$value->employee_id] = $value->title;
+            }
+            $depart_id[$value->employee_id][] = $value->id;
+        }
 
         foreach ($data['data'] as $key => $value){
             $data['data'][$key]['role'] = $role2[$value['id']] ?? [];
             $data['data'][$key]['role_name'] = $role[$value['id']] ?? '';
-            $data['data'][$key]['depart_id'] = $map[$value['id']]->id ?? '';
-            $data['data'][$key]['depart_title'] = $map[$value['id']]->title ?? '';
+            $data['data'][$key]['depart'] = $depart_id[$value['id']] ?? [];
+            $data['data'][$key]['depart_title'] = $depart_title[$value['id']] ?? '';
         }
         return $data;
     }
 
     public function employeeRule($data,$is_add = true){
         if($this->isEmpty($data,'number')) return [false,'工号不存在!'];
-        if($this->isEmpty($data,'mobile')) return [false,'手机号不存在!'];
         if($this->isEmpty($data,'emp_name')) return [false,'姓名不存在!'];
+
         if(! $is_add){
             if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
             $bool = Employee::where('number',$data['number'])
                 ->where('id','<>',$data['id'])
                 ->where('del_time',0)->exists();
-            $bool_account = Employee::where('account',$data['account'])
-                ->where('id','<>',$data['id'])
-                ->where('del_time',0)->exists();
         }else{
             $bool = Employee::where('number',$data['number'])
                 ->where('del_time',0)->exists();
-            $bool_account = Employee::where('account',$data['account'])
-                ->where('del_time',0)->exists();
         }
         if($bool) return [false,'工号已存在!'];
-        if($bool_account) return [false,'账号已存在!'];
 
         return [true,''];
     }
@@ -212,8 +286,10 @@ class EmployeeService extends Service
 
     public function roleList($data){
         $list = Role::where('del_time',0)
-            ->select('title','title','crt_time','id','upd_time')
+            ->select('title','crt_time','id','upd_time')
             ->orderBy('id','desc');
+        if(! empty($data['title'])) $list->where('title', 'LIKE', '%' . $data['title'] . '%');
+
         $list = $this->limit($list,'',$data);
 
         return [200,$list];
@@ -293,7 +369,7 @@ class EmployeeService extends Service
             ->where('del_time',0)
             ->select('menu_id','type')
             ->get()->toArray();
-        $button = $this->fillRoleButton($data['role_id']);
+        $button = $this->fillRoleButton([$data['role_id']]);
         foreach ($menu as $key => $value){
             $menu[$key]['button'] = $button[$value['menu_id']] ?? [];
         }
@@ -345,23 +421,24 @@ class EmployeeService extends Service
         return [true, ''];
     }
 
-    public function departList($data){
+    public function departList($data,$user){
         $model = Depart::where('del_time',0)
-            ->select('title','id','code','parent_id','is_use')
+            ->select('title','id','code','parent_id','is_main')
             ->orderby('code', 'asc');
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
         if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
 
         $list = $model->get()->toArray();
-        if(! empty($list)) {
-            $list = $this->makeTree(0,$list);
-            $list = $this->set_sort_circle($list);
+        $list_tree = $list;
+        if(! empty($list_tree)) {
+            $list_tree = $this->makeTree(0,$list_tree);
+            $list_tree = $this->set_sort_circle($list_tree);
         }
 
-        return [200,$list];
+        return [200,['data' => $list,'tree' => $list_tree]];
     }
 
-    public function departRule($data, $is_check){
+    public function departRule($data, $is_check = true){
         if($this->isEmpty($data,'data')) return [false,'数据不能为空!'];
 
         $code = array_column($data['data'],'code');
@@ -383,10 +460,6 @@ class EmployeeService extends Service
             if($title_count[$value] > 1) return [false,'名称不能重复'];
         }
 
-        $depart_id = array_filter(array_column($data['data'],'parent_id'));
-        $res = $this->checkDepartHasPerson($depart_id);
-        if($res) return [false,'部门下已有人员,不能新建子部门!'];
-
         foreach ($data['data'] as $key => $value){
             if(empty($value['parent_id'])) $data['data'][$key]['parent_id'] = 0;
 
@@ -398,11 +471,6 @@ class EmployeeService extends Service
                     ->exists();
             }else{
                 if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
-
-                if(! $value['is_use']) {
-                    $bool_is = $this->checkDepartHasPerson([$data['id']]);
-                    if($bool_is) return [false,'部门下已经有人员,停用失败!'];
-                }
                 $bool = Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
                     ->where('id','<>',$data['id'])
                     ->where('del_time',0)
@@ -626,7 +694,7 @@ class EmployeeService extends Service
             ->get()->toArray();
 
         //组织
-        $role_id = array_column($role,'role_id');
+        $role_id = array_unique(array_column($role,'role_id'));
         asort($role_id);
         $role_id = array_values($role_id);
 
@@ -662,18 +730,23 @@ class EmployeeService extends Service
             ->select('menu_id','type')
             ->get()->toArray();
         $button = $this->fillRoleButton($role_id);
+        $tmp = [];
         foreach ($search as $value){
-            $object[] = [
-                'menu_id' => $value['menu_id'],
-                'type' => $value['type'],
-                'button' => $button[$value['menu_id']] ?? [],
-            ];
+            if(! in_array($value['menu_id'],$tmp)){
+                $object[] = [
+                    'menu_id' => $value['menu_id'],
+                    'type' => $value['type'],
+                    'button' => $button[$value['menu_id']] ?? [],
+                ];
+                $tmp[] = $value['menu_id'];
+            }
         }
+        unset($tmp);
 
         return $object;
     }
 
-    //获取登录账号的权限部门
+    //获取登录账号的权限部门 暂时不用了
     public static function getPersonDepart($employee_id){
         if(empty($employee_id)) return [];
 
@@ -723,16 +796,51 @@ class EmployeeService extends Service
         return [true,''];
     }
 
+    //填充角色下的按钮
     public function fillRoleButton($role_id){
-        $button = RoleMenuButton::where('role_id',$role_id)
+        $button = RoleMenuButton::whereIn('role_id',$role_id)
             ->where('del_time',0)
             ->select('menu_id','button_id')
             ->get()->toArray();
         $button_map = [];
         foreach ($button as $value){
-            $button_map[$value['menu_id']][] = $value['button_id'];
+            if(! isset($button_map[$value['menu_id']])){
+                $button_map[$value['menu_id']][] = $value['button_id'];
+            }else{
+                if(! in_array($value['button_id'], $button_map[$value['menu_id']])) $button_map[$value['menu_id']][] = $value['button_id'];
+            }
         }
 
         return $button_map;
     }
+
+    //获取登录账号的部门
+    public static function getLoginDepart($employee_id){
+        $is_main = 0;//是否总社
+        if(empty($employee_id)) return ['', $is_main];
+
+        //admin账号
+        if($employee_id == Employee::SPECIAL_ADMIN) {
+            $is_main = 1;
+            return [Depart::RULE_DEPART, $is_main];
+        }
+
+        //自己绑定的部门 启用的部门
+        $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
+            ->join('depart as b','b.id','a.depart_id')
+            ->where('a.employee_id',$employee_id)
+            ->where('b.is_use',Depart::IS_UES)
+            ->select('a.depart_id','b.is_main')
+            ->get()->toArray();
+        if(! empty($depart)){
+            foreach ($depart as $value){
+                if($value['is_main'] > 0) {
+                    $is_main = 1;
+                    continue;
+                }
+            }
+        }
+
+        return [$depart, $is_main];
+    }
 }

+ 1 - 1
app/Service/FileUploadService.php

@@ -33,7 +33,7 @@ class FileUploadService extends Service
         }
 
         // 上传文件
-        $file_name = date("Y-m-d").time().rand(1000,9999);
+        $file_name = date("Ymd").time().rand(1000,9999);
         $filename =  $file_name.'.' . $ext;
         // 使用我们新建的uploads本地存储空间(目录)
         Storage::disk('public')->put('upload_files/'.$filename, file_get_contents($realPath));

+ 1 - 1
app/Service/FollowUpRecordService.php

@@ -92,7 +92,7 @@ class FollowUpRecordService extends Service
         if(! $is_add){
             if($this->isEmpty($data,'id')) return [false,'ID不能为空!'];
         }
-        $data['visit_time'] = $this->changeDateToDate($data['visit_time']);
+        $data['visit_time'] = $this->changeDateToDateMin($data['visit_time']);
 
         return [true,''];
     }

+ 210 - 0
app/Service/InvoiceOrderService.php

@@ -0,0 +1,210 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Depart;
+use App\Model\Employee;
+use App\Model\InvoiceOrder;
+use App\Model\InvoiceOrderInfo;
+use Illuminate\Support\Facades\DB;
+
+class InvoiceOrderService extends Service
+{
+    public function edit($data,$user){
+        list($status,$msg) = $this->orderRule($data,false);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $material_model = InvoiceOrder::where('order_number',$data['order_number'])->first();
+            $material_model->contact_order_number = $data['contact_order_number'];
+            $material_model->send = $data['send'];
+            $material_model->send_time = $data['send_time'];
+            $material_model->take = $data['take'];
+            $material_model->take_address = $data['take_address'];
+            $material_model->take_phone = $data['take_phone'];
+            $material_model->logistics_company = $data['logistics_company'];
+            $material_model->logistics_number = $data['logistics_number'];
+            $material_model->depart_id = $data['depart_id'];
+            $material_model->mark = $data['mark'];
+            $material_model->save();
+
+            InvoiceOrderInfo::where('order_number',$data['order_number'])
+                ->where('del_time',0)
+                ->update(['del_time' => time()]);
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'order_number' => $data['order_number'],
+                        'depart_id' => $data['depart_id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                InvoiceOrderInfo::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function add($data,$user){
+        list($status,$msg) = $this->orderRule($data);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $material_model = new InvoiceOrder();
+            $material_model->order_number = $data['order_number'];
+            $material_model->contact_order_number = $data['contact_order_number'];
+            $material_model->send = $data['send'];
+            $material_model->send_time = $data['send_time'];
+            $material_model->take = $data['take'];
+            $material_model->take_address = $data['take_address'];
+            $material_model->take_phone = $data['take_phone'];
+            $material_model->logistics_company = $data['logistics_company'];
+            $material_model->logistics_number = $data['logistics_number'];
+            $material_model->depart_id = $data['depart_id'];
+            $material_model->mark = $data['mark'];
+            $material_model->crt_id = $user['id'];
+            $material_model->save();
+
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'order_number' => $data['order_number'],
+                        'depart_id' => $data['depart_id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                InvoiceOrderInfo::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function detail($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
+
+        $order = InvoiceOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->select('id','order_number','contact_order_number','depart_id','send','send_time','take','take_address','take_phone','logistics_company','logistics_number','crt_id','mark','state')
+            ->first();
+        if(empty($order)) return [false, '发货订单不存在或已被删除'];
+
+        $info = InvoiceOrderInfo::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->select('id','order_number','depart_id','product_id','number','mark')
+            ->get()->toArray();
+        $order['product'] = $info;
+
+        return [true, $order];
+    }
+
+    public function del($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据!'];
+
+        $bool = InvoiceOrder::where('order_number',$data['order_number'])
+            ->where('state','>',InvoiceOrder::STATE_ZERO)->exists();
+        if($bool) return [false,'发货订单已确认,删除失败!'];
+
+        try{
+            DB::beginTransaction();
+            InvoiceOrder::where('order_number',$data['order_number'])->update([
+                'del_time'=>time()
+            ]);
+            InvoiceOrderInfo::where('order_number',$data['order_number'])->update([
+                'del_time'=>time()
+            ]);
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function getList($data,$user){
+        $model = InvoiceOrder::where('del_time',0)
+            ->select('id','order_number','contact_order_number','depart_id','send','send_time','take','take_address','take_phone','logistics_company','logistics_number','crt_id','mark','state')
+            ->orderby('id', 'desc');
+        if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
+        if(! empty($data['contact_order_number'])) $model->where('contact_order_number', 'LIKE', '%'.$data['contact_order_number'].'%');
+        if(! empty($data['depart_id'])) $model->where('depart_id', $data['depart_id']);
+        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;
+
+        $depart_id = array_unique(array_column($data['data'],'depart_id'));
+        $depart_map = Depart::whereIn('id',$depart_id)
+            ->pluck('title','id')
+            ->toArray();
+
+        $emp_id = array_unique(array_merge_recursive(array_column($data['data'],'crt_id'),array_column($data['data'],'send')));
+        $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]['depart_name'] = $depart_map[$value['depart_id']] ?? '';
+            $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
+            $data['data'][$key]['send_name'] = $emp_map[$value['send']] ?? '';
+        }
+
+        return $data;
+    }
+
+    public function orderRule(&$data, $is_check = true){
+        if($this->isEmpty($data,'depart_id')) return [false,'部门不能为空!'];
+        if($this->isEmpty($data,'send')) return [false,'发货人不能为空!'];
+        if($this->isEmpty($data,'product')) return [false,'产品不能为空!'];
+        if(! empty($data['send_time'])) $data['send_time'] = $this->changeDateToDateMin($data['send_time']);
+
+        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,'产品数量请不要超过两位小数'];
+        }
+
+        if($is_check){
+            $order_number = (new OrderNoService())->createOrderNumber(InvoiceOrder::prefix);
+            if(empty($order_number)) return [false,'发货单号生成失败!'];
+            $data['order_number'] = $order_number;
+        }else{
+            if($this->isEmpty($data,'order_number')) return [false,'发货单号不能为空!'];
+        }
+
+        return [true, ''];
+    }
+}

+ 10 - 0
app/Service/OrderNoService.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Service;
+
+class OrderNoService extends Service
+{
+    public function createOrderNumber($prefix){
+        return $prefix . date('Ymd') . time() . rand(1000,9999);
+    }
+}

+ 33 - 2
app/Service/ProductService.php

@@ -6,6 +6,7 @@ use App\Model\Employee;
 use App\Model\Product;
 use App\Model\ProductCategory;
 use App\Model\ProductInfo;
+use App\Model\ProductInventory;
 use App\Model\ProductRange;
 use Illuminate\Support\Facades\DB;
 
@@ -319,7 +320,7 @@ class ProductService extends Service
         return [true,''];
     }
 
-    public function productDetail($data){
+    public function productDetail($data,$user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         $customer = Product::where('del_time',0)
@@ -327,8 +328,13 @@ class ProductService extends Service
             ->first();
         if(empty($customer)) return [false,'产品不存在或已被删除'];
         $customer = $customer->toArray();
-        $customer['img'] = $customer['file'] = $customer['depart'] = $customer['employee'] = [];
+        //库存
+        $customer['product_inventory'] = [];
+        $depart_id = array_column($user['rule_depart'],'depart_id');
+        $inventory = $this->getProductInventory([$data['id']], $depart_id);
+        if(! empty($inventory)) $customer['product_inventory'] = $inventory;
 
+        $customer['img'] = $customer['file'] = $customer['depart'] = $customer['employee'] = [];
         $customer_info = ProductInfo::where('del_time',0)
             ->where('product_id',$customer['id'])
             ->select('id','product_id','file','type')
@@ -369,6 +375,17 @@ class ProductService extends Service
             ->select('title','id','product_category_id','code','size','unit','bar_code','retail_price','state','crt_id','crt_time','mark')
             ->orderby('id', 'desc');
 
+        if(! $user['is_main']) {
+            $user_id = $user['id'];
+            $depart_id = array_column($user['rule_depart'],'depart_id');
+            $product_id = ProductRange::where('del_time',0)
+                ->where(function ($query) use($user_id, $depart_id) {
+                    $query->where('employee_id',$user_id)
+                        ->orWhereIn('depart_id', $depart_id);
+                })->select('product_id')->get()
+                ->toArray();
+            $model->whereIn('id',array_column($product_id,'product_id'));
+        }
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
         if(isset($data['state'])) $model->where('state', $data['state']);
 
@@ -423,4 +440,18 @@ class ProductService extends Service
 
         return $data;
     }
+
+    public function getProductInventory($product_id = [],$depart_id = []){
+        if(empty($product_id)) return [];
+
+        $result = ProductInventory::whereIn('product_id',$product_id)
+            ->when(! empty($depart_id), function ($query) use ($depart_id) {
+                return $query->whereIn('depart_id', $depart_id);
+            })
+            ->select('id','product_id','number','depart_id','lock_number')
+            ->get()
+            ->toArray();
+
+        return $result;
+    }
 }

+ 206 - 0
app/Service/PurchaseOrderService.php

@@ -0,0 +1,206 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Depart;
+use App\Model\Employee;
+use App\Model\PurchaseOrder;
+use App\Model\PurchaseOrderInfo;
+use Illuminate\Support\Facades\DB;
+
+class PurchaseOrderService extends Service
+{
+    public function edit($data,$user){
+        list($status,$msg) = $this->orderRule($data,false);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $material_model = PurchaseOrder::where('order_number',$data['order_number'])->first();
+            $material_model->depart_id = $data['depart_id'];
+            $material_model->mark = $data['mark'] ?? '';
+            $material_model->save();
+
+            PurchaseOrderInfo::where('order_number',$data['order_number'])
+                ->where('del_time',0)
+                ->update(['del_time' => time()]);
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'order_number' => $data['order_number'],
+                        'depart_id' => $data['depart_id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                PurchaseOrderInfo::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function add($data,$user){
+        list($status,$msg) = $this->orderRule($data);
+        if(!$status) return [$status,$msg];
+        try{
+            DB::beginTransaction();
+            $material_model = new PurchaseOrder();
+            $material_model->order_number = $data['order_number'];
+            $material_model->depart_id = $data['depart_id'];
+            $material_model->mark = $data['mark'] ?? '';
+            $material_model->crt_id = $user['id'];
+            $material_model->save();
+
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'order_number' => $data['order_number'],
+                        'depart_id' => $data['depart_id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                PurchaseOrderInfo::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function detail($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
+
+        $order = PurchaseOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->select('id','order_number','depart_id','mark','state','crt_id')
+            ->first();
+        if(empty($order)) return [false, '采购订单不存在或已被删除'];
+
+        $info = PurchaseOrderInfo::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->select('id','order_number','depart_id','product_id','number','mark')
+            ->get()->toArray();
+        $order['product'] = $info;
+
+        return [true, $order];
+    }
+
+    public function del($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据!'];
+
+        $bool = PurchaseOrder::where('order_number',$data['order_number'])
+            ->where('state','>',PurchaseOrder::STATE_ZERO)->exists();
+        if($bool) return [false,'采购订单已审核,删除失败!'];
+
+        try{
+            DB::beginTransaction();
+            PurchaseOrder::where('order_number',$data['order_number'])->update([
+                'del_time'=>time()
+            ]);
+            PurchaseOrderInfo::where('order_number',$data['order_number'])->update([
+                'del_time'=>time()
+            ]);
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function getList($data,$user){
+        $model = PurchaseOrder::where('del_time',0)
+            ->select('order_number','id','depart_id','mark','crt_time','state','crt_id')
+            ->orderby('id', 'desc');
+        if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
+        if(! empty($data['depart_id'])) $model->where('depart_id', $data['depart_id']);
+        if(! empty($data['company_id'])) $model->where('company_id', $data['company_id']);
+        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;
+
+        $depart_id = array_unique(array_column($data['data'],'depart_id'));
+        $depart_map = Depart::whereIn('id',$depart_id)
+            ->pluck('title','id')
+            ->toArray();
+
+        $emp_id = array_unique(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]['depart_name'] = $depart_map[$value['depart_id']] ?? '';
+            $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
+        }
+
+        return $data;
+    }
+
+    public function orderRule(&$data, $is_check = true){
+        if($this->isEmpty($data,'depart_id')) return [false,'部门不能为空!'];
+        if($this->isEmpty($data,'product')) return [false,'产品不能为空!'];
+
+        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,'产品数量请不要超过两位小数'];
+        }
+
+        if($is_check){
+            $order_number = (new OrderNoService())->createOrderNumber(PurchaseOrder::prefix);
+            if(empty($order_number)) return [false,'采购单号生成失败!'];
+            $data['order_number'] = $order_number;
+        }else{
+            if($this->isEmpty($data,'order_number')) return [false,'采购单号不能为空!'];
+        }
+
+        return [true, ''];
+    }
+
+    public function purchaseOrderConfirm($data,$user){
+        if(empty($data['order_number'])) return [false, '请选择数据'];
+
+        $order = PurchaseOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($order)) return [false, '采购订单不存在或已被删除'];
+        if($order->state != PurchaseOrder::STATE_ZERO) return [false, '请确认采购订单状态,操作失败'];
+
+        PurchaseOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->update(['state' => PurchaseOrder::STATE_TWO]);
+
+        return [true,''];
+    }
+}

+ 1 - 1
app/Service/Service.php

@@ -313,7 +313,7 @@ class Service
 
     //前端传来的时间 转为时间戳
     //精确到分
-    function changeDateToDate($time){
+    function changeDateToDateMin($time){
         if(empty($time)) return '';
 
         // 创建一个 DateTime 对象并设置时区为 UTC

+ 11 - 0
app/Service/SysMenuService.php

@@ -4,6 +4,7 @@ namespace App\Service;
 
 use App\Model\Employee;
 use App\Model\RoleMenu;
+use App\Model\RoleMenuButton;
 use App\Model\SysMenu;
 use App\Model\SysMenuButton;
 use Illuminate\Support\Facades\DB;
@@ -161,6 +162,10 @@ class SysMenuService extends Service
                 ->where('id','<>',$data['id'])
                 ->where('del_time',0)
                 ->exists();
+            $role_button = RoleMenuButton::where('del_time',0)
+                ->where('menu_id',$data['id'])
+                ->select('button_id')
+                ->get()->toArray();
         }
         if($bool) return [false,'菜单名称已经存在!'];
 
@@ -176,6 +181,12 @@ class SysMenuService extends Service
                 if($title_count[$value] > 1) return [false,'按钮名称不能重复'];
             }
         }
+        if(! empty($role_button)){
+            $submit = array_column($data['button'],'id');
+            foreach ($role_button as $value){
+                if(! in_array($value['button_id'],$submit)) return [false,'菜单功能按钮已绑定角色!'];
+            }
+        }
 
         return [true,''];
     }

+ 202 - 0
app/Service/TakeOrderService.php

@@ -0,0 +1,202 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Depart;
+use App\Model\Employee;
+use App\Model\InvoiceOrder;
+use App\Model\InvoiceOrderInfo;
+use App\Model\TakeOrder;
+use App\Model\TakeOrderInfo;
+use Illuminate\Support\Facades\DB;
+
+class TakeOrderService extends Service
+{
+    public function edit($data,$user){
+        list($status,$msg) = $this->orderRule($data,false);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $material_model = TakeOrder::where('order_number',$data['order_number'])->first();
+            $material_model->contact_order_number = $data['contact_order_number'];
+            $material_model->depart_id = $data['depart_id'];
+            $material_model->take = $data['take'];
+            $material_model->take_time = $data['take_time'];
+            $material_model->mark = $data['mark'];
+            $material_model->save();
+
+            TakeOrderInfo::where('order_number',$data['order_number'])
+                ->where('del_time',0)
+                ->update(['del_time' => time()]);
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'order_number' => $data['order_number'],
+                        'depart_id' => $data['depart_id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                TakeOrderInfo::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function add($data,$user){
+        list($status,$msg) = $this->orderRule($data);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $material_model = new TakeOrder();
+            $material_model->order_number = $data['order_number'];
+            $material_model->contact_order_number = $data['contact_order_number'];
+            $material_model->take = $data['take'];
+            $material_model->take_time = $data['take_time'];
+            $material_model->depart_id = $data['depart_id'];
+            $material_model->mark = $data['mark'];
+            $material_model->crt_id = $user['id'];
+            $material_model->save();
+
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'order_number' => $data['order_number'],
+                        'depart_id' => $data['depart_id'],
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                TakeOrderInfo::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function detail($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
+
+        $order = TakeOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->select('id','order_number','contact_order_number','depart_id','take_time','take','crt_id','mark','state')
+            ->first();
+        if(empty($order)) return [false, '收货订单不存在或已被删除'];
+
+        $info = TakeOrderInfo::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->select('id','order_number','depart_id','product_id','number','mark')
+            ->get()->toArray();
+        $order['product'] = $info;
+
+        return [true, $order];
+    }
+
+    public function del($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据!'];
+
+        $bool = TakeOrder::where('order_number',$data['order_number'])
+            ->where('state','>',TakeOrder::STATE_ZERO)->exists();
+        if($bool) return [false,'收货订单已确认,删除失败!'];
+
+        try{
+            DB::beginTransaction();
+            TakeOrder::where('order_number',$data['order_number'])->update([
+                'del_time'=>time()
+            ]);
+            TakeOrderInfo::where('order_number',$data['order_number'])->update([
+                'del_time'=>time()
+            ]);
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    public function getList($data,$user){
+        $model = TakeOrder::where('del_time',0)
+            ->select('id','order_number','contact_order_number','depart_id','take','take_time','crt_id','mark','state')
+            ->orderby('id', 'desc');
+        if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
+        if(! empty($data['contact_order_number'])) $model->where('contact_order_number', 'LIKE', '%'.$data['contact_order_number'].'%');
+        if(! empty($data['depart_id'])) $model->where('depart_id', $data['depart_id']);
+        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;
+
+        $depart_id = array_unique(array_column($data['data'],'depart_id'));
+        $depart_map = Depart::whereIn('id',$depart_id)
+            ->pluck('title','id')
+            ->toArray();
+
+        $emp_id = array_unique(array_merge_recursive(array_column($data['data'],'crt_id'),array_column($data['data'],'take')));
+        $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]['depart_name'] = $depart_map[$value['depart_id']] ?? '';
+            $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
+            $data['data'][$key]['take_name'] = $emp_map[$value['take']] ?? '';
+        }
+
+        return $data;
+    }
+
+    public function orderRule(&$data, $is_check = true){
+        if($this->isEmpty($data,'depart_id')) return [false,'部门不能为空!'];
+        if($this->isEmpty($data,'take_time')) return [false,'收货时间不能为空!'];
+        if($this->isEmpty($data,'product')) return [false,'产品不能为空!'];
+        $data['take_time'] = $this->changeDateToDateMin($data['take_time']);
+
+        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,'产品数量请不要超过两位小数'];
+        }
+
+        if($is_check){
+            $order_number = (new OrderNoService())->createOrderNumber(TakeOrder::prefix);
+            if(empty($order_number)) return [false,'收货单号生成失败!'];
+            $data['order_number'] = $order_number;
+        }else{
+            if($this->isEmpty($data,'order_number')) return [false,'收货单号不能为空!'];
+        }
+
+        return [true, ''];
+    }
+}

+ 22 - 0
routes/api.php

@@ -102,4 +102,26 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('productAdd', 'Api\ProductController@productAdd');
     $route->any('productDel', 'Api\ProductController@productDel');
     $route->any('productDetail', 'Api\ProductController@productDetail');
+
+    //采购单
+    $route->any('purchaseOrderList', 'Api\PurchaseOrderController@purchaseOrderList');
+    $route->any('purchaseOrderEdit', 'Api\PurchaseOrderController@purchaseOrderEdit');
+    $route->any('purchaseOrderDetail', 'Api\PurchaseOrderController@purchaseOrderDetail');
+    $route->any('purchaseOrderAdd', 'Api\PurchaseOrderController@purchaseOrderAdd');
+    $route->any('purchaseOrderDel', 'Api\PurchaseOrderController@purchaseOrderDel');
+    $route->any('purchaseOrderConfirm', 'Api\PurchaseOrderController@purchaseOrderConfirm');
+
+    //发货单
+    $route->any('invoiceOrderList', 'Api\InvoiceOrderController@invoiceOrderList');
+    $route->any('invoiceOrderEdit', 'Api\InvoiceOrderController@invoiceOrderEdit');
+    $route->any('invoiceOrderDetail', 'Api\InvoiceOrderController@invoiceOrderDetail');
+    $route->any('invoiceOrderAdd', 'Api\InvoiceOrderController@invoiceOrderAdd');
+    $route->any('invoiceOrderDel', 'Api\InvoiceOrderController@invoiceOrderDel');
+
+    //收货单
+    $route->any('takeOrderList', 'Api\TakeOrderController@takeOrderList');
+    $route->any('takeOrderEdit', 'Api\TakeOrderController@takeOrderEdit');
+    $route->any('takeOrderDetail', 'Api\TakeOrderController@takeOrderDetail');
+    $route->any('takeOrderAdd', 'Api\TakeOrderController@takeOrderAdd');
+    $route->any('takeOrderDel', 'Api\TakeOrderController@takeOrderDel');
 });