#include "SIO_USCOREBOM_USCOREPLM_USCOREASYNBinding.nsmap" #include "soapH.h" #include "soapStub.h" #include "stdsoap2.h" #include "ado.h" #include "soapSIO_USCOREBOM_USCOREPLM_USCOREASYNBindingProxy.h" #include "soapSI_USCOREFACTORY_USCORENUMBER_USCOREPLM_USCOREOUT_USCORESYNBindingProxy.h" #include "soapSI_USCOREPROCESSROUTE_USCOREPLM_USCOREOUT_USCORESYNBindingProxy.h" #include #include #include #include #include #include #include #include "ps/ps.h"; #include "ps/vrule.h" #include "sstream" #include #include "epm/epm.h" #include "sa/sa.h" #include "libxl.h" #include #include "epm/signoff.h" #include #include #include #include #include "ae/dataset.h" #include #include #include #include #include //#include "ado.h" #include "ocilib.h" #include #include #include "util.h" #include #include "dfl_custom.h" #include "CRUL_server_call_httpserver.h" using namespace std; // struct FlowBean { vector flowList; tag_t flow_split = NULLTAG; tag_t flow_combine = NULLTAG; tag_t flow_end = NULLTAG; char* BEZFL; // 参考顺序 string PLNFL = ""; // 序列 boolean isMain = true; boolean isOther = false; vector flow_combine_list; }; char* getNotNullMsg(char* msg); void logBomMsg(vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> lists); void logProcessMsg(vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist);// vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist; char* getUnti(char* unti); FlowBean getClone(FlowBean oldBean) { FlowBean newBean; newBean.isMain = false; newBean.flow_combine = oldBean.flow_combine; newBean.flow_split = oldBean.flow_split; for (int num = 0; num < oldBean.flowList.size(); num++) { newBean.flowList.push_back(oldBean.flowList[num]); } return newBean; } //// void printfMsg(ns1__DT_USCOREPROCESSROUTE_USCORES4_USCORERSP ns1Rsp, string& sendMsg) { /*_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCORERSP_RSP_USCOREBASEINFO info = ns1Rsp.RSP_USCOREBASEINFO; char* id = info.REQ_USCORETRACE_USCOREID; log("id:[%s]", id);*/ _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCORERSP_ZTABLE_USCORERETURN* returnTable = ns1Rsp.ZTABLE_USCORERETURN; int num = ns1Rsp.__sizeZTABLE_USCORERETURN; log("工艺路线RETURN:{}", num);/**/ for (int i = 0; i < num; i++) { _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCORERSP_ZTABLE_USCORERETURN returnMsg = returnTable[i]; //System.out.println(z.getSERNR() + "|" + z.getTYPE() + "|" + z.getMESSAGE()); string logMsg; char* msg = getNotNullMsg(returnMsg.MESSAGE); msg = U2G(msg); logMsg.append(returnMsg.MATNR).append("|") .append(returnMsg.TYPE).append("|").append(msg); if (strcmp(returnMsg.TYPE, "E") == 0) { sendMsg.append("\n").append(returnMsg.MATNR).append(": ").append(msg); } log(logMsg.c_str()); } } void printfMsg(ns1__DT_USCOREFACTORY_USCORENUMBER_USCORERSP ns1Rsp) { int num = ns1Rsp.__sizeZTABLE_USCORERETURN; //_ns1__DT_USCOREFACTORY_USCORENUMBER_USCORERSP_RSP_USCOREBASEINFO *info = ns1Rsp.RSP_USCOREBASEINFO; //char* id = info[0].REQ_USCORETRACE_USCOREID; _ns1__DT_USCOREFACTORY_USCORENUMBER_USCORERSP_ZTABLE_USCORERETURN* returnTable = ns1Rsp.ZTABLE_USCORERETURN; log("出厂编号RETURN:{}", num);/**/ for (int i = 0; i < num; i++) { _ns1__DT_USCOREFACTORY_USCORENUMBER_USCORERSP_ZTABLE_USCORERETURN returnMsg = returnTable[i]; //System.out.println(z.getSERNR() + "|" + z.getTYPE() + "|" + z.getMESSAGE()); string logMsg = getNotNullMsg(returnMsg.SERNR); char* msg = getNotNullMsg(returnMsg.MESSAGE); msg = U2G(msg); logMsg.append("|").append(getNotNullMsg(returnMsg.TYPE)).append("|").append(msg); log("{}", logMsg); } } void SplitStr(string strArg, string spliter, vector& ans) { ans.clear(); size_t index0 = 0; string one_arg; if (strArg.find_first_not_of(' ') == string::npos) strArg = ""; while (strArg.size() > 0) { index0 = strArg.find(spliter); log(" ind %d \n", index0); if (index0 != string::npos) { one_arg = strArg.substr(0, index0); strArg = strArg.substr(index0 + 1); ans.push_back(one_arg); } else { ans.push_back(strArg); break; } } } void sendBom(vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> list, string batchMsg) { //SIO_USCOREBOM_USCOREPLM_USCOREASYNBinding SIO_USCOREBOM_USCOREPLM_USCOREASYNBindingProxy proxy; ns1__DT_USCOREBOM_USCORES4_USCOREREQ ns1Req; proxy.userid = "shpodev"; proxy.passwd = "sap@2019Test"; soap_mode(&proxy, SOAP_C_UTFSTRING); _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST* reqList = new _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST[list.size()]; log("list ===> %d \n", list.size()); for (int i = 0; i < list.size(); i++) { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST msg = list[i]; reqList[i] = list[i]; } _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_BASEINFO baseInfo; ns1Req.LIST = reqList; ns1Req.__sizeLIST = list.size(); baseInfo.REQ_USCORETRACE_USCOREID = (char*)batchMsg.c_str();//batchNum; ns1Req.BASEINFO = &baseInfo; //ns1__DT_USCOREBOM_USCOREPLM_USCORERSP ns1Rsp; int xlt = proxy.send_SIO_USCOREBOM_USCOREPLM_USCOREASYN(NULL, NULL, &ns1Req); log("111"); char* msg = proxy.buf; vector vecMsg; //Split(msg, "?>", vecMsg); //webservice调不通 暂时拆分获取xml信息curl调用 /*string lastMsg = vecMsg[vecMsg.size()-1].c_str(); lastMsg = lastMsg.substr(1, lastMsg.size());*/ log("BOM XML MSG:{}", msg);/* xml信息*/ SplitStr(msg, "soap1.1\"", vecMsg); string lastMsg = vecMsg[1].substr(11); string str = callHttpserver2(lastMsg); log("BOM XML MSG:{}", lastMsg);/* xml信息*/ log("return MSG :{}", str); soap_print_fault(&proxy, stderr); log("xlt:[%d]", xlt); //printfMsg(ns1Rsp, sendMsg); } //判断是否为主线 void isMain(FlowBean& bean, vector& mainLines, vector& endLines, vector& splits, map& BEZFL_maps, int num2) { tag_t combine = bean.flow_combine; vector lists = bean.flowList; for (int i = 0; i < lists.size(); i++) { tag_t b = lists[i]; char* idmte; tag_t gxRev; ITKCALL(AOM_ask_value_tag(b, "bl_line_object", &gxRev)); AOM_ask_value_string(gxRev, "item_id", &idmte); log("=====flowList=====%s====\n", idmte); } vector lists2 = bean.flow_combine_list; //char* uid; //ITK__convert_tag_to_uid(combine, &uid); if (combine == NULLTAG) { log("汇合点:\n"); } int len = lists.size() - 1; if (len >= -1) { if (std::find(splits.begin(), splits.end(), lists[0]) == splits.end()) { bean.flow_split = lists[0]; splits.push_back(lists[0]); bean.isOther = true; } } if (combine != NULLTAG && std::find(mainLines.begin(), mainLines.end(), combine) != mainLines.end()) { bean.isMain = false; int num = std::find(mainLines.begin(), mainLines.end(), combine) - mainLines.begin(); log("num %d\n", num); vector::const_iterator index1 = lists.begin(); vector::const_iterator index2 = lists.begin() + num; log("num %d\n", num); vector vec_new; // 新的vector存放 log("num %d\n", num); vec_new.assign(index1, index2); log("num %d\n", num); bean.flowList = vec_new; if (BEZFL_maps.count(combine) > 0) { bean.BEZFL = BEZFL_maps[combine]; } return; } log("1\n"); if (mainLines.size() == 0) { bean.isMain = (true); } else { bean.isMain = (false); } if (len > -1) { tag_t end = lists[len]; if (combine == NULLTAG) { endLines.push_back(end); if (BEZFL_maps.count(end) > 0) { bean.BEZFL = BEZFL_maps[end]; } } else { int size = lists2.size(); if (BEZFL_maps.count(lists2[size - 1]) > 0) { bean.BEZFL = BEZFL_maps[lists2[size - 1]]; } if (!bean.isMain) { int cout = 0; for (int i = 0; i < size; i++) { if (std::find(mainLines.begin(), mainLines.end(), lists2[i]) != mainLines.end()) { //mainLines.count(lists2[i)) cout = i; break; } } bean.flow_combine = lists2[cout]; } endLines.push_back(combine); } } for (int i = 0; i <= len; i++) { if (std::find(mainLines.begin(), mainLines.end(), lists[i]) == mainLines.end()) { log("3\n"); mainLines.push_back(lists[i]); char* fileDate = new char[20]; sprintf(fileDate, "%06d", num2); BEZFL_maps[lists[i]] = fileDate; log("4\n"); } } return; } void sendProcess(vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist, string& sendMsg) { //ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ *ns1__MT_USCOREPROCESSROUTE_USCORES4_USCOREREQ SI_USCOREPROCESSROUTE_USCOREPLM_USCOREOUT_USCORESYNBindingProxy proxy; soap_mode(&proxy, SOAP_C_UTFSTRING); ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ ns1Req; _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_BASEINFO baseInfo; baseInfo.REQ_USCORETRACE_USCOREID = (char*)"123456"; ns1Req.BASEINFO = baseInfo; _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST* LIST = new _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST[proclist.size()]; for (int i = 0; i < proclist.size(); i++) { _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST list = proclist[i]; LIST[i] = list; } ns1Req.__sizeLIST = proclist.size(); ns1Req.LIST = LIST; ns1__DT_USCOREPROCESSROUTE_USCORES4_USCORERSP ns1Rsp; proxy.userid = "shplm";//shplm proxy.passwd = "sap@2019"; int xlt = proxy.SI_USCOREPROCESSROUTE_USCOREPLM_USCOREOUT_USCORESYN(NULL, NULL, &ns1Req, ns1Rsp); if (xlt != 0) { soap_print_fault(&proxy, stderr); } //log("PROCESS XML MSG:{}", U2G(proxy.buf));/* xml信息*/ log("xlt:[%d]", xlt); printfMsg(ns1Rsp, sendMsg); } void sendFactoryNo(vector<_ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM> list_Factorys) { SI_USCOREFACTORY_USCORENUMBER_USCOREPLM_USCOREOUT_USCORESYNBindingProxy proxy; //soap_set_omode(&proxy, SOAP_C_UTFSTRING); /*ssoap_set_mode(&soap, SOAP_C_MBSTRING);*/ soap_mode(&proxy, SOAP_C_UTFSTRING); proxy.userid = "shplm"; proxy.passwd = "sap@2019"; ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ ns1Req; _ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_BASEINFO info; info.REQ_USCORETRACE_USCOREID = (char*)"123456"; ns1Req.BASEINFO = &info; _ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS items; _ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM* item_items = new _ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM[list_Factorys.size()]; for (int i = 0; i < list_Factorys.size(); i++) { item_items[i] = list_Factorys[i]; } items.__sizeITEM = list_Factorys.size(); items.ITEM = item_items; ns1Req.ITEMS = &items; ns1__DT_USCOREFACTORY_USCORENUMBER_USCORERSP ns1Rsp; int xlt = proxy.SI_USCOREFACTORY_USCORENUMBER_USCOREPLM_USCOREOUT_USCORESYN(NULL, NULL, &ns1Req, ns1Rsp); log("xlt:[%d]", xlt); if (xlt != 0) { soap_print_fault(&proxy, stderr); } printfMsg(ns1Rsp); } void getFactoryNoList(char* projectNo, char* groupName, char* wbs, tag_t* factoryNos, int num, tag_t ccp, vector<_ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM>& list) { char* zt2_MaterialNo, *zt2_TankNo, *zt2_Site; AOM_UIF_ask_value(ccp, "zt2_MaterialNo", &zt2_MaterialNo); AOM_UIF_ask_value(ccp, "zt2_TankNo", &zt2_TankNo); AOM_UIF_ask_value(ccp, "zt2_Site", &zt2_Site); //_ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM for (int i = 0, len = num; i < len; i++) { tag_t factoryNo = factoryNos[i]; char* itemId; AOM_ask_value_string(factoryNo, "item_id", &itemId); _ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM item_factoryNo; int index = i + 1; char fileDate[128] = ""; item_factoryNo.MATNR = zt2_MaterialNo; item_factoryNo.PSPID = projectNo; sprintf_s(fileDate, "%04d", index); char* rspos = fileDate; item_factoryNo.RSPOS = rspos; item_factoryNo.SERNR = itemId; item_factoryNo.WERKS = groupName; item_factoryNo.ZGH = G2U(zt2_TankNo); item_factoryNo.ZPSPID = wbs; item_factoryNo.ZZD = zt2_Site; list.push_back(item_factoryNo); } } vector addLastRev(map> items2) { vector revLast; map>::iterator it; //名称模糊匹配 for (it = items2.begin(); it != items2.end(); it++) { tag_t s = it->first; vector rev2 = items2[s]; tag_t revTag = NULLTAG; char* revId = (char*)""; for (int j = 0; j < rev2.size(); j++) { char* id2; AOM_ask_value_string(rev2[j], "item_revision_id", &id2); if (strcmp(id2, revId) > 0) { revId = id2; revTag = rev2[j]; } } revLast.push_back(revTag); } return revLast; } tag_t getProcessTag(tag_t mantr) { int n_references = 0; int* levels = 0; tag_t* references_tag, processTag = NULLTAG; char** relation_type_name = NULL; //通过引用关系查找到变更单 ITKCALL(WSOM_where_referenced(mantr, 1, &n_references, &levels, &references_tag, &relation_type_name)); for (int n = 0; n < n_references; n++) { log("relation_type_name [%s]\n", relation_type_name[n]); if (strcmp(relation_type_name[n], "IMAN_METarget") == 0) { processTag = references_tag[n]; } } return processTag; } boolean isTcm2(tag_t mantr) { int releaseCount = 0; tag_t* releaseTags = NULL; //判断子件是否发布 AOM_ask_value_tags(mantr, "release_status_list", &releaseCount, &releaseTags); if (releaseCount > 0) { return true; } else { return false; } } vector getFlowStartsYH(int num, tag_t* c_line_tags) { vector starts; for (int i = 0; i < num; i++) { tag_t gxLine = c_line_tags[i], *successors, *Mfg0predecessors; int sucCnt = 0, preCnt = 0; ITKCALL(AOM_ask_value_tags(gxLine, "Mfg0successors", &sucCnt, &successors)); AOM_ask_value_tags(gxLine, "Mfg0predecessors", &preCnt, &Mfg0predecessors); log("sucCnt %d preCnt%d \n", sucCnt, preCnt); if (preCnt == 0 && sucCnt > 0) { starts.push_back(gxLine); } } return starts; } void readGXFlow(tag_t gxLine, vector& flowBeans, FlowBean& currentFlow, boolean isMainFlow, boolean top) { tag_t* successors, *Mfg0predecessors; int sucCnt = 0, preCnt = 0; AOM_ask_value_tags(gxLine, "Mfg0successors", &sucCnt, &successors); AOM_ask_value_tags(gxLine, "Mfg0predecessors", &preCnt, &Mfg0predecessors); currentFlow.flowList.push_back(gxLine); if (preCnt > 1) { currentFlow.flow_combine_list.push_back(gxLine); } if (preCnt > 1 && currentFlow.flow_combine == NULLTAG) { currentFlow.flow_combine = gxLine; } if (sucCnt == 0) { return; } for (int i = 1; i < sucCnt; i++) { FlowBean newFlow = getClone(currentFlow); if (newFlow.flow_combine == NULLTAG) { log("=============="); } newFlow.flow_split = gxLine; readGXFlow(successors[i], flowBeans, newFlow, false, false); flowBeans.push_back(newFlow); } readGXFlow(successors[0], flowBeans, currentFlow, false, false); if (top) { log("sucCnt %d\n", sucCnt); currentFlow.isMain = isMainFlow;; flowBeans.push_back(currentFlow); } } //工艺信息排序 void getSort(vector& flowBeans) { if (flowBeans.size() == 1 || flowBeans.size() == 0) return; vector flowInt; map> flows; for (FlowBean b : flowBeans) { int size = b.flowList.size(); if (flows.count(size) > 0) { flows[size].push_back(b); } else { vector flow; flow.push_back(b); flowInt.push_back(size); flows[size] = flow; } } flowBeans.clear(); vector mainLines; vector endLines; vector splits; int index = 0; map BEZFL_maps; sort(flowInt.rbegin(), flowInt.rend()); for (vector::iterator it = flowInt.begin(); it != flowInt.end(); it++) { cout << *it << " "; if (flows.count(*it) > 0) { vector beans = flows[*it]; for (int x = 0; x < beans.size(); x++) { isMain(beans[x], mainLines, endLines, splits, BEZFL_maps, index); flowBeans.push_back(beans[x]); index++; } } } } char* getGXNR(tag_t gxLine) { if (gxLine == NULLTAG) { return (char*)""; } char* bl_sequence_no; AOM_ask_value_string(gxLine, "bl_sequence_no", &bl_sequence_no); //String seq = gxLine.getProperty("bl_sequence_no"); int seqI = 0; if (strcmp(bl_sequence_no, "") != 0) { seqI = atoi(bl_sequence_no); } char* fileDate = new char[20]; sprintf(fileDate, "%04d", seqI); return fileDate; } char* getBomUid(tag_t gxLine) { char* gxUid; tag_t gxRev; if (gxLine == NULLTAG) { return (char*)""; } ITKCALL(AOM_ask_value_tag(gxLine, "bl_line_object", &gxRev)); ITK__convert_tag_to_uid(gxRev, &gxUid); return gxUid; } _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM getGXInfo(FlowBean bean, int index, tag_t partRev, char* p_uom, char* now) { _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM item; item.PLNAL = (char*)("1");// 组计数器 char* fileDate = new char[20]; sprintf(fileDate, "%06d", index); item.PLNFL = fileDate;// 序列 item.DATUV = now;// 有效起始日期 boolean bx = false; item.VORNR1 = (char*)(""); item.VORNR2 = (char*)(""); item.BEZFL = (char*)("");// 参考顺序 // item.setLTXA1("");//顺序描述 if (!bean.isMain) {// 并行 // item.setBEZFL("000000");//参考顺序 item.BEZFL = bean.BEZFL; bx = true; item.FLGAT = (char*)("1");// 顺序类别 // System.out.println("前驱:"+bean.flow_split); if (bean.flow_split != NULLTAG) { item.VORNR1 = getGXNR(bean.flow_split);// 前驱 } else { log("bean.flow_split ====== NULL"); } if (bean.isOther) bean.flow_split = NULLTAG; if (bean.flow_combine != NULLTAG) { item.VORNR2 = getGXNR(bean.flow_combine);// 后置 (SAPUtil.getGXNR(bean.flow_combine)) } } else {// 非并行 item.FLGAT = (char*)("0");// 顺序类别 } int cnt = bean.flowList.size(); _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS subitemsArr; vector<_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS_SUBITEM> subItems; boolean inBx = bean.flow_split == NULLTAG; for (int i = 0; i < cnt; i++) { tag_t gxLine = bean.flowList[i]; char* gxUid; tag_t gxRev; ITKCALL(AOM_ask_value_tag(gxLine, "bl_line_object", &gxRev)); ITK__convert_tag_to_uid(gxRev, &gxUid); if (bx) { if (strcmp(getBomUid(bean.flow_combine), gxUid) == 0) { //gxLine.equals(bean.flow_combine) break; } if (strcmp(getBomUid(bean.flow_split), gxUid) == 0) { //gxLine.equals(bean.flow_split) inBx = true; continue; } if (!inBx) { continue; } } _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS_SUBITEM sub; char* zt2_WorkCenter, *zt2_ControlCode, *object_name, *zt2_ClassificationCode, *zt2_ArtificialTime, *zt2_MachineTime, *zt2_ReadinessTime; AOM_ask_value_string(gxRev, "zt2_WorkCenter", &zt2_WorkCenter); AOM_UIF_ask_value(gxLine, "zt2_ControlCode", &zt2_ControlCode); AOM_UIF_ask_value(gxRev, "object_name", &object_name); AOM_UIF_ask_value(gxRev, "zt2_ClassificationCode", &zt2_ClassificationCode); AOM_UIF_ask_value(gxLine, "zt2_ArtificialTime", &zt2_ArtificialTime); AOM_UIF_ask_value(gxLine, "zt2_MachineTime", &zt2_MachineTime); AOM_UIF_ask_value(gxLine, "zt2_ReadinessTime", &zt2_ReadinessTime); sub.VORNR = getGXNR(gxLine);// 工序 sub.ARBPL = zt2_WorkCenter;// (gxRev.getTCProperty("zt2_WorkCenter").getStringValue());// 工作中心 sub.STEUS = zt2_ControlCode;// (gxLine.getProperty("zt2_ControlCode"));// 控制码 sub.LTXA1 = G2U(object_name);// (gxRev.getProperty("object_name"));// 工序描述 sub.USR00 = zt2_ClassificationCode;// (gxRev.getProperty("zt2_ClassificationCode"));// 工序编码 sub.BMSCH = (char*)("1");// 基本数量 sub.PLNME = p_uom; sub.VGW01 = zt2_ArtificialTime;// (gxLine.getProperty("zt2_ArtificialTime"));// 标准值1 sub.VGE01 = (char*)("MIN");// 标准值单位1 sub.VGW02 = zt2_MachineTime;// (gxLine.getProperty("zt2_MachineTime"));// 标准值2 sub.VGE02 = (char*)("MIN");// 标准值单位2 sub.VGW05 = zt2_ReadinessTime;// (gxLine.getProperty("zt2_ReadinessTime"));// 标准值5 sub.VGE05 = (char*)("MIN");// 标准值单位5 subItems.push_back(sub); } _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS_SUBITEM* SUBITEM = new _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS_SUBITEM[subItems.size()]; for (int i = 0; i < subItems.size(); i++) { SUBITEM[i] = subItems[i]; } subitemsArr.__sizeSUBITEM = subItems.size(); subitemsArr.SUBITEM = SUBITEM; item.SUBITEMS = subitemsArr; return item; } //////获取工艺信息 void readBopInfo1YH(tag_t rev, tag_t partRev, boolean flag, map& gy_meops, vector& needTCM_meops, char* groupName, char* now, vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST>& proclist) { //"zt2_MaterialNo", "zt2_WBSNo" char* zt2_MaterialNo, *zt2_WBSNo; AOM_ask_value_string(partRev, "zt2_MaterialNo", &zt2_MaterialNo); AOM_ask_value_string(partRev, "zt2_WBSNo", &zt2_WBSNo); if (isTcm2(rev) && flag) return; if (gy_meops.count(zt2_MaterialNo) > 0) return; /*if (rev == null) { throw new Exception("权限不足,无法读取物料[" + zt2_MaterialNo + "]所关联工艺"); }*/ gy_meops[zt2_MaterialNo] = rev; //!needTCM_meops.contains(rev) if (std::find(needTCM_meops.begin(), needTCM_meops.end(), rev) == needTCM_meops.end()) needTCM_meops.push_back(rev); tag_t ebom_window, bom_line; ITKCALL(ME_create_bop_window(&ebom_window)); ITKCALL(BOM_set_window_top_line(ebom_window, NULL, rev, NULLTAG, &bom_line)); int c_line_count; tag_t* c_line_tags; ITKCALL(BOM_line_ask_all_child_lines(bom_line, &c_line_count, &c_line_tags)); if (c_line_count == 0) { return; } _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST proc_list; _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_HEAD head; head.PSPNR = zt2_WBSNo; head.MATNR = zt2_MaterialNo; head.DATUV = now;// 起始日期 head.PLNAL = (char*)"1";// 组计数器 head.STATU = (char*)"4";// 状态 head.VERWE = (char*)"1";// 用途 head.WERKS = groupName;// 工厂 _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS items; vector flowBeans; vector startLines = getFlowStartsYH(c_line_count, c_line_tags); tag_t part2; char* zt2_unit2; ITEM_ask_item_of_rev(partRev, &part2); AOM_ask_value_string(part2, "zt2_unit", &zt2_unit2); char* unit = getUnti(zt2_unit2); if (startLines.size() > 0) { char* itemID; //ITKCALL(AOM_ask_value_string(startLines[0], "item_id", &itemID)); log("找到工序流起始点 :\n"); } for (int i = 0; i < startLines.size(); i++) { FlowBean firstBean; log("startLines == \n"); char* idmte; tag_t gxRev; ITKCALL(AOM_ask_value_tag(startLines[i], "bl_line_object", &gxRev)); AOM_ask_value_string(gxRev, "item_id", &idmte); log("=====idmte=====%s====\n", idmte); readGXFlow(startLines[i], flowBeans, firstBean, i == 0, true); for (int i = 0; i < firstBean.flowList.size(); i++) { tag_t b = firstBean.flowList[i]; char* idmte; tag_t gxRev; ITKCALL(AOM_ask_value_tag(b, "bl_line_object", &gxRev)); AOM_ask_value_string(gxRev, "item_id", &idmte); log("=====ffirstBean.flowList=====%s====\n", idmte); } }// 打印流信息 if (flowBeans.size() > 0) { } else { // 无PERT数据 log("无PERT数据"); FlowBean bean; bean.isMain = true; for (int j = 0; j < c_line_count; j++) { tag_t gxLine = c_line_tags[j]; bean.flowList.push_back(gxLine); } // bean.print(); flowBeans.push_back(bean); } // 排序 getSort(flowBeans); // 读取BOP信息 _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM* gxInfo = new _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM[flowBeans.size()]; log("flowBeans %d \n", flowBeans.size()); for (int i = 0; i < flowBeans.size(); i++) { FlowBean bean = flowBeans[i]; /*bean.print();;*/ gxInfo[i] = getGXInfo(bean, i, partRev, unit, now); //gxInfo(getGXInfo(bean, i, partRev, p_uom, now)); } items.__sizeITEM = flowBeans.size(); items.ITEM = gxInfo; proc_list.HEAD = head; proc_list.ITEMS = items; proclist.push_back(proc_list); //for (int i = 0; i < flowBeans.size(); i++) { // FlowBean bean = flowBeans.get(i); // bean.print(); // gxInfo.add(SAPUtil.getGXInfo(bean, i, partRev, p_uom, now)); //} //proclist.add( // new DT_PROCESSROUTE_S4_REQLIST(head, gxInfo.toArray(new DT_PROCESSROUTE_S4_REQLISTITEMSITEM[]{}))); //window.clearCache(); //// window.refresh(); //window.closeBOPWindow(); //System.out.println("====读取工艺信息结束==="); ITKCALL(ME_close_bop_window(ebom_window)); } char* getUnti(char* unti) { char* s = _strupr(unti); return s; } // 记录已经存在的BOMList bomISExist void recurZYZZSAPYH(tag_t line, tag_t rev, vector& bomISExist, char* groupName, char* now, string& errMess, vector& set_meops, map& material_revs, vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST>& list, map& gy_meops, vector& needTCM_meops, vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST>& proclist) { char* zt2_Diagram, *item_id, *object_name, *zt2_MaterialNo, *zt2_WBSNo; //"zt2_Diagram","item_id","object_name","zt2_MaterialNo","zt2_WBSNo" AOM_ask_value_string(rev, "zt2_Diagram", &zt2_Diagram); AOM_ask_value_string(rev, "item_id", &item_id); AOM_ask_value_string(rev, "object_name", &object_name); AOM_ask_value_string(rev, "zt2_MaterialNo", &zt2_MaterialNo); AOM_ask_value_string(rev, "zt2_WBSNo", &zt2_WBSNo); string x = zt2_MaterialNo; log("item_id = [%s] \n", item_id); if (x.rfind("99", 0) == 0) { tag_t meops = getProcessTag(rev); if (meops != NULLTAG) { if (!isTcm2(meops)) { set_meops.push_back(meops); } readBopInfo1YH(meops, rev, true, gy_meops, needTCM_meops, groupName, now, proclist); } else { log("item_id22 = [%s] \n", item_id); } } int c_line_count; tag_t* c_line_tags; ITKCALL(BOM_line_ask_all_child_lines(line, &c_line_count, &c_line_tags)); log("child c_line_count %d \n", c_line_count); if (c_line_count == 0) { return; } _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_HEAD head; if (std::find(bomISExist.begin(), bomISExist.end(), zt2_MaterialNo) != bomISExist.end()) { return; } else { bomISExist.push_back(zt2_MaterialNo); } tag_t item; char* zt2_unit; ITEM_ask_item_of_rev(rev, &item); AOM_ask_value_string(item, "zt2_unit", &zt2_unit); char* unit = getUnti(zt2_unit); log("str = [%s] \n", unit); head.PSPNR = zt2_WBSNo; head.MATNR = zt2_MaterialNo; head.BMEIN = unit; head.STLAN = (char*)"1"; head.STLAL = (char*)"1"; head.BMENG = (char*)"1"; head.WERKS = groupName; head.DATUV = now; char* parnetUid; ITK__convert_tag_to_uid(rev, &parnetUid); head.STKTX = parnetUid; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM* items_items = new _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM[c_line_count]; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS items; for (int i = 0; i < c_line_count; i++) { string buff; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM items_item; tag_t c_line_tag = c_line_tags[i], rev2; ITKCALL(AOM_ask_value_tag(c_line_tag, "bl_line_object", &rev2)); char* prop0, *prop1, *prop2, *prop3, *prop4, *zt2_unit2; AOM_ask_value_string(rev2, "zt2_Diagram", &prop0); AOM_ask_value_string(rev2, "item_id", &prop1); AOM_ask_value_string(rev2, "object_name", &prop2); AOM_ask_value_string(rev2, "zt2_SapState", &prop3); AOM_ask_value_string(rev2, "zt2_MaterialNo", &prop4); tag_t part2; ITEM_ask_item_of_rev(rev2, &part2); AOM_ask_value_string(part2, "zt2_unit", &zt2_unit2); char* unit22 = getUnti(zt2_unit2); items_item.IDNRK = prop4; char* unit = unit22; items_item.MEINS = unit; items_item.DATUV = now; items_item.POSTP = (char*)"L"; char* bl_sequence_no, *bl_quantity, *ZT2_ClassificationNo, *ZT2_Remark; //"bl_sequence_no", "bl_quantity", "ZT2_ClassificationNo", "ZT2_Remark" AOM_ask_value_string(c_line_tag, "bl_sequence_no", &bl_sequence_no); AOM_ask_value_string(c_line_tag, "bl_quantity", &bl_quantity); AOM_ask_value_string(c_line_tag, "ZT2_ClassificationNo", &ZT2_ClassificationNo); AOM_ask_value_string(c_line_tag, "ZT2_Remark", &ZT2_Remark); items_item.POSNR = bl_sequence_no; //string sss = bl_quantity;//line2.getProperty("bl_quantity"); log("bl_quantity ===== %s\n", bl_quantity); if (strcmp(bl_quantity, "") == 0) { buff.append("未填写数量(bl_quantity);"); } double ddd = atof(bl_quantity); char* strff = new char[21]; sprintf(strff, "%.3f", ddd); items_item.MENGE = strff; items_item.SORTF = ZT2_ClassificationNo; if (strcmp(ZT2_ClassificationNo, "") == 0) { buff.append("BOM行未找到投料信息;"); } items_item.POTX1 = ZT2_Remark; items_items[i] = items_item; string msg; msg.append(prop1).append("-").append(prop2).append("(父项:") .append(item_id).append("-").append(object_name).append("):").append(buff); log("buff ===== %s\n", buff.c_str()); if (buff.length() > 0 && strstr(errMess.c_str(), msg.c_str()) == NULL) { errMess.append("\\n").append(msg); } if (strcmp(prop4, "") == 0) { material_revs[prop4] = rev2; } } //items. items.ITEM = items_items; items.__sizeITEM = c_line_count; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST list1; list1.HEAD = head; log("list1.HEAD %s\n ", list1.HEAD.BMEIN); list1.ITEMS = items; list.push_back(list1); } // 清楚为空的子项 //void removeNull(vector<_ns1__DT_USCOREBOM_USCOREPLM_USCOREREQ_LIST> list) { // for (int i = list.size() - 1; i >= 0; i--) { // _ns1__DT_USCOREBOM_USCOREPLM_USCOREREQ_LIST dt = list[i]; // _ns1__DT_USCOREBOM_USCOREPLM_USCOREREQ_LIST_ITEMS items = dt.ITEMS; // for (int j = 0; j < items.__sizeITEM; j++) { // // } // } //// for (int i = list.size() - 1; i >= 0; i--) { //// DT_BOM_PLM_REQLIST dt = list.get(i); //// List item_lists = new ArrayList(); //// DT_BOM_PLM_REQLISTITEMSITEM items[] = dt.getITEMS(); //// for (DT_BOM_PLM_REQLISTITEMSITEM item : items) { //// if (item != null) //// item_lists.add(item); //// /* //// * else { //KUtil.isEmpty(item.getDATUV()) } //// */ //// } //// if (item_lists == null || item_lists.size() == 0) //// list.remove(dt); //// else { //// DT_BOM_PLM_REQLISTITEMSITEM[] request = item_lists //// .toArray(new DT_BOM_PLM_REQLISTITEMSITEM[item_lists.size()]); //// dt.setITEMS(request); //// } //// } //} #define OBJECT_NAME "object_name" #define MATERIAL_NO "zt2_MaterialNo" void readSchemesYH(vector vectorRev, tag_t partRev, map>& scheme_boms, vector& bomISExist, map>& rev_meops, char* groupName, char* now, string& errMess, map& material_revs, map& gy_meops, vector& needTCM_meops, map>& process_boms, char* transfer, map> &inCcpMap) { vector set_meops; tag_t ebom_window; ITKCALL(BOM_create_window(&ebom_window)); //遍历产成品关联的电气BOM char* ccpMaterialNo; ITKCALL(AOM_ask_value_string(partRev, MATERIAL_NO, &ccpMaterialNo)); for (int i = 0; i < vectorRev.size(); i++) { tag_t rev = vectorRev[i], bom_line; char* cName, *zt2_MaterialNo, *zt2_BOMScheme, *revUid; ITK__convert_tag_to_uid(rev, &revUid); //material_revs 记录物料编码对应的产成品用来修改状态 ITKCALL(AOM_ask_value_string(rev, "object_name", &cName)); ITKCALL(AOM_ask_value_string(rev, "zt2_MaterialNo", &zt2_MaterialNo)); ITKCALL(AOM_UIF_ask_value(rev, "zt2_BOMScheme", &zt2_BOMScheme)); //判断名称是否存在 电气设计、铭牌壳体 if (strstr(cName, transfer) == NULL) { //判断是不是在对应的文件夹下 boolean pflag = false; int n_references = 0; int* levels = 0; tag_t* references_tag; char** relation_type_name = NULL; //通过引用关系找所在的文件夹 tag_t itemTag; ITKCALL(ITEM_ask_item_of_rev(rev, &itemTag)); ITKCALL(WSOM_where_referenced(itemTag, 1, &n_references, &levels, &references_tag, &relation_type_name)); for (int j = 0; j < n_references; j++) { tag_t refTag = references_tag[j]; char* folderName; ITKCALL(AOM_ask_value_string(refTag, OBJECT_NAME, &folderName)); if (strstr(folderName, transfer) != NULL) { pflag = true; break; } } //获取引用rev if (!pflag) { continue; } } if (scheme_boms.count(rev) > 0) { log("folderName = {} \n", zt2_MaterialNo); inCcpMap[revUid].push_back(ccpMaterialNo); continue; } vector ccpMaterialMap; ccpMaterialMap.push_back(ccpMaterialNo); inCcpMap[revUid] = ccpMaterialMap; //判断方案信息 //material_revs.put(zt2_MaterialNo, rev); ITKCALL(BOM_set_window_top_line(ebom_window, NULL, rev, NULLTAG, &bom_line)); vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> list; //记录单个电气BOM信息 vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist; recurZYZZSAPYH(bom_line, rev, bomISExist, groupName, now, errMess, set_meops, material_revs, list, gy_meops, needTCM_meops, proclist); /*List list = new ArrayList(); List proclist = new ArrayList();*/ if (list.size() > 0 && strcmp(zt2_BOMScheme, "汇总") == 0) { char* zt2_Quantity; ITKCALL(AOM_ask_value_string(rev, "zt2_Quantity", &zt2_Quantity)); if (strstr(zt2_Quantity, "") != 0) { int quantity = atoi(zt2_Quantity); if (quantity == 0) { quantity = 1; } int size = list.size(); char* s = new char[10]; _itoa(quantity, s, 10); list[size - 1].HEAD.BMENG = s; //head.BMENG = (char*)to_string(quantity).c_str(); } } log("电气BOM信息"); logBomMsg(list); if (proclist.size() > 0) { logProcessMsg(proclist); } scheme_boms[rev] = list; process_boms[rev] = proclist; } ITKCALL(BOM_close_window(ebom_window)); rev_meops[partRev] = set_meops; } char* getFLMDb2(string zt2_MaterialNo2, string groupName, map& flmMap) { vector matnr; split(zt2_MaterialNo2, "-", &matnr); string mes = matnr[0]; if (flmMap.count(mes) > 0) { return flmMap[mes]; } char* sortno = (char*)""; string sql = "select WLFLM from CHINT_GYGL_000 where ZZBM = '"; sql.append(groupName).append("' and WLMC = '/' and FABN = '").append(mes).append("'"); int outputColumn1 = 0, outputValueCount1 = 0; char*** outputValue1 = NULL; log("search3 ===> %s\n", sql.c_str()); QuerySQLNoInputParam((char*)sql.c_str(), &outputColumn1, &outputValueCount1, &outputValue1); if (outputValueCount1 > 0) { sortno = outputValue1[0][0]; } flmMap[mes] = sortno; log("sortno 分类码 [%s]\n", sortno); return sortno; // if (read.next()) { // sortno = read.getString("WLFLM"); // System.out.println("投料分类:" + sortno + "zt2_MaterialNo2==>" + zt2_MaterialNo2 + "groupName==>" + groupName); // } } char* getWlflm2(string fabn, map& flmMap) { char* wlflmMap = (char*)""; // 查询物料分类码 if (flmMap.count(fabn) > 0) { return flmMap[fabn]; } string query = "select WLFLM from CHINT_GYGL_000 where zzbm = 'M040' and WLMC = '/' and FABN = '%s' "; char selectRxfs[200]; sprintf(selectRxfs, query.c_str(), fabn.c_str()); int outputColumn1 = 0, outputValueCount1 = 0; char*** outputValue1 = NULL; log("search3 ===> %s\n", selectRxfs); QuerySQLNoInputParam(selectRxfs, &outputColumn1, &outputValueCount1, &outputValue1); for (int num = 0; num < outputValueCount1; num++) { //TarGXCODE\", \"TarGXNAME\", \"TemGXCODE\", \"TemGXNAME wlflmMap = outputValue1[num][0]; } flmMap[fabn] = wlflmMap; return wlflmMap; } /** * 获取BOM详细信息 产成品下的单元信息 * @param ccp 产成品对象 * @param schemes 产成品下面的单元 * @param list 记录BOM xml * @param proclist 记录工艺路线xml * @param isSends 记录已经传递的对象 * @param txtPath 没用上 * @param material_revs 记录需要修改属性的产成品(只记录了,修改在回传) * @param groupName 组ID M040 * @param now 当前时间 * @param scheme_boms 单元 对应 单元下面的BOM * @param gy_meops 记录工艺工步信息 * @param needTCM_meops 记录需要发布的工艺路线 * @param flmMap 记录辅料信息 * @param isExistBom 记录已经组织的数据 */ void readBomInfoYH(tag_t ccp, vector schemes, vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST>& list, vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST>& proclist, vector isSends, string txtPath, map& material_revs, char* groupName, char* now, map> scheme_boms, map& gy_meops, vector& needTCM_meops, map& flmMap, map &isExistBom) { char* zt2_MaterialNo, *zt2_WBSNo, *zt2_BOMScheme, *zt2_Quantity, *zt2_unit2; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_HEAD head; AOM_ask_value_string(ccp, "zt2_MaterialNo", &zt2_MaterialNo); AOM_ask_value_string(ccp, "zt2_WBSNo", &zt2_WBSNo); AOM_UIF_ask_value(ccp, "zt2_BOMScheme", &zt2_BOMScheme); AOM_ask_value_string(ccp, "zt2_Quantity", &zt2_Quantity); tag_t part2; ITEM_ask_item_of_rev(ccp, &part2); AOM_ask_value_string(part2, "zt2_unit", &zt2_unit2); char* unit2 = getUnti(zt2_unit2); material_revs[zt2_MaterialNo] = ccp; head.PSPNR = (zt2_WBSNo); head.MATNR = (zt2_MaterialNo); head.STLAN = (char*)("1"); head.STLAL = (char*)("1"); head.BMENG = (char*)("1"); if (strcmp("汇总", zt2_BOMScheme) == 0) { if (strstr(zt2_Quantity, "") != 0) { int quantity = atoi(zt2_Quantity); if (quantity == 0) { quantity = 1; } char* s = new char[10]; _itoa(quantity, s, 10); head.BMENG = s; } } head.WERKS = groupName; head.BMEIN = unit2; head.DATUV = now; char* parnetUid; ITK__convert_tag_to_uid(ccp, &parnetUid); head.STKTX = parnetUid; tag_t meops = getProcessTag(ccp); //c产成品工艺 if (meops != NULLTAG) { char* itemId; AOM_ask_value_string(meops, "item_id", &itemId); log("processId %s \n", itemId); readBopInfo1YH(meops, ccp, true, gy_meops, needTCM_meops, groupName, now, proclist); } else { vector vecc; tag_t item, lastRev = NULLTAG; split(zt2_MaterialNo, "-", &vecc); ITEM_find_item(vecc[0].c_str(), &item); ITEM_ask_latest_rev(item, &lastRev); //log("vecc[0].c_str()%s\n", vecc[0].c_str()); if (lastRev != NULLTAG) { log("1"); tag_t meops2 = getProcessTag(lastRev); readBopInfo1YH(meops2, ccp, false, gy_meops, needTCM_meops, groupName, now, proclist); } } _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM* items_items = new _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM[schemes.size()]; for (int i = 0; i < schemes.size(); i++) { tag_t rev2 = schemes[i]; char* prop1, *propp2; AOM_ask_value_string(rev2, "zt2_MaterialNo", &prop1); AOM_ask_value_string(rev2, "object_name", &propp2); _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM items_item; char* flm = getFLMDb2(prop1, groupName, flmMap); items_item.SORTF = flm; items_item.DATUV = now; items_item.POSTP = (char*)"L"; items_item.POSNR = (char*)""; items_item.IDNRK = prop1; items_item.MENGE = (char*)"1"; items_item.POTX1 = (char*)""; if (strstr(prop1, "-") != NULL) { vector vecc; split(prop1, "-", &vecc); char* flm2 = getWlflm2(vecc[0], flmMap); items_item.SORTF = flm2; } char* zt2_unit22; tag_t part22; ITEM_ask_item_of_rev(rev2, &part22); AOM_ask_value_string(part22, "zt2_unit", &zt2_unit22); char* unit22 = getUnti(zt2_unit22); items_item.MEINS = unit22; items_items[i] = items_item; if (std::find(isSends.begin(), isSends.end(), rev2) != isSends.end()) continue; else isSends.push_back(rev2); if (scheme_boms.count(rev2) > 0 && isExistBom.count(rev2) == 0) { isExistBom[rev2] = (char*)"test"; vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> lists = scheme_boms[rev2]; for (int j = 0, len = lists.size(); j < len; j++) { if (j != len - 1) { list.push_back(lists[j]); } else { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST dt = lists[j]; dt.HEAD.PSPNR = zt2_WBSNo; list.push_back(dt); } } } } _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS items; items.ITEM = items_items; items.__sizeITEM = schemes.size(); _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST list22; list22.HEAD = head; list22.ITEMS = items; list.push_back(list22); } char* getNotNullMsg(char* msg) { if (msg == NULL) { return (char*)""; } else { return msg; } } /** * 记录出厂编号信息日志 */ void logCcbh(vector<_ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM> list_Factorys) { string msg = ""; for (int i = 0; i < list_Factorys.size(); i++) { _ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM list_Factory = list_Factorys[i]; msg.append("PSPID = ").append(getNotNullMsg(list_Factory.PSPID)).append(" "); msg.append("RSPOS = ").append(getNotNullMsg(list_Factory.RSPOS)).append(" "); msg.append("SERNR = ").append(getNotNullMsg(list_Factory.SERNR)).append(" "); msg.append("MATNR = ").append(getNotNullMsg(list_Factory.MATNR)).append(" "); msg.append("WERKS = ").append(getNotNullMsg(list_Factory.WERKS)).append(" "); msg.append("ZGH = ").append(U2G(getNotNullMsg(list_Factory.ZGH))).append(" "); msg.append("ZPSPID = ").append(getNotNullMsg(list_Factory.ZPSPID)).append(" "); msg.append("ZZD = ").append(getNotNullMsg(list_Factory.ZZD)).append("\n"); } log(" 出厂编号信息:\n {} \n\n", msg); } /** * 记录工艺路线信息日志 */ void logProcessMsg(vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist) { log("start log ProecessMSG %d \n", proclist.size()); string msg = ""; for (int i = 0; i < proclist.size(); i++) { _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST list = proclist[i]; _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_HEAD head = list.HEAD; msg.append("MATNR= ").append(getNotNullMsg(head.MATNR)).append(" "); msg.append("WERKS= ").append(getNotNullMsg(head.WERKS)).append(" "); msg.append("VERWE= ").append(getNotNullMsg(head.VERWE)).append(" "); msg.append("STATU= ").append(getNotNullMsg(head.STATU)).append(" "); msg.append("DATUV= ").append(getNotNullMsg(head.DATUV)).append(" "); msg.append("PLNAL= ").append(getNotNullMsg(head.PLNAL)).append(" "); msg.append("PSPNR= ").append(getNotNullMsg(head.PSPNR)).append("\n["); _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS items = list.ITEMS; _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM* items_item = items.ITEM; for (int j = 0; j < items.__sizeITEM; j++) { _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM item_item = items_item[j]; msg.append("PLNAL= ").append(getNotNullMsg(item_item.PLNAL)).append(" "); msg.append("PLNFL= ").append(getNotNullMsg(item_item.PLNFL)).append(" "); msg.append("DATUV= ").append(getNotNullMsg(item_item.DATUV)).append(" "); msg.append("FLGAT= ").append(getNotNullMsg(item_item.FLGAT)).append(" "); msg.append("BEZFL= ").append(getNotNullMsg(item_item.BEZFL)).append(" "); msg.append("LTXA1= ").append(U2G(getNotNullMsg(item_item.LTXA1))).append(" "); msg.append("VORNR1= ").append(getNotNullMsg(item_item.VORNR1)).append(" "); msg.append("VORNR2= ").append(getNotNullMsg(item_item.VORNR2)).append("\n"); _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS subItems = item_item.SUBITEMS; _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS_SUBITEM* sbuItemSubItems = subItems.SUBITEM; msg.append("["); for (int x = 0; x < subItems.__sizeSUBITEM; x++) { _ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST_ITEMS_ITEM_SUBITEMS_SUBITEM sbuItemSubItem = sbuItemSubItems[x]; msg.append("VORNR= ").append(getNotNullMsg(sbuItemSubItem.VORNR)).append(" "); msg.append("ARBPL= ").append(getNotNullMsg(sbuItemSubItem.ARBPL)).append(" "); msg.append("STEUS= ").append(getNotNullMsg(sbuItemSubItem.STEUS)).append(" "); msg.append("LTXA1= ").append(U2G(getNotNullMsg(sbuItemSubItem.LTXA1))).append(" "); msg.append("USR00= ").append(getNotNullMsg(sbuItemSubItem.USR00)).append(" "); msg.append("BMSCH= ").append(getNotNullMsg(sbuItemSubItem.BMSCH)).append(" "); msg.append("PLNME= ").append(getNotNullMsg(sbuItemSubItem.PLNME)).append(" "); msg.append("VGW01= ").append(getNotNullMsg(sbuItemSubItem.VGW01)).append(" "); msg.append("VGE01= ").append(getNotNullMsg(sbuItemSubItem.VGE01)).append(" "); msg.append("VGW02= ").append(getNotNullMsg(sbuItemSubItem.VGW02)).append(" "); msg.append("VGE02= ").append(getNotNullMsg(sbuItemSubItem.VGE02)).append(" "); msg.append("VGW05= ").append(getNotNullMsg(sbuItemSubItem.VGW05)).append(" "); msg.append("VGE05= ").append(getNotNullMsg(sbuItemSubItem.VGE05)).append("\n"); } msg.append("]\n"); } msg.append("]\n"); } log(" 开始记录PROCESS信息====> \n {} \n\n", msg); } /** * 记录BOM信息日志 */ void logBomMsg(vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> lists) { string msg = ""; for (int i = 0; i < lists.size(); i++) { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST list = lists[i]; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_HEAD head = list.HEAD; msg.append("PSPNR= ").append(getNotNullMsg(head.PSPNR)).append(" "); msg.append("MATNR= ").append(getNotNullMsg(head.MATNR)).append(" "); msg.append("WERKS= ").append(getNotNullMsg(head.WERKS)).append(" "); msg.append("DATUV= ").append(getNotNullMsg(head.DATUV)).append(" "); msg.append("STLAN= ").append(getNotNullMsg(head.STLAN)).append(" "); msg.append("STLAL= ").append(getNotNullMsg(head.STLAL)).append(" "); msg.append("BMENG= ").append(getNotNullMsg(head.BMENG)).append(" "); msg.append("BMEIN= ").append(getNotNullMsg(head.BMEIN)).append(" "); msg.append("STKTX= ").append(getNotNullMsg(head.STKTX)).append("\n["); _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS items = list.ITEMS; _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM* items_item = items.ITEM; for (int j = 0; j < items.__sizeITEM; j++) { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST_ITEMS_ITEM item_item = items_item[j]; msg.append("DATUV= ").append(getNotNullMsg(item_item.DATUV)).append(" "); msg.append("POSTP= ").append(getNotNullMsg(item_item.POSTP)).append(" "); msg.append("POSNR= ").append(getNotNullMsg(item_item.POSNR)).append(" "); msg.append("IDNRK= ").append(getNotNullMsg(item_item.IDNRK)).append(" "); msg.append("MENGE= ").append(getNotNullMsg(item_item.MENGE)).append(" "); msg.append("MEINS= ").append(getNotNullMsg(item_item.MEINS)).append(" "); msg.append("SORTF= ").append(getNotNullMsg(item_item.SORTF)).append(" "); msg.append("POTX1= ").append(getNotNullMsg(item_item.POTX1)).append("\n"); } msg.append("]\n"); } log(" 开始记录BOM信息====> \n {} \n\n", msg); } /** * 记录传递信息到DETAILS表中 回传用 * @param bomMsg 组织的xml信息 * @param isExistTag 判断单元是否多次出现 * @param ccpTagMap 获取单元对应的产成品物料编码 * @param code 传递号 * @param batchNum 批次号 */ void logBatabase(_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST bomMsg, map &isExistTag, map> ccpTagMap, char *code, string batchNum, char *groupId, char*wbsNo) { char* topUid = bomMsg.HEAD.STKTX, *itemId, *topMatnrNo; string materialNoTmp = ""; if (ccpTagMap.count(topUid) == 0) { materialNoTmp = bomMsg.HEAD.MATNR; } else { vector ccps = ccpTagMap[topUid]; for (int i = 0; i < ccps.size(); i++) { if (i > 0) { materialNoTmp.append(";").append(ccps[i]); } else { materialNoTmp.append(ccps[i]); } } } if (isExistTag.count(topUid) == 0) { //插入详情数据表 tag_t topTag; ITK__convert_uid_to_tag(topUid, &topTag); AOM_ask_value_string(topTag, "item_id", &itemId); AOM_ask_value_string(topTag, "zt2_MaterialNo", &topMatnrNo); isExistTag[topUid] = materialNoTmp.c_str(); string insertSql = "insert into CHINT_BOM_TO_SAP_DETIALS (code,batchnumber,plmsendstatus,plmsendstarttime,factory,productmaterialno,pitemid,puid,materialno,wbsno,plmstatus) VALUES ('%s','%s','PLM开始传递',SYSDATE,'%s','%s','%s','%s','%s','%s','未处理') "; char selectRxfs[3000]; sprintf(selectRxfs, insertSql.c_str(), code, batchNum.c_str(), groupId, materialNoTmp.c_str(), itemId, topUid, topMatnrNo, wbsNo); log("selectRecord2 ===> %s\n", selectRxfs); ExecuteSQLNoInputParam(selectRxfs); ExecuteSQLNoInputParam((char*)"commit"); } else { string updateSql = "update CHINT_BOM_TO_SAP_DETIALS set productmaterialno = '%s' where batchnumber = '%s'"; char selectRxfs[3000]; sprintf(selectRxfs, updateSql.c_str(), materialNoTmp.c_str(), batchNum.c_str()); log("selectRecord2 ===> %s\n", selectRxfs); ExecuteSQLNoInputParam(selectRxfs); ExecuteSQLNoInputParam((char*)"commit"); } log("========="); return; } /** * 计算传递的耗时 * @param code 传递号 */ string getPlmTime(char *code) { string getMsg = "select trunc((sysdate - plmstarttime) * 24)||'h:'||trunc(mod((sysdate - plmstarttime) * 24 * 60, 60))||'min:'|| trunc(mod((sysdate - plmstarttime) * 24 * 60 * 60, 60))||'s' tim from CHINT_BOM_TO_SAP_SUM where code = %s "; char selectRxfs[600]; string timel; sprintf(selectRxfs, getMsg.c_str(), code); int outputColumn1 = 0, outputValueCount1 = 0; char*** outputValue1 = NULL; log("selectRecord2 ===> %s\n", selectRxfs); QuerySQLNoInputParam(selectRxfs, &outputColumn1, &outputValueCount1, &outputValue1); for (int num = 0; num < outputValueCount1; num++) { //TarGXCODE\", \"TarGXNAME\", \"TemGXCODE\", \"TemGXNAME timel = outputValue1[num][0]; } return timel; } /** * 分批次传递BOM至SAP * @param groupId 用户所在组ID * @param mapList 记录 产成品对应的BOM信息 * @param code 传递号 * @param wbsNo WBS号 * @param inCcpMap 单元对应产成品的物料编码 1对多 */ void startSplitSend(char*groupId, map> mapList, char *code, char *wbsNo, map> inCcpMap) { int url_num = 0; char** url_vals = NULL; //首选项配置组对应的拆分方法 PREF_ask_char_values("CHINT_SAPBOM_SPLIT", &url_num, &url_vals); int cfNum = 1; // 拆分传递的数量 int type = 0; //0产成品维度 1 BOM for (int j = 0; j < url_num; j++) { vector vec; Split(url_vals[j], ":", vec); if (vec.size() == 3) { if (strcmp(groupId, vec[0].c_str()) == 0) { if (strcmp("BOM", vec[1].c_str()) == 0) { type = 1; } cfNum = atoi(vec[2].c_str()); } } } log("====url_vals===={} {} \n", cfNum, mapList.size()); int batchNum = 1; int numberCnt = 0; map ccpMap; //map> ccpTagMap; //传递BOM 按产成品数量拆分传递 if (type == 0) { int count = 1; vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> list; for (auto it = mapList.begin(); it != mapList.end(); ++it) { //std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl; tag_t ccp = it->first; vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST > bomList = mapList[ccp]; log("====bomList====%d \n", bomList.size()); logBomMsg(bomList); for (int i = 0; i < bomList.size(); i++) { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST bomMsg = bomList[i]; /*if (ccpTagMap.count(bomMsg.HEAD.STKTX) > 0) { ccpTagMap[bomMsg.HEAD.STKTX].push_back(ccp); } else { vector< tag_t> ccpVector; ccpVector.push_back(ccp); ccpTagMap[bomMsg.HEAD.STKTX] = ccpVector; }*/ list.push_back(bomMsg); } if (count == mapList.size()) { numberCnt = numberCnt + 1; string batchMsg; char numMsg[128] = ""; sprintf_s(numMsg, "%05d", batchNum); batchMsg.append(code).append("-").append(numMsg); log("batchMsg%s\n", batchMsg.c_str()); for (int i = 0; i < list.size(); i++) { log("i.size() ===> %d \n", i); _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST bomMsg = list[i]; logBatabase(bomMsg, ccpMap, inCcpMap, code, batchMsg, groupId, wbsNo); } log(" start SEND ===\n"); sendBom(list, batchMsg); batchNum = batchNum + 1; list.clear(); } else if (count % cfNum == 0) { numberCnt = numberCnt + 1; string batchMsg; char numMsg[128] = ""; sprintf_s(numMsg, "%05d", batchNum); batchMsg.append(code).append("-").append(numMsg); log("batchMsg%s\n", batchMsg.c_str()); log("list.size() ===> %d \n", list.size()); for (int i = 0; i < list.size(); i++) { log("i.size() ===> %d \n", i); _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST bomMsg = list[i]; logBatabase(bomMsg, ccpMap, inCcpMap, code, batchMsg, groupId, wbsNo); //log("i.size() ===> %d \n", i); } log(" start SEND ==="); sendBom(list, batchMsg); batchNum = batchNum + 1; list.clear(); } count++; } } else { //按BOM数量拆分传递 int count = 1; vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> list; for (auto it = mapList.begin(); it != mapList.end(); ++it) { //std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl; tag_t ccp = it->first; vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST > bomList = mapList[ccp]; for (int i = 0; i < bomList.size(); i++) { list.push_back(bomList[i]); if (list.size() % cfNum == 0) { numberCnt = numberCnt + 1; string batchMsg; char numMsg[128] = ""; sprintf_s(numMsg, "%05d", batchNum); batchMsg.append(code).append("-").append(numMsg); for (int i = 0; i < list.size(); i++) { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST bomMsg = list[i]; logBatabase(bomMsg, ccpMap, inCcpMap, code, batchMsg, groupId, wbsNo); } sendBom(list, batchMsg); batchNum = batchNum + 1; list.clear(); } } if (count == mapList.size() && list.size()>0) { string batchMsg; char numMsg[128] = ""; sprintf_s(numMsg, "%05d", batchNum); numberCnt = numberCnt + 1; batchMsg.append(code).append("-").append(numMsg); for (int i = 0; i < list.size(); i++) { _ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST bomMsg = list[i]; logBatabase(bomMsg, ccpMap, inCcpMap, code, batchMsg, groupId, wbsNo); } sendBom(list, batchMsg); batchNum = batchNum + 1; list.clear(); } count++; } } string time1 = getPlmTime(code); string updateSum = "update CHINT_BOM_TO_SAP_SUM set \"NUMBER\" = %d ,datastatus = '数据正常推送SAP',organizationaltime = '%s',taskstauts = '组织完成',PLMFINISHTIME = SYSDATE where code = '%s' "; char selectRxfs[800]; string timel; sprintf(selectRxfs, updateSum.c_str(), numberCnt, time1.c_str(), code); log("selectRecord2 ===> %s\n", selectRxfs); ExecuteSQLNoInputParam(selectRxfs); ExecuteSQLNoInputParam((char*)"commit"); } #define SEND_MSG "发起的 \\\"" #define SPLIT_MSG "\\\" \\\"" #define CODE_MSG "\\\" 项目已经处理完毕, 任务号: " #define TYPE_MSG ", 传递类型: " #define RESULT_MSG ", 本次传递结果为: PLM检查未通过。具体原因:\\n" /** * 错误信息发送飞书通知 * @param code 传递的编号code * @param errMsg 错误信息 * @param wbsNo 项目的WBS号 * @param userName 用户名称 * @param projectName 项目名称 */ void sendNotice(char *code, string errMsg, char *wbsNo, char *userName, char* projectName) { /*string noticeMsg = "项目BOM传递异常WBS:"; noticeMsg.append(wbsNo).append("\n").append(errMsg);*/ string search = "select userid,TO_CHAR(STARTTIME,'yyyy-MM-dd HH24:mi:ss'),transfer from CHINT_BOM_TO_SAP_SUM where code = '%s' "; char selectRxfs[600]; string userNameStr = "wangll06"; string startTime, transfer; //获取发起的时间 sprintf(selectRxfs, search.c_str(), code); int outputColumn1 = 0, outputValueCount1 = 0; char*** outputValue1 = NULL; log("selectRecord2 ===> %s\n", selectRxfs); QuerySQLNoInputParam(selectRxfs, &outputColumn1, &outputValueCount1, &outputValue1); for (int num = 0; num < outputValueCount1; num++) { userNameStr = outputValue1[num][0]; startTime = outputValue1[num][1]; transfer = outputValue1[num][2]; } string noticeMsg = "【PLM系统自动通知】:"; noticeMsg.append(startTime).append(" ") .append(userName).append(SEND_MSG) .append(wbsNo).append(SPLIT_MSG) .append(projectName).append(CODE_MSG) .append(code).append(TYPE_MSG).append(transfer).append(RESULT_MSG) .append(errMsg); string json = "{"; json.append("\"mobiles\":").append("[\"13588843438\",\"15295371103\"],"); json.append("\"emails\":").append("["); json.append("\"").append(userNameStr).append("\"],"); json.append("\"sms\":").append("false,"); json.append("\"content\":\"").append(noticeMsg).append("\""); json.append("}"); log(" 项目数据组织错误信息 :%s \n", json.c_str()); string returnMsg = callFsHttpserver(json, "http://10.128.10.170/api/feishu/Message/sendMessages"); log(" 飞书通知结果 :%s \n", returnMsg.c_str()); } /** * 根据产成品获取出厂编号 和电气设计下的BOM * @param ccpVector 产成品的集合 * @param projectNo 项目编号 * @param groupName 用户所在的组 * @param wbs 项目的WBS号 * @param now 当前时间 * @param errMsgBuf 错误信息 * @param code 传递的编号code * @param transfer 传递类型 电气设计 * @param userName 用户名称 * @param projectName 项目名称 */ void getCcpAndBom(vector ccpVector, char* projectNo, char* groupName, char* wbs, char* now, string& errMsgBuf, char*code, char* transfer, char* userName, char* projectName) { //记录是否有重复的出厂编号 vector isCheck_FactoryNos; //记录产成品 对应的 电气BOM集合 map> cPart_schemes; vector<_ns1__DT_USCOREFACTORY_USCORENUMBER_USCOREREQ_ITEMS_ITEM> list_Factorys; for (int len = 0; len < ccpVector.size(); len++) { vector elcBoms; tag_t ccp = ccpVector[len], *factoryNos; char* ccpUid; ITK__convert_tag_to_uid(ccp, &ccpUid); log("产成品UID:%s\n", ccpUid); ITKCALL(AOM_refresh(ccp, FALSE)); int num = 0; ITKCALL(AOM_ask_value_tags(ccp, "ZT2_FactoryNumber", &num, &factoryNos)); if (num == 0) { cPart_schemes[ccp] = elcBoms; } else { if (cPart_schemes.count(ccp) > 0) { continue; }//组织传递出厂编号的 getFactoryNoList(projectNo, groupName, wbs, factoryNos, num, ccp, list_Factorys); map> items2; for (int i = 0; i < num; i++) { tag_t factoryNo = factoryNos[i]; if (std::find(isCheck_FactoryNos.begin(), isCheck_FactoryNos.end(), factoryNo) != isCheck_FactoryNos.end()) continue; isCheck_FactoryNos.push_back(factoryNos[i]); int n_references = 0; int* levels = 0; tag_t* references_tag; char** relation_type_name = NULL; //通过引用关系查找到变更单 ITKCALL(WSOM_where_referenced(factoryNo, 1, &n_references, &levels, &references_tag, &relation_type_name)); //新增逻辑,获取下产成品的ITEM防止多个版本影响 tag_t ccpItem; char* ccpItemUid; ITEM_ask_item_of_rev(ccp, &ccpItem); ITK__convert_tag_to_uid(ccpItem, &ccpItemUid); log("===========%d \n", n_references); for (int i = 0; i < n_references; i++) { char* refType, *grpName, *useUid, *object_name, *zt2_SapState; tag_t refTag = references_tag[i], group, item; AOM_ask_value_string(refTag, "object_type", &refType); if (strcmp(refType, "Part Revision") != 0) { continue; } ITK__convert_tag_to_uid(refTag, &useUid); //判断不是产成品 并且同一组 AOM_ask_value_tag(refTag, "owning_group", &group); AOM_ask_value_string(group, "name", &grpName); if (strcmp(grpName, groupName) != 0 || strcmp(ccpUid, useUid) == 0) continue; AOM_UIF_ask_value(refTag, "object_name", &object_name); AOM_UIF_ask_value(refTag, "zt2_SapState", &zt2_SapState); if (strcmp(zt2_SapState, "1") == 0 || strcmp(zt2_SapState, "未传") == 0) { continue; } ITEM_ask_item_of_rev(refTag, &item); char* unitUid; ITK__convert_tag_to_uid(item, &unitUid); if (strcmp(unitUid, ccpItemUid) == 0) { continue; } log("useUid %s object_name %s \n", useUid, object_name); if (items2.count(item) > 0) { items2[item].push_back(refTag); } else { vector revs2; revs2.push_back(refTag); items2[item] = revs2; } } } vector rev2 = addLastRev(items2); cPart_schemes[ccp] = rev2; } } //传递出厂编号的记录日志信息 log("出厂编号数量 num :{} \n\n\n", list_Factorys.size()); logCcbh(list_Factorys); sendFactoryNo(list_Factorys); string errMess;//记录BOM错误信息 map material_revs; //记录需要修改属性的产成品 vector set_meops; //记录需要发布的工艺路线 map gy_meops; //避免重复工艺路线 vector needTCM_meops;//没用上 map>::iterator it; map> scheme_boms;//记录产成品关联的BOM传递的信息 map> process_boms; vector bomISExist;//记录物料编码防止重复 //名称模糊匹配 map> rev_meops; map> inCcpMap;//记录单元对应的产成品物料编码 for (it = cPart_schemes.begin(); it != cPart_schemes.end(); it++) { tag_t s = it->first; vector vectorRev = cPart_schemes[s]; log("vectorRev size 遍历BOM {} \n", vectorRev.size()); readSchemesYH(vectorRev, s, scheme_boms, bomISExist, rev_meops, groupName, now, errMess, material_revs, gy_meops, needTCM_meops, process_boms, transfer, inCcpMap); log("scheme_boms {} \n", scheme_boms.size()); } if (errMess.length() > 0) { errMsgBuf.append("BOM异常:\\n").append(errMess); // string updateSum = "update CHINT_BOM_TO_SAP_SUM set \"DATASTATUS\" = '数据检查有问题' ,SAPRESULT = 'PLM检查未通过',PLMRESULT = '已发送飞书通知' where code = '%s' "; char selectRxfs[800]; string timel; sprintf(selectRxfs, updateSum.c_str(), code); log("selectRecord2 ===> %s\n", selectRxfs); ExecuteSQLNoInputParam(selectRxfs); ExecuteSQLNoInputParam((char*)"commit"); //错误数据已发送飞书提醒 sendNotice(code, errMsgBuf, wbs, userName, projectName); return; } vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist; //vector< vector<_ns1__DT_USCOREBOM_USCOREPLM_USCOREREQ_LIST>> lists; //vector< vector<_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST>> proclists; vector isSends; //vector errorParts; //vector successParts; map isExistBom; //已经传递过的单元不再传递 map flmMap; string sendErrMsg; map> mapList; for (int i = 0; i < ccpVector.size(); i++) { //list.clear(); proclist.clear(); vector<_ns1__DT_USCOREBOM_USCORES4_USCOREREQ_LIST> list; //记录单个电气BOM信息 tag_t ccp = ccpVector[i]; if (cPart_schemes.count(ccp) > 0) { vector schemes = cPart_schemes[ccp]; string sendMsg; log("schemes size %d \n", schemes.size()); //产成品没有电气单元就跳过 if (schemes.size() == 0) { continue; } readBomInfoYH(ccp, schemes, list, proclist, isSends, "", material_revs, groupName, now, scheme_boms, gy_meops, needTCM_meops, flmMap, isExistBom); if (list.size() > 0) { //logBomMsg(list); mapList[ccp] = list; } if (proclist.size() > 0) { logProcessMsg(proclist);// vector <_ns1__DT_USCOREPROCESSROUTE_USCORES4_USCOREREQ_LIST> proclist; sendProcess(proclist, sendMsg);//proclists.push_back(proclist);//sendProcess(proclist); } } } /*if (errorParts.size() > 0) { errMsgBuf.append("BOM传递发生异常:\n").append(sendErrMsg); } else { string endBuff; for (int j = 0; j < successParts.size(); j++) { char* object_string; AOM_ask_value_string(successParts[j], "object_string", &object_string); endBuff.append(object_string).append("\n"); } errMsgBuf.append("传递成功:\n").append(endBuff); }*/ if (mapList.size() > 0) { //传递BOM //logBomMsg(list); //sendBom(list, sendMsg); startSplitSend(groupName, mapList, code, wbs, inCcpMap); //sendBom(list); } else { string time1 = getPlmTime(code); string updateSum = "update CHINT_BOM_TO_SAP_SUM set datastatus = '没有合法BOM',organizationaltime = '%s',taskstauts = '组织完成',PLMFINISHTIME = SYSDATE where code = '%s' "; char selectRxfs[800]; string timel; sprintf(selectRxfs, updateSum.c_str(), time1.c_str(), code); log("selectRecord2 ===> %s\n", selectRxfs); ExecuteSQLNoInputParam(selectRxfs); ExecuteSQLNoInputParam((char*)"commit"); } } //void startLog() { // tag_t current_member = NULLTAG, current_user = NULLTAG; // char* user_id = ""; // // SA_ask_current_groupmember(¤t_member); // SA_ask_groupmember_user(current_member, ¤t_user); // SA_ask_user_identifier2(current_user, &user_id); // // string userId = user_id; // //获取当前时间 // time_t now = time(0); // tm* p = localtime(&now); // char dateNow[128] = ""; // sprintf_s(dateNow, "%04d%02d%02d%02d%02d%02d", 1900 + p->tm_year, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec); // string dateString = dateNow; // auto file_logger = basic_logger_mt("import_logger", "C:/logs/" + userId + "_" + dateString + ".log"); // set_default_logger(file_logger); // log("begin connor_import_object"); //} /** * 根据产成品获取出厂编号 和电气设计下的BOM * @param ccpVector 产成品的集合 * @param groupName 用户所在的组 * @param projectUid 项目的UID * @param code 传递的编号code * @param userName 用户ID */ int readBomMsg(vector ccpVector, char * groupName, char* projectUid, char*code, char *userName) { char* revUid; int ifail = ITK_ok, num = 0; //startLog(); //链接TC数据库 string errorBuff; tag_t project; time_t now = time(0); tm* p = localtime(&now); char fileDate[128] = ""; sprintf_s(fileDate, "%04d%02d%02d", 1900 + p->tm_year, p->tm_mon + 1, p->tm_mday); string nowTime = fileDate; tag_t ccp; ITK__convert_uid_to_tag(projectUid, &project); char* projectNo, *zt2_WBSNo, *objectName; //project.getProperty("zt2_ProjectNo"); AOM_ask_value_string(project, "zt2_ProjectNo", &projectNo); AOM_ask_value_string(project, "object_name", &objectName); AOM_ask_value_string(project, "zt2_WBSNo", &zt2_WBSNo); log("ccpVector%d\n", ccpVector.size()); //查询传递类型 char* transfer = (char*)"电气设计"; string sql = "select transfer from CHINT_BOM_TO_SAP_SUM where code = "; sql.append(code); int outputColumn1 = 0, outputValueCount1 = 0; char*** outputValue1 = NULL; log("search3 ===> :{}\n", sql.c_str()); QuerySQLNoInputParam((char*)sql.c_str(), &outputColumn1, &outputValueCount1, &outputValue1); if (outputValueCount1 > 0) { transfer = outputValue1[0][0]; } log("transfer ===> :{}\n", transfer); getCcpAndBom(ccpVector, projectNo, groupName, zt2_WBSNo , fileDate, errorBuff, code, transfer, userName, objectName); /*log("errorBuff ===>%s\n", errorBuff.c_str()); *((char**)returnValue) = (char*)MEM_alloc((strlen(errorBuff.c_str()) + 1) * sizeof(char)); tc_strcpy(*((char**)returnValue), errorBuff.c_str());*/ log("end connor_import_object"); //spdlog::drop_all(); return ITK_ok; }