|  | @@ -10,7 +10,7 @@ use Exception;
 | 
	
		
			
				|  |  |  use app\common\model\inspection\Item as ItemModel;
 | 
	
		
			
				|  |  |  use app\admin\model\inspection\TypeItem as TypeItemModel;
 | 
	
		
			
				|  |  |  use fast\Arr;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +use app\common\enum\StatusEnum;
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 验货类型
 | 
	
		
			
				|  |  |   *
 | 
	
	
		
			
				|  | @@ -94,7 +94,7 @@ class Type extends Backend
 | 
	
		
			
				|  |  |                      'name' => $item['name'],
 | 
	
		
			
				|  |  |                      'standard_desc' => $item['standard_desc'],
 | 
	
		
			
				|  |  |                      'is_required' => $item['is_required'],
 | 
	
		
			
				|  |  | -                    'status' => 'normal'
 | 
	
		
			
				|  |  | +                    'status' => StatusEnum::ENABLED
 | 
	
		
			
				|  |  |                  ]);
 | 
	
		
			
				|  |  |                  $itemResult[] = $newItem;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -170,11 +170,16 @@ class Type extends Backend
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |          // 处理fieldlist格式的验货选项数据
 | 
	
		
			
				|  |  | -        $arrItems = $params['items'] ?? [];
 | 
	
		
			
				|  |  | -        if(empty($arrItems)){
 | 
	
		
			
				|  |  | +        $jsonItems = $params['items'] ?? [];
 | 
	
		
			
				|  |  | +        if(empty($jsonItems)){
 | 
	
		
			
				|  |  |              $this->error(__('Parameter %s can not be empty', 'items'));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | +        $arrItems = json_decode($jsonItems, true); 
 | 
	
		
			
				|  |  | +        // 删除调试代码
 | 
	
		
			
				|  |  | +        // echo "<pre>";
 | 
	
		
			
				|  |  | +        // print_r($arrItems);
 | 
	
		
			
				|  |  | +        // die();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          $params = $this->preExcludeFields($params);
 | 
	
		
			
				|  |  |          $result = false;
 | 
	
		
			
				|  |  |          Db::startTrans();
 | 
	
	
		
			
				|  | @@ -191,34 +196,66 @@ class Type extends Backend
 | 
	
		
			
				|  |  |              $itemModel = new ItemModel();
 | 
	
		
			
				|  |  |              $typeItemModel = new TypeItemModel();
 | 
	
		
			
				|  |  |              
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +            // 1. 查询当前类型关联的所有验货选项
 | 
	
		
			
				|  |  | +            $existingTypeItems = $typeItemModel->where('type_id', $row->id)->select();
 | 
	
		
			
				|  |  | +            $existingItemIds = array_column(collection($existingTypeItems)->toArray(), 'item_id');
 | 
	
		
			
				|  |  |              
 | 
	
		
			
				|  |  | -            // 处理前端传来的选项数据 - 由于fieldlist不包含id,我们采用替换策略
 | 
	
		
			
				|  |  | -            // 先删除所有现有关联
 | 
	
		
			
				|  |  | -            $typeItemModel->where('type_id', $row->id)->delete();
 | 
	
		
			
				|  |  | +            // 2. 从前端数据中提取ID
 | 
	
		
			
				|  |  | +            $frontendItemIds = [];
 | 
	
		
			
				|  |  | +            $frontendItemsById = [];
 | 
	
		
			
				|  |  | +            foreach($arrItems as $item) {
 | 
	
		
			
				|  |  | +                if(isset($item['id']) && !empty($item['id'])) {
 | 
	
		
			
				|  |  | +                    $frontendItemIds[] = $item['id'];
 | 
	
		
			
				|  |  | +                    $frontendItemsById[$item['id']] = $item;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              
 | 
	
		
			
				|  |  | -            // 重新创建所有选项和关联
 | 
	
		
			
				|  |  | -            $newItemIds = [];
 | 
	
		
			
				|  |  | -            foreach($arrItems as $item){
 | 
	
		
			
				|  |  | -                // 创建新选项
 | 
	
		
			
				|  |  | -                $newItem = $itemModel->create([
 | 
	
		
			
				|  |  | -                    'name' => $item['name'],
 | 
	
		
			
				|  |  | -                    'standard_desc' => $item['standard_desc'],
 | 
	
		
			
				|  |  | -                    'is_required' => $item['is_required'],
 | 
	
		
			
				|  |  | -                    'status' => 'normal'
 | 
	
		
			
				|  |  | +            // 3. 判断需要删除的选项 (存在于数据库但不存在于前端数据中)
 | 
	
		
			
				|  |  | +            $itemsToDelete = array_diff($existingItemIds, $frontendItemIds);
 | 
	
		
			
				|  |  | +            if(!empty($itemsToDelete)) {
 | 
	
		
			
				|  |  | +                // 删除关联关系
 | 
	
		
			
				|  |  | +                $typeItemModel->where('type_id', $row->id)->where('item_id', 'in', $itemsToDelete)->delete();
 | 
	
		
			
				|  |  | +                // 删除选项本身
 | 
	
		
			
				|  |  | +                $itemModel->where('id', 'in', $itemsToDelete)->delete();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 4. 判断需要修改的选项 (存在于数据库且存在于前端数据中)
 | 
	
		
			
				|  |  | +            $itemsToUpdate = array_intersect($existingItemIds, $frontendItemIds);
 | 
	
		
			
				|  |  | +            foreach($itemsToUpdate as $itemId) {
 | 
	
		
			
				|  |  | +                $itemData = $frontendItemsById[$itemId];
 | 
	
		
			
				|  |  | +                $itemModel->where('id', $itemId)->update([
 | 
	
		
			
				|  |  | +                    'name' => $itemData['name'],
 | 
	
		
			
				|  |  | +                    'standard_desc' => $itemData['standard_desc'],
 | 
	
		
			
				|  |  | +                    'is_required' => $itemData['is_required'],
 | 
	
		
			
				|  |  |                  ]);
 | 
	
		
			
				|  |  | -                $newItemIds[] = $newItem->id;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              
 | 
	
		
			
				|  |  | -            // 创建新的关联关系
 | 
	
		
			
				|  |  | -            $arrTypeItem = [];
 | 
	
		
			
				|  |  | -            foreach($newItemIds as $itemId){
 | 
	
		
			
				|  |  | -                $arrTypeItem[] = [
 | 
	
		
			
				|  |  | -                    'item_id' => $itemId,
 | 
	
		
			
				|  |  | -                    'type_id' => $row->id,
 | 
	
		
			
				|  |  | -                ];
 | 
	
		
			
				|  |  | +            // 5. 判断需要新增的选项 (不存在于数据库但存在于前端数据中,或者没有ID的新选项)
 | 
	
		
			
				|  |  | +            $newItems = [];
 | 
	
		
			
				|  |  | +            foreach($arrItems as $item) {
 | 
	
		
			
				|  |  | +                // 如果没有ID或者ID不在现有ID列表中,则为新增
 | 
	
		
			
				|  |  | +                if(!isset($item['id']) || empty($item['id']) || !in_array($item['id'], $existingItemIds)) {
 | 
	
		
			
				|  |  | +                    $newItem = $itemModel->create([
 | 
	
		
			
				|  |  | +                        'name' => $item['name'],
 | 
	
		
			
				|  |  | +                        'standard_desc' => $item['standard_desc'],
 | 
	
		
			
				|  |  | +                        'is_required' => $item['is_required'],
 | 
	
		
			
				|  |  | +                        'status' => StatusEnum::ENABLED
 | 
	
		
			
				|  |  | +                    ]);
 | 
	
		
			
				|  |  | +                    $newItems[] = $newItem;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +            // 6. 为新增的选项创建关联关系
 | 
	
		
			
				|  |  | +            if(!empty($newItems)) {
 | 
	
		
			
				|  |  | +                $arrTypeItem = [];
 | 
	
		
			
				|  |  | +                foreach($newItems as $newItem) {
 | 
	
		
			
				|  |  | +                    $arrTypeItem[] = [
 | 
	
		
			
				|  |  | +                        'item_id' => $newItem->id,
 | 
	
		
			
				|  |  | +                        'type_id' => $row->id,
 | 
	
		
			
				|  |  | +                    ];
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                $typeItemModel->saveAll($arrTypeItem);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            $typeItemModel->saveAll($arrTypeItem);
 | 
	
		
			
				|  |  |              
 | 
	
		
			
				|  |  |              Db::commit();
 | 
	
		
			
				|  |  |          } catch (ValidateException|PDOException|Exception $e) {
 |