#define _CRT_SECURE_NO_WARNINGS #include "epm_handler_common.h" #define ITK_err 919012 int recursionBOM(tag_t rev, char *checkResult); int ML_CheckMBOM(EPM_action_message_t msg) { printf("=========================MBOM校验 Start===================\n"); auto startTime = std::chrono::high_resolution_clock::now(); //EPM_decision_t decision = EPM_go; int ifail = ITK_ok; int attachments_num = 0; tag_t rootTask = NULLTAG, *attachments = NULLTAG; string type; vector types; char checkResult[1024] = ""; //获取任务对象 EPM_ask_root_task(msg.task, &rootTask); //获取任务目标对象 EPM_ask_attachments(rootTask, EPM_target_attachment, &attachments_num, &attachments); char *argflag = NULL, *argvalue = NULL, *arg = NULL; //获取参数 int arg_cnt = TC_number_of_arguments(msg.arguments); printf("参数个数为:%d\n", arg_cnt); if (arg_cnt > 0) { for (int i = 0; i < arg_cnt; i++) { //获取下一个参数(从0开始) arg = TC_next_argument(msg.arguments); //获取参数的名称和值 ITKCALL(ifail = ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue)) ; if (stricmp(argflag, "type") == 0) { if (argvalue != NULL) { //strcpy(arg1value, argvalue); type.assign(argvalue); } } DOFREE(argflag); DOFREE(argvalue); } } //解析handler参数 { int strnum = 0; types = split2(type, ","); if (types.size() == 0) { EMH_store_error_s1(EMH_severity_error, ITK_err, "未配置流程参数:-type"); ifail = 1; goto end; } } for (int i = 0; i < attachments_num; i++) { char *itemType = NULL, *factory = NULL, *line = NULL, *item_id = NULL, *name = NULL; AOM_ask_value_string(attachments[i], "object_type", &itemType); printf("type_class : %s,-itemType:%s \r\n", itemType, type.c_str()); //过滤掉非目标版本的对象 if (!isVecHasStr(types, itemType)) { DOFREE(itemType); continue; } ITKCALL(ifail = AOM_ask_value_string(attachments[i],"ml8_Factory",&factory)); ITKCALL(ifail = AOM_ask_value_string(attachments[i],"ml8_Line",&line)); ITKCALL(ifail = AOM_ask_value_string(attachments[i],"item_id",&item_id)); ITKCALL(ifail = AOM_ask_value_string(attachments[i],"object_name",&name)); if (factory == NULL || strcmp(factory, "") == 0 || line == NULL || strcmp(line, "") == 0) { strcat(checkResult,item_id); strcat(checkResult,name); strcat(checkResult,"不为MBOM!\n"); DOFREE(item_id); DOFREE(name); DOFREE(factory); DOFREE(line); DOFREE(itemType); continue; } recursionBOM(attachments[i], checkResult); } if (strcmp(checkResult, "") != 0) { //decision = EPM_nogo; //EMH_store_error_s2(EMH_severity_error, ITK_err, G2U("MBOM校验失败"), G2U(checkResult) ); ITKCALL(ifail = EMH_store_error_s2(EMH_severity_error, ITK_err, "MBOM校验失败", checkResult )); } DOFREE(item_id); DOFREE(name); DOFREE(factory); DOFREE(line); DOFREE(itemType); end: auto stopTime = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(stopTime - startTime); //std::cout << "ML_CheckMBOM用时:" << duration.count() / 1000 << std::endl; string usetime = "ML_CheckMBOM用时:"; usetime.append(std::to_string(duration.count() / 1000)); WriteLog(true, usetime.c_str()); printf("=========================MBOM校验 End===================\n"); return ifail; } int recursionBOM(tag_t rev,char *checkResult) { tag_t *child_revs = NULL, *child_revs2 = NULL; int child_num = 0; int child_num2 = 0, ifail = ITK_ok; char *factory = NULL, *line = NULL, *processing_mode = NULL, *add_trade = NULL, *item_id = NULL, *name = NULL; ITKCALL(AOM_ask_value_tags(rev,"ps_children",&child_num,&child_revs)); if (child_num > 0) { for (int i = 0; i < child_num; i++) { ITKCALL(ifail = AOM_ask_value_string(child_revs[i],"ml8_ProcessingMode", &processing_mode)); if (ifail != ITK_ok) { printf("清理不存在属性ml8_ProcessingMode错误信息\n"); EMH_clear_last_error(ifail); processing_mode = (char*)malloc(1 + sizeof(char) * strlen("")); strcpy(processing_mode,""); } ITKCALL(ifail = AOM_ask_value_string(child_revs[i],"ml8_AddTrade", &add_trade)); if (ifail != ITK_ok) { printf("清理不存在属性ml8_ProcessingMode错误信息\n"); EMH_clear_last_error(ifail); add_trade = (char*)malloc(1 + sizeof(char) * strlen("")); strcpy(add_trade,""); } if (strcmp(processing_mode, "自制") == 0 || strcmp(processing_mode, "外协外购") == 0 && strcmp(add_trade, "是") == 0) { ITKCALL(AOM_ask_value_string(child_revs[i],"ml8_Factory", &factory)); ITKCALL(AOM_ask_value_string(child_revs[i],"ml8_Line", &line)); ITKCALL(AOM_ask_value_string(child_revs[i],"item_id", &item_id)); ITKCALL(AOM_ask_value_string(child_revs[i],"object_name", &name)); if (factory == NULL || strcmp(factory, "") == 0 || line == NULL || strcmp(line, "") == 0) { strcat(checkResult, item_id); strcat(checkResult, name); strcat(checkResult, "产线、工厂为空!\n"); } if (factory)DOFREE(factory); if (line)DOFREE(line); if (item_id)DOFREE(item_id); if (name)DOFREE(name); } if(processing_mode)DOFREE(processing_mode); if (add_trade)DOFREE(add_trade); //递归 ITKCALL(AOM_ask_value_tags(child_revs[i],"ps_children",&child_num2,&child_revs2)); if (child_num2 > 0) { recursionBOM(child_revs[i], checkResult); } } } DOFREE(child_revs); return 0; }