xj qian
2024-07-16 7a91c3a1ed37b0332d4ff0ebeae60bd6da3665c0
jrj/project/business/BasicCode/FCL.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,354 @@
#include <wobject/xstring.hpp>
#include <xcontrol/xtreeview.hpp>
#include <xcontrol/xdwgrid.hpp>
#include <wobject/xdouble.hpp>
#include <xcontrol/xlayersheet.hpp>
#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
#include "viewobject/view.base.hpp"
using xml = KXMLDOMDocument;
class __declspec(dllexport) FCL : public xframe
{
public:
   xcombobox ddlb_1;
   int   changeddlb;
   xdwgrid   dw_list;
   int m_PageSize; //每页显示数量
   int m_PageIndex; //第几页
   xstring m_QueryTxt; //查询条件
   xdwtable   dw_base;
   xnode   m_agentNode;   //Agent Condition
   xstring   m_agentCond;   //Agent Node
   xstring m_config;
   xstring m_spec;
public:
   FCL(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
public:
   static FCL* CreateInstance(void* implPtr, void* hWnd)
   {
      FCL* pWin = new FCL(implPtr, (HWND)hWnd);
      return pWin;
   }
   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 OnRetrieve()
   {
      xaserverarg arg;
      xdwpages zz = new xdwpages;
      zz.setNativePointer(GetControl(L"pages"));
      xml x;
      getUrl(L"/sale/data/FCL/entity/list", arg.GetString(), x);
      KXMLDOMElement e = x.documentElement();
      if (e.selectSingleNode(L"@TotalPage"))
      {
         xstring s = e.selectSingleNode(L"@TotalPage").text(); //总数量
         zz.SetMaxPage(s.toInt());
      }
      dw_list.Retrieve(x);
      dw_list.Redraw();
      return 1;
   }
   int SetPriceBaseEmpty()
   {
      int rows = dw_base.GetColumnCount();
      int i;
      for (i = 1; i <= rows; i++)
      {
         dw_base.SetItemString(1, i, L"");
         //dw_base.SetItemDisplayString(1,i,L"");
      }
      dw_base.ResetUpdateStatus();
      dw_base.Redraw();
      return 1;
   }
   int SetCellEdit(int row, xstring name, xstring value, xstring display)
   {
      dw_base.SetItemString(row, name, value);
      dw_base.Redraw();
      if (display != L"")
      {
         dw_base.SetItemDisplayString(row, name, display);
      }
      dw_base.AcceptText();
      dw_base.ResetUpdateStatus();
      dw_base.Redraw();
      return 1;
   }
   int OnSetCTGValue(int row)
   {
      dw_base.AcceptText();
      SetPriceBaseEmpty();
      KXMLDOMElement e = dw_list.GetRowElement(row);
      var list = e.selectNodes(L"*");
      if (list)
      {
         int s = list.length;
         int i;
         for (i = 0; i < s; i++)
         {
            xml x;
            ;
            KXMLDOMElement xitem = list.item(i);
            x.loadXML(xitem.xml());
            //trace(xitem.xml);
            KXMLDOMElement e1 = x.documentElement();
            xstring name = e1.tagName();
            trace(name);
            trace(e1.text());
            xstring display;
            if (e1.selectSingleNode(L"@_displaystring"))
            {
               display = e1.selectSingleNode(L"@_displaystring").text();
               SetCellEdit(1, name, e1.text(), L"" + display);
            }
            else
               SetCellEdit(1, name, e1.text(), L"");
         }
      }
      return 1;
   }
   int OnRowClicked(TEvent* evt, LPARAM p)
   {
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      int row = hdr.row;
      OnSetCTGValue(row);
      return 1;
   }
   int setMaint()
   {
      xml x;
      dw_base.DwUpdateAllTo(x);
      int row = dw_list.GetRow();
      dw_list.SetItemString(row, L"PriceInfo", x.xml());
      return 1;
   }
   int SetTotalAmount(int row, xstring name)
   {
      if (name == L"price20base" || name == L"price20BAF" || name == L"price20CAF" || name == L"price20add" || name == L"price20comm" || name == L"price20other")
      {
         double price20base = dw_base.GetItemString(row, L"price20base").toDouble();
         double price20BAF = dw_base.GetItemString(row, L"price20BAF").toDouble();
         double price20CAF = dw_base.GetItemString(row, L"price20CAF").toDouble();
         double price20add = dw_base.GetItemString(row, L"price20add").toDouble();
         double price20comm = dw_base.GetItemString(row, L"price20comm").toDouble();
         double price20other = dw_base.GetItemString(row, L"price20other").toDouble();
         double price20 = price20base + price20BAF + (price20CAF / 100) * price20base + price20add - (price20comm / 100) * price20base + price20other;
         dw_base.SetItemString(1, L"price20", xstring(price20));
      }
      if (name == L"price40base" || name == L"price40BAF" || name == L"price40CAF" || name == L"price40add" || name == L"price40comm" || name == L"price40other")
      {
         double price40base = dw_base.GetItemString(row, L"price40base").toDouble();
         double price40BAF = dw_base.GetItemString(row, L"price40BAF").toDouble();
         double price40CAF = dw_base.GetItemString(row, L"price40CAF").toDouble();
         double price40add = dw_base.GetItemString(row, L"price40add").toDouble();
         double price40comm = dw_base.GetItemString(row, L"price40comm").toDouble();
         double price40other = dw_base.GetItemString(row, L"price40other").toDouble();
         double price40 = price40base + price40BAF + (price40CAF / 100) * price40base + price40add - (price40comm / 100) * price40base + price40other;
         dw_base.SetItemString(1, L"price40", xstring(price40));
      }
      if (name == L"price40Hbase" || name == L"price40HBAF" || name == L"price40HCAF" || name == L"price40Hadd" || name == L"price40Hcomm" || name == L"price40Hother")
      {
         double price40Hbase = dw_base.GetItemString(row, L"price40Hbase").toDouble();
         double price40HBAF = dw_base.GetItemString(row, L"price40HBAF").toDouble();
         double price40HCAF = dw_base.GetItemString(row, L"price40HCAF").toDouble();
         double price40Hadd = dw_base.GetItemString(row, L"price40Hadd").toDouble();
         double price40Hcomm = dw_base.GetItemString(row, L"price40Hcomm").toDouble();
         double price40Hother = dw_base.GetItemString(row, L"price40Hother").toDouble();
         double price40H = price40Hbase + price40HBAF + (price40HCAF / 100) * price40Hbase + price40Hadd - (price40Hcomm / 100) * price40Hbase + price40Hother;
         dw_base.SetItemString(1, L"price40h", xstring(price40H));
      }
      return 1;
   }
   int OnPriceBaseChanged(TEvent* evt, LPARAM p)
   {
      trace(L"123");
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      xstring name = hdr.colname;
      xstring value = hdr.data;
      SetTotalAmount(1, name);
      xstring price20 = dw_base.GetItemString(1, L"price20");
      xstring price40 = dw_base.GetItemString(1, L"price40");
      xstring price40h = dw_base.GetItemString(1, L"price40h");
      dw_list.SetItemString(dw_list.GetRow(), L"price20", price20);
      dw_list.SetItemString(dw_list.GetRow(), L"price40", price40);
      dw_list.SetItemString(dw_list.GetRow(), L"price40h", price40h);
      dw_list.Redraw();
      setMaint();
      return 1;
   }
   int OnListChanged(TEvent* evt, LPARAM p)
   {
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      int row = hdr.row;
      xstring colname = hdr.colname;
      xstring value = hdr.data;
      if (colname == L"port")
      {
         xml x;
         xaserverarg arg;
         arg.AddArg(L"code", value);
         if (getUrl(L"/sale/data/FCL/pref/shipthread", arg.GetString(), x) != 1)
         {
            trace(x.xml());
         }
         KXMLDOMElement e = x.documentElement();
         dw_list.SetItemString(row, L"shipthread", e.text());
         dw_list.Redraw();
      }
      return 1;
   }
   int OnChangePages(TEvent* evt, LPARAM p)
   {
      PAGENMHDR& h = *(PAGENMHDR*)evt->notify.pnmh;
      int c = h.cur;
      HCURSOR hCursor = xutil::SetCursorWait();
      m_pageIndex = c;
      OnRetrieve();
      xutil::RestoreCursor(hCursor);
      return 1;
   }
   int  onSave()
   {
      xml x;
      dw_list.DwUpdateAllToEx(x);
      trace(x.xml());
   }
   int OnDeleteRow()
   {
      int row = dw_list.GetRow();
      if (row<1 || row>dw_list.GetRowCount())
      {
         return -1;
      }
      dw_list.DeleteRow(row);
   }
   int OnAddrow()
   {
      int row = dw_list.InsertRow(0);
      dw_list.SetItemString(row, L"modifieddate", publiccode::GetCurrentDate());
      SetPriceBaseEmpty();
      return 1;
   }
   int OnInsertRow()
   {
      int row = dw_list.GetRow();
      if (row < 1) return 0;
      int newrow = dw_list.InsertRow(row);
      dw_list.SetItemString(newrow, L"modifieddate", publiccode::GetCurrentDate());
      SetPriceBaseEmpty();
      return 1;
   }
   int OnDeleteRow()
   {
      int row = dw_list.GetRow();
      if (row > 0 && row <= dw_list.GetRowCount())
      {
         dw_list.DeleteRow(row);
         //OnSetCTGValue(row);
      }
      return 1;
   }
   int OnCmdDispatch(xstring comdid)
   {
      if (comdid.find(L"add", 0) >= 0)
         OnAddrow();
      else if (comdid.find(L"insert", 0) >= 0)
         OnInsertRow();
      else if (comdid.find(L"del", 0) >= 0)
         OnDeleteRow();
      else if (comdid.find(L"save", 0) >= 0)
         onSave();
      return 1;
   }
   int OnSetFocus(TEvent* evt, LPARAM p) {
      SetAgent();
      return 1;
   }
   int OnXCommand(TEvent* evt, LPARAM param)
   {
      return OnCmdDispatch(evt->xcommand.pStrID);
   }
   int OnItemError(TEvent* evt, LPARAM p)
   {
      DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh;
      xstring value = hdr.data;
      int e = hdr.idFrom;
      if (e == -1000)
         alert(L"【" + value + L"】不是有效的数字!");
      if (e == -1001)
         alert(L"【" + value + L"】不是有效的数字!");
      if (e == -1002)
         alert(L"【" + value + L"】不是有效的日期!");
      return 1;
   }
   int OnAttachEvent()
   {
      AttachEvent(L"WM_XCOMMAND", (FEvent)&FCL::OnXCommand);
      AttachEvent(L"dw_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&FCL::OnRowClicked);
      AttachEvent(L"WM_SETFOCUS", (FEvent)&FCL::OnSetFocus);
      AttachEvent(L"pages", L"PAGE_CLICK", (FEvent)&FCL::OnChangePages);
      AttachEvent(L"dw_base", L"DWV_ITEMCHANGED", (FEvent)&FCL::OnPriceBaseChanged);
      AttachEvent(L"dw_base", L"DWV_ITEMERROR", (FEvent)&FCL::OnItemError);
      AttachEvent(L"dw_list", L"DWV_ITEMCHANGED", (FEvent)&FCL::OnListChanged);
      return 1;
   }
   int OnInit()
   {
      dw_list = new xdwgrid;
      dw_list.setNativePointer(GetControl(L"dw_list"));
      dw_list.openUrl(L"/sale/view/FCL/template/FCL/List");
      dw_base = new xdwtable;
      dw_base.setNativePointer(GetControl(L"dw_base"));
      dw_base.openUrl(L"/sale/view/FCL/template/FCL/pricebase");
      dw_list.SetReadOnlyColumn(L"shipthread", true);
      dw_list.SetReadOnlyColumn(L"price20", true);
      dw_list.SetReadOnlyColumn(L"price40", true);
      dw_list.SetReadOnlyColumn(L"price40h", true);
      return 1;
   }
   int onload()
   {
      m_PageSize = 30; //每页显示数量
      m_PageIndex = 1; //第几页
      m_QueryTxt = L""; //查询条件
      OnInit();
      OnAttachEvent();
      OnRetrieve();
      SetAgent();
      return 1;
   }
};