xj qian
2024-07-17 b1d01ea6fa62ce12c2e592b3315186f6b3c8359d
jrj/project/business/SystemSettings/Flow3.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,476 @@
#include <wobject/xstring.hpp>
#include <xcontrol/xtreeview.hpp>
#include <xcontrol/xdwgrid.hpp>
#include <wobject/xdouble.hpp>
#include <xcontrol/xlayersheet.hpp>
#include <xcontrol/xdatetimepick.hpp>
#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
#include "viewobject/view.base.hpp"
using xml = KXMLDOMDocument;
   class  __declspec(dllexport) flow :  public xframe
   {
   public:
      xtreeview tv_1;
      xlayersheet   tab_1;
      xdwgrid   dw_flow;
      xdwgrid   dw_state;
      xdwgrid   dw_button;
      xdwgrid   dw_role;
      xdwgrid   dw_bill;
      xdwgrid   dw_scene;
      xdwgrid   dw_buttonright;
      xdwgrid   dw_datafieldright;
      xstring    flowid;
      xtreeview tv_folder;
      xnode   m_agentNode;   //Agent Condition
   public:
      flow(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
   public:
      static flow* CreateInstance(void* implPtr, void* hWnd)
      {
         flow* pWin = new flow(implPtr, (HWND)hWnd);
         return pWin;
      }
      xstring GetSheetType(int index)
      {
         if (index == 0)  return L"flowitem";
         else if (index == 1) return L"state";
         else if (index == 2) return L"actionrole";
         else if (index == 3) return L"button";
         else if (index == 4) return L"role";
         else if (index == 5) return L"bill";
         else if (index == 6) return L"scene";
         else if (index ==7) return L"fieldrole";
         else return L"unkown";
      }
      xdwgrid GetSheetDwgrid(int index)
      {
         xstring typ = GetSheetType(index);
         if(typ==L"flowitem") return dw_flow;
         if(typ==L"actionrole") return dw_buttonright;
         if(typ==L"state") return dw_state;
         if(typ==L"button") return dw_button;
         if(typ==L"role") return dw_role;
         if(typ==L"bill") return dw_bill;
         if(typ==L"scene") return dw_scene;
         if(typ==L"fieldrole") return dw_datafieldright;
         return 0;
      }
      xdwgrid GetSheetDbmap(int index)
      {
         xstring typ = GetSheetType(index);
         if(typ==L"flowitem") return "flow.dbmap";
         if(typ==L"actionrole") return "workflow.actionrole.dbmap";
         if(typ==L"state") return "state.dbmap";
         if(typ==L"button") return "button.dbmap";
         if(typ==L"role") return "role.dbmap";
         if(typ==L"bill") return "bill.dbmap";
         if(typ==L"scene") return "scene.dbmap";
         if(typ==L"fieldrole") return "workflow.datarole.dbmap";
         return 0;
      }
      xstring GetDwname(xstring typ)
      {
         if(typ==L"flowitem") return L"/sale/view/Flow3/template/flow";
         if(typ==L"actionrole") return L"/sale/view/Flow3/template/buttonright";
         if(typ==L"state") return L"/sale/view/Flow3/template/state";
         if(typ==L"button") return L"/sale/view/Flow3/template/button";
         if(typ==L"role") return L"/sale/view/Flow3/template/role";
         if(typ==L"bill") return L"/sale/view/Flow3/template/bill";
         if(typ==L"scene") return L"/sale/view/Flow3/template/scene";
         if(typ==L"fieldrole") return L"/sale/view/Flow3/template/datafieldright";
         return L"";
      }
      int SetAgent()
      {
         xstring xfNodeAgentArea  = L"agentarea";
         xnode anode = GetAgentNode(xfNodeAgentArea);
         if(m_agentNode)
         {
            SetAgentNode (anode,m_agentNode);
         }
         else
         {
            KXMLDOMElement xframeElement =  GetElement();
            KXMLDOMElement agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
            if(agent)
            {
               xstring s = agent.xml();
               m_agentNode =  SetAgentNode (anode,s);
            }
         }
         return 1;
      }
      int OnSave()
      {
         if(flowid==L"") return 1;
         xstring sdbmap;
         xml x ;
         int index = tab_1.GetSheetIndex();
         sdbmap = (xstring)GetSheetDbmap(index);
         xdwgrid dw_list = GetSheetDwgrid(index);
         dw_list.DwUpdateAllToEx(x);
         //trace(x.xml());
         KXMLDOMNodeList ls = x.documentElement().selectNodes(L"*[@update.modify='1' and @update.new='1']");
         int len = ls.length();
         for(int k=0;k<len;k++)
         {
            KXMLDOMElement e;
            if(ls.item(k).selectSingleNode(L"flowID"))
            {
               e = ls.item(k).selectSingleNode(L"flowID");
               e.setAttribute(L"update.modify",L"1");
               e.text() = flowid;
            }else
            {
               e = x.createElement(L"flowID");
               e.setAttribute(L"update.modify",L"1");
               e.text() = flowid;
               ls.item(k).appendChild(e);
            }
         }
         xaserverarg arg ;
         ;
         arg.AddArg(L"content",x.xml());
         arg.AddArg(L"sdbmap",sdbmap);
         trace(x.xml());
         if(xurl::get(L"/sale/data/Flow3/save/flow", arg.GetString(),x)!=1)
         {
            xstring error = x.text();
            alert(L"err:"+error);
            return 1;
         }
         dw_list.ResetUpdateStatus();
         //alert(x.xml());
         alert(L"保存成功!");
         return 1;
      }
      int OnAddrow()
      {
         int i = tab_1.GetSheetIndex();
         xdwgrid dw_list = GetSheetDwgrid(i);
         dw_list.InsertRow(0);
         return 1;
      }
      int OnInsertrow()
      {
         int i = tab_1.GetSheetIndex();
         xdwgrid dw_list = GetSheetDwgrid(i);
         dw_list.InsertRow(dw_list.GetRow());
         return 1;
      }
      int OnDeleterow()
      {
         int i = tab_1.GetSheetIndex();
         xdwgrid dw_list = GetSheetDwgrid(i);
         dw_list.DeleteRow(0);
         return 1;
      }
      //焦点激活处理函数
      int OnSetFocus(TEvent* evt, LPARAM param)
      {
         //重置工具条
         SetAgent();
         //alert(evt.hWnd.toString());
         return 1;
      }
      int OnClicked(TEvent* evt, int p)
      {
         DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
         int row = hdr.row;
         xstring colname=hdr.colname;
         //trace(colname);
         xaserverarg arg ;
         ;
         xstring comdid =L"";
         xstring data=L"";
         xstring display=L"";
         xdwgrid dw_list;
         int index = tab_1.GetSheetIndex();
         dw_list = GetSheetDwgrid(index);
         arg.AddArg(L"sdata",L"");
         arg.AddArg(L"flowid",flowid);
         if(colname==L"billID")
         {
            arg.AddArg(L"stype",L"bill");
            arg.AddArg(L"datacolumn",L"billID");
            arg.AddArg(L"displaycolumn",L"billName");
            arg.AddArg(L"dwname",L"/sale/view/Flow3/template/bill");
         }
         else if(colname==L"stateSource")
         {
            arg.AddArg(L"stype",L"state");
            arg.AddArg(L"datacolumn",L"stateID");
            arg.AddArg(L"displaycolumn",L"stateName");
            arg.AddArg(L"dwname",L"/sale/view/Flow3/template/state");
         }
         else if(colname==L"state")
         {
            arg.AddArg(L"stype",L"state");
            arg.AddArg(L"datacolumn",L"stateID");
            arg.AddArg(L"displaycolumn",L"stateName");
            arg.AddArg(L"dwname",L"/sale/view/Flow3/template/state");
         }
         else if(colname==L"stateTarget")
         {
            arg.AddArg(L"stype",L"state");
            arg.AddArg(L"datacolumn",L"stateID");
            arg.AddArg(L"displaycolumn",L"stateName");
            arg.AddArg(L"dwname",L"/sale/view/Flow3/template/state");
         }
         else if(colname==L"roles")
         {
            arg.AddArg(L"stype",L"role");
            arg.AddArg(L"datacolumn",L"roleName");
            arg.AddArg(L"displaycolumn",L"roleName");
            arg.AddArg(L"dwname",L"/sale/view/Flow3/template/role");
         }
         else if(colname==L"flowAction")
         {
            arg.AddArg(L"stype",L"button");
            arg.AddArg(L"datacolumn",L"buttonName");
            arg.AddArg(L"displaycolumn",L"buttonName");
            arg.AddArg(L"dwname",L"/sale/view/Flow3/template/button");
         }
         else
            return 1;
         OpenWindow(L"dev:xpage[FlowTermSelect.vx]",arg);
         comdid = arg.GetArgString(L"comdid");
         if(comdid==L"xmOk")
         {
            data = arg.GetArgString(L"data");
            display = arg.GetArgString(L"display");
            dw_list.SetItemDisplayString(row,colname,display);
            dw_list.SetItemString(row,colname,data);
            dw_list.Redraw();
         }
         return 1;
      }
      int OnImport()
      {
         int i = tab_1.GetSheetIndex();
         xdwgrid dw_list = GetSheetDwgrid(i);
         xaserverarg arg ;
         ;
         arg.SetArg(L"stype",GetSheetType(i),L"xstring");
         arg.SetArg(L"sdata",L"ddd",L"xstring");
         arg.SetArg(L"flowID",flowid,L"xstring");
         int obj = cast(dw_list as int);
         arg.SetArg(L"dwobj",obj.toString(),L"xstring");
         arg.SetArg(L"dwname",GetDwname(GetSheetType(i)),L"xstring");
         OpenWindow(L"dev:xpage[FlowTermImport.vx]",arg);
         return 1;
      }
      int  OnRetrieve()
      {
         if(flowid==L"") return 1;
         xml x ;
         xaserverarg arg ;
         ;
         //int i = tab_1.GetSheetIndex();
         for(int i=0;i<7;i++)
         {
            //alert(i.toString());
            arg.SetArg(L"stype",GetSheetType(i),L"xstring");
            arg.SetArg(L"sdata",L"ddd",L"xstring");
            arg.SetArg(L"flowID",flowid,L"xstring");
            //trace(arg.GetString());
            if (getUrl(L"/sale/data/Flow3/retrieve/flowex",arg.GetString(),x)!=1)
            {
               //trace(x.text());
               //return -1;
               continue;
            }
            xdwgrid dw_list = GetSheetDwgrid(i);
            dw_list.Retrieve(x);
            dw_list.Redraw();
         }
         return 1;
      }
      int OnTreeSelChanged(TEvent* evt, int p)
      {
         NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
         HTREEITEM hItem = nmtv.itemNew.hItem;
         KXMLDOMElement& e = *(KXMLDOMElement*)tv_1.GetItemData(hItem);
         flowid = e.getAttribute(L"flowID");
         HCURSOR hCursor = xutil::SetCursorWait();
         SetFlowChart(e);
         OnRetrieve();
         xutil::RestoreCursor(hCursor);
         return 1;
      }
      int OnTabSelectSheet(TEvent* evt, int p)
      {
         //OnRetrieve();
         return 1;
      }
      int SetFlowChart(KXMLDOMElement e)
      {
         xstring flowUrl = e.getAttribute(L"flowchart");
         xflowchart flowchart = GetControl(L"flowchart");
         xml f ;
         if(flowUrl != L"")
         {
            if(xaserver::FetchXml(flowUrl,L"",f)==1)
            {
               flowchart.LoadEx(f.documentElement());
            }
         }else
         {
            f.loadXML(L"<sheet/>");
            flowchart.LoadEx(f.documentElement());
         }
         return 1;
      }
      //命令发布函数
      int OnCmdDispatch(xstring comdid)
      {
         if (comdid == L"xmSave")
            return OnSave();
         if (comdid == L"xmAddrow")
            return OnAddrow();
         if (comdid == L"xmInsertrow")
            return OnInsertrow();
         if (comdid == L"xmDeleterow")
            return OnDeleterow();
         if (comdid == L"xmImport")
            return OnImport();
         return 0;
      }
      //命令处理事件
      int OnXCommand(TEvent* evt, LPARAM param)
      {
         return OnCmdDispatch(evt->xcommand.pStrID);
      }
      int OnAttachEvent()
      {
         //绑定工具条点击事件
         AttachEvent(L"WM_XCOMMAND", (FEvent)&flow::OnXCommand);
         //获取焦点事件,用于重置工具条
         AttachEvent(L"WM_SETFOCUS", (FEvent)&flow::OnSetFocus);
         AttachEvent(L"tv_folder", L"TVN_SELCHANGED", (FEvent)&flow::OnTreeSelChanged);
         AttachEvent(L"tab_1",L"LYSN_SELECTEDSHEET", (FEvent)&flow::OnTabSelectSheet);
         AttachEvent(L"dw_flow",L"DWV_CLICKED", (FEvent)&flow::OnClicked);
         AttachEvent(L"dw_buttonright",L"DWV_CLICKED", (FEvent)&flow::OnClicked);
         AttachEvent(L"dw_button",L"DWV_CLICKED", (FEvent)&flow::OnClicked);
         AttachEvent(L"dw_state",L"DWV_CLICKED", (FEvent)&flow::OnClicked);
         return 1;
      }
      int CreateFlowFloder()
      {
         xml x = ViewObject::RetrieveData(L"/sale/data/flow3/flowfolder");
         if(x)
         {
            KXMLDOMNodeList nlist = x.selectNodes(L"//item");
            int len = nlist.length();
            int hItem = 0;
            for (int i = 0; i < len; i++)
            {
               KXMLDOMElement e = nlist.item(i);
               xstring name = e.getAttribute(L"flowName");
               xstring no = e.getAttribute(L"flowNo");
               xstring label = name;//no.trim() + L" " + name;
               int h= tv_folder.InsertChildItem(hItem,label, trust(e as int),22);
               //tv_folder.SetItemChild(h,1);
            }
         }
         return 1;
      }
      int onload()
      {
         flowid = L"";
         tv_folder = GetControl(L"tv_folder");
         CreateFlowFloder();
         tv_1 = GetControl(L"tv_1");
         tab_1 = GetControl(L"tab_1");
         dw_flow = GetControl(L"dw_flow");
         dw_flow.openUrl(L"/sale/view/Flow3/template/flow");
         dw_state = GetControl(L"dw_state");
         dw_state.openUrl(L"/sale/view/Flow3/template/state");
         dw_button = GetControl(L"dw_button");
         dw_button.openUrl(L"/sale/view/Flow3/template/button");
         dw_role = GetControl(L"dw_role");
         dw_role.openUrl(L"/sale/view/Flow3/template/role");
         dw_bill = GetControl(L"dw_bill");
         dw_bill.openUrl(L"/sale/view/Flow3/template/bill");
         dw_scene = GetControl(L"dw_scene");
         dw_scene.openUrl(L"/sale/view/Flow3/template/scene");
         dw_buttonright = GetControl(L"dw_buttonright");
         dw_buttonright.openUrl(L"/sale/view/Flow3/template/buttonright");
         dw_datafieldright = GetControl(L"dw_datafieldright");
         dw_datafieldright.openUrl(L"/sale/view/Flow3/template/datafieldright");
         OnAttachEvent();
         return 1;
      }
      int onloaded()
      {
         SetAgent();
         OnRetrieve();
         return 1;
      }
   };