|
@@ -5,6 +5,7 @@ namespace App\Service;
|
|
|
use App\Jobs\ProcessOssTask;
|
|
use App\Jobs\ProcessOssTask;
|
|
|
use App\Model\CustomFieldValue;
|
|
use App\Model\CustomFieldValue;
|
|
|
use App\Model\Device;
|
|
use App\Model\Device;
|
|
|
|
|
+use App\Model\Draft;
|
|
|
use App\Model\Employee;
|
|
use App\Model\Employee;
|
|
|
use App\Model\Item;
|
|
use App\Model\Item;
|
|
|
use App\Model\ItemDetails;
|
|
use App\Model\ItemDetails;
|
|
@@ -20,6 +21,7 @@ use App\Model\ItemNodeMissionEmployee;
|
|
|
use App\Model\SysOssTasks;
|
|
use App\Model\SysOssTasks;
|
|
|
use App\Model\Tag;
|
|
use App\Model\Tag;
|
|
|
use App\Model\SysMenu;
|
|
use App\Model\SysMenu;
|
|
|
|
|
+use App\Model\WorkFlowTemplates;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
|
|
class ItemService extends Service
|
|
class ItemService extends Service
|
|
@@ -218,14 +220,32 @@ class ItemService extends Service
|
|
|
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];
|
|
|
|
|
+ $origin_data = $msg;
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
DB::beginTransaction();
|
|
DB::beginTransaction();
|
|
|
|
|
|
|
|
$model = Item::where('id', $data['id'])->first();
|
|
$model = Item::where('id', $data['id'])->first();
|
|
|
- $old_employee_id = $model->charge_id;
|
|
|
|
|
- $crt_id = $model->crt_id;
|
|
|
|
|
$tableName = $model->getTable();
|
|
$tableName = $model->getTable();
|
|
|
|
|
+
|
|
|
|
|
+ if(isset($data['draft'])){
|
|
|
|
|
+ // 创建草稿
|
|
|
|
|
+ $this->createDraft($origin_data, $user, $tableName);
|
|
|
|
|
+ // 更新项目状态
|
|
|
|
|
+ $model->state = Item::TYPE_MINUS_ONE;
|
|
|
|
|
+ $model->save();
|
|
|
|
|
+ //触发审批
|
|
|
|
|
+ list($status, $msg) = (new WorkFlowService())->triggerWorkflow($data['review_id'], $model->id,$tableName,$user);
|
|
|
|
|
+ if(! $status) {
|
|
|
|
|
+ DB::rollBack();
|
|
|
|
|
+ return [false, $msg];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ DB::commit();
|
|
|
|
|
+ return [true, '更新记录成功,记录草稿,进入审批流程'];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $old_employee_id = $model->charge_id;
|
|
|
$model->code = $data['code'] ?? '';
|
|
$model->code = $data['code'] ?? '';
|
|
|
$model->title = $data['title'] ?? '';
|
|
$model->title = $data['title'] ?? '';
|
|
|
$model->mark = $data['mark'] ?? "";
|
|
$model->mark = $data['mark'] ?? "";
|
|
@@ -236,14 +256,12 @@ class ItemService extends Service
|
|
|
$model->charge_id = $data['charge_id'] ?? 0;
|
|
$model->charge_id = $data['charge_id'] ?? 0;
|
|
|
$model->field = $data['field'] ?? "";
|
|
$model->field = $data['field'] ?? "";
|
|
|
$model->item_attribute = $data['item_attribute'] ?? 0;
|
|
$model->item_attribute = $data['item_attribute'] ?? 0;
|
|
|
-
|
|
|
|
|
//项目管理的字段
|
|
//项目管理的字段
|
|
|
if($user['select_tree_type'] == SysMenu::tree_type_one){
|
|
if($user['select_tree_type'] == SysMenu::tree_type_one){
|
|
|
$model->is_review_required = $data['is_review_required'] ?? 0;
|
|
$model->is_review_required = $data['is_review_required'] ?? 0;
|
|
|
$model->review_id = $data['review_id'] ?? 0;
|
|
$model->review_id = $data['review_id'] ?? 0;
|
|
|
$model->priority_id = $data['priority_id'] ?? 0;
|
|
$model->priority_id = $data['priority_id'] ?? 0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
$model->save();
|
|
$model->save();
|
|
|
|
|
|
|
|
$time = time();
|
|
$time = time();
|
|
@@ -256,21 +274,13 @@ class ItemService extends Service
|
|
|
->update(['del_time' => $time]);
|
|
->update(['del_time' => $time]);
|
|
|
$this->saveDetail($model->id, $time, $data);
|
|
$this->saveDetail($model->id, $time, $data);
|
|
|
|
|
|
|
|
|
|
+ //客户自定义字段
|
|
|
list($status, $msg) = CustomFieldSettingService::syncCustomFieldData($model->id, $tableName, $data, $user);
|
|
list($status, $msg) = CustomFieldSettingService::syncCustomFieldData($model->id, $tableName, $data, $user);
|
|
|
if (! $status) {
|
|
if (! $status) {
|
|
|
DB::rollBack();
|
|
DB::rollBack();
|
|
|
return [false, $msg];
|
|
return [false, $msg];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //如果编辑人不是创建人触发审核
|
|
|
|
|
- if($user['id'] != $crt_id){
|
|
|
|
|
- list($status, $msg) = (new WorkFlowService())->triggerWorkflow($data['review_id'], $model->id,$tableName,$user);
|
|
|
|
|
- if(! $status) {
|
|
|
|
|
- DB::rollBack();
|
|
|
|
|
- return [false, $msg];
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
DB::commit();
|
|
DB::commit();
|
|
|
}catch (\Exception $exception){
|
|
}catch (\Exception $exception){
|
|
|
DB::rollBack();
|
|
DB::rollBack();
|
|
@@ -327,6 +337,90 @@ class ItemService extends Service
|
|
|
return [true, ''];
|
|
return [true, ''];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public function checkIsChanged($data, $user) {
|
|
|
|
|
+ // 1. 获取旧数据
|
|
|
|
|
+ list($status, $oldData) = $this->itemDetail($data, $user);
|
|
|
|
|
+ if (!$status) return [false, $oldData];
|
|
|
|
|
+
|
|
|
|
|
+ //工时创建 直接通过
|
|
|
|
|
+ $select_tree_type = $user['select_tree_type'];
|
|
|
|
|
+ if(empty($select_tree_type)) return false;
|
|
|
|
|
+
|
|
|
|
|
+ //创建人 直接通过
|
|
|
|
|
+ if($user['id'] == $oldData['crt_id']) return false;
|
|
|
|
|
+
|
|
|
|
|
+ // --- 表头基础字段比对 ---
|
|
|
|
|
+ $fields = [
|
|
|
|
|
+ 'code', 'title', 'mark', 'state', 'budget',
|
|
|
|
|
+ 'charge_id', 'item_attribute', 'start_time', 'end_time'
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ // 权限字段校验
|
|
|
|
|
+ if (($user['select_tree_type']) == SysMenu::tree_type_one) {
|
|
|
|
|
+ $fields = array_merge($fields, ['is_review_required', 'review_id', 'priority_id']);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ foreach ($fields as $field) {
|
|
|
|
|
+ $oldValue = $oldData[$field] ?? '';
|
|
|
|
|
+ $newValue = $data[$field] ?? '';
|
|
|
|
|
+
|
|
|
|
|
+ // 日期格式对齐(确保 Y-m-d 格式一致)
|
|
|
|
|
+ if (in_array($field, ['start_time', 'end_time'])) {
|
|
|
|
|
+ $newValue = !empty($newValue) ? date("Y-m-d", $newValue) : "";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($oldValue != $newValue) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- 自定义字段比对 ---
|
|
|
|
|
+ if (isset($data['custom_fields']) && is_array($data['custom_fields'])) {
|
|
|
|
|
+ $oldCustomMap = array_column($oldData['custom_fields'] ?? [], 'field_value', 'id');
|
|
|
|
|
+
|
|
|
|
|
+ foreach ($data['custom_fields'] as $customField) {
|
|
|
|
|
+ $fid = $customField['id'] ?? 0;
|
|
|
|
|
+ $newVal = $customField['field_value'] ?? '';
|
|
|
|
|
+ $oldVal = $oldCustomMap[$fid] ?? '';
|
|
|
|
|
+
|
|
|
|
|
+ if ($oldVal != $newVal) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- 表体:人员名单比对 (man_list) ---
|
|
|
|
|
+ $oldMans = collect($oldData['man_list'] ?? [])->pluck('data_id')->sort()->values()->toArray();
|
|
|
|
|
+ $newMans = collect($data['man_list'] ?? [])->pluck('data_id')->sort()->values()->toArray();
|
|
|
|
|
+ if ($oldMans !== $newMans) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // --- 表体:设备名单比对 (device_list) ---
|
|
|
|
|
+ $oldDevices = collect($oldData['device_list'] ?? [])->pluck('data_id')->sort()->values()->toArray();
|
|
|
|
|
+ $newDevices = collect($data['device_list'] ?? [])->pluck('data_id')->sort()->values()->toArray();
|
|
|
|
|
+ if ($oldDevices !== $newDevices) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return false; // 没有任何变动
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function createDraft($data, $user, $type, $opt_type = 1) {
|
|
|
|
|
+ Draft::insert([
|
|
|
|
|
+ 'document_type' => $type,
|
|
|
|
|
+ 'document_id' => $data['id'],
|
|
|
|
|
+ 'content' => json_encode($data),
|
|
|
|
|
+ 'opt_user' => json_encode($user),
|
|
|
|
|
+ 'crt_id' => $user['id'],
|
|
|
|
|
+ 'top_depart_id' => $user['top_depart_id'],
|
|
|
|
|
+ 'opt_type' => $opt_type,
|
|
|
|
|
+ 'crt_time' => time()
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private function saveDetail($id, $time, $data){
|
|
private function saveDetail($id, $time, $data){
|
|
|
if(! empty($data['man_list'])){
|
|
if(! empty($data['man_list'])){
|
|
|
$unit = [];
|
|
$unit = [];
|
|
@@ -529,6 +623,7 @@ 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'] = Item::State_Type[$customer['state']] ?? '';
|
|
$customer['state_title'] = Item::State_Type[$customer['state']] ?? '';
|
|
|
$customer['priority_title'] = Tag::where('id', $customer['priority_id'])->value('title') ?? "";
|
|
$customer['priority_title'] = Tag::where('id', $customer['priority_id'])->value('title') ?? "";
|
|
|
|
|
+ $customer['review_title'] = WorkFlowTemplates::where('id', $customer['review_id'])->value('title') ?? "";
|
|
|
|
|
|
|
|
$details = $this->getDetail($data['id']);
|
|
$details = $this->getDetail($data['id']);
|
|
|
$customer = array_merge($customer, $details);
|
|
$customer = array_merge($customer, $details);
|
|
@@ -692,6 +787,7 @@ class ItemService extends Service
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function itemRule(&$data, $user, $is_add = true){
|
|
public function itemRule(&$data, $user, $is_add = true){
|
|
|
|
|
+ $origin_data = $data;
|
|
|
$data['top_depart_id'] = $user['top_depart_id'];
|
|
$data['top_depart_id'] = $user['top_depart_id'];
|
|
|
if(empty($data['code'])) return [false, '项目编码不能为空'];
|
|
if(empty($data['code'])) return [false, '项目编码不能为空'];
|
|
|
if(empty($data['title'])) return [false, '项目名称不能为空'];
|
|
if(empty($data['title'])) return [false, '项目名称不能为空'];
|
|
@@ -734,15 +830,33 @@ class ItemService extends Service
|
|
|
->exists();
|
|
->exists();
|
|
|
}else{
|
|
}else{
|
|
|
if(empty($data['id'])) return [false,'ID不能为空'];
|
|
if(empty($data['id'])) return [false,'ID不能为空'];
|
|
|
|
|
+ $item = Item::where('id', $data['id'])
|
|
|
|
|
+ ->where('del_time',0)
|
|
|
|
|
+ ->first();
|
|
|
|
|
+ if(empty($item)) return [false, '项目不存在或已被删除'];
|
|
|
|
|
+
|
|
|
$bool = Item::where('code',$data['code'])
|
|
$bool = Item::where('code',$data['code'])
|
|
|
->where('top_depart_id', $data['top_depart_id'])
|
|
->where('top_depart_id', $data['top_depart_id'])
|
|
|
- ->where('id','<>',$data['id'])
|
|
|
|
|
|
|
+ ->where('id','<>', $data['id'])
|
|
|
->where('del_time',0)
|
|
->where('del_time',0)
|
|
|
->exists();
|
|
->exists();
|
|
|
|
|
+
|
|
|
|
|
+ if($user['select_tree_type'] && $item->state == Item::TYPE_MINUS_ONE) return [false, '审核中不允许编辑'];
|
|
|
}
|
|
}
|
|
|
if($bool) return [false, '项目编码已存在'];
|
|
if($bool) return [false, '项目编码已存在'];
|
|
|
|
|
|
|
|
- return [true, ''];
|
|
|
|
|
|
|
+ //判断是否编辑 然后需要审核的 需要后 就更新状态 记录草稿
|
|
|
|
|
+ if(! $is_add){
|
|
|
|
|
+ $return = $this->checkIsChanged($data, $user);
|
|
|
|
|
+ if(is_array($return)) {
|
|
|
|
|
+ list($status, $msg) = $return;
|
|
|
|
|
+ return [$status, $msg];
|
|
|
|
|
+ }else{
|
|
|
|
|
+ if($item->review_id && $return) $data['draft'] = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return [true, $origin_data];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function fillData($data){
|
|
public function fillData($data){
|
|
@@ -1142,6 +1256,7 @@ class ItemService extends Service
|
|
|
$item = Item::where('id', $customer['item_id'])->first();
|
|
$item = Item::where('id', $customer['item_id'])->first();
|
|
|
$customer['item_code'] = $item->code;
|
|
$customer['item_code'] = $item->code;
|
|
|
$customer['item_title'] = $item->title;
|
|
$customer['item_title'] = $item->title;
|
|
|
|
|
+ $customer['review_title'] = WorkFlowTemplates::where('id', $customer['review_id'])->value('title') ?? "";
|
|
|
|
|
|
|
|
$details = $this->getNodeDetail($data['id']);
|
|
$details = $this->getNodeDetail($data['id']);
|
|
|
$customer = array_merge($customer, $details);
|
|
$customer = array_merge($customer, $details);
|
|
@@ -1647,6 +1762,7 @@ class ItemService extends Service
|
|
|
$customer['mission_title'] = $node_tmp['title'] ?? '';
|
|
$customer['mission_title'] = $node_tmp['title'] ?? '';
|
|
|
$customer['mission_code'] = $node_tmp['code'] ?? '';
|
|
$customer['mission_code'] = $node_tmp['code'] ?? '';
|
|
|
$customer['parent_item_node_mission_title'] = ItemNodeMission::where('id', $customer['parent_item_node_mission_id'])->value('title') ?? '';
|
|
$customer['parent_item_node_mission_title'] = ItemNodeMission::where('id', $customer['parent_item_node_mission_id'])->value('title') ?? '';
|
|
|
|
|
+ $customer['review_title'] = WorkFlowTemplates::where('id', $customer['review_id'])->value('title') ?? "";
|
|
|
|
|
|
|
|
$item_node_map = $this->getItemNodeMap($customer['id']);
|
|
$item_node_map = $this->getItemNodeMap($customer['id']);
|
|
|
$customer['item_node_title'] = $item_node_map[$customer['id']];
|
|
$customer['item_node_title'] = $item_node_map[$customer['id']];
|