You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jd_check_jz/HEZON_ITK/Sample_confirmation_sheet.cpp

173 lines
4.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "util.h"
#include <ict/ict_userservice.h>
#include <tccore/uom.h>
bool startsWith(const char* str, const char* prefix) {
return strncmp(str, prefix, strlen(prefix)) == 0;
}
bool endsWith(const char* str, const char* suffix) {
if (!str || !suffix)
return str == suffix;
size_t lenStr = strlen(str);
size_t lenSuffix = strlen(suffix);
if (lenSuffix > lenStr)
return false;
return strncmp(str + lenStr - lenSuffix, suffix, lenSuffix) == 0;
}
bool isJD2_BJRevision(const char* type) {
return startsWith(type, "JD2") && endsWith(type, "BJRevision");
}
/*
* 获取包含中文字符的字符串长度
*/
int getCharLength(char str[])
{
int count = 0;
for (int i = 0; str[i]; i++)
{
if (str[i] < 0) i++;
count++;
}
return count;
}
/*
* 选中对象版本发起任意流程时,检查版本净重
*/
int jd_check_jz(EPM_rule_message_t msg) {
printf("Sample_confirmation_sheet is begin! \n");
int ifail = ITK_ok,
result_tag = EPM_go;
tag_t rootTask = NULLTAG;
int attachmentCount = 0;
tag_t* attachmentTags = NULL,
attachmentTag = NULLTAG;
char* type = NULL,
* name = NULL,
* jz = NULL;
int form_cnt = 0;
tag_t* forms = NULL;
ITKCALL(ifail = EPM_ask_root_task(msg.task, &rootTask));
ITKCALL(ifail = EPM_ask_attachments(rootTask, EPM_target_attachment, &attachmentCount, &attachmentTags));
//便利所有的流程目标下的对象
for (int i = 0; i < attachmentCount; i++) {
attachmentTag = attachmentTags[i];//PartRevisionMaster
ITKCALL(ifail = AOM_ask_value_string(attachmentTag, "object_type", &type));
ITKCALL(ifail = AOM_ask_value_string(attachmentTag, "object_name", &name));
printf(">>>当前流程下对象的类型为==[%s]\n", type);
//获取版本对象下的表单
ITKCALL(ifail = AOM_ask_value_tags(attachmentTag, "IMAN_master_form_rev", &form_cnt, &forms));
//==========================下面是检查特定版本类型JD2_XXBJRevision下的表单属性净重===========================================================================================================
if (isJD2_BJRevision(type)) {
//检查版本表单是否存在属性jd2_jz
ITKCALL(ifail = AOM_ask_value_string(forms[0], "jd2_jz", &jz));
printf("获取净重属性的ifail结果 = [%d] \n", ifail);
if (ifail != 0 && ifail != 2) {
//未获取到净重属性,流程正常发起
printf("未获取到净重属性,流程正常发起 \n");
continue;
}else {
if (jz != NULL && stricmp(jz, "") == 0) {
//弹出弹窗提示,且终止流程
printf(">>>部件净重为空,不允许发起流程,请检查!!\n");
char* message = "部件净重为空,不允许发起流程,请检查!!";
cout << "Exception:" << message << endl;
EMH_store_error_s1(EMH_severity_error, EMH_IDGENERATION_ERROR_BASE, message);
result_tag = EPM_nogo;
break;
}else if (jz != NULL && stricmp(jz, "0.001") < 0) {
//弹出弹窗提示,且终止流程
printf(">>>部件净重小于0.001,不允许发起流程,请检查!!\n");
char* message = "部件净重小于0.001,不允许发起流程,请检查!!";
cout << "Exception:" << message << endl;
EMH_store_error_s1(EMH_severity_error, EMH_IDGENERATION_ERROR_BASE, message);
result_tag = EPM_nogo;
break;
}else {
//正常发起流程
printf(">>>净重=[%s],允许发起流程!\n",jz);
}
}
}
else {
printf(">>>当前流程下对象[%s]类型为[%s]类型非部件类型JD2_[XX]BJRevision不必检查净重\n", name,type);
}
}
MEM_free(forms);
MEM_free(name);
MEM_free(type);
MEM_free(attachmentTags);
return result_tag;
}
/*
* 修改单位值的userservice方法
*/
int USERSEVICE_getProperties(void* returnValue) {
int ifail = ITK_ok;
tag_t tag = NULL_TAG;
char* uomName = NULL;
tag_t* release_objs = NULL;
//接收参数
USERARG_get_tag_argument(&tag);
USERARG_get_string_argument(&uomName);
int num_could = 0;
tag_t* uoms = NULL, uom = NULLTAG;
// 获取所有单位的列表
ITKCALL(UOM_extent(&num_could, &uoms));
for (int i = 0; i < num_could; i++)
{
char* name = NULL;
UOM_ask_name(uoms[i], &name);
if (strcmp(name, uomName) == 0)
{
uom = uoms[i];
break;
}
}
// 初始化类ID、属性ID和标签变量
char* class_id = NULL;
tag_t attr_id = NULLTAG, class_tag = NULLTAG, tag_instance = NULLTAG;
// 锁定对象以防止在操作过程中被修改
ITKCALL(AOM_lock(tag));
// 获取对象所属类的标签和名称
ITKCALL(POM_class_of_instance(tag, &class_tag));
ITKCALL(POM_name_of_class(class_tag, &class_id));
// 获取类中名为"uom_tag"的属性的标签
ITKCALL(POM_attr_id_of_attr("uom_tag", class_id, &attr_id));
// 刷新对象的实例以确保数据是最新的
ITKCALL(POM_refresh_instances_any_class(1, &tag, POM_modify_lock));
// 将对象的单位属性设置为之前找到的单位标签
ITKCALL(POM_set_attr_tag(1, &tag, attr_id, uom));
// 保存对对象所做的更改
ITKCALL(POM_save_instances(1, &tag, true));
// 解锁对象
ITKCALL(AOM_unlock(tag));
// 刷新对象的状态
ITKCALL(AOM_refresh(tag, false));
return ifail;
}