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.

660 lines
18 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.

#define _CRT_SECURE_NO_WARNINGS
#include "epm_handler_common.h"
#define DOFREE(obj) \
{ \
if(obj) \
{ \
MEM_free(obj); \
obj = NULL; \
} \
}
string GbkToUtf8(const char* src_str) {
int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
string strTemp = str;
if (wstr) delete[] wstr;
if (str) delete[] str;
return strTemp;
}
bool create_adhoc_signoff(tag_t current_task, vector<tag_t> user)
{
tag_t tmp_select_signoff_task = NULLTAG;
AOM_refresh(current_task, FALSE);
EPM_ask_sub_task(current_task, EPM_select_signoff_team_task, &tmp_select_signoff_task);
//if (tmp_select_signoff_task != NULLTAG)
//{
// //获取successors
// int successors_count = 0;
// tag_t * successors_attaches = NULLTAG;
// AOM_ask_value_tags(tmp_select_signoff_task, "successors", &successors_count, &successors_attaches);
// for (int i = 0; i < successors_count; i++) {
// //设置signoff_attachments的值为空
// AOM_lock(successors_attaches[i]);
// AOM_set_value_tags(successors_attaches[i], "signoff_attachments", 0, NULLTAG);
// AOM_save(successors_attaches[i]);
// AOM_unlock(successors_attaches[i]);
// AOM_refresh(successors_attaches[i], FALSE);
// }
// DOFREE(successors_attaches);
//}
//获取任务负责人
int perform_count = 0;
tag_t * perform_attaches = NULLTAG;
AOM_ask_value_tags(current_task, "valid_signoffs", &perform_count, &perform_attaches);
printf("已包含人员%d===================\n", perform_count);
for (int i = 0; i < user.size(); i++) {
int signoff_cnt = 0;
tag_t * signoffs = NULLTAG;
if (user[i] != NULLTAG)
{
bool isHave = false;
//判断是否已包含指定人员
if (perform_count > 0)
{
for (int j = 0; j < perform_count; j++)
{
tag_t user_tag = NULLTAG;
AOM_ask_value_tag(perform_attaches[j], "fnd0Assignee", &user_tag);
if (user_tag != NULL_TAG) {
//判断userID是否相同
char * user_id = NULL;
SA_ask_user_identifier2(user_tag, &user_id);
char * checkUser_id = NULL;
SA_ask_user_identifier2(user[i], &checkUser_id);
if (strcmp(user_id, checkUser_id) == 0)
{
isHave = true;
DOFREE(user_id);
DOFREE(checkUser_id);
break;
}
DOFREE(user_id);
DOFREE(checkUser_id);
}
}
}
if (isHave)
{
DOFREE(signoffs);
continue;
}
if (tmp_select_signoff_task != NULLTAG)
{
EPM_create_adhoc_signoff(tmp_select_signoff_task, user[i], &signoff_cnt, &signoffs);
EPM_set_adhoc_signoff_selection_done(tmp_select_signoff_task, true);
//EPM_trigger_action(tmp_select_signoff_task, EPM_complete_action, "");
}
else
{
printf("更改执行人员===================\n");
//更改执行人
//AOM_lock(current_task);
EPM_assign_responsible_party(current_task, user[i]);
//EPM_set_task_decision2(current_task, signoffs[0], CR_approve_decision, "");
////connor_set_prop_value_tag(current_task, "fnd0Assignee", user[i]);
//AOM_set_value_tag(current_task, "fnd0Assigner", user[i]);
//AOM_set_value_tag(current_task, "fnd0Performer", user[i]);
//AOM_save(current_task);
//AOM_unlock(current_task);
//AOM_refresh(current_task, FALSE);
}
}
DOFREE(signoffs);
}
return true;
}
void TCFindItem(char * queryName, int n_entries, char ** qry_entries, char ** qry_values, int * n_found, tag_t ** dba_mbrs)
{
tag_t query = NULLTAG;
QRY_find2(queryName, &query);
QRY_execute(query, n_entries, qry_entries, qry_values, n_found, dba_mbrs);
}
void TCGetPropertyValue(tag_t item, char * type, char * propertyName, char ** propertyValue)
{
//判断是否包含.号
if (strstr(propertyName, ".") != NULL)
{
//根据等号拆分条件和值
int itemPropertyCount = 0;
char ** itemPropertyChar = new char *[64];
//分割字符串
split(propertyName, ".", itemPropertyChar, &itemPropertyCount);
char * itemAddress = itemPropertyChar[0];
if (strcmp(type, "Revision") == NULL)
{
//传进来的是版本
if (strcmp(itemAddress, "item") == 0)
{
ITEM_ask_item_of_rev(item, &item);
}
else if (strcmp(itemAddress, "revMaster") == 0)
{
tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG;
int form_count = 0;
//获取版本表单
GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type);
GRM_list_secondary_objects_only(item, master_form_rel_type, &form_count, &form_list);
if (form_count == 0)
{
printf("未找到form,继续...");
}
else
{
item = form_list[form_count - 1];
}
DOFREE(form_list);
}
//判断拆分出的数量是否大于2
if (itemPropertyCount > 2)
{
//遍历查找关系对象
for (int i = 1; i < itemPropertyCount - 1; i++)
{
if (item == NULL_TAG) {
break;
}
PROP_type_t type_t;
char *type = NULL;
tag_t *childs = NULL;
int count = 0;
AOM_ask_property_type(item, itemPropertyChar[i], &type_t, &type);
printf("关系:%s ==> %s\n", itemPropertyChar[i], type);
if (type_t == PROP_reference) {
AOM_ask_value_tag(item, itemPropertyChar[i], &item);
}
else {
AOM_ask_value_tags(item, itemPropertyChar[i], &count, &childs);
if (count == 0) {
item = NULL_TAG;
}
else {
item = childs[0];
}
}
}
}
if (item == NULL_TAG)
{
*propertyValue = "";
}
else
{
AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], propertyValue);
}
}
else if (strcmp(type, "BOMLine") == NULL)
{
tag_t revisions = NULLTAG;
AOM_ask_value_tag(item, "bl_line_object", &revisions);
//传进来的是对象
if (strcmp(itemAddress, "item") == 0)
{
ITEM_ask_item_of_rev(revisions, &item);
}
else if (strcmp(itemAddress, "rev") == 0)
{
item = revisions;
}
else if (strcmp(itemAddress, "revMaster") == 0)
{
tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG;
int form_count = 0;
//获取版本表单
GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type);
GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list);
if (form_count == 0)
{
printf("未找到form,继续...");
}
else
{
item = form_list[form_count - 1];
}
DOFREE(form_list);
}
//判断拆分出的数量是否大于2
if (itemPropertyCount > 2)
{
//遍历查找关系对象
for (int i = 1; i < itemPropertyCount - 1; i++)
{
AOM_ask_value_tag(item, itemPropertyChar[i], &item);
}
}
if (item == NULL_TAG)
{
*propertyValue = "";
}
else
{
AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], propertyValue);
}
}
else if (strcmp(type, "Item") == NULL)
{
tag_t revisions = NULLTAG;
ITEM_ask_latest_rev(item, &revisions);
//传进来的是对象
if (strcmp(itemAddress, "rev") == 0)
{
item = revisions;
}
else if (strcmp(itemAddress, "revMaster") == 0)
{
tag_t master_form_rel_type = NULLTAG, *form_list = NULLTAG;
int form_count = 0;
//获取版本表单
GRM_find_relation_type(TC_master_form_rtype, &master_form_rel_type);
GRM_list_secondary_objects_only(revisions, master_form_rel_type, &form_count, &form_list);
if (form_count == 0)
{
printf("未找到form,继续...");
}
else
{
item = form_list[form_count - 1];
}
DOFREE(form_list);
}
//判断拆分出的数量是否大于2
if (itemPropertyCount > 2)
{
//遍历查找关系对象
for (int i = 1; i < itemPropertyCount - 1; i++)
{
AOM_ask_value_tag(item, itemPropertyChar[i], &item);
}
}
if (item == NULLTAG)
{
*propertyValue = "";
}
else
{
AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], propertyValue);
//char * type = NULL;
//AOM_ask_value_string(item, "object_type", &type);
////获取对象类型
//tag_t tAttrID = NULLTAG;
//POM_attr_id_of_attr(itemPropertyChar[itemPropertyCount - 1], type, &tAttrID);
//if (tAttrID == NULLTAG)
//{
// *propertyValue = "";
//}
//else
//{
// AOM_ask_value_string(item, itemPropertyChar[itemPropertyCount - 1], propertyValue);
//}
}
}
}
else
{
*propertyValue = propertyName;
}
}
void BOMSendToWeixin(char * userId, tag_t rootTask_tag, string message)
{
string jsonStr("{\\\"touser\\\":\\\""), strResult;
jsonStr.append(userId);
if (rootTask_tag != NULLTAG)
{
jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"BOM发送到ERP失败。\\n流程发起者");
//获取流程发起者
tag_t owning_user = NULLTAG;
char * owning_id = NULL, *process_name = NULL;
AOM_ask_owner(rootTask_tag, &owning_user);
SA_ask_user_identifier2(owning_user, &owning_id);
jsonStr.append(owning_id);
jsonStr.append("\\n流程名称");
//获取流程名称
EPM_ask_name2(rootTask_tag, &process_name);
jsonStr.append(process_name);
DOFREE(owning_id);
DOFREE(process_name);
}
else
{
jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"使用菜单BOM发送到ERP失败。\\n");
}
jsonStr.append("\\n异常日志");
jsonStr.append(message);
jsonStr.append("");
jsonStr.append("\\\"}}");
char toJar[1000] = "";
strcat(toJar, "java -jar ");
strcat(toJar, "C:\\PLM\\sendToWeixin.jar ");
strcat(toJar, jsonStr.c_str());
//system(toJar);
//_popen(toJar, "r");
char buf[8000] = { 0 };
FILE *pf = NULL;
if ((pf = _popen(toJar, "r")) == NULL) {
printf("接口返回:\n%s", "1");
}
while (fgets(buf, sizeof buf, pf)) {
strResult += buf;
}
_pclose(pf);
cout << strResult << endl;
}
void itemSendToWeixin(char* userId, tag_t rootTask_tag, string message) {
printf("message:%s", message);
string jsonStr("{\\\"touser\\\":\\\"");
jsonStr.append(userId);
jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"物料发送到ERP失败。\\n流程发起者");
//获取流程发起者
tag_t owning_user = NULLTAG;
char* owning_id = NULL, * process_name = NULL;
AOM_ask_owner(rootTask_tag, &owning_user);
SA_ask_user_identifier2(owning_user, &owning_id);
jsonStr.append(owning_id);
jsonStr.append("\\n流程名称");
//获取流程名称
EPM_ask_name2(rootTask_tag, &process_name);
jsonStr.append(process_name);
jsonStr.append("\\n异常日志");
jsonStr.append(message);
jsonStr.append("");
jsonStr.append("\\\"}}");
char toJar[1000] = "";
strcat(toJar, "java -jar ");
strcat(toJar, "C:\\PLM\\sendToWeixin.jar ");
strcat(toJar, jsonStr.c_str());
printf("cmd:%s", toJar);
//system(toJar);
//_popen(toJar, "r");
char buf[8000] = { 0 };
FILE* pf = NULL;
if ((pf = _popen(toJar, "r")) == NULL) {
printf("接口返回:\n%s", "1");
}
string strResult;
while (fgets(buf, sizeof buf, pf)) {
strResult += buf;
}
_pclose(pf);
cout << strResult << endl;
DOFREE(owning_id);
DOFREE(process_name);
}
void itemSendToWeixin_srm(char * userId, tag_t rootTask_tag, string message)
{
string jsonStr("{\\\"touser\\\":\\\""), strResult;
jsonStr.append(userId);
jsonStr.append("\\\",\\\"msgtype\\\":\\\"text\\\",\\\"agentid\\\":1000060,\\\"text\\\":{\\\"content\\\":\\\"物料发送到ERP失败。\\n流程发起者");
//获取流程发起者
tag_t owning_user = NULLTAG;
char* owning_id = NULL, * process_name = NULL;
AOM_ask_owner(rootTask_tag, &owning_user);
SA_ask_user_identifier2(owning_user, &owning_id);
jsonStr.append(owning_id);
jsonStr.append("\\n流程名称");
//获取流程名称
EPM_ask_name2(rootTask_tag, &process_name);
jsonStr.append(process_name);
jsonStr.append("\\n异常日志");
jsonStr.append(message);
jsonStr.append("");
jsonStr.append("\\\"}}");
char toJar[1000] = "";
strcat(toJar, "java -jar ");
strcat(toJar, "C:\\PLM\\sendToWeixin.jar ");
strcat(toJar, jsonStr.c_str());
//system(toJar);
//_popen(toJar, "r");
char buf[8000] = { 0 };
FILE *pf = NULL;
if ((pf = _popen(toJar, "r")) == NULL) {
printf("接口返回:\n%s", "1");
}
while (fgets(buf, sizeof buf, pf)) {
strResult += buf;
}
_pclose(pf);
cout << strResult << endl;
DOFREE(owning_id);
DOFREE(process_name);
}
void GetFiles(string path, vector<string>& files)
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
std::string p;
if ((hFile = _findfirst(p.assign(path).append("/*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
GetFiles(p.assign(path).append("/").append(fileinfo.name), files);
}
else
{
files.push_back(p.assign(path).append("/").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
LPCWSTR stringToLPCWSTR(std::string orig)
{
/*size_t origsize = orig.length() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(orig.length() - 1));
mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
return wcstring;*/
int len;
int slength = (int)orig.length() + 1;
len = MultiByteToWideChar(CP_ACP, 0, orig.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, orig.c_str(), slength, buf, len);
//std::wstring r(buf);
///delete[] buf;
//LPCWSTR result = r.c_str();
return buf;
}
LPCSTR stringToLPCWSTR1(std::string orig)
{
return orig.c_str();
}
char * inputFileToFtp(char * filePath)
{
//printf("下载到:%s Start===================\n", temp_file);
string ftpFilePath = "";
//ftp地址
string ftpSvrIp = "172.18.254.18";
//string ftpSvrIp = "ftp.meiling.com";
//ftp端口
int port = 21;
//用户名
string userName = "plm";
//用户密码
string password = "Plm_8023";
//上传文件源路径
string sourceFilePath = filePath;
//上传文件目的路径
string resultFilePath = "/工位SOP文件/";
string desFilePath = "./工位SOP文件/";
vector<string> files;
//判断上传的是文件还是文件夹标识
int size = 0;
if (sourceFilePath.find(".") == string::npos)
{
//获取文件夹下所有文件名
GetFiles(sourceFilePath, files);
char str[30];
size = files.size();
}
HINTERNET hint = NULL;
HINTERNET hftp = NULL;
do {
hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
if (hint == NULL)
{
break;
}
//创建ftp连接
hftp = InternetConnect(hint, stringToLPCWSTR(ftpSvrIp), port, stringToLPCWSTR(userName), stringToLPCWSTR(password), INTERNET_SERVICE_FTP, 0, 0);
if (hftp == NULL)
{
break;
}
//如果目的路径不存在,一级一级创建
//目的路径格式为:"./dir/dir1/.../"
int pos = 1;
string tempPath;
while (pos > 0)
{
// 从第二个“/”开始依次找到目的路径中的“/”位置
pos = desFilePath.find_first_of('/', pos + 1);
if (pos == -1)
break;
tempPath = desFilePath.substr(0, pos + 1);
if (_access(tempPath.c_str(), 0) == -1)
{
FtpCreateDirectory(hftp, stringToLPCWSTR(tempPath));
}
}
//如果FtpSetCurrentDirectory一直报错看一下desFilePath路径是否创建成功用资源管理器看能否直接访问ftp
if (FtpSetCurrentDirectory(hftp, stringToLPCWSTR(desFilePath)))
{
//上传文件源为一个文件
if (0 == size)
{
//获取上传路径中的文件名
int pos = sourceFilePath.find_last_of('/');
string desfilename = sourceFilePath.substr(pos + 1);
int i = FtpPutFile(hftp, stringToLPCWSTR(sourceFilePath), stringToLPCWSTR(desfilename), FTP_TRANSFER_TYPE_BINARY, 0);
if (i == 0)
{
printf("上传文件失败!\n");
return NULL;
}
else
{
ftpFilePath = "FTP://" + ftpSvrIp + resultFilePath + desfilename;
}
}
//上传文件源为文件夹
else
{
for (int i = 0; i < size; i++)
{
std::string tempFilePath = files[i].c_str();
//获取上传路径中的文件名
int pos = tempFilePath.find_last_of('/');
string desfilename = tempFilePath.substr(pos + 1);
//desfilename = desFilePath + desfilename;
int result = FtpPutFile(hftp, stringToLPCWSTR(tempFilePath), stringToLPCWSTR(desfilename), FTP_TRANSFER_TYPE_ASCII, 0);
if (result == 0)
{
printf("上传文件失败!\n");
return NULL;
}
else
{
ftpFilePath = "FTP://" + ftpSvrIp + resultFilePath + desfilename;
}
}
}
}
} while (0);
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
if (ftpFilePath.length() > 0)
{
cout << "上传文件完成" << endl;
}
char * strc = new char[strlen(ftpFilePath.c_str()) + 1];
strcpy(strc, ftpFilePath.c_str());
return strc;
}
char * getLineCode(char * lineCode)
{
char * result = "ALL";
int theCount1;
char **theICOUIDs, **theICOIds, **theClassIds, **theWSOUIDs;
tag_t *theICOTags, *theWSOTags;
ICS_class_ask_icos("组计数器字典", "", &theCount1, &theICOTags, &theICOUIDs, &theICOIds, &theClassIds, &theWSOTags, &theWSOUIDs);
//printf("theCount1=%d\n", theCount1);
int theAttributeCount, *theAttributeIds, *theAttributeValCounts;
char ***theAttributeValues;
for (int m = 0; m < theCount1; m++)
{
ICS_ico_ask_attributes(theICOTags[m], &theAttributeCount, &theAttributeIds, &theAttributeValCounts, &theAttributeValues);
//printf("theICOIds=%s,theICOUID==%s\n", theICOIds[m], theICOUIDs[m]);
char * icoLineCode = NULL;
char * icoERPCode = NULL;
for (int t = 0; t < theAttributeCount; t++) {
char theAttributeId[20] = "\0";
//printf("theAttributeIds=%d ,theAttributeValCounts=%d\n", theAttributeIds[t], theAttributeValCounts[t]);
sprintf(theAttributeId, "%d", theAttributeIds[t]);
if (theAttributeValCounts[t] > 0 && strcmp(theAttributeId, "1003") == 0) {
//printf("icoLineCode=%s\n", theAttributeValues[t][0]);
icoLineCode = theAttributeValues[t][0];
}
else if (theAttributeValCounts[t] > 0 && strcmp(theAttributeId, "1101") == 0) {
//printf("icoERPCode=%s\n", theAttributeValues[t][0]);
icoERPCode = theAttributeValues[t][0];
}
}
if (icoLineCode != NULL && strcmp(lineCode, icoLineCode) == 0 && icoERPCode != NULL && strcmp(icoERPCode, "") != 0)
{
result = icoERPCode;
break;
}
}
return result;
}