#define _CRT_SECURE_NO_WARNINGS
#include "epm_handler_common.h"

/**
 *
 * @handlerType: ActionHandler
 * @handlerName: RB_CheckForCompletion
 * @Description: 1、在设计节点完成时检查 :检查目标下[任务包版本RB3_TaskPackageRevision下的[交付物RB3_TaskDeliverable]关系下内容不允许为空
 *				 2、检查目标下[任务包版本]下的[项目包关系RB3_XMGX]关系下的[项目包版本RB3_XMKFRevision]下的 [物料关系RB3_WLGX]的内容不允许为空
 *               如果[交付物] 、[物料关系] 下任一内容为空，不允许通过弹出报错“[交付物] 或[物料关系] 下内容不允许为空”: 如果都有内容则节点通过
 * @author hcj
 * @date 2024年1月9日
 *
 */
int RB_CheckForCompletion(EPM_action_message_t msg)
{	
	int  attachments_num = 0;
	tag_t  rootTask = NULLTAG;
	tag_t *attachments = NULLTAG;
	char* errorMessage = "“交付物或物料关系下内容不允许为空";
	//获取任务对象
	EPM_ask_root_task(msg.task, &rootTask);
	//获取任务目标对象
	EPM_ask_attachments(rootTask, EPM_target_attachment, &attachments_num, &attachments);
	printf("开始循环查找目标中的对象\n");
	for (int i = 0; i < attachments_num; i++)
	{
		char* attType;
		ITKCALL(AOM_ask_value_string(attachments[i], "object_type", &attType));
		printf("获取类型%s是否与RB3_TaskPackageRevision匹配\n", attType);
		if (strcmp(attType,"RB3_TaskPackageRevision")) 
		{
			printf("匹配上了\n开始检查目标下RB3_TaskPackageRevision下的RB3_TaskDeliverable关系下内容是否为空\n");
			//检查目标下[任务包版本RB3_TaskPackageRevision下的[交付物RB3_TaskDeliverable]关系下内容是否为空
			int checkNum = 0;
			tag_t* checkObj;
			ITKCALL(AOM_ask_value_tags(attachments[i], "RB3_TaskDeliverable", &checkNum, &checkObj));
			if (checkNum == 0) {
				printf("为空，提示报错，退出流程\n");
				EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, errorMessage);
				return 1;
			}
			printf("检查任务包版本下的RB3_XMGX关系下的[RB3_XMKFRevision]下的 [物料关系RB3_WLGX]的内容是否为空\n");
			//检查任务包版本下的RB3_XMGX关系下的[RB3_XMKFRevision]下的 [物料关系RB3_WLGX]的内容是否为空
			int num = 0;
			tag_t* obj;
			ITKCALL(AOM_ask_value_tags(attachments[i], "RB3_XMGX", &num, &obj));
			for (int j = 0; j < num; j++) 
			{
				printf("开始循环获取RB3_XMGX关系下的对象\n");
				char* taskPType;
				ITKCALL(AOM_ask_value_string(obj[j], "object_type", &taskPType));
				printf("匹配类型%s是否等于RB3_XMKFRevision\n", taskPType);
				if (strcmp(taskPType, "RB3_XMKFRevision"))
				{
					printf("匹配上了\n");
					int checkTaskNum = 0;
					tag_t* checkTaskObj;
					ITKCALL(AOM_ask_value_tags(obj[j], "RB3_WLGX", &checkTaskNum, &checkTaskObj));
					if (checkTaskNum == 0) {
						EMH_store_error_s1(EMH_severity_user_error, EMH_USER_error_base, errorMessage);
						return 1;
					}
				}
			}
		}
	}
	return ITK_ok;
}