cqp 1 개월 전
부모
커밋
f3e402f6a1

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

@@ -7,6 +7,19 @@ use Illuminate\Http\Request;
 
 
 class ItemController extends BaseController
 class ItemController extends BaseController
 {
 {
+    public function itemFileUpLoad(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemFileUpLoad($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
     public function itemEdit(Request $request)
     public function itemEdit(Request $request)
     {
     {
         $service = new ItemService();
         $service = new ItemService();
@@ -74,6 +87,19 @@ class ItemController extends BaseController
         }
         }
     }
     }
 
 
+    public function itemDetailBoard(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemDetailBoard($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
     public function itemNodeEdit(Request $request)
     public function itemNodeEdit(Request $request)
     {
     {
         $service = new ItemService();
         $service = new ItemService();
@@ -140,4 +166,71 @@ class ItemController extends BaseController
             return $this->json_return(201,$data);
             return $this->json_return(201,$data);
         }
         }
     }
     }
+
+    public function itemNodeMissionEdit(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeMissionEdit($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function itemNodeMissionAdd(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeMissionAdd($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function itemNodeMissionDel(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeMissionDel($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+    }
+
+    public function itemNodeMissionList(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeMissionList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function itemNodeMissionDetail(Request $request)
+    {
+        $service = new ItemService();
+        $user = $request->userData;
+        list($status,$data) = $service->itemNodeMissionDetail($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }
 }

+ 7 - 0
app/Model/CustomFieldValue.php

@@ -13,6 +13,13 @@ class CustomFieldValue extends DataScopeBaseModel
     const UPDATED_AT = 'upd_time';
     const UPDATED_AT = 'upd_time';
     protected $dateFormat = 'U';
     protected $dateFormat = 'U';
 
 
+    const type_one = 1;
+    const type_two = 2;
+    const type = [
+        self::type_one => '文本',
+        self::type_two => '附件',
+    ];
+
     public function definition()
     public function definition()
     {
     {
         // 即使你不需要它的数据,whereHas 也要靠这个方法生成 SQL 的 JOIN 或 EXISTS
         // 即使你不需要它的数据,whereHas 也要靠这个方法生成 SQL 的 JOIN 或 EXISTS

+ 31 - 0
app/Model/ItemFile.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+//项目下所有的文件
+class ItemFile extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "item_file"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+
+    const type_one = 1;
+    const type_two = 2;
+    const type = [
+        self::type_one => '项目文件',
+        self::type_two => '交付物',
+    ];
+
+    const from_one = 1;
+    const from_two = 2;
+    const from_three = 3;
+    const from = [
+        self::from_one => '项目',
+        self::from_two => '节点',
+        self::from_three => '任务',
+    ];
+}

+ 70 - 0
app/Model/ItemNodeMission.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace App\Model;
+
+use App\Traits\HasCustomFields;
+
+class ItemNodeMission extends DataScopeBaseModel
+{
+    protected $table = "item_node_mission"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const employee_column = "crt_id";
+    const table_column = "item_node_mission_employee";
+    const table_id_column = "item_node_mission_id";
+    const Order_type = "item_node_mission";
+
+    public static $field = ['*'];
+
+    const TYPE_MINUS_TWO = -2;
+    const TYPE_MINUS_ONE = -1;
+    const TYPE_ONE = 1;
+    const TYPE_TWO = 2;
+    const TYPE_THREE = 3;
+    const State_Type = [
+        self::TYPE_MINUS_ONE => '审核中',
+        self::TYPE_MINUS_TWO => '已超期',
+        self::TYPE_ONE => '待开始',
+        self::TYPE_TWO => '进行中',
+        self::TYPE_THREE => '已完成',
+    ];
+
+    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/ItemNodeMissionDetails.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Model;
+
+class ItemNodeMissionDetails extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "item_node_mission_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 => '设备',
+    ];
+}

+ 12 - 0
app/Model/ItemNodeMissionEmployee.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace App\Model;
+
+class ItemNodeMissionEmployee extends DataScopeBaseModel
+{
+    protected $guarded = [];
+    protected $table = "item_node_mission_employee"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+}

+ 529 - 3
app/Service/ItemService.php

@@ -2,20 +2,94 @@
 
 
 namespace App\Service;
 namespace App\Service;
 
 
+use App\Jobs\ProcessOssTask;
+use App\Model\CustomFieldValue;
 use App\Model\Device;
 use App\Model\Device;
 use App\Model\Employee;
 use App\Model\Employee;
 use App\Model\Item;
 use App\Model\Item;
 use App\Model\ItemDetails;
 use App\Model\ItemDetails;
 use App\Model\ItemEmployee;
 use App\Model\ItemEmployee;
+use App\Model\ItemFile;
 use App\Model\ItemNode;
 use App\Model\ItemNode;
 use App\Model\ItemNodeDetails;
 use App\Model\ItemNodeDetails;
 use App\Model\ItemNodeEmployee;
 use App\Model\ItemNodeEmployee;
+use App\Model\ItemNodeMission;
+use App\Model\ItemNodeMissionDetails;
+use App\Model\ItemNodeMissionEmployee;
+use App\Model\SysOssTasks;
 use App\Model\Tag;
 use App\Model\Tag;
 use App\Model\SysMenu;
 use App\Model\SysMenu;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
 
 
 class ItemService extends Service
 class ItemService extends Service
 {
 {
+    public function itemFileUpLoad($data,$user){
+        // 1. 基础校验
+        $from = $data['from'] ?? null;
+        $fromMap = ItemFile::from;
+        if (empty($from)) return [false, '上传来源类型不能为空'];
+        if (!isset($fromMap[$from])) return [false, '上传来源类型错误'];
+
+        $id = $data['id'] ?? null;
+        if (empty($id)) return [false, '来源ID不能为空'];
+
+        $modelMap = [
+            ItemFile::from_one => Item::class,
+            ItemFile::from_two => ItemNode::class,
+            ItemFile::from_three => ItemNodeMission::class,
+        ];
+
+        $modelClass = $modelMap[$from] ?? "";
+        $item = $modelClass::where('id', $id)->where('del_time', 0)->first();
+        if (!$item) return [false, $fromMap[$from] . "不存在或已被删除"];
+
+        $itemId = $item->item_id ?? $item->id;
+        $itemNodeId = $item->item_node_id ?? ($from == ItemFile::from_one ? 0 : $item->id);
+        $missionId = ($from != ItemFile::from_one && $from != ItemFile::type_two) ? $item->id : 0;
+
+        $files = $data['file'] ?? [];
+        if (empty($files)) return [false, '上传文件不能为空'];
+
+        $time = time();
+        $pendingTasks = [];
+        foreach ($files as &$file) {
+            if (empty($file['url']) || empty($file['type']) || empty($file['name'])) {
+                return [false, '文件信息(URL/类型/名称)不完整'];
+            }
+
+            $file['top_depart_id'] = $user['top_depart_id'];
+            $file['type'] = $from;
+            $file['item_id'] = $itemId;
+            $file['item_node_id'] = $itemNodeId;
+            $file['item_node_mission_id'] = $missionId;
+            $file['crt_time'] = $time;
+
+            $pendingTasks[] = ['type' => SysOssTasks::type_two, 'url' => $file['url'], 'top_depart_id' => $user['top_depart_id'], 'crt_time' => $time];
+        }
+
+        unset($file);
+        $data['file'] = $files;
+
+        try {
+            DB::beginTransaction();
+
+            ItemFile::insert($data['file']);
+
+            //触发 OSS 任务
+            if (!empty($pendingTasks)) {
+                SysOssTasks::insert($pendingTasks);
+                ProcessOssTask::dispatch()->onQueue(SysOssTasks::job);
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
     public function itemEdit($data,$user){
     public function itemEdit($data,$user){
         list($status,$msg) = $this->itemRule($data, $user, false);
         list($status,$msg) = $this->itemRule($data, $user, false);
         if(!$status) return [$status,$msg];
         if(!$status) return [$status,$msg];
@@ -268,6 +342,86 @@ class ItemService extends Service
         return [true, $customer];
         return [true, $customer];
     }
     }
 
 
+    public function itemDetailBoard($data, $user){
+        list($status, $msg) = $this->itemDetail($data, $user);
+        if(! $status) return [false, $msg];
+        $customer = $msg;
+
+        //节点信息
+        $customer['node_list'] = $this->itemDetailBoard($data, $user);
+
+        //文件归档
+        $customer['file_list'] = $this->getNodeFile($data, $user, $customer);
+
+        return [true, $customer];
+    }
+
+    public function itemNodeBoard($data,$user){
+        $model = ItemNode::TopAndEmployeeClear($user,$data);
+        $list = $model->where('del_time',0)
+            ->where('item_id', $data['id'])
+            ->select('*')
+            ->orderby('update_time', 'desc')
+            ->orderby('id', 'desc')
+            ->get()->toArray();
+
+        $emp = (new EmployeeService())->getEmployeeMap(array_unique(array_merge_recursive(array_column($list,'charge_id'), array_column($list,'crt_id'))));
+        $tag = (new TagService())->getTagMap(array_unique(array_merge_recursive(array_column($list,'priority_id'),array_column($list,'node_id'))));
+        foreach ($list as $key => $value){
+            $list[$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
+            $list[$key]['start_time'] = $value['start_time'] ? date('Y-m-d',$value['start_time']) : '';
+            $list[$key]['end_time'] = $value['end_time'] ? date('Y-m-d',$value['end_time']) : '';
+            $list[$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
+            $list[$key]['charge_name'] = $emp[$value['charge_id']] ?? '';
+            $list[$key]['state_title'] = ItemNode::State_Type[$value['state']] ?? "";
+            $priority_tmp = $tag[$value['priority_id']] ?? [];
+            $list[$key]['priority_title'] = $priority_tmp['title'] ?? '';
+            $list[$key]['priority_code'] = $priority_tmp['code'] ?? '';
+            $node_tmp = $tag[$value['node_id']] ?? [];
+            $list[$key]['node_title'] = $node_tmp['title'] ?? '';
+            $list[$key]['node_code'] = $node_tmp['code'] ?? '';
+            $list[$key]['progress'] = rand(1, 100); //todo
+        }
+
+        return $list;
+    }
+
+    public function getNodeFile($data,$user, $item){
+        $return = [];
+        if(! empty($item['custom_fields'])){
+            foreach ($item['custom_fields'] as $value){
+                $return[] = [
+                    'id' => $value['id'],
+                    'url' => $value['field_value'],
+                    'name' => $value['field_name'],
+                    'show_url' => $value['field_value_show'],
+                    'type_name' => '项目',
+                    'type_name_2' => CustomFieldValue::type[CustomFieldValue::type_two],
+                    'type' => 'custom_fields',
+                ];
+            }
+        }
+        $file = ItemFile::where('del_time',0)
+            ->where('item_id', $data['id'])
+            ->get()->toArray();
+        if(! empty($file)){
+            $fileUploadService = new FileUploadService();
+            foreach ($file as $value){
+                $return[] = [
+                    'id' => $value['id'],
+                    'url' => $value['url'],
+                    'name' => $value['name'],
+                    'show_url' => $fileUploadService->getFileShow($value['url']),
+                    'type_name' => ItemFile::from[$value['from']],
+                    'type_name_2' => ItemFile::type[$value['type']],
+                    'type' => 'item_file',
+                ];
+            }
+        }
+
+        return $return;
+    }
+
     public function itemCommon($data,$user, $field = []){
     public function itemCommon($data,$user, $field = []){
         if(empty($field)) $field = Item::$field;
         if(empty($field)) $field = Item::$field;
 
 
@@ -738,8 +892,6 @@ class ItemService extends Service
         $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
         $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['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'] ]));
         $tag = (new TagService())->getTagMap(array_unique([$customer['priority_id'], $customer['node_id'] ]));
         $priority_tmp = $tag[$customer['priority_id']] ?? [];
         $priority_tmp = $tag[$customer['priority_id']] ?? [];
         $customer['priority_title'] = $priority_tmp['title'] ?? '';
         $customer['priority_title'] = $priority_tmp['title'] ?? '';
@@ -786,7 +938,7 @@ class ItemService extends Service
     public function itemNodeRule(&$data, $user, $is_add = true){
     public function itemNodeRule(&$data, $user, $is_add = true){
         $data['top_depart_id'] = $user['top_depart_id'];
         $data['top_depart_id'] = $user['top_depart_id'];
         if(empty($data['item_id'])) return [false, '项目ID不能为空'];
         if(empty($data['item_id'])) return [false, '项目ID不能为空'];
-        $item = Item::where('item_id', $data['item_id'])->where('del_time',0)->first();
+        $item = Item::where('id', $data['item_id'])->where('del_time',0)->first();
         if(empty($item)) return [false, '项目不存在或已被删除'];
         if(empty($item)) return [false, '项目不存在或已被删除'];
         $item = $item->toArray();
         $item = $item->toArray();
         if(empty($data['title'])) return [false, '节点名称不能为空'];
         if(empty($data['title'])) return [false, '节点名称不能为空'];
@@ -871,4 +1023,378 @@ class ItemService extends Service
 
 
         return $data;
         return $data;
     }
     }
+
+
+    //项目节点任务
+    public function itemNodeMissionEdit($data,$user){
+        list($status,$msg) = $this->itemNodeMissionRule($data, $user, false);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            $model = ItemNodeMission::where('id', $data['id'])->first();
+            $old_employee_id = $model->charge_id;
+            $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->mission_id = $data['mission_id'] ?? 0;
+            $model->mission_weight = $data['mission_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();
+            ItemNodeMissionDetails::where('del_time',0)
+                ->where('item_node_mission_id', $model->id)
+                ->update(['del_time' => $time]);
+
+            $this->saveNodeMissionDetail($model->id, $time, $data);
+
+            // 人员项目节点任务表
+            $this->saveNodeMissionEmployee($model->id, $time, $data, $user, $old_employee_id);
+
+            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 itemNodeMissionAdd($data,$user){
+        list($status,$msg) = $this->itemNodeMissionRule($data, $user);
+        if(!$status) return [$status,$msg];
+
+        try {
+            DB::beginTransaction();
+
+            $model = new ItemNodeMission();
+            $model->item_id = $data['item_id'] ?? 0;
+            $tableName = $model->getTable();
+            $model->code = $this->generateBillNo([
+                'top_depart_id' => $user['top_depart_id'],
+                'type' => ItemNodeMission::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->mission_id = $data['mission_id'] ?? 0;
+            $model->mission_weight = $data['mission_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();
+
+            $time = time();
+            $this->saveNodeMissionDetail($model->id, $time, $data);
+
+            // 人员项目节点任务表
+            $this->saveNodeMissionEmployee($model->id, $time, $data, $user);
+
+            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 saveNodeMissionEmployee($id, $time, $data, $user, $old_employee_id = 0){
+        if($old_employee_id != $data['charge_id']){
+            ItemNodeMissionEmployee::where('del_time',0)
+                ->where('item_node_mission_id', $id)
+                ->where('data_id', $old_employee_id)
+                ->delete();
+
+            ItemNodeMissionEmployee::insert([
+                'item_node_mission_id' => $id,
+                'item_node_id' => $data['item_node_id'],
+                'item_id' => $data['item_id'],
+                'data_id' => $data['charge_id'],
+                'top_depart_id' => $user['top_depart_id'],
+                'crt_time' => $time
+            ]);
+        }
+    }
+
+    private function saveNodeMissionDetail($id, $time, $data){
+        if(! empty($data['man_list'])){
+            $unit = [];
+            foreach ($data['man_list'] as $value){
+                $unit[] = [
+                    'item_id' => $data['item_id'],
+                    'item_node_id' => $data['item_node_id'],
+                    'item_node_mission_id' => $id,
+                    'type' => $value['type'],
+                    'data_id' => $value['data_id'],
+                    'crt_time' => $time,
+                    'top_depart_id' => $value['top_depart_id'],
+                ];
+            }
+            if(! empty($unit)) ItemNodeMissionDetails::insert($unit);
+        }
+
+        if(! empty($data['device_list'])){
+            $receipt = [];
+            foreach ($data['device_list'] as $value){
+                $receipt[] = [
+                    'item_id' => $data['item_id'],
+                    'item_node_id' => $data['item_node_id'],
+                    'item_node_mission_id' => $id,
+                    'type' => $value['type'],
+                    'data_id' => $value['data_id'],
+                    'crt_time' => $time,
+                    'top_depart_id' => $value['top_depart_id'],
+                ];
+            }
+            if(! empty($receipt)) ItemNodeMissionDetails::insert($receipt);
+        }
+    }
+
+    private function getNodeMissionDetail($id){
+        $data = ItemNodeMissionDetails::where('del_time',0)
+            ->where('item_node_mission_id', $id)
+            ->get()->toArray();
+
+        $id = $id2 = [];
+        foreach ($data as $value){
+            if($value['type'] == ItemNodeMissionDetails::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'] == ItemNodeMissionDetails::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 itemNodeMissionDel($data){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+
+        try {
+            DB::beginTransaction();
+            $time = time();
+
+            ItemNodeMission::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->update(['del_time' => $time]);
+
+            ItemNodeMissionDetails::where('del_time',0)
+                ->whereIn('item_node_mission_id', $data['id'])
+                ->update(['del_time' => $time]);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    public function itemNodeMissionDetail($data, $user){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+        $customer = ItemNodeMission::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'] = ItemNodeMission::State_Type[$customer['state']] ?? '';
+
+        $tag = (new TagService())->getTagMap(array_unique([$customer['priority_id'], $customer['mission_id'] ]));
+        $priority_tmp = $tag[$customer['priority_id']] ?? [];
+        $customer['priority_title'] = $priority_tmp['title'] ?? '';
+        $customer['priority_code'] = $priority_tmp['code'] ?? '';
+        $node_tmp = $tag[$customer['mission_id']] ?? [];
+        $customer['mission_title'] = $node_tmp['title'] ?? '';
+        $customer['mission_code'] = $node_tmp['code'] ?? '';
+
+        $details = $this->getNodeMissionDetail($data['id']);
+        $customer = array_merge($customer, $details);
+
+        return [true, $customer];
+    }
+
+    public function itemNodeMissionCommon($data,$user, $field = []){
+        if(empty($field)) $field = ItemNodeMission::$field;
+
+        $model = ItemNodeMission::TopAndEmployeeClear($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 itemNodeMissionList($data,$user){
+        $model = $this->itemNodeMissionCommon($data, $user);
+        $list = $this->limit($model,'',$data);
+        $list = $this->fillNodeMissionData($list);
+
+        return [true, $list];
+    }
+
+    public function itemNodeMissionRule(&$data, $user, $is_add = true){
+        $data['top_depart_id'] = $user['top_depart_id'];
+        if(empty($data['item_node_id'])) return [false, '项目节点ID不能为空'];
+        $item = ItemNode::where('id', $data['item_node_id'])->where('del_time',0)->first();
+        if(empty($item)) return [false, '项目节点不存在或已被删除'];
+        $item = $item->toArray();
+        $data['item_id'] = $item['item_id'];
+        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 = ItemNodeMission::where('item_node_id',$data['item_node_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 = ItemNodeMission::where('title', $data['title'])
+                ->where('item_node_id',$data['item_node_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 fillNodeMissionData($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'],'mission_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['mission_id']] ?? [];
+            $data['data'][$key]['mission_title'] = $node_tmp['title'] ?? '';
+            $data['data'][$key]['mission_code'] = $node_tmp['code'] ?? '';
+        }
+
+        return $data;
+    }
 }
 }

+ 9 - 0
routes/api.php

@@ -95,6 +95,8 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('itemAdd', 'Api\ItemController@itemAdd');
     $route->any('itemAdd', 'Api\ItemController@itemAdd');
     $route->any('itemDel', 'Api\ItemController@itemDel');
     $route->any('itemDel', 'Api\ItemController@itemDel');
     $route->any('itemDetail', 'Api\ItemController@itemDetail');
     $route->any('itemDetail', 'Api\ItemController@itemDetail');
+    $route->any('itemDetailBoard', 'Api\ItemController@itemDetailBoard');
+    $route->any('itemFileUpLoad', 'Api\ItemController@itemFileUpLoad');
 
 
     //项目节点
     //项目节点
     $route->any('itemNodeList', 'Api\ItemController@itemNodeList');
     $route->any('itemNodeList', 'Api\ItemController@itemNodeList');
@@ -103,6 +105,13 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('itemNodeDel', 'Api\ItemController@itemNodeDel');
     $route->any('itemNodeDel', 'Api\ItemController@itemNodeDel');
     $route->any('itemNodeDetail', 'Api\ItemController@itemNodeDetail');
     $route->any('itemNodeDetail', 'Api\ItemController@itemNodeDetail');
 
 
+    //项目节点任务
+    $route->any('itemNodeMissionList', 'Api\ItemController@itemNodeMissionList');
+    $route->any('itemNodeMissionEdit', 'Api\ItemController@itemNodeMissionEdit');
+    $route->any('itemNodeMissionAdd', 'Api\ItemController@itemNodeMissionAdd');
+    $route->any('itemNodeMissionDel', 'Api\ItemController@itemNodeMissionDel');
+    $route->any('itemNodeMissionDetail', 'Api\ItemController@itemNodeMissionDetail');
+
     //标签管理
     //标签管理
     $route->any('tagList', 'Api\TagController@tagList');
     $route->any('tagList', 'Api\TagController@tagList');
     $route->any('tagEdit', 'Api\TagController@tagEdit');
     $route->any('tagEdit', 'Api\TagController@tagEdit');