cqp 1 місяць тому
батько
коміт
12b8805624

+ 67 - 0
app/Http/Controllers/Api/ItemController.php

@@ -73,4 +73,71 @@ class ItemController extends BaseController
             return $this->json_return(201,$data);
         }
     }
+
+    public function itemNodeEdit(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeEdit($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function itemNodeAdd(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeAdd($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function itemNodeDel(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeDel($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function itemNodeList(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function itemNodeDetail(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeDetail($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }

+ 67 - 0
app/Model/ItemNode.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace App\Model;
+
+use App\Traits\HasCustomFields;
+
+class ItemNode extends DataScopeBaseModel
+{
+    protected $table = "item_node"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const employee_column = "crt_id";
+
+    const Order_type = "item_node";
+
+    public static $field = ['*'];
+
+    const TYPE_ZERO = 0;
+    const TYPE_ONE = 1;
+    const TYPE_TWO = 2;
+    const TYPE_MINUS = -1;
+    const State_Type = [
+        self::TYPE_MINUS => '审核驳回',
+        self::TYPE_ZERO => '未审核',
+        self::TYPE_ONE => '待审核',
+        self::TYPE_TWO => '审核通过',
+    ];
+
+    const delivery_zero = 0;
+    const delivery_one = 1;
+    const Delivery_Attribute = [
+        self::delivery_zero => '否',
+        self::delivery_one => '是',
+    ];
+
+    const entrust_zero = 0;
+    const entrust_one = 1;
+    const entrust_two = 2;
+    const Entrust_Attribute = [
+        self::entrust_zero => '无',
+        self::entrust_one => '境内委托',
+        self::entrust_two => '境外委托',
+    ];
+
+    const review_zero = 0;
+    const review_one = 1;
+    const Review_Attribute = [
+        self::review_zero => '否',
+        self::review_one => '是',
+    ];
+
+    // 引入自定义字段预加载关系
+    use HasCustomFields;
+
+    // 作用域 里面关联了客户自定义的表头数据 列表页需要 :: withCustomData($user) 这个是预加载
+    public function scopeWithCustomData($query, $user)
+    {
+        $top_depart_id = $user['top_depart_id'];
+
+        return $query->with(['customFields' => function ($subQuery) use ($top_depart_id) {
+            $subQuery->where('top_depart_id', $top_depart_id)
+                ->where('table_name', $this->table)
+                ->where('del_time', 0);
+        }]);
+    }
+}

+ 19 - 0
app/Model/ItemNodeDetails.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Model;
+
+class ItemNodeDetails extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "item_node_details"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+    const type_one = 1;
+    const type_two = 2;
+    public static $type_name = [
+        self::type_one => '人员',
+        self::type_two => '设备',
+    ];
+}

+ 348 - 0
app/Service/ItemService.php

@@ -6,6 +6,8 @@ use App\Model\Device;
 use App\Model\Employee;
 use App\Model\Item;
 use App\Model\ItemDetails;
+use App\Model\ItemNode;
+use App\Model\ItemNodeDetails;
 use App\Model\Tag;
 use App\Model\SysMenu;
 use Illuminate\Support\Facades\DB;
@@ -442,4 +444,350 @@ class ItemService extends Service
 
         return $res;
     }
+
+
+    //项目节点
+    public function itemNodeEdit($data,$user){
+        list($status,$msg) = $this->itemNodeRule($data, $user, false);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            $model = ItemNode::where('id', $data['id'])->first();
+            $tableName = $model->getTable();
+            $model->title = $data['title'] ?? '';
+            $model->mark = $data['mark'] ?? "";
+            $model->start_time = $data['start_time'] ?? 0;
+            $model->end_time = $data['end_time'] ?? 0;
+            $model->is_delivery_required = $data['is_delivery_required'] ?? 0;
+            $model->entrust_type = $data['entrust_type'] ?? 0;
+            $model->charge_id = $data['charge_id'] ?? 0;
+            $model->node_id = $data['node_id'] ?? 0;
+            $model->node_weight = $data['node_weight'] ?? 0;
+            $model->is_review_required = $data['is_review_required'] ?? 0;
+            $model->review_id = $data['review_id'] ?? 0;
+            $model->priority_id = $data['priority_id'] ?? 0;
+            $model->save();
+
+            $time = time();
+            ItemNodeDetails::where('del_time',0)
+                ->where('item_node_id', $model->id)
+                ->update(['del_time' => $time]);
+            $this->saveNodeDetail($model->id, $time, $data);
+
+            list($status, $msg) = CustomFieldSettingService::syncCustomFieldData($model->id, $tableName, $data, $user);
+            if (! $status) {
+                DB::rollBack();
+                return [false, $msg];
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    public function itemNodeAdd($data,$user){
+        list($status,$msg) = $this->itemNodeRule($data, $user);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            $model = new ItemNode();
+            $model->item_id = $data['item_id'] ?? 0;
+            $tableName = $model->getTable();
+            $model->code = $this->generateBillNo([
+                'top_depart_id' => $user['top_depart_id'],
+                'type' => ItemNode::Order_type,
+                'period' => date("Ym", time())
+            ]);
+            $model->title = $data['title'] ?? '';
+            $model->mark = $data['mark'] ?? "";
+            $model->start_time = $data['start_time'] ?? 0;
+            $model->end_time = $data['end_time'] ?? 0;
+            $model->is_delivery_required = $data['is_delivery_required'] ?? 0;
+            $model->entrust_type = $data['entrust_type'] ?? 0;
+            $model->charge_id = $data['charge_id'] ?? 0;
+            $model->node_id = $data['node_id'] ?? 0;
+            $model->node_weight = $data['node_weight'] ?? 0;
+            $model->is_review_required = $data['is_review_required'] ?? 0;
+            $model->review_id = $data['review_id'] ?? 0;
+            $model->priority_id = $data['priority_id'] ?? 0;
+            $model->crt_id = $user['id'];
+            $model->top_depart_id = $data['top_depart_id'];
+            $model->save();
+
+            $this->saveNodeDetail($model->id, time(), $data);
+
+            list($status, $msg) = CustomFieldSettingService::syncCustomFieldData($model->id, $tableName, $data, $user);
+            if (!$status) {
+                DB::rollBack();
+                return [false, $msg];
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    private function saveNodeDetail($id, $time, $data){
+        if(! empty($data['man_list'])){
+            $unit = [];
+            foreach ($data['man_list'] as $value){
+                $unit[] = [
+                    'item_id' => $data['item_id'],
+                    'item_node_id' => $id,
+                    'type' => $value['type'],
+                    'data_id' => $value['data_id'],
+                    'crt_time' => $time,
+                    'top_depart_id' => $value['top_depart_id'],
+                ];
+            }
+            if(! empty($unit)) ItemNodeDetails::insert($unit);
+        }
+
+        if(! empty($data['device_list'])){
+            $receipt = [];
+            foreach ($data['device_list'] as $value){
+                $receipt[] = [
+                    'item_id' => $data['item_id'],
+                    'item_node_id' => $id,
+                    'type' => $value['type'],
+                    'data_id' => $value['data_id'],
+                    'crt_time' => $time,
+                    'top_depart_id' => $value['top_depart_id'],
+                ];
+            }
+            if(! empty($receipt)) ItemNodeDetails::insert($receipt);
+        }
+    }
+
+    private function getNodeDetail($id){
+        $data = ItemNodeDetails::where('del_time',0)
+            ->where('item_node_id', $id)
+            ->get()->toArray();
+
+        $id = $id2 = [];
+        foreach ($data as $value){
+            if($value['type'] == ItemNodeDetails::type_one) {
+                $id[] = $value['data_id'];
+            }else{
+                $id2[] = $value['data_id'];
+            }
+        }
+        $map = Employee::whereIn('id', $id)->select('title','id','number')->get()->toArray();
+        $map = array_column($map,null,'id');
+        $map2 = Device::whereIn('id', $id2)->select('code','id','title')->get()->toArray();
+        $map2 = array_column($map2,null,'id');
+
+        $unit = $receipt = [];
+        foreach ($data as $value){
+            if($value['type'] == ItemNodeDetails::type_one) {
+                $tmp = $map[$value['data_id']] ?? [];
+                $unit[] = [
+                    'type' => $value['type'],
+                    'data_id' => $value['data_id'],
+                    'data_title' => $tmp['title'],
+                    'data_code' => $tmp['number'],
+                ];
+            }else{
+                $tmp = $map2[$value['data_id']] ?? [];
+                $receipt[] = [
+                    'type' => $value['type'],
+                    'data_id' => $value['data_id'],
+                    'data_title' => $tmp['title'] ?? "",
+                    'data_code' => $tmp['code'] ?? "",
+                ];
+            }
+        }
+
+        return [
+            'man_list' => $unit,
+            'device_list' => $receipt,
+        ];
+    }
+
+    public function itemNodeDel($data){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+
+        try {
+            DB::beginTransaction();
+            $time = time();
+
+            ItemNode::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->update(['del_time' => $time]);
+
+            ItemNodeDetails::where('del_time',0)
+                ->whereIn('item_node_id', $data['id'])
+                ->update(['del_time' => $time]);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    public function itemNodeDetail($data, $user){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+        $customer = ItemNode::where('del_time',0)
+            ->withCustomData($user)
+            ->where('id',$data['id'])
+            ->first();
+        if(empty($customer)) return [false,'项目节点不存在或已被删除'];
+        $customer->getFormattedCustomFields();// 自定义数据附件处理
+        $customer = $customer->toArray();
+
+        $customer['start_time']  = ! empty($customer['start_time']) ? date("Y-m-d", $customer['start_time']) : "";
+        $customer['end_time']  = ! empty($customer['end_time']) ? date("Y-m-d", $customer['end_time']) : "";
+        $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('title');
+        $customer['charge_name'] = Employee::where('id',$customer['charge_id'])->value('title');
+        $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
+        $customer['state_title'] = ItemNode::State_Type[$customer['state']] ?? '';
+
+        $customer['priority_title'] = Tag::where('id', $customer['priority_id'])->value('title') ?? "";
+        $customer['node_title'] = Tag::where('id', $customer['node_id'])->value('title') ?? "";
+        $tag = (new TagService())->getTagMap(array_unique([$customer['priority_id'], $customer['node_id'] ]));
+        $priority_tmp = $tag[$customer['priority_id']] ?? [];
+        $customer['priority_title'] = $priority_tmp['title'] ?? '';
+        $customer['priority_code'] = $priority_tmp['code'] ?? '';
+        $node_tmp = $tag[$customer['node_id']] ?? [];
+        $customer['node_title'] = $node_tmp['title'] ?? '';
+        $customer['node_code'] = $node_tmp['code'] ?? '';
+
+        $details = $this->getNodeDetail($data['id']);
+        $customer = array_merge($customer, $details);
+
+        return [true, $customer];
+    }
+
+    public function itemNodeCommon($data,$user, $field = []){
+        if(empty($field)) $field = ItemNode::$field;
+
+        $model = ItemNode::TopClear($user,$data);
+        $model = $model->where('del_time',0)
+            ->select($field)
+            ->orderby('id', 'desc');
+
+        if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
+        if(! empty($data['code'])) $model->where('code', 'LIKE', '%'.$data['code'].'%');
+        if(! empty($data['id'])) $model->whereIn('id', $data['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->where('crt_time','>=',$return[0]);
+            $model->where('crt_time','<=',$return[1]);
+        }
+
+        return $model;
+    }
+
+    public function itemNodeList($data,$user){
+        $model = $this->itemNodeCommon($data, $user);
+        $list = $this->limit($model,'',$data);
+        $list = $this->fillNodeData($list);
+
+        return [true, $list];
+    }
+
+    public function itemNodeRule(&$data, $user, $is_add = true){
+        $data['top_depart_id'] = $user['top_depart_id'];
+        if(empty($data['item_id'])) return [false, '项目ID不能为空'];
+        $item = Item::where('item_id', $data['item_id'])->where('del_time',0)->first();
+        if(empty($item)) return [false, '项目不存在或已被删除'];
+        $item = $item->toArray();
+        if(empty($data['title'])) return [false, '节点名称不能为空'];
+        if(! empty($data['start_time'])) $data['start_time'] = $this->changeDateToDate($data['start_time']);
+        if(! empty($data['end_time'])) $data['end_time'] = $this->changeDateToDate($data['end_time'],true);
+
+        $itemStartTime = $item['start_time'];
+        $itemEndTime = $item['end_time'];
+        if (!empty($data['start_time'])) {
+            $inputStartTime = $data['start_time'];
+
+            if ($itemStartTime > 0 && $inputStartTime < $itemStartTime) {
+                return [false, '节点开始时间不能早于项目开始时间:' . date('Y-m-d', $itemStartTime)];
+            }
+        }
+        if (!empty($data['end_time'])) {
+            $inputEndTime = $data['end_time'];
+            if ($itemEndTime > 0 && $inputEndTime > $itemEndTime) {
+                return [false, '节点结束时间不能晚于项目结束时间:' . date('Y-m-d', $itemEndTime)];
+            }
+        }
+
+        if(! empty($data['man_list'])) {
+            foreach ($data['man_list'] as $key => $value){
+                if(empty($value['type'])) return [false, '类型不能为空'];
+                if(empty($value['data_id'])) return [false, '人员不能为空'];
+                $data['man_list'][$key]['top_depart_id'] = $data['top_depart_id'];
+            }
+            list($status, $msg) = $this->checkArrayRepeat($data['man_list'],'data_id','人员');
+            if(! $status) return [false, $msg];
+        }
+
+        if(! empty($data['device_list'])) {
+            foreach ($data['device_list'] as $key => $value){
+                if(empty($value['type'])) return [false, '类型不能为空'];
+                if(empty($value['data_id'])) return [false, '设备ID不能为空'];
+                $data['device_list'][$key]['top_depart_id'] = $data['top_depart_id'];
+            }
+            list($status, $msg) = $this->checkArrayRepeat($data['device_list'],'data_id','设备');
+            if(! $status) return [false, $msg];
+        }
+
+        if($is_add){
+            $bool = ItemNode::where('item_id',$data['item_id'])
+                ->where('top_depart_id', $data['top_depart_id'])
+                ->where('title', $data['title'])
+                ->where('del_time',0)
+                ->exists();
+        }else{
+            if(empty($data['id'])) return [false,'ID不能为空'];
+            $bool = ItemNode::where('title', $data['title'])
+                ->where('item_id',$data['item_id'])
+                ->where('top_depart_id', $data['top_depart_id'])
+                ->where('id','<>',$data['id'])
+                ->where('del_time',0)
+                ->exists();
+        }
+        if($bool) return [false, '该项目下节点名称已存在'];
+
+        return [true, ''];
+    }
+
+    public function fillNodeData($data){
+        if(empty($data['data'])) return $data;
+
+        $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_merge_recursive(array_column($data['data'],'charge_id'), array_column($data['data'],'crt_id'))));
+        $tag = (new TagService())->getTagMap(array_unique(array_merge_recursive(array_column($data['data'],'priority_id'),array_column($data['data'],'node_id'))));
+        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]['start_time'] = $value['start_time'] ? date('Y-m-d',$value['start_time']) : '';
+            $data['data'][$key]['end_time'] = $value['end_time'] ? date('Y-m-d',$value['end_time']) : '';
+            $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
+            $data['data'][$key]['charge_name'] = $emp[$value['charge_id']] ?? '';
+            $data['data'][$key]['state_title'] = ItemNode::State_Type[$value['state']] ?? "";
+            $priority_tmp = $tag[$value['priority_id']] ?? [];
+            $data['data'][$key]['priority_title'] = $priority_tmp['title'] ?? '';
+            $data['data'][$key]['priority_code'] = $priority_tmp['code'] ?? '';
+            $node_tmp = $tag[$value['node_id']] ?? [];
+            $data['data'][$key]['node_title'] = $node_tmp['title'] ?? '';
+            $data['data'][$key]['node_code'] = $node_tmp['code'] ?? '';
+        }
+
+        return $data;
+    }
 }

+ 16 - 3
app/Service/TagService.php

@@ -15,8 +15,10 @@ class TagService extends Service
             DB::beginTransaction();
 
             $update = $msg['data'][0];
+            $id = $update['id'];
+            unset($update['id']);
             $model = new Tag();
-            $model->where('id',$data['id'])->update($update);
+            $model->where('id',$id)->update($update);
 
             DB::commit();
         }catch (\Exception $exception){
@@ -147,10 +149,10 @@ class TagService extends Service
                     ->where('del_time',0)
                     ->exists();
             }else{
-                if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
+                if($this->isEmpty($value,'id')) return [false,'id不能为空!'];
                 $bool = Tag::whereRaw("binary code = '{$value['code']}'")
                     ->where('top_depart_id', $top_depart_id)
-                    ->where('id','<>',$data['id'])
+                    ->where('id','<>',$value['id'])
                     ->where('del_time',0)
                     ->exists();
             }
@@ -159,4 +161,15 @@ class TagService extends Service
 
         return [true, $data];
     }
+
+    public function getTagMap($ids){
+        $ids = array_filter((array)$ids);
+        if (empty($ids)) return [];
+
+        return Tag::whereIn('id', $ids)
+            ->select('id', 'title', 'code')
+            ->get()
+            ->keyBy('id')
+            ->toArray();
+    }
 }

+ 7 - 0
routes/api.php

@@ -96,6 +96,13 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('itemDel', 'Api\ItemController@itemDel');
     $route->any('itemDetail', 'Api\ItemController@itemDetail');
 
+    //项目节点
+    $route->any('itemNodeList', 'Api\ItemController@itemNodeList');
+    $route->any('itemNodeEdit', 'Api\ItemController@itemNodeEdit');
+    $route->any('itemNodeAdd', 'Api\ItemController@itemNodeAdd');
+    $route->any('itemNodeDel', 'Api\ItemController@itemNodeDel');
+    $route->any('itemNodeDetail', 'Api\ItemController@itemNodeDetail');
+
     //标签管理
     $route->any('tagList', 'Api\TagController@tagList');
     $route->any('tagEdit', 'Api\TagController@tagEdit');