From bf115a00a40d3af1fae7521d38b9b2ca70fcc161 Mon Sep 17 00:00:00 2001
From: LiFan <2308045698@qq.com>
Date: 星期三, 17 七月 2024 11:22:32 +0800
Subject: [PATCH] update SystemSetting

---
 jrj/project/business/SystemSettings/ProcessManagement_A.cpp         |  513 +++
 jrj/project/business/SystemSettings/view.assignadjust.cpp           |  267 +
 jrj/project/business/SystemSettings/Organization_A.cpp              |  513 +++
 jrj/project/business/SystemSettings/AddUserGroup.cpp                |  183 +
 jrj/project/business/SystemSettings/Developer.Synch.cpp             |  415 ++
 jrj/ext-jrj/ext-jrj.vcxproj.filters                                 |   72 
 jrj/project/business/SystemSettings/FlowTermImport.cpp              |  162 +
 jrj/project/business/SystemSettings/GroupManagerList_A.cpp          | 1576 ++++++++++
 jrj/project/business/SystemSettings/TestRetrieveing.cpp             |   52 
 jrj/project/business/SystemSettings/AddUser.cpp                     |  229 +
 jrj/project/business/SystemSettings/Buglist.Developer.hxsoft_A.cpp  | 1576 ++++++++++
 jrj/project/business/SystemSettings/level.Customer.v3.cpp           |  359 ++
 jrj/project/business/SystemSettings/Data.config.cpp                 |  571 +++
 jrj/project/business/SystemSettings/UserImport.cpp                  |  329 ++
 jrj/project/business/SystemSettings/SysUser.cpp                     |  330 ++
 jrj/project/business/SystemSettings/BindComputer.cpp                |  106 
 jrj/project/business/SystemSettings/Role.config.cpp                 |  548 +++
 jrj/project/business/SystemSettings/LogList.cpp                     |  203 +
 jrj/project/business/SystemSettings/FlowTermSelect.cpp              |  161 +
 jrj/project/business/SystemSettings/SysLoginRecord.cpp              |   89 
 jrj/project/business/SystemSettings/Flow3.cpp                       |  464 +++
 jrj/project/business/SystemSettings/Resource.select.data.config.cpp |   93 
 jrj/project/business/SystemSettings/maint.Level.Customer3.cpp       |   72 
 jrj/project/business/SystemSettings/UserPassDlg.cpp                 |  131 
 jrj/ext-jrj/ext-jrj.vcxproj                                         |   69 
 25 files changed, 9,083 insertions(+), 0 deletions(-)

diff --git a/jrj/ext-jrj/ext-jrj.vcxproj b/jrj/ext-jrj/ext-jrj.vcxproj
index 4013c16..26b4f29 100644
--- a/jrj/ext-jrj/ext-jrj.vcxproj
+++ b/jrj/ext-jrj/ext-jrj.vcxproj
@@ -817,6 +817,75 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\AddUser.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\AddUserGroup.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\BindComputer.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Buglist.Developer.hxsoft_A.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Data.config.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Developer.Synch.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Flow3.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\FlowTermImport.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\FlowTermSelect.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\GroupManagerList_A.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\level.Customer.v3.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\LogList.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\maint.Level.Customer3.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Organization_A.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\ProcessManagement_A.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Resource.select.data.config.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Role.config.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\SysLoginRecord.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\SysUser.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\TestRetrieveing.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\UserImport.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\UserPassDlg.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\view.assignadjust.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="..\project\business\VATNotify\list.vatnotify.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
     </ClCompile>
diff --git a/jrj/ext-jrj/ext-jrj.vcxproj.filters b/jrj/ext-jrj/ext-jrj.vcxproj.filters
index 965a48d..7fdd5ce 100644
--- a/jrj/ext-jrj/ext-jrj.vcxproj.filters
+++ b/jrj/ext-jrj/ext-jrj.vcxproj.filters
@@ -118,6 +118,9 @@
     <Filter Include="project\business\BasicCode">
       <UniqueIdentifier>{64c23153-69c8-4db3-9225-9e5375e489ff}</UniqueIdentifier>
     </Filter>
+    <Filter Include="project\business\SystemSettings">
+      <UniqueIdentifier>{9d76dee1-2190-4b2c-8f17-bd2e54140f7d}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="framework.h">
@@ -1019,5 +1022,74 @@
     <ClCompile Include="..\project\business\BasicCode\TypeList.maint.supplier.cpp">
       <Filter>project\business\BasicCode</Filter>
     </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\AddUser.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\AddUserGroup.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\BindComputer.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Buglist.Developer.hxsoft_A.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Data.config.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Developer.Synch.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Flow3.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\FlowTermImport.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\FlowTermSelect.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\GroupManagerList_A.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\level.Customer.v3.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\LogList.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\maint.Level.Customer3.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Organization_A.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\ProcessManagement_A.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Resource.select.data.config.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\Role.config.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\SysLoginRecord.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\SysUser.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\TestRetrieveing.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\UserImport.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\UserPassDlg.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
+    <ClCompile Include="..\project\business\SystemSettings\view.assignadjust.cpp">
+      <Filter>project\business\SystemSettings</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/AddUser.cpp b/jrj/project/business/SystemSettings/AddUser.cpp
new file mode 100644
index 0000000..3d9c416
--- /dev/null
+++ b/jrj/project/business/SystemSettings/AddUser.cpp
@@ -0,0 +1,229 @@
+use "win.vl"
+use "treeview.vm"
+use "dev:vm[xdwgrid.vm]"
+use "dev:vm[xdwtable.vm]"
+use "pref.vl"
+use "dev:vm[xml.vm]"
+use "dev:vm[xaserverarg.vm]"
+use "dev:vm[xaserver.vm]"
+use "dev:vm[xutil.vm]"
+use "dev:code[pa.tpp]"
+use "dev:vm[control.vm]"
+#include "dev:xpage[SysUser.vx]"
+
+unit vbusiness.xpage tpp
+[
+	class pa
+	{
+		string note;
+		int hitem;
+		int row;
+		int wid;
+		treeview__ tv;
+		xdwgrid__ dw;
+		win__ pwin;
+	}
+]
+
+unit vbusiness.xpage
+[
+	AddUser is extend win__;
+	about AddUser
+	[
+		control:
+		
+		method:
+		[
+			pa p;
+			
+			int SetAgent()
+			{
+				return 1;
+			}
+			//焦点激活处理函数
+			int OnSetFocus(ref TEvent evt,int param)
+			{
+				int SetAgent();
+
+				//重置工具条
+				return 1;
+			}
+			int AppendItem(xml__ x,msxml::IXMLDOMElement r,string item){
+				var e = x.GetXmlDoc().createElement(item);
+				//xcontrol xc = GetControl(item);
+				control__ xc = new control__;
+				xc.setNativePointer(this.GetControl(item));
+				e.text = xc.GetText();
+				r.appendChild(e);		
+				return 1;
+			}
+			
+			int OnSave()
+			{
+				control__ xc = new control__;
+				/*xc=GetControl("EmployeeNo");
+				if (xc.GetText()=="")
+				{
+					alert("用户代码不能为空!");
+					return 0;
+				}*/
+				xc=GetControl("UserName");
+				if (xc.GetText()=="")
+				{
+					alert("用户名称不能为空!");
+					return 0;
+				}		
+				xml__ x = new xml__;
+				x.setNativePointer(x.CreateInstance());
+				xaserverarg__ arg = new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());
+				x.LoadXml("<SysUser/>");
+				var r = x.GetXmlDoc().documentElement;
+				string guid;
+				string guid1;
+				if (p.note=="修改")
+				{
+					msxml::IXMLDOMElement ele=xdwgrid__::GetRowElement(p.row);
+					guid = ele.selectSingleNode("UserID").text;
+					//guid=ele.getAttribute("guid");
+					//if (ele.selectSingleNode("empid"))
+					//	r.appendChild(ele.selectSingleNode("empid"));			
+				}
+				else
+					guid=win__::GetGuid();
+					//guid1=win32::GetGuid();
+				r.setAttribute("guid",guid);
+				//r.setAttribute("guid1",guid1);
+				//AppendItem(x,r,"EmployeeNo");
+				AppendItem(x,r,"UserName");
+				AppendItem(x,r,"PassWord");
+				AppendItem(x,r,"Status");
+				//trace(x.GetXml());
+				//return 1;
+				arg.AddArg("content",x.GetXml());
+				int ls_item = treeview__::GetSelectedItem(p.wid);
+				msxml::IXMLDOMElement e=treeview__::GetItemData(p.wid,ls_item);
+				string gpguid=e.selectSingleNode("@guid").text;
+				arg.AddArg("gpguid",gpguid);			
+				if (xaserver__::ExecXAction(GetServerUrl(),"[update.User.xa]",arg.GetString())==1)
+				{
+					alert("ok");
+					if (p.note=="修改")
+					{
+						xdwgrid__ dw = new xdwgrid__;
+						//dw.setNativePointer(p.dw_user);
+						int row = dw.GetNextSelectRow(0);
+						//dw.SetItemString(row,"UserName","");
+						msxml::IXMLDOMElement e;
+						e = x.GetXmlDoc().documentElement;
+						string ls_pass = e.selectSingleNode("PassWord").text;
+						string ls_status = e.selectSingleNode("Status").text;
+						dw.SetItemString(row,"PassWord",ls_pass);
+						dw.SetItemString(row,"Status",ls_status);
+						dw.Redraw();
+					}
+					else
+					{
+					//----------
+						//p.pwin.OnTreeSelChanged();
+					}
+				}
+				else
+				{
+					alert("保存出错!");
+					return 0;
+				}
+				return 1;		
+			}
+			
+			int ClearItem(string item)
+			{
+				control__ xc = new control__;
+				xc.setNativePointer(GetControl(item));
+				xc.SetText("");
+				return 1;
+			}
+			//命令发布函数
+			int OnCmdDispatch(string comdid)
+			{
+				if (comdid=="cb_cancel")
+					CloseWindow();
+				else if(comdid=="cb_ok")
+				{
+					int r=OnSave();
+					if (r==1)
+						CloseWindow();
+				}
+				else if(comdid=="cb_save")
+				{
+					OnSave();
+					p.note="新增";
+					win__::SetWindowText(GetHWND(),p.note+"用户");
+					ClearItem("userno");
+					ClearItem("username");
+					ClearItem("pwd");
+				}
+				return 0;
+			}
+			
+			//命令处理事件
+			int OnXCommand(ref TXCommandEvent evt,int param)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+			
+			int OnAttachEvent()
+			{
+				//绑定工具条点击事件
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				//获取焦点事件,用于重置工具条
+				AttachEvent("WM_SETFOCUS",OnSetFocus);
+			}
+			
+			int OnInitial()
+			{
+				SetAgent();
+
+				OnAttachEvent();
+				
+				return 1;
+			}
+			
+			int SetItem(string value,string item){
+				control__ xc = new control__;
+				xc.setNativePointer(GetControl(item));
+				xc.SetText(value);	
+				return 1;
+			}	
+			int onload()
+			{
+				OnInitial();
+				p = new pa;
+				
+				if(this.GetParam())
+				{
+					p=GetParam();
+					win__::SetWindowText(GetHWND(),p.note+"用户");
+					if (p.note=="修改")
+					{
+						xdwgrid__ dw = new xdwgrid__;
+						dw.setNativePointer(p.dw);
+						msxml::IXMLDOMElement ele=dw.GetRowElement(p.row);
+						//if(ele.selectSingleNode("EmployeeNo"))
+							//SetItem(ele.selectSingleNode("EmployeeNo").text,"EmployeeNo");
+						if(ele.selectSingleNode("UserName"))
+							SetItem(ele.selectSingleNode("UserName").text,"UserName");
+						if(ele.selectSingleNode("PassWord"))
+							SetItem(ele.selectSingleNode("PassWord").text,"PassWord");
+						if(ele.selectSingleNode("Status"))
+							SetItem(ele.selectSingleNode("Status").text,"Status");
+					trace("Aa");
+					return 1;
+					}
+				}		
+				return 1;
+			}
+		]
+		
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/AddUserGroup.cpp b/jrj/project/business/SystemSettings/AddUserGroup.cpp
new file mode 100644
index 0000000..fc7a253
--- /dev/null
+++ b/jrj/project/business/SystemSettings/AddUserGroup.cpp
@@ -0,0 +1,183 @@
+use "win.vl"
+use "treeview.vm"
+use "dev:vm[xdwgrid.vm]"
+use "dev:vm[xdwtable.vm]"
+use "pref.vl"
+use "dev:vm[xml.vm]"
+use "dev:vm[xaserverarg.vm]"
+use "dev:vm[xaserver.vm]"
+use "dev:vm[xutil.vm]"
+use "dev:code[pa.tpp]"
+use "dev:vm[control.vm]"
+
+unit vbusiness.xpage tpp
+[
+	class pa
+	{
+		string note;
+		int hitem;
+		int row;
+		int wid;
+		treeview__ tv;
+		xdwgrid__ dw;
+		win__ pwin;
+	}
+]
+			
+unit vbusiness.xpage
+[
+
+	AddUserGroup is extend win__;
+	about AddUserGroup
+	[
+		control:
+		
+		method:
+		[
+			pa p;
+			
+			int SetAgent()
+			{
+				return 1;
+			}
+			//焦点激活处理函数
+			int OnSetFocus(ref TEvent evt,int p)
+			{
+				int SetAgent();
+
+				//重置工具条
+				return 1;
+			}
+			int AppendItem(xml__ x,msxml::IXMLDOMElement r,string item){
+				var e = x.GetXmlDoc().createElement(item);
+				control__ xc = new control__;
+				xc.setNativePointer(this.GetControl(item));
+				e.text = xc.GetText();
+				r.appendChild(e);		
+				return 1;
+			}	
+			int AppendAttrib(xml__ x,msxml::IXMLDOMElement r,string item){
+				var e = x.GetXmlDoc().createElement(item);
+				//xcontrol xc = GetControl(item);
+				control__ xc = new control__;
+				xc.setNativePointer(this.GetControl(item));
+				e.text = xc.GetText();
+				r.setAttribute(item,xc.GetText());
+				return 1;
+			}	
+			//命令发布函数
+			int OnCmdDispatch(string comdid)
+			{
+				if (comdid=="cb_cancel")
+					CloseWindow();
+				else if(comdid=="cb_ok")
+				{
+					int wid = p.wid;
+					xml__ x = new xml__;
+					x.setNativePointer(x.CreateInstance());
+					xaserverarg__ arg = new xaserverarg__;
+					arg.setNativePointer(arg.CreateInstance());
+					x.LoadXml("<row/>");
+					var r = x.GetXmlDoc().documentElement;
+					string gpguid;
+					if (p.note=="修改")
+					{
+						msxml::IXMLDOMElement ele = treeview__::GetItemData(wid,p.hitem);
+						gpguid=ele.selectSingleNode("@JobID").text;
+					}
+					else
+						gpguid=win__::GetGuid();
+					r.setAttribute("JobID",gpguid);
+					AppendAttrib(x,r,"JobName");
+					AppendAttrib(x,r,"JobType");
+					//AppendItem(x,r,"JobName");
+					//AppendItem(x,r,"JobType");
+					//trace(x.GetXml());
+					//return 1;
+					arg.AddArg("content",x.GetXml());
+					if (xaserver__::ExecXAction(GetServerUrl(),"[update.Usergroup.xa]",arg.GetString())==1)
+					{
+						control__ xc = new control__;
+						xc.setNativePointer(this.GetControl("JobName"));
+						//p.tv.Redraw();
+						if (p.note=="修改")
+						{
+							treeview__::SetItemData(wid,p.hitem,r);
+							treeview__::SetItemLabel(wid,p.hitem,xc.GetText());
+						}
+						else
+						{
+							int root = treeview__::GetRootItem(wid);
+							treeview__::InsertChildItem(wid,root,xc.GetText(),r,15);
+						}
+						CloseWindow();
+					}
+					else
+					{
+						alert("保存出错!");
+					}
+				}
+				return 0;
+			}
+			
+			//命令处理事件
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+			
+			int OnAttachEvent()
+			{
+				//绑定工具条点击事件
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				//获取焦点事件,用于重置工具条
+				AttachEvent("WM_SETFOCUS",OnSetFocus);
+			}
+			
+			int OnInitial()
+			{
+				SetAgent();
+
+				OnAttachEvent();
+				
+				return 1;
+			}
+			
+			int SetItem(string value,string item){
+				control__ xc = new control__;
+				xc.setNativePointer(GetControl(item));
+				xc.SetText(value);	
+				return 1;
+			}	
+			
+			int onload()
+			{
+				OnInitial();
+				p = new pa;
+				
+				if(this.GetParam())
+				{
+					p=GetParam();
+					win__::SetWindowText(GetHWND(),p.note+"用户组");
+					if (p.note=="修改")
+					{
+						int wid = p.wid;
+						msxml::IXMLDOMElement ele=treeview__::GetItemData(wid,p.hitem);
+						//trace(ele.xml);
+						//SetItem(ele.selectSingleNode("gpno").text,"gpno");
+						//SetItem(ele.selectSingleNode("gpname").text,"gpname");
+						string ls_guid = ele.selectSingleNode("@JobID").text;
+						string ls_name = ele.selectSingleNode("@JobName").text;
+						string ls_type = ele.selectSingleNode("@JobType").text;
+						SetItem(ls_guid,"JobID");
+						SetItem(ls_name,"JobName");
+						SetItem(ls_type,"JobType");
+					}
+				}
+				
+				return 1;
+			}
+		]
+		
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/BindComputer.cpp b/jrj/project/business/SystemSettings/BindComputer.cpp
new file mode 100644
index 0000000..0af3e7f
--- /dev/null
+++ b/jrj/project/business/SystemSettings/BindComputer.cpp
@@ -0,0 +1,106 @@
+use"lang.vl"
+use "win.vl"
+use "dev:vm[xdwgrid.vm]"
+
+unit vbusiness.vpage
+[
+	BindComputerDlgNew is extend win__;
+	about BindComputerDlgNew
+	[
+		field:
+			
+		method:
+		[
+			xdwgrid__	dw_list;
+			int  OnRetrieve()
+			{
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg = this.GetParam();	
+				if(arg.GetArgString("BindComputer"))
+				{	
+					string sbys= arg.GetArgString("BindComputer");
+					//alert(sbys);
+					x.LoadXml(sbys);
+					
+				}
+				else
+				{	
+
+					x.LoadXml("<args></args>");	
+				}	
+
+				dw_list.Retrieve(x.GetXmlDoc().selectSingleNode("args"));		
+				dw_list.ResetUpdateStatus();
+				dw_list.Redraw();
+				return 1;
+			}
+			int OnAddRow(xdwgrid__ dw)
+			{
+				dw.InsertRow(0);
+				return 1;
+			}
+			
+			int OnDelRow(xdwgrid__ dw)
+			{
+				int row = dw.GetRow();
+				if(row<1 || row > dw.GetRowCount()) return -1;
+				dw.DeleteRow(row);			
+				return 1;
+			}				
+			//命令发布函数
+			int OnCmdDispatch(string comdid)
+			{
+				dw_list.AcceptText();
+				xaserverarg__ arg = new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());							
+				arg = win__::GetParam();
+				arg.AddArg("comdid",comdid);				
+				if (comdid=="ok")
+				{
+					xml__ x = new xml__;
+					x.setNativePointer(xml__ ::CreateInstance());
+					dw_list.DwUpdateAllTo(x.GetXmlDoc());
+					arg.AddArg("xml",x.GetXml());			
+					CloseWindow();
+				}
+				else if(comdid=="close")
+					CloseWindow();
+				else if(comdid == "add")
+					OnAddRow(dw_list);
+				else if(comdid == "del")
+					OnDelRow(dw_list);				
+				return 0;
+			}
+			
+			//命令处理事件
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+			
+			int OnAttachEvent()
+			{
+				//绑定工具条点击事件
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+			}
+			int onload()
+			{
+				OnAttachEvent();
+			
+				dw_list = new xdwgrid__;
+				dw_list.setNativePointer(GetControl("dw_list"));
+				dw_list.SetDataObject(GetServerUrl(),"dev:sheet[SysUser.tpl/BindComputer]");
+				dw_list.SetReadOnly(true);
+				if(this.GetParam())
+				{				
+					OnRetrieve();
+				}
+				return 1;
+			}			
+		]
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Buglist.Developer.hxsoft_A.cpp b/jrj/project/business/SystemSettings/Buglist.Developer.hxsoft_A.cpp
new file mode 100644
index 0000000..ca9b3d6
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Buglist.Developer.hxsoft_A.cpp
@@ -0,0 +1,1576 @@
+#include <wobject/xstring.hpp>
+#include <wobject/xdouble.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xdwgrid.hpp>
+#include <xcontrol/ximageview.hpp>
+
+#include "vbusiness/vframe/maint.vframe.vbusiness.hpp"
+#include "viewobject/view.base.hpp"
+#include "viewobject/saleorder.view.hpp"
+#include "viewobject/quote.view.hpp"
+#include "viewobject/shoppingcart.view.hpp"
+#include "viewobject/productLibrary.view.hpp"
+#include "xcontrol/xcheckbox.hpp"
+#include "xcontrol/xshtml.hpp"
+
+class __declspec(dllexport) ProductLibrary4Win : public xframe
+{
+public:
+	//产品库产品列表
+	xdwgrid	dw_list;
+	//购物车产品列表
+	xdwgrid	dwc_list;
+
+	//产品缓存对象
+	//xdataset g_xdoc_product;
+	//xdataset g_xdoc_shoppingcart;
+
+	xcombobox  cbx_goodscar;
+	//是否多选
+
+	xnode	m_agentNode;	//Agent Condition
+	xtreeview tv_folder;
+	xstring 	agentFor;
+	KXMLDOMElement imageElement;
+	xstring m_customer;
+
+public:
+	ProductLibrary4Win(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
+public:
+	static ProductLibrary4Win* CreateInstance(void* implPtr, void* hWnd)
+	{
+		ProductLibrary4Win* pWin = new ProductLibrary4Win(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+public:
+	int FillGoodsCarList()
+	{
+		xcombobox xc = GetControl(L"frame:cbx_goodscar");
+		if (!xc) return 0;
+		xml  x = ShoppingCartView::GetRoleList();
+		if (!x) return 0;
+		xc.SetText(L"==选择购物车==L");
+
+		KXMLDOMNodeList nlist = x.selectNodes(L"//item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"name");
+			xc.AddItem( name);
+		}
+		return 1;
+	}
+
+	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"[@for='" + agentFor + L"']/*");
+			if (agent)
+			{
+				bstring s = agent.xml();
+				m_agentNode = SetAgentNode(anode, s);
+				//FillGoodsCarList();
+			}
+		}
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent * evt, int param)
+	{
+		//重置工具条
+		SetAgent();
+		return 1;
+	}
+
+	KXMLDOMElement OnGetCarListRowElement(int row = 0)
+	{
+		if (row < 1) row = dwc_list.GetRow();
+		if (row < 1 || row > dwc_list.GetRowCount()) return KXMLDOMElement();
+		KXMLDOMElement e = dw_list.GetRowElement(row);
+		return e;
+	}
+
+	int OnShowImage(xstring skuid)
+	{
+		ximageview im = GetControl(L"im1");
+		//im.RemoveImage();
+		im.Reset();
+
+		xml xp ;
+		xaserverarg arg_pic;
+		arg_pic.AddArg(L"SKUID", skuid);
+		if (xurl::get(L"/sale/data/ProductLibrary3/pref/picture/imagelistSKU", arg_pic.GetString(), xp) != 1)
+		{
+			trace(xstring(L"xxx")+xp.xml());
+		}
+		else
+		{
+			//trace(skuid+L" "+xp.GetXml());
+			imageElement = xp.documentElement();
+			KXMLDOMNodeList  nlistp = xp.selectNodes(L"ImageList/image");
+			int lenp = nlistp.length();
+			for (int ip = 0; ip < lenp; ip++)
+			{
+				KXMLDOMElement xitem = nlistp.item(ip);
+				xstring picname = xitem.selectSingleNode(L"PicPath").text();
+				xstring goodno = xitem.selectSingleNode(L"GoodsNo").text();
+				if (picname == L"/business/products/Thumbs//")
+					picname = L"/business/products/Thumbs/00/00000000-0000-0000-0000-000000000000.jpg";
+				im.AddImages(picname, (LPTSTR)L"");
+			}
+			im.Redraw();
+			//win32::SendMessage(im.GetId(),0x000f,0,1);
+			//win32::InvalidateRect(im.GetId(),cast(0 as ref xrect),true);
+		}
+		return 1;
+	}
+
+	int OnShowImage(xstring skuid, xstring customerItemNo)
+	{
+		ximageview im = GetControl(L"im1");
+		//im.RemoveImage();
+		im.Reset();
+
+		xml xp ;
+		xaserverarg arg_pic ;
+		arg_pic.AddArg(L"SKUID", skuid);
+		arg_pic.AddArg(L"CustomerID", m_customer);
+		arg_pic.AddArg(L"CustomerItemNo", customerItemNo);
+
+		if (xurl::get(L"/sale/data/ProductLibrary3/pref/picture/customer/imagelistSKU", arg_pic.GetString(), xp) != 1)
+		{
+			trace(L"error:" + xstring(xp.xml(),true));
+		}
+		else
+		{
+			imageElement = xp.documentElement();
+			KXMLDOMNodeList  nlistp = xp.selectNodes(L"ImageList/image");
+			int lenp = nlistp.length();
+			for (int ip = 0; ip < lenp; ip++)
+			{
+				KXMLDOMElement xitem = nlistp.item(ip);
+				bstring picname = xitem.selectSingleNode(L"PicPath").text();
+				bstring goodno = xitem.selectSingleNode(L"GoodsNo").text();
+				if (picname == L"/business/products/Thumbs//")
+					picname = L"/business/products/Thumbs/00/00000000-0000-0000-0000-000000000000.jpg";
+				im.AddImages(picname, L"");
+			}
+			im.Redraw();
+		}
+		return 1;
+	}
+
+	int OnRowChanged(TEvent * evt, int p)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+
+		xshtml xs = GetControl(L"html_detail");
+		xstring html = makeHtml(row);
+		xs.SetContent(html);
+		xs.Redraw();
+
+		xstring id = dw_list.GetGuid(row);
+		OnShowImage(id);
+		trace(id);
+		return 1;
+	}
+
+	int OnGoodsCarRowChanged(TEvent * evt, int p)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+
+		xshtml xs = GetControl(L"html_detail");
+		xstring html = makeGoodscarHtml(row);
+		xs.SetContent(html);
+		xs.Redraw();
+		if (m_customer)
+		{
+			xstring id = dw_list.GetItemString(row, L"SKUID");
+			xstring customerItemNo =dw_list.GetItemString( row, L"CustomerItemNo");
+			OnShowImage(id, customerItemNo);
+		}
+
+		return 1;
+	}
+
+	int DeleteRow(int row)
+	{
+		int IDOK = 1;
+		int MB_OKCANCEL = 1;
+		int MB_ICONQUESTION = 32;
+		if (MessageBoxW(GetHWND(), L"确认删除指定的项,删除后将不能恢复?", L"提示", MB_OKCANCEL | MB_ICONQUESTION) != IDOK) return 1;
+		xstring id = dw_list.GetGuid(row);
+
+		if (ProductLibraryView::DeleteItem(id) == 1)	dw_list.DeleteRow(0);
+		return 1;
+	}
+
+	int SetSelectState(xdwgrid dw_obj, int state)
+	{
+		if (state == 1)
+		{
+			dw_obj.SetSelectionMode(3);
+		}
+		else if (state == -1)
+		{
+			dw_obj.SelectRow(0, false);
+			dw_obj.SetSelectionMode(0);
+		}
+		return 1;
+	}
+	int OnCkbCLick(TEvent * evt, int p)
+	{
+		xcheckbox cbx_1 = GetControl(L"frame:cbx1");
+		int state = cbx_1.GetCheck();
+		return SetSelectState(dw_list, state);
+	}
+
+	int OnCkbCLick2(TEvent * evt, int p)
+	{
+		xcheckbox cbx_2 = GetControl(L"frame:cbx2");
+		int state = cbx_2.GetCheck();
+		return SetSelectState(dwc_list, state);
+	}
+
+	xml  GetGoodsPropList(xstring guid)
+	{
+		xml x;
+		xaserverarg arg;
+		arg.AddArg(L"guid", guid);
+		if (xurl::get(L"/sale/data/SO/goods/goodsprop/list", arg.GetString(), x) != 1)
+		{
+			bstring error = x.text();
+			alert(error);
+		}
+		return x;
+	}
+
+	xml  GetGoodsPropListEx(xstring guid)
+	{
+		xml x;
+		xstring fields = L"<data>";
+		//fields +=L"<field name='HighestPrice' label='最高价'/>";
+		//fields +=L"<field name='LowestPrice' label='最低价'/>";
+
+		//fields +=L"<field name='BulkPrice' label='散货价'/>";
+		//fields +=L"<field name='CardPrice' label='纸卡价'/>";
+		//fields +=L"<field name='BuyPrice' label='采购价'/>";
+		//fields +=L"<field name='SupplierID' label='货源'/>";
+
+		fields += L"<field name='Packing' label='包装方式'/>";
+		fields += L"<field name='PackingRate' label='每箱数量'/>";
+		fields += L"<field name='VolumeDesc' label='包装尺码'/>";
+		fields += L"<field name='GWPerPkg' label='毛重'/>";
+		fields += L"<field name='NWPerPkg' label='净重'/>";
+		//fields +=L"<field name='DeveloperID' label='开发人员'/>";
+		fields += L"<field name='AttributeValue_1' label='产品属性'/>";
+		//fields +=L"<field name='Remark' label='备注'/>";
+
+		fields += L"</data>";
+		x.loadXML(fields);
+
+		return x;
+	}
+
+	xstring makeHtml(int row)
+	{
+		xstring id = dw_list.GetItemString(row, L"@guid");
+		xml x = GetGoodsPropList(id);
+		xml x1 = GetGoodsPropListEx(id);
+
+		xstring html = L"<html><style> .text{ font-weight:400} .label { font-weight:400;}</style><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >编号:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"SKUNo") +
+			L"</span> <span style='font-weight:700;width:50;font-size:10pt' >类项:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"RefNo") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >公司型号:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"GoodsNo") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >品名:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"CName") +
+			L"</span></div>";
+		if (dw_list.GetItemString(row, L"CSpec") != L"")
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >规格:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"CSpec") +
+				L"</span></div>";
+
+		KXMLDOMNodeList fieldsEx = x1.selectNodes(L"data/field");
+		xstring ls_detail = L"";
+		xstring ls_item = L"";
+		xstring name;
+		xstring label;
+		int len = fieldsEx.length();
+		int i = 0;
+
+		for (i = 0; i < len; true)
+		{
+			int cnt = 0;
+			ls_item = L"";
+			while (cnt < 2)
+			{
+				name = fieldsEx.item(i).selectSingleNode(L"@name").text();
+				label = fieldsEx.item(i).selectSingleNode(L"@label").text();
+				ls_item += L"<td>" + label + L"</td>" + L"<td style='text-align:center'>" + dw_list.GetItemString( row, (LPCTSTR)name) + L"</td>";
+				cnt++;
+				i++;
+				if (i == len)break;
+			}
+			ls_detail += L"<tr>" + ls_item + L"</tr>";
+		}
+		html += (xstring)L"<div style='margin-left:8px;margin-right:16px;'>" +
+			+ L"<table><colgroup span='1' width='70'/><colgroup span='1' width='120'/><colgroup span='1' width='70'/><colgroup span='1' width='120'/>"
+			+ ls_detail
+			+ L"</table>"
+			+ L"</div>";
+
+		xstring ls_star = L"";
+		KXMLDOMNodeList fields = x.selectNodes(L"data/field");
+		len = fields.length();
+
+		ls_detail = L"";
+		if (len > 0)
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >技术要求:</span></div>";
+		for (i = 0; i < len; true)
+		{
+			ls_item = L"";
+
+			int count = 0;
+			while (count < 2)
+			{
+				name = fields.item(i).selectSingleNode(L"@name").text();
+				label = fields.item(i).selectSingleNode(L"@label").text();
+				if (name == L"QualityTerm" || name == L"PackTerm" || label == L"质量" || label == L"包装质量" || label == L"技术要求")
+				{
+					i++;
+					if (i >= len)count = 2;
+					continue;
+				}
+				else if (dw_list.GetItemString( row, (LPCTSTR)name) == L"")
+				{
+					KXMLDOMNodeList options = fields.item(i).selectNodes(L"item");
+					int tlen = options.length();
+					xstring terms = L"";
+					for (int k = 0; k < tlen; k++)
+					{
+						if (xstring(options.item(k).text()))
+						{
+							if (k > 0) terms += L", L";
+							terms += (xstring)L"[" + options.item(k).text() + L"]";
+						}
+					}
+					ls_star += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >" + label + L"*:</span><span  style='width:90;font-size:10pt'>" + terms + L"</span></div>";
+				}
+				else
+				{
+					ls_item = L"<td>" + label + L"</td>" + L"<td>" + dw_list.GetItemString( row, (LPCTSTR)name) + L"</td>";
+					count++;
+				}
+				i++;
+				if (i >= len)count = 2;
+			}
+			ls_item = L"<tr>" + ls_item + L"</tr>";
+			ls_detail += ls_item;
+		}
+
+		html += (xstring)L"<div style='margin-left:8px;margin-right:16px;'>" +
+			+L"<table><colgroup span='1' width='70'/><colgroup span='1' width='120'/><colgroup span='1' width='70'/><colgroup span='1' width='120'/>"
+			+ ls_detail
+			+ L"</table>"
+			+ L"</div>";
+		if (dw_list.GetItemString(row, L"QualityTerm") != L"")
+		{
+			html += L"<div style='height:12px'/>";
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >质量:</span></div>";
+			html += L"<div ><span style='margin-left:8px;margin-right:16px;font-weight:400;font-size:10pt'  >" + dw_list.GetItemString(row, L"QualityTerm") + L"</span></div>";
+		}
+
+		if (dw_list.GetItemString(row, L"PackTerm") != L"")
+		{
+			html += L"<div style='height:12px'/>";
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >包装质量:</span></div>";
+			html += L"<div ><span style='margin-left:8px;margin-right:16px;font-weight:400;font-size:10pt' >" + dw_list.GetItemString(row, L"PackTerm") + L"</span></div>";
+		}
+
+		if (dw_list.GetItemString( row, L"Remark") != L"")
+		{
+			//html +=  L"<div style='height:12px'/>";
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >备注:</span></div>";
+			html += L"<div ><span style='margin-left:8px;margin-right:16px;font-weight:400;font-size:10pt' >" + dw_list.GetItemString( row, L"Remark") + L"</span></div>";
+		}
+
+		html += L"<div style='height:24px'/>";
+
+		//星标项
+		html += ls_star;
+
+		//显示图片	
+		/*
+		if (id != L"")
+		{
+			xml xp=new xml;
+			xp.setNativePointer(xml::CreateInstance());
+			xaserverarg arg_pic=new xaserverarg;
+			arg_pic.setNativePointer(arg_pic.CreateInstance());
+			arg_pic.AddArg(L"SKUID",id);
+			if(url::get(L"/sale/data/ProductLibrary3/pref/picture/imagelistSKU",arg_pic.GetString(),xp)!=1)
+			{
+				trace(L"xxx",xp.GetXml());
+			}else {
+				html +=  L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >图片:</span>"	;
+				KXMLDOMElement ep=  xp.selectSingleNode(L"ImageList");
+				if (ep)
+				{
+					if (ep.SelectNodes(L"image")){
+						KXMLDOMNodeList  nlistp = ep.SelectNodes(L"image");
+						int ip=0;
+						int lenp = nlistp.length;
+						for(ip=0;ip<lenp;ip++)
+						{
+							KXMLDOMElement xitemp = nlistp.item(ip);
+							xstring filename = xitemp.selectSingleNode(L"PicPath").text;
+							//trace(filename);
+							html +=  L"<control visible='layer' controlclass='ximage'  data='' src='http://192.168.7.241:7001" +  filename +L"'/>";
+						}
+					}
+				}
+				html +=  L"</div>";
+			}
+		}else {
+			xstring picname = L"1FA9E331-F95C-4E51-B80C-73FB9B911D8D.jpg";//dw_list.GetItemString(row,L"ImgName"); //ItemID+L".jpg";
+			xstring str = picname.mid(0,2);
+			str = str.upper();
+			xstring serversrc =L"http://192.168.7.241:1001/business/products/chanpin/"+str+L"/"+picname;
+			html +=  L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >图片:</span>";
+			html +=  L"<control visible='layer' controlclass='ximage'  data='' src='"+ serversrc +L"'/></div>";
+		}
+		*/
+		html += L"</body></html>";
+		//trace(html);
+		return html;
+	}
+
+	xstring makeGoodscarHtml(int row)
+	{
+		xstring No = dwc_list.GetItemString(row, L"RefNo");//获取属性值id					
+		xml x = GetGoodsPropList(No);
+
+		xstring html = L"<html><style> .text{ font-weight:400} .label { font-weight:400;}</style><body style='margin:2;background-color1:#ccdccc none #f0f0f0 none'>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >编号:</span><span  style='width:90;font-size:10pt'>" + dwc_list.GetItemString(row, L"No") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >品名:</span><span  style='width:90;font-size:10pt'>" + dwc_list.GetItemString(row, L"CName") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >规格:</span><span  style='width:90;font-size:10pt'>" + dwc_list.GetItemString(row, L"CSpec") +
+			L"</span></div>";
+
+		KXMLDOMNodeList fields = x.selectNodes(L"data/field");
+		int len = fields.length();
+		html += (xstring)L"<table>" +
+			L"<colgroup span='1' width='80'/>" +
+			L"<colgroup span='1' width='120'/>" +
+			L"<colgroup span='1' width='420'/>";
+		html += L"<tr>";
+		html += L"<td style='text-align:center'>编号</td><td style='text-align:center'>项目</td><td style='text-align:center'>内容</td>";
+		html += L"</tr>";
+		for (int i = 0; i < len; i++)
+		{
+			xstring name = fields.item(i).selectSingleNode(L"@name").text();
+			xstring label = fields.item(i).selectSingleNode(L"@label").text();
+			html += L"<tr>";
+			if (i == 0)
+				html += L"<td rowspan='" + xstring(len) + L"'>" + No + L"</td><td >" + label + L"</td><td >" + L"</td>";
+			else
+				html += L"<td >" + label + L"</td><td >" +dw_list.GetItemString( row, (LPCTSTR)name) + L"</td>";
+			html += L"</tr>";
+		}
+
+		html += L"<tr>";
+		html += L"<td rowspan='3'>" +dw_list.GetItemString( row, L"PackCode") + L"</td><td >包装方式</td><td >" +
+			dw_list.GetItemString(row, L"CPack") + L"</td>";
+		html += L"</tr>";
+		html += L"<tr height='48'>";
+		html += L"<td >包装要求</td><td >" +dw_list.GetItemString( row, L"PackQualityTerm") + L"</td>";
+		html += L"</tr>";
+		html += L"<tr>";
+		html += L"<td >侧唛</td><td ></td>";
+		html += L"</tr>";
+
+		html += L"<tr height='72'>";
+		html += L"<td>" +dw_list.GetItemString( row, L"QualityCode") + L"</td><td >质量要求</td><td >" +
+			dw_list.GetItemString(row, L"QualityTerm") + L"</td>";
+		html += L"</tr>";
+
+		html += L"</table>";
+
+		html += L"</body></html>";
+		return html;
+
+	}
+
+	int CarGoodsDelete()
+	{
+		return 1;
+	}
+
+	xstring Up(xstring name) {
+		xstring str = name.mid(0, 2);
+		str = str.toUpper();
+		return xaserver::UploadFile(L"product" + str, name + L".jpg", GetHWND(), L"", false);
+	}
+
+	int OnAddImage() {
+		if (m_customer != L"") return OnAddImageEx();
+		int row = dw_list.GetNextSelectRow(1);
+		if (row < 1) row = dw_list.GetRow();
+		if (row < 1 || row > dw_list.GetRowCount()) return 0;
+
+		KXMLDOMElement e = dw_list.GetRowElement(row);
+		xstring skuid = dw_list.GetItemString( row, L"@guid");
+		xstring SKUNo = dw_list.GetItemString( row, L"SKUNo");
+		xstring id = ViewObject::GetGuid();
+		xstring ret1 = Up(id);
+		if (ret1 == L"-1") return -1;
+		if (ret1 == L"0")
+		{
+			alert(L"上传图片失败");
+			return -1;
+		}
+		xstring originfile = ret1;
+		xstring ext = originfile.right(7);
+		if (ext.find(L".") >= 0)
+			ext = ext.mid(ext.find(L".") + 1, 9999);
+		else
+			ext = L"jpg";
+
+		// 图片名加入数据库
+		xml x ;
+		x.loadXML(L"<Item update.new='1' update.modify='1' guid='" + id + L"'>" +
+			L"<ProductPictureID>" + id + L"</ProductPictureID>" +
+			L"<OriginFile>" + originfile + L"</OriginFile>" +
+			L"<FileExt>" + ext + L"</FileExt>" +
+			L"<SKUID>" + skuid + L"</SKUID>" +
+			L"<Name>[" + SKUNo.trim() + L"]</Name>" +
+			L"<FileName>" + id + L".jpg</FileName>" +
+			L"</Item>"
+		);
+
+		xaserverarg arg;
+		arg.AddArg(L"content", x.xml());
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		dw_list.SetItemString(row, L"pic", L"*");
+		dw_list.Redraw();
+		//刷新一下界面,显示图片
+		OnShowImage(skuid);
+		return 1;
+	}
+
+	int OnAddImageEx() {
+		int row = dwc_list.GetNextSelectRow(1);
+		if (row < 1) row = dwc_list.GetRow();
+		if (row < 1 || row > dwc_list.GetRowCount()) return 0;
+
+		KXMLDOMElement e = dw_list.GetRowElement( row);
+		xstring skuid =dw_list.GetItemString( row, L"SKUID");
+		xstring SKUNo =dw_list.GetItemString( row, L"SKUID/@__displaystring");
+		xstring CustomerID = m_customer;
+		xstring CustomerItemNo =dw_list.GetItemString( row, L"CustomerItemNo");
+		xstring id = ViewObject::GetGuid();
+		xstring ret1 = Up(id);
+		if (ret1 == L"-1") return -1;
+		if (ret1 == L"0")
+		{
+			alert(L"上传图片失败");
+			return -1;
+		}
+		xstring originfile = ret1;
+		xstring ext = originfile.right(7);
+		if (ext.find(L".") >= 0)
+			ext = ext.mid(ext.find(L".") + 1, 9999);
+		else
+			ext = L"jpg";
+
+		// 图片名加入数据库
+		xml x;
+		x.loadXML(L"<Item update.new='1' update.modify='1' guid='" + id + L"'>" +
+			L"<ProductPictureID>" + id + L"</ProductPictureID>" +
+			L"<OriginFile>" + originfile + L"</OriginFile>" +
+			L"<FileExt>" + ext + L"</FileExt>" +
+			L"<SKUID>" + skuid + L"</SKUID>" +
+			L"<CustomerItemNo>" + CustomerItemNo + L"</CustomerItemNo>" +
+			L"<CustomerID>" + CustomerID + L"</CustomerID>" +
+			L"<Name>[" + SKUNo.trim() + L"]</Name>" +
+			L"<FileName>" + id + L".jpg</FileName>" +
+			L"</Item>"
+		);
+
+		xaserverarg arg;
+		arg.AddArg(L"content", x.xml());
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		dwc_list.SetItemString(row, L"pic", L"*");
+		dwc_list.Redraw();
+		//刷新一下界面,显示图片
+		OnShowImage(skuid, CustomerItemNo);
+		return 1;
+	}
+
+	int OnDeleteImageEx()
+	{
+		int row = dwc_list.GetNextSelectRow(1);
+		if (row < 1) row = dwc_list.GetRow();
+		if (row < 1 || row > dwc_list.GetRowCount()) return 0;
+
+		ximageview im = GetControl(L"im1");
+		int index = im.GetSelectIndex();
+		int count = im.GetImageCount();
+
+		if (count < 1) return 1;
+
+		KXMLDOMNodeList images = imageElement.selectNodes(L"image");
+		int length = images.length();
+		if (length < index) return 1;
+
+		int MB_OKCANCEL = 0x00000001;
+		int IDOK = 1;
+		if (MessageBox(GetHWND(), L"确认删除当前图片?", L"提示", MB_OKCANCEL) != IDOK) return 1;
+
+		xstring id = images.item(index).selectSingleNode(L"@guid").text();
+
+		xml x ;
+		xaserverarg arg;
+		arg.setNativePointer(arg.CreateInstance());
+		xstring str = L"<Item update.modify='1' update.delete='1' guid='" + id + L"'/>";
+		arg.AddArg(L"content", str);
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		if (count == 1)
+		{
+			dwc_list.SetItemString(row, L"pic", L"");
+			dwc_list.Redraw();
+		}
+
+		xstring skuid =dw_list.GetItemString( row, L"SKUID");
+		xstring SKUNo =dw_list.GetItemString( row, L"SKUID/@__displaystring");
+		xstring CustomerID = m_customer;
+		xstring CustomerItemNo =dw_list.GetItemString( row, L"CustomerItemNo");
+		OnShowImage(skuid, CustomerItemNo);
+
+		return 1;
+	}
+
+	int OnDeleteImage() {
+		if (m_customer != L"") return OnDeleteImageEx();
+
+		int row = dw_list.GetNextSelectRow(1);
+		if (row < 1) row = dw_list.GetRow();
+		if (row < 1 || row > dw_list.GetRowCount()) return 0;
+
+		ximageview im = GetControl(L"im1");
+		int index = im.GetSelectIndex();
+		int count = im.GetImageCount();
+
+		if (count < 1) return 1;
+
+		KXMLDOMNodeList images = imageElement.selectNodes(L"image");
+		int length = images.length();
+		if (length < index) return 1;
+
+		int MB_OKCANCEL = 0x00000001;
+		int IDOK = 1;
+		if (MessageBox(GetHWND(), L"确认删除当前图片?", L"提示", MB_OKCANCEL) != IDOK) return 1;
+
+		xstring id = images.item(index).selectSingleNode(L"@guid").text();
+
+		xml x;
+		xaserverarg arg;
+		xstring str = L"<Item update.modify='1' update.delete='1' guid='" + id + L"'/>";
+		arg.AddArg(L"content", str);
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		if (count == 1)
+		{
+			dw_list.SetItemString(row, L"pic", L"");
+			dw_list.Redraw();
+		}
+
+		KXMLDOMElement e1 = dw_list.GetRowElement(row);
+		xstring skuid = e1.getAttribute(L"guid");
+		OnShowImage(skuid);
+
+		return 1;
+	}
+	int OnPreviewImage()
+	{
+		int row = dw_list.GetNextSelectRow(1);
+		if (row < 1) row = dw_list.GetRow();
+		if (row < 1 || row > dw_list.GetRowCount()) return 0;
+		KXMLDOMElement e = dw_list.GetRowElement(row);
+		//KXMLDOMElement e = dw_list.GetRowElement(row);
+		//alert(e.xml);
+		xstring id = dw_list.GetItemString( row, L"@guid");
+		//alert(id);
+
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+		xstring categoryid = e1.selectSingleNode(L"@guid").text();
+		//alert(categoryid);
+		xaserverarg* arg = new xaserverarg;
+		arg->AddArg(L"SKUID", id);
+		arg->AddArg(L"CategoryID", categoryid);
+
+		OpenWindow(L"dev:xpage[PictureView.Product3.vx]", (LPARAM)arg);
+
+		return 1;
+	}
+
+	int ItemMaint()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		//xstring no = e.getAttribute(L"no");
+		//if(no==L"") return 1;
+		xstring guid = e.getAttribute(L"guid");
+		if (guid == L"") return 1;
+
+		/*
+		if(no==L"NP0000FS" || no==L"UP0000FS")
+		{
+			OpenWindow(L"dev:xpage[PackSchemaMaint.goodslib.vx]");
+		}else
+		{
+			int pr = g_xdoc_product;
+			OpenWindow(L"dev:xpage[ProductLibraryItemMaint.vx]",pr);
+		}
+		*/
+		//KXMLDOMElement ele = g_xdoc_product.getRowElement(L"data/Item", 1);
+		//alert(ele.xml);
+#ifdef shouldfinished
+		int pr = g_xdoc_product;
+		OpenWindow(L"dev:xpage[ProductLibraryItemMaint3.vx]", pr);
+#endif
+		return 1;
+	}
+
+	int ItemAdd()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		//alert(e.xml);
+		/*xstring no = e.getAttribute(L"no");
+		if(no==L"") return 1;
+		if(no==L"NP0000FS" || no==L"UP0000FS")
+		{
+			OpenWindow(L"dev:xpage[PackSchemaMaint.goodslib.vx]");
+		}else
+		{
+			int p = no;
+			OpenWindow(L"dev:xpage[SO.autolist.goodslib.add.vx]",p);
+		}*/
+		xstring guid = e.getAttribute(L"guid");
+		if (guid == L"") return 1;
+		xaserverarg arg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg(L"guid", e.getAttribute(L"guid"));
+		if (name == L"个人产品")
+			arg.AddArg(L"FolderID", e.getAttribute(L"guid"));
+		else
+			arg.AddArg(L"CategoryID", e.getAttribute(L"guid"));
+		xstring No = e.getAttribute(L"CategoryNo");
+		if (No == L"") No = e.getAttribute(L"no");
+		xstring Name = e.getAttribute(L"CName");
+		if (Name == L"") Name = e.getAttribute(L"cname");
+		arg.AddArg(L"No", No);
+		arg.AddArg(L"CName", Name);
+		OpenWindow(L"dev:xpage[Quick.Input.NewProduct.vx]", (LPARAM)&arg);
+
+		if (arg.GetArgString(L"data.modify") == L"1")RetrieveData();
+
+		return 1;
+	}
+
+	int OnAddFolder()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+
+		xaserverarg arg;
+		if (hItem != hTopItem)
+		{
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring folder = e.getAttribute(L"guid");
+			if (folder != L"")
+			{
+				arg.AddArg(L"parentCategoryID", folder);
+				OpenWindow(L"dev:xpage[UserFolderMaint.vx]",(LPARAM)&arg);
+				/*if(arg.GetArgString(L"FolderID")!=L"")
+				{
+					int child = tv_folder.GetChildItem(hItem);
+					if(!child)
+					{
+						ExpandItem(hItem);
+					}
+					else
+					{
+						KXMLDOMElement e1 = cast(tv_folder.GetItemData(hItem) as KXMLDOMElement);
+						KXMLDOMElement e2 = e1.cloneNode(0);
+						e2.
+					}
+				}*/
+			}
+		}
+
+		return 1;
+	}
+
+	int OnMaintFolder()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+
+		xaserverarg arg;
+		if (name == L"个人库" && selectname == L"新产品" && tv_folder.GetParentItem(hItem) == hTopItem) return 1;
+		if (hItem != hTopItem)
+		{
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring folder = e.getAttribute(L"guid");
+			if (folder != L"")
+			{
+				arg.AddArg(L"CategoryID", folder);
+				OpenWindow(L"dev:xpage[UserFolderMaint.vx]", (LPARAM)&arg);
+				if (arg.GetArgString(L"label") != L"")
+				{
+					tv_folder.SetItemLabel(hItem, arg.GetArgString(L"label"));
+				}
+			}
+		}
+		return 1;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		int hCursor;
+		xstring name = L"";
+		if (comdid == L"xmRefresh")
+		{
+			return RetrieveData();
+		}
+		else if (comdid == L"xmCarGoodsDelete")
+		{
+			CarGoodsDelete();
+			return 1;
+		}
+		else if (comdid == L"xmAddFolder")
+		{
+			return OnAddFolder();
+		}
+		else if (comdid == L"xmMaintFolder")
+		{
+			return OnMaintFolder();
+		}
+		else if (comdid == L"xmClose")
+		{
+			CloseWindow();
+			return 1;
+		}
+		else if (comdid == L"xmCarGoodsMaint")
+		{
+#ifdef shouldfinish
+			OpenWindow(L"dev:xpage[ShoppingCartProductMaint.vx]", trust(g_xdoc_shoppingcart as int));
+#endif
+			return 1;
+		}
+		else if (comdid == L"xmCarMaint")
+		{
+			OpenWindow(L"dev:xpage[SO.autolist.Shopcar.vx]");
+			return 1;
+		}
+		else if (comdid == L"xmSaleOrder")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+
+			}
+			content += L"</data>";
+			xaserverarg carg;
+			carg.setNativePointer(carg.CreateInstance());
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[SO.Simulation.Import.vx]", (LPARAM) & carg);
+			return 1;
+		}
+		else if (comdid == L"xmEnquiry")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+			}
+			content += L"</data>";
+			xaserverarg carg;
+			carg.setNativePointer(carg.CreateInstance());
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[Enquiry.Import.vx]", (LPARAM)&carg);
+			return 1;
+		}
+		else if (comdid == L"xmPurchar")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+			}
+			content += L"</data>";
+			xaserverarg carg ;
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[PO.Import.vx]", (LPARAM)&carg);
+			return 1;
+		}
+		else if (comdid == L"xmSearch")
+		{
+			RetrieveData();
+			return 1;
+		}
+		else if (comdid == L"xmQuote")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+			}
+			content += L"</data>";
+			xaserverarg carg;
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[Quote.Import.vx]",  (LPARAM) & carg);
+			return 1;
+		}
+		else if (comdid == L"xmAdd")
+		{
+			return ItemAdd();
+		}
+		else if (comdid == L"xmDelete")
+		{
+			int row = dw_list.GetRow();
+			if (row < 1) return 1;
+			xstring skuid = dw_list.GetItemString( row, L"@guid");
+			xml skuid_x = ViewObject::RetrieveData(L"/sale/data/ProductLibrary3/ProductNumberone", L"SKUID", skuid);
+			xstring  skuidEx = skuid_x.text();
+			int  skuid1 = skuidEx.toInt();
+			if (skuid1)
+			{
+				if (skuid1 > 0)
+				{
+					alert(L"订单已有产品,不允许删除!");
+					return 1;
+				}
+			}
+
+			DeleteRow(row);
+
+			return 1;
+		}
+		else if (comdid == L"xmCarAdd")
+		{
+			HCURSOR hCursor = xutil::SetCursorWait();
+			name = xcontrol(GetControl(L"frame:ed_goodscar")).GetText();
+			if (name != L"")
+			{
+				if (ShoppingCartView::AddCar(name) == 1)
+				{
+					tv_folder.InsertChildItem(LookupTopFolder(tv_folder.GetSelectedItem()),
+						name, 0, 35);
+				}
+			}
+			xutil::RestoreCursor(hCursor);
+			return 1;
+		}
+		else if (comdid == L"xmMaint")
+		{
+			return ItemMaint();
+		}
+		else if (comdid == L"xmAddImage")
+		{
+			return OnAddImage();
+		}
+		else if (comdid == L"xmDeleteImage")
+		{
+			return OnDeleteImage();
+		}
+		else if (comdid == L"xmPreviewImage")
+		{
+			return OnPreviewImage();
+		}
+		else if (comdid == L"xmPropConfigure")
+		{
+#ifdef shouldfinish
+			int r = cast(g_xdoc_product.getData(L"data/Item", L"@guid") as int);
+			OpenWindow(L"dev:xpage[Product.ItemProp.Maint.vx]", r);
+#endif
+			return 1;
+		}
+		else if (comdid == L"xmRertieve")
+		{
+			/*
+			int hItem1 = tv_folder.GetSelectedItem();
+			KXMLDOMElement e2= tv_folder.GetItemData(hItem1);
+			xstring no1 = e2.getAttribute(L"no");
+			xml x2 = vcontrol::RetrieveData(L"/sale/data/SO/goods/usergoods/listex1",L"parent",no1);
+			g_xdoc_product.Retrieve(x2);
+			*/
+			return 1;
+		}
+		else if (comdid == L"xmToCar")
+		{
+			name = xcontrol(GetControl(L"frame:cbx_goodscar")).GetText();
+			if (name == L"==选择购物车==L")
+			{
+				alert(L"请选择购物车");
+				return 1;
+			}
+			int xrow = dw_list.GetNextSelectRow(1);
+			xstring goodsid = L"";
+			xstring html = L"<data>";
+			while (xrow > 0)
+			{
+				KXMLDOMElement e =dw_list.GetRowElement(xrow);
+				goodsid = ProductLibraryView::GetElementString(e, L"@guid");
+				html += L"<item goodid='" + goodsid + L"' id ='" + ProductLibraryView::GetGuid() + L"'/>";
+				xrow = dw_list.GetNextSelectRow(xrow + 1);
+			}
+			html += L"</data>";
+			trace(html);
+			if (ShoppingCartView::GoodsImport(name, html) == 1)
+				alert(L"添加错误!");
+			else
+				alert(L"添加成功");
+			return 1;
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt, int param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	//查找当前树项的顶级目录
+	HTREEITEM LookupTopFolder(HTREEITEM hItem)
+	{
+		HTREEITEM hRoot = tv_folder.GetRootItem();
+		while (tv_folder.GetParentItem(hItem)) hItem = tv_folder.GetParentItem(hItem);
+		return hItem;
+	}
+
+	//插入产品类项的子项
+	int MakeGoodsFolderItem(HTREEITEM hItem, xstring sno)
+	{
+		xml x = ProductLibraryView::GetTreeChildItems3(sno);
+		if (!x) return 0;
+
+		KXMLDOMNodeList nlist = x.selectNodes(L"//Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"CName");
+			xstring no = e.getAttribute(L"CategoryNo");
+			xstring label = no.trim() + L" " + name;
+
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, label, e, 15);
+			xstring child = e.getAttribute(L"Childs");
+			if (child == L"")
+				tv_folder.SetItemChild(h, 1);
+			else if (child != L"0")
+				tv_folder.SetItemChild(h, 1);
+		}
+		return 1;
+	}
+
+	//插入新产品目录子项
+	int MakeUserGoodsFolderItem(HTREEITEM hItem, xstring sno)
+	{
+		xml x = ProductLibraryView::GetTreeUserChildItems3(sno);
+		if (!x) return 0;
+
+		KXMLDOMNodeList nlist = x.selectNodes(L"//Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"CName");
+			xstring no = e.getAttribute(L"CategoryNo");
+			xstring label = no.trim() + L" " + name;
+
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, label, e, 15);
+			xstring child = e.getAttribute(L"Childs");
+			if (child == L"")
+				tv_folder.SetItemChild(h, 1);
+			else if (child != L"0")
+				tv_folder.SetItemChild(h, 1);
+		}
+		return 1;
+	}
+
+	//插入购物车项
+	int ExpandCatChildFolder(HTREEITEM hItem, KXMLDOMElement ele, int image)
+	{
+		KXMLDOMNodeList nlist = ele.selectNodes(L"item");
+		int len = nlist.length();
+		if (len > 0) tv_folder.SetItemChild(hItem, 1);
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+	int MakeGoodCarFolderItem(HTREEITEM hItem)
+	{
+		xml x = ShoppingCartView::GetRoleList();
+		if (!x) return 0;
+		KXMLDOMNodeList nlist = x.selectNodes(L"/data/item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, 35);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+
+	int ExpandItem(HTREEITEM hItem)
+	{
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		HTREEITEM child = tv_folder.GetChildItem(hItem);
+		xstring no = L"";
+		KXMLDOMElement e;
+		if (name == L"公司库" && !child)
+		{
+			no = L"";
+			if (hTopItem != hItem)
+			{
+				e = tv_folder.GetItemData(hItem);
+				no = e.getAttribute(L"categoryid");
+			}
+			else
+			{
+				e = tv_folder.GetItemData(hItem);
+				no = e.getAttribute(L"categoryid");
+			}
+			MakeGoodsFolderItem(hItem, no);
+		}
+		else if (name == L"个人库" && !child)
+		{
+			no = L"";
+			if (hTopItem != hItem)
+			{
+				e = tv_folder.GetItemData(hItem);
+				no = e.getAttribute(L"categoryid");
+				MakeUserGoodsFolderItem(hItem, no);
+			}
+		}
+		else if (name == L"购物车" && !child)
+		{
+			if (hItem == hTopItem)MakeGoodCarFolderItem(hItem);
+		}
+		return 1;
+	}
+
+	//树展开
+	int OnTreeExpanding(TEvent * evt, int p)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+		return ExpandItem(hItem);
+	}
+
+	int ResetAgent(xstring agentAsk)
+	{
+		if (agentFor != agentAsk)
+		{
+			agentFor = agentAsk;
+			m_agentNode = 0;
+			SetAgent();
+		}
+		return 1;
+	}
+
+	HTREEITEM LookupCustomerFolder(HTREEITEM hItem)
+	{
+		while (true)
+		{
+			KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+			xstring str = e1.getAttribute(L"no");
+			if (str.find(L"Customer:") >= 0) return hItem;
+			hItem = tv_folder.GetParentItem(hItem);
+			if (hItem == 0) break;
+		}
+		return 0;
+	}
+
+	xstring LookupCustomer(HTREEITEM hItem)
+	{
+		hItem = LookupCustomerFolder(hItem);
+		if (hItem == 0) return L"";
+		KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+		xstring str = e1.getAttribute(L"no");
+		return str.mid(xstring(L"Customer:").length(), 9999);
+	}
+
+	int RetrieveData()
+	{
+		ximageview im = GetControl(L"im1");
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+
+		xcontrol query = GetControl(L"sl_search");
+		xstring queryString = query.GetText();
+
+		if (hItem == hTopItem)
+		{
+			dw_list.Reset();
+			dw_list.SetReadOnly(true);
+			dw_list.Redraw();
+			dwc_list.Reset();
+			dwc_list.SetReadOnly(true);
+			dwc_list.Redraw();
+
+			im.Reset();
+			im.Redraw();
+
+
+			xshtml xs1 = GetControl(L"html_detail");
+			xs1.SetContent(L"<html><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'/></html>");
+
+			if (name != L"公司库") return 1;
+		}
+		//return 1;
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+
+		if (name == L"购物车")
+		{
+			if (selectname != name)
+			{
+				KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+				xstring str = e1.getAttribute(L"no");
+				alert(str);
+				if (str.find(L"Customer:") == 0 || str.find(L"SO:") == 0)
+				{
+					m_customer = LookupCustomer(hItem);
+					if (str.find(L"Customer:") == 0)
+						dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodscustomerlist");
+					else
+						dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodssolist");
+					dwc_list.Reset();
+					dwc_list.SetReadOnly(true);
+					dw_list.Retrieve(ShoppingCartView::GetGoodsList(str, queryString));
+				}
+				else if (e1.getAttribute(L"categoryid") != L"")
+				{
+					xstring categoryid = e1.getAttribute(L"categoryid");
+					dwc_list.SetDataObject(ProductLibraryView::GetMaintListForm3(categoryid));
+					dwc_list.SetReadOnly(true);
+					dwc_list.Reset();
+					dw_list.Retrieve(ProductLibraryView::GetMaintList3(categoryid, queryString, L""));
+					dwc_list.Redraw();
+				}
+				else
+				{
+					dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodslist");
+					dwc_list.SetReadOnly(true);
+					dwc_list.Reset();
+					dw_list.Retrieve(ShoppingCartView::GetGoodsList(selectname, queryString));
+				}
+				//dwc_list.PostRetrieve();
+				dwc_list.Redraw();
+
+				xshtml xs = GetControl(L"html_detail");
+				if (dwc_list.GetRowCount() >= 1)
+				{
+					xs.SetContent(makeGoodscarHtml(1));
+
+					if (m_customer != L"")
+					{
+						xstring skuid =dw_list.GetItemString( 1, L"SKUID");
+						xstring customerItemNo =dw_list.GetItemString( 1, L"CustomerItemNo");
+						OnShowImage(skuid, customerItemNo);
+					}
+				}
+				else
+				{
+					im.Reset();
+					im.Redraw();
+
+					xs = GetControl(L"html_detail");
+					xs.SetContent(L"<html><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'/></html>");
+				}
+				xs.Redraw();
+			}
+		}
+		else
+		{
+
+			if (name == L"个人库" || name == L"公司库")
+			{
+				xstring no = L"N000005";
+				if (name == L"个人库") no = L"U000005";
+
+				if (hItem != hTopItem)
+				{
+					KXMLDOMElement e = tv_folder.GetItemData(hItem);
+					no = e.getAttribute(L"guid");
+				}
+				else
+					return 1;
+
+				/*	dw_list.SetDataObject(ProductLibraryView::GetMaintListForm3(no).GetXmlDoc());
+					dw_list = GetControl(L"dw_list");
+					dw_list.Reset();
+					dw_list.SetReadOnly(true);
+				*/
+
+				if (name == L"个人库")
+					dw_list.Retrieve(ProductLibraryView::GetMaintRoleList3(no));
+				else
+				{
+					if (queryString != L"")
+					{
+
+						if (no == L"N000005")
+							dw_list.Retrieve(ProductLibraryView::GetMaintList3(L"", queryString, L""));
+						else
+							dw_list.Retrieve(ProductLibraryView::GetMaintList3(no, queryString, L""));
+					}
+					else
+					{
+						if (no == L"N000005") return 1;
+						dw_list.Retrieve(ProductLibraryView::GetMaintList3(no));
+					}
+				}
+				//dw_list.PostRetrieve();
+				dw_list.Redraw();
+
+				xshtml xs = GetControl(L"html_detail");
+				if (dw_list.GetRowCount() > 0)
+				{
+					xs.SetContent(makeHtml(1));
+					xstring id = dw_list.GetItemString( 1, L"@guid");
+					OnShowImage(id);
+				}
+				else
+				{
+					im.Reset();
+					im.Redraw();
+
+					xs.SetContent(L"<html><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'/></html>");
+				}
+				xs.Redraw();
+			}
+		}
+		xutil::RestoreCursor(hCursor);
+
+		return 1;
+	}
+
+	int OnTreeSelChanged(TEvent * evt, int p)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+		ximageview im = GetControl(L"im1");
+		m_customer = L"";
+		//alert(name);
+		if (name == L"购物车")
+		{
+			if (agentFor != L"goodscar")SwitchLayer(L"goodscarsheet", L"sheetframe");
+			ResetAgent(L"goodscar");
+		}
+		else
+		{
+			if (agentFor != L"goodslib")SwitchLayer(L"goodslibsheet", L"sheetframe");
+			if (name == L"个人库")
+				ResetAgent(L"userlib");
+			else
+				ResetAgent(L"goodslib");
+		}
+		//RetrieveData();
+		PostMessage(GetHWND(), 0x401, (WPARAM)L"xmRefresh", 0);
+
+		return 1;
+	}
+
+	int  ExpandChildFolder(HTREEITEM hItem, KXMLDOMElement pElement)
+	{
+		KXMLDOMNodeList nlist = pElement.selectNodes(L"Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement& e = * new KXMLDOMElement(nlist.item(i));
+			xstring name = e.getAttribute(L"cname");
+			xstring sImage = e.getAttribute(L"image");
+			int image = 15;
+			//if(sImage) image = sImage.toInt();
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			tv_folder.SetItemChild(h, 1);
+			ExpandChildFolder(h, e);
+		}
+		return 1;
+	}
+
+	int  InitialFolder()
+	{
+		KXMLDOMElement xframeElement = GetElement();
+		KXMLDOMElement e = xframeElement.selectSingleNode(L"//xtree[@name='tv_folder']/initial");
+		ExpandChildFolder(0, e);
+		return 1;
+	}
+
+	int OnViewZoomChange(TEvent* evt, int lParam)
+	{
+		ximageview im = GetControl(L"im1");
+		xcombobox xc = GetControl(L"precent");
+		xstring text = xc.GetLBText();
+		int p = text.toInt();
+		if (p == 0) p = 100;
+		im.Preview(p);
+		return 1;
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&ProductLibrary4Win::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&ProductLibrary4Win::OnSetFocus);
+		AttachEvent(L"dw_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&ProductLibrary4Win::OnRowChanged);
+		AttachEvent(L"dwc_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&ProductLibrary4Win::OnGoodsCarRowChanged);
+		AttachEvent(L"tv_folder", L"TVN_ITEMEXPANDING", (FEvent)&ProductLibrary4Win::OnTreeExpanding);
+		AttachEvent(L"tv_folder", L"TVN_SELCHANGED", (FEvent)&ProductLibrary4Win::OnTreeSelChanged);
+		AttachEvent(L"WM_COMMAND", (FEvent)&ProductLibrary4Win::OnCkbCLick);	//checkbox打钩事件
+		AttachEvent(L"WM_COMMAND", (FEvent)&ProductLibrary4Win::OnCkbCLick2);	//checkbox打钩事件	
+
+		AttachEvent(L"im1", L"IMG_LDBCLICK", (FEvent)&ProductLibrary4Win::OnImgDBClicked);
+		AttachEvent(L"precent", L"CBN_SELCHANGE", (FEvent)&ProductLibrary4Win::OnViewZoomChange);
+
+		return 1;
+	}
+
+	int onload()
+	{
+		agentFor = L"goodslib";
+		m_customer = 0;
+
+		OnAttachEvent();
+
+		tv_folder = GetControl(L"tv_folder");
+		dw_list = GetControl(L"dw_list");
+		dwc_list = GetControl(L"dwc_list");
+
+		InitialFolder();
+
+		dw_list.SetDataObject(ProductLibraryView::GetMaintListForm3(L""));
+		dw_list = GetControl(L"dw_list");
+		dw_list.SetReadOnly(true);
+
+		dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodslist");
+		dwc_list.SetReadOnly(true);
+
+		tv_folder.ExpandItem(tv_folder.GetRootItem());
+		tv_folder.ItemFocus(tv_folder.GetRootItem());
+
+		if (dw_list.GetRowCount())
+		{
+			xshtml xs = GetControl(L"html_detail");
+			xs.SetContent(makeHtml(1));
+		}
+
+		return 1;
+	}
+
+	int onloaded()
+	{
+		SetAgent();
+
+		return 1;
+	}
+
+	int OnImgDBClicked(TEvent * evt, int pr)
+	{
+		IMGNNMHDR& nmtv = *(IMGNNMHDR*)evt->notify.pnmh;
+		xstring src = nmtv.path;
+		/*if(src.length() > 60)
+			src = src.right(44);
+		else
+			src=src.mid(src.find(L"Thumbs", 0)+6, 50);
+		*/
+		xaserverarg& arg = *new xaserverarg;
+		//arg.AddArg(L"src",L"/business/products/chanpin"+src);	
+		arg.AddArg(L"src", src);
+
+		//win::OpenWindow(L"dev:xpage[BigPicture.vx]",arg);	
+
+		int h = openUrl(L"/sale/view/ProductLibrary/xpage/bigpictureview", &arg);
+		return 1;
+		/*
+		xwin x = new xwin;
+		x.setNativePointer(h);
+		m_winHwnd = x.GetHWND();
+
+		xstring sh = doc.GetXml();
+		int p = cast(sh as int);
+		win32::SendMessage(m_winHwnd, 0x401, p, 0);
+		*/
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Data.config.cpp b/jrj/project/business/SystemSettings/Data.config.cpp
new file mode 100644
index 0000000..f5b5019
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Data.config.cpp
@@ -0,0 +1,571 @@
+use "lang.vl"
+use "win.vl"
+use "treeview.vm"
+use "dev:vm[xutil.vm]"
+use "dev:vm[xdwtable.vm]"
+use "dev:vm[xdwgrid.vm]"
+use "dev:vm[combobox.vm]"
+use "frame.vl"
+use "file.vl"
+use "dev:vm[xlayersheet.vm]"
+use "publiccode.vl"
+
+unit vbusiness.vpage
+[
+	DataConfig is extend frame;
+	about DataConfig
+	[
+		field:
+			
+		method:
+		[
+			treeview__	dw_tree;
+			xdwgrid__ dw_list;
+			xdwgrid__ dw_role;
+			combobox__ dw_ddlb;
+			xlayersheet__ m_sheet;
+			
+			int alert(string str)
+			{
+				TApp::alert(this,str,3);
+				return 0;
+			}
+			int createTree(msxml::IXMLDOMElement e, int parentItem)
+			{	
+				if(treeview__::GetChildItem(dw_tree.GetId(), parentItem) > 0) return 0;
+
+				var list=e.selectNodes("item");
+				int i=0,s=list.length;
+				msxml::IXMLDOMElement xitem;
+				for (i=0;i<s;i++)
+				{
+					xitem= list.item(s - i - 1);
+					string Name=xitem.selectSingleNode("name").text;
+					string image = xitem.selectSingleNode("image").text;
+					int curItem=treeview__::InsertItem(dw_tree.GetId(), parentItem,0,Name,xitem,image.toInt());
+					string child=xitem.selectSingleNode("child").text;
+					if (child != "0")
+						treeview__::SetItemChild1(dw_tree.GetId(), curItem,1);
+				}
+				return 1;
+			}
+					
+			int OnTreeExpanding(ref TNotifyEvent evt,int p)
+			{
+				ref NMTREEVIEW nmtv = evt.pnmh;
+				int sitem = nmtv.itemNew.hItem;
+					
+				int i = combobox__::GetCurSel(dw_ddlb.GetId());
+				msxml::IXMLDOMElement e = 	treeview__::GetItemData(dw_tree.GetId(), sitem);
+				string id = e.selectSingleNode("id").text;
+				string xid = e.selectSingleNode("tree").text;
+				int hCursor = xutil__::SetCursorWait();
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("pid",id);
+				arg.AddArg("tree",xid);
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[selectRoleInt.xq]",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/user/select",arg.GetString(),x)!=1)
+				{
+					trace("错误返回="+x.GetXml());
+					return -1;	
+				}
+
+				msxml::IXMLDOMElement ele = x.GetXmlDoc().documentElement;
+				createTree(ele, sitem);
+				xutil__::RestoreCursor(hCursor);
+				return 1;
+			}
+							
+			int OnRetrieve(string id)
+			{
+				int hIcon= xutil__::SetCursorWait();
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("id",id);
+				trace(id);
+				arg.AddArg("flag","-1");
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[selectRoleInt.xq]",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/maint/data",arg.GetString(),x)!=1)
+				{
+					trace("错误返回1="+x.GetXml());
+					return -1;
+				}
+
+				if(x.GetXml() == "")
+					x.LoadXml("<root><items/><roles/></root>");
+				
+				xml__ x1 = new xml__;
+				x1.setNativePointer(xml__ ::CreateInstance());
+				if(x.GetXmlDoc().selectSingleNode("root/items"))
+				{
+					dw_list.Retrieve(x.GetXmlDoc().selectSingleNode("root/items"));
+					dw_list.SetReadOnly(true);
+					dw_list.Redraw();
+				}
+				else
+				{
+					x1.LoadXml("<items/>");
+					dw_list.Retrieve(x1);
+					dw_list.SetReadOnly(true);
+					dw_list.Redraw();					
+				}
+				if(x.GetXmlDoc().selectSingleNode("root/roles"))
+				{
+					dw_role.Retrieve(x.GetXmlDoc().selectSingleNode("root/roles"));
+					dw_role.SetReadOnly(true);
+					dw_role.Redraw();		
+				}				
+				else
+				{
+					x1.LoadXml("<roles/>");
+					dw_role.Retrieve(x1);
+					dw_role.SetReadOnly(true);
+					dw_role.Redraw();					
+				}
+				xutil__::RestoreCursor(hIcon);
+				return 1;
+			}
+
+			int OnTreeSelecded( ref TNotifyEvent evt,int p)
+			{
+				ref NMTREEVIEW nmtv = evt.pnmh;
+				int hItem = nmtv.itemNew.hItem;					
+				int wid = dw_tree.GetId();				
+				msxml::IXMLDOMElement ele =treeview__::GetItemData(wid,hItem);
+				
+				string id = ele.SelectSingleNode("id").text;
+				OnRetrieve(id);
+				
+				return 1;	
+			}
+				
+			int OnSelect()
+			{
+				int nIndex = combobox__::GetCurSel(dw_ddlb.GetId());
+
+				combobox__ dw_ddlbdata =  new combobox__;
+				dw_ddlbdata.setNativePointer(this.GetControl("dw_ddlbdata"));
+				int h = combobox__::FindString(dw_ddlbdata.GetId(), nIndex.toString());
+				param p;
+				xnode__ bnode;
+				xnode__ anode = new xnode__;
+				anode.setNativePointer(GetAgentNode("tree"));
+				if(h < 0)
+				{
+					string str = "<vbox><xtree name='dw_tree"+nIndex.toString()+"' imagelist='0'/></vbox>";
+					bnode = new xnode__;
+					bnode.setNativePointer(SetAgentNodeContent(anode,str));
+				
+					p = combobox__::GetItemData(dw_ddlb.GetId(), nIndex);
+					msxml::IXMLDOMElement ele = p;
+					
+					dw_tree =  new treeview__;
+					dw_tree.setNativePointer(this.GetControl("dw_tree"+nIndex.toString()));
+				
+					createTree(ele, 0);
+					AttachEvent("dw_tree"+nIndex.toString(), "TVN_ITEMEXPANDING",OnTreeExpanding);
+					AttachEvent("dw_tree"+nIndex.toString(), "TVN_SELCHANGED",OnTreeSelecded);
+				
+					int sk = combobox__::AddItem(dw_ddlbdata.GetId(), nIndex.toString());
+					p = bnode;
+					combobox__::SetItemData(dw_ddlbdata.GetId(), sk, p);
+				}
+				else
+				{
+					p = combobox__::GetItemData(dw_ddlbdata.GetId(), h);
+					bnode = p;
+					SetAgentNodeContent(anode,bnode);
+				
+					dw_tree =  new treeview__;
+					dw_tree.setNativePointer(this.GetControl("dw_tree"+nIndex.toString()));
+				}
+				
+				return 1;
+			}
+			
+			int OnSave()
+			{
+				int m = treeview__::GetSelectedItem(dw_tree.GetId());
+				if(m == 0) return 0;
+				
+				int wid = dw_tree.GetId();
+				int hItem=treeview__::GetSelectedItem(wid);				
+				msxml::IXMLDOMElement ele =treeview__::GetItemData(wid,hItem);
+				string id = ele.SelectSingleNode("id").text;
+				string tpy = ele.SelectSingleNode("type").text;
+				
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				dw_list.DwUpdateAllToEx(x.GetXmlDoc());
+				msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				e.SetAttribute("id", id);
+				e.SetAttribute("type", tpy);
+				
+				xml__ x1 = new xml__;
+				x1.setNativePointer(xml__ ::CreateInstance());
+				dw_role.DwUpdateAllToEx(x1.GetXmlDoc());
+				msxml::IXMLDOMElement e1 = x1.GetXmlDoc().documentElement;
+				e.AppendChild(e1);
+	
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				arg.AddArg("content", e.xml);
+				arg.AddArg("dbmap", "Data.config.dbmap");
+				//if(xaserver__::ExecXAction(GetServerUrl(),"[onSave.xa]",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/save",arg.GetString(),x)!=1)
+				//if(url::get("/workflow/action/datarole.resource/bill.update",arg.GetString(),x)!=1)
+				{
+					trace("error:"+x.GetXml());
+					alert("保存出错!");
+					return 0;
+				}
+				if(x.GetXmlDoc().selectSingleNode("error"))
+				{
+					alert("保存出错2!");
+					return 0;
+				}
+				dw_list.ResetUpdateStatus();
+				dw_role.ResetUpdateStatus();
+				alert("保存成功!");
+				
+				return 1;
+			}
+			
+			int OnSelectDdlb(ref TNotifyEvent evt,int p)
+			{
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				dw_list.DwUpdateAllToEx(x.GetXmlDoc());
+				msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				if(e)
+				{
+					var list = e.SelectNodes("//*[@update.new='1' or @update.modify='1' or @update.delete='1']");
+					int s = list.length;
+					if(s>0)
+					{
+						int ret = win__::MessageBox(this.GetHWND(), "当前修改记录未保存,是否保存?","提示",4);
+						if(ret == 6)
+							OnSave();
+					}
+				}
+						
+				OnSelect();
+
+				int m = treeview__::GetSelectedItem(dw_tree.GetId());
+				string id;
+				if(m == 0)
+				{
+					id = "";
+				}
+				else
+				{
+					msxml::IXMLDOMElement ele =treeview__::GetItemData(dw_tree.GetId(),m);
+					id = ele.SelectSingleNode("id").text;
+				}
+				OnRetrieve(id);
+
+				return 1;
+			}
+			
+			int createTreeRoot()
+			{
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("pid","");
+				arg.AddArg("tree","0");
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[selectRoleInt.xq]",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/user/select",arg.GetString(),x)!=1)
+				{
+					trace("错误返回="+x.GetXml());
+					return -1;	
+				}
+				msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				var list = e.SelectNodes("*");
+				int i;
+				int len = list.length;
+				msxml::IXMLDOMElement ele;
+				for(i=0; i<len; i++)
+				{
+					ele= list.item(i);
+					string name = ele.selectSingleNode("@tree").text;
+					int sk = combobox__::AddItem(dw_ddlb.GetId(), name);
+					param p = ele;
+					combobox__::SetItemData(dw_ddlb.GetId(), sk, p);
+				}
+				if(len > 0)
+				{
+					combobox__::SetCurSel(dw_ddlb.GetId(), 0);
+					OnSelect();
+				}
+				OnRetrieve("");
+				return 1;
+			}
+			
+			int OnSetFocus(ref TEvent evt,int p)
+			{
+				SetAgent("data");
+				return 1;
+			}
+				
+			string GetPath()
+			{
+				int h = treeview__::GetSelectedItem(dw_tree.GetId());
+				if(h == 0) return 0;
+				
+				int tv = dw_tree.GetId();
+				string str = treeview__::GetItemLabel(tv, h);
+				int k = treeview__::GetParentItem(tv, h);
+				while(k > 0)
+				{
+					string tmp = treeview__::GetItemLabel(tv, k);
+					str = tmp+"\\" + str;
+					k = treeview__::GetParentItem(tv, k);
+				}
+				return str;
+			}
+				
+			int OnAddRole()
+			{
+				int m = treeview__::GetSelectedItem(dw_tree.GetId());
+				if(m == 0) return -1;
+				msxml::IXMLDOMElement ele =treeview__::GetItemData(dw_tree.GetId(),m);
+				string tpy=""+ele.selectSingleNode("type").text;
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				arg.AddArg("dataUrl","/sale/data/Role.config/pref/model/select");
+				openUrl("/sale/view/Role.config/xpage/role/select/user", arg);
+				string str = arg.GetArgString("item");
+				if(str == "") return -1;
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				x.LoadXml(str);
+				var list=x.GetXmlDoc().selectNodes("items/item");
+				int i=0,s=list.length;
+				msxml::IXMLDOMElement xitem;
+				int row = dw_role.GetRowCount() + 1;
+				string treepath = GetPath();
+				for (i=0;i<s;i++)
+				{
+					xitem= list.item(i);
+					string id = ""+xitem.selectSingleNode("@id").text;
+					string name=""+xitem.selectSingleNode("@name").text;
+					//string tpy=""+xitem.selectSingleNode("@type").text;
+					dw_role.InsertRow(0);
+					dw_role.SetItemString(row + i, "id", id);
+					dw_role.SetItemString(row + i, "name", ""+treepath);
+					dw_role.SetItemDisplayString(row + i, "name", name);
+					dw_role.SetItemString(row + i, "type", tpy);
+				}
+				return 1;
+			}
+			
+			int OnAddRow()
+			{
+				int m = treeview__::GetSelectedItem(dw_tree.GetId());
+				if(m == 0) return 0;
+				
+				int k = m_sheet.GetSheetIndex();
+				if(k == 0)
+					//openUrl("/sale/view/role.config/xpage/data/select/resource", dw_list);
+					OpenWindow("dev:xpage[Resource.select.data.config.vx]", dw_list);
+				else
+					OnAddRole();
+					
+				return 1;
+			}
+			
+			int OnDelRow()
+			{
+				int k = m_sheet.GetSheetIndex();
+				int row;
+				string hr_type;
+				msxml::IXMLDOMElement e;
+				if(k == 0)
+				{
+					row = dw_list.GetRow();
+					if(row<1 || row > dw_list.GetRowCount()) return -1;
+					e = dw_list.GetRowElement(row);
+					if(e.selectSingleNode("fromparent"))
+					{
+						hr_type = e.selectSingleNode("fromparent").text;
+						if(hr_type != "")
+						{
+							alert("继承的权限无权删除!");
+							return 0;
+						}
+					}
+					dw_list.DeleteRow(row);				
+				}
+				else
+				{
+					row = dw_role.GetRow();
+					if(row<1 || row > dw_role.GetRowCount()) return -1;
+					e = dw_role.GetRowElement(row);
+					if(e.selectSingleNode("fromparent"))
+					{
+						hr_type = e.selectSingleNode("fromparent").text;
+						if(hr_type != "")
+						{
+							alert("继承的权限无权删除!");
+							return 0;
+						}
+					}
+					dw_role.DeleteRow(row);				
+				}
+				
+				return 1;
+			}
+						
+			int OnSetCopy(xdwgrid__ dw, msxml::IXMLDOMElement e, string name)
+			{
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				msxml::IXMLDOMElement ele;
+				bool f = false;
+						
+				int count = dw.GetRowCount();
+				if(count == 0)
+				{
+					x.LoadXml("<" + name + "s/>");
+					ele = x.GetXmlDoc().documentElement;
+				}
+				else
+				{
+					msxml::IXMLDOMElement e1  = dw.GetRowElement(1);
+					ele = e1.parentNode;
+				}
+				var li = e.SelectNodes(name);
+				int i;
+				int len = li.length;
+				string treepath = GetPath();
+				for(i=0; i<len; i++)
+				{
+					msxml::IXMLDOMElement ele1= li.item(i);
+					if(ele1.selectSingleNode("fromparent"))
+					{
+						string str = ele1.selectSingleNode("fromparent").text;
+						if(str != "") continue;
+					}
+					xml__ x1 = new xml__;
+					x1.setNativePointer(xml__::CreateInstance());
+					x1.LoadXml(ele1.xml);
+					msxml::IXMLDOMElement ele2 = x1.GetXmlDoc().documentElement;
+					ele2.setAttribute("update.new","1");
+					ele2.setAttribute("update.modify","1");
+					ele2.setAttribute("guid",publiccode::GetGuid());
+					if(ele2.selectSingleNode("name"))
+						ele2.selectSingleNode("name").text = treepath;
+					//ele1.selectSingleNode("@guid").text = publiccode::GetGuid();
+					//ele1.selectSingleNode("@update.new").text = "1";
+					//ele1.selectSingleNode("@update.modify").text = "1";
+					ele.appendChild(ele2);
+				}
+				dw.Retrieve(ele);
+				dw.SetReadOnly(true);
+				dw.Redraw();
+
+				return 1;
+			}
+						
+			int OnCopy()
+			{
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				int p = arg.__nativept;
+				OpenWindow("dev:xpage[Data.config.copy.vx]", p);
+				string id = arg.GetArgString("id");
+				string f = arg.GetArgString("flag");
+				if(id == "") return 1;
+				
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				if(url::get("/sale/data/Role.config/pref/maint/data",arg.GetString(),x)!=1)
+				{
+					trace("错误返回="+x.GetXml());
+					return -1;
+				}
+
+				if(x.GetXml() == "")
+					x.LoadXml("<root><items/><roles/></root>");
+				
+				msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				
+				if(f == "0" || f == "1") 
+				{
+					msxml::IXMLDOMElement ele1 = e.selectSingleNode("items");
+					OnSetCopy(dw_list, ele1, "item");
+				}
+				
+				if(f == "0" || f == "2") 
+				{
+					msxml::IXMLDOMElement ele2 = e.selectSingleNode("roles")
+					OnSetCopy(dw_role, ele2, "role");
+				}
+				
+				return 1;
+			}
+			
+			int OnCmdDispatch(string comdid)
+			{
+				if(comdid == "Config")
+					openUrl("/sale/view/role.config/xpage/data/resource/config");
+				if(comdid == "RightQuery")
+					openUrl("/sale/view/role.config/xpage/data/modulerightquery");
+				else if(comdid == "New")
+					OnAddRow();
+				else if(comdid == "Del")
+					OnDelRow();
+				else if(comdid == "Save")
+					OnSave();
+				else if(comdid == "Copy")
+					OnCopy();
+				else if(comdid == "xmProdDivi")
+					openUrl("/sale/view/RoleAccount3/xpage/data/proddivi");
+				return 0;
+			}
+
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+
+			int onload()
+			{
+				SetAgent("data");
+				
+				dw_list = new xdwgrid__;
+				dw_list.setNativePointer(GetControl("dw_list"));
+				dw_list.openUrl("/sale/view/Role.config/template/data/config/resourceOrg");
+				dw_list.SetReadOnly(false);
+				
+				dw_role = new xdwgrid__;
+				dw_role.setNativePointer(GetControl("dw_role"));	
+				//dw_role.SetDataObject(GetServerUrl(), "dev:sheet[leftFrame.tpl/role]");
+				//dw_role.openUrl(m_vface+"/template/role/config/role");
+				dw_role.openUrl("/sale/view/Role.config/template/role/config/role");
+				dw_role.SetReadOnly(false);
+				
+				dw_ddlb =  new combobox__;
+				dw_ddlb.setNativePointer(this.GetControl("dw_ddlb"));
+				
+				m_sheet =  new xlayersheet__;
+				m_sheet.setNativePointer(this.GetControl("m_sheet"));
+								
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				AttachEvent("WM_SETFOCUS",OnSetFocus);
+				AttachEvent("dw_ddlb","CBN_SELCHANGE",OnSelectDdlb);
+				
+				createTreeRoot();
+				
+				return 1;
+			}
+		]
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Developer.Synch.cpp b/jrj/project/business/SystemSettings/Developer.Synch.cpp
new file mode 100644
index 0000000..ba7e601
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Developer.Synch.cpp
@@ -0,0 +1,415 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class DeveloperSynch :  public xframe
+	{
+		xtreeview	tv_gs;
+		xsedit dw_log;
+	
+		int[100] nItems;
+		int nCount;
+	
+		string sContent;
+	
+		string ProcessDevCmd(string cmd,string ext, string aurl="", bool needlogin=false)
+		{
+			if(aurl == "") aurl = GetServerUrl();
+			//alert(aurl);
+			string d = xaserver::ProcessCmd(aurl,"uri.hxsoft.com/xaserver/developer "+cmd,ext,needlogin);
+			return d;
+		}
+	
+		string ProcessDevCmd2(string cmd,string ext, string aurl="", bool needlogin=false)
+		{
+			if(aurl == "") aurl = GetServerUrl();
+			//alert(aurl);
+			string d = xaserver::ProcessCmd(aurl,"uri.hxsoft.com/xaserver/dev:"+cmd,ext,needlogin);
+			return d;
+		}
+
+		int GetProjectItem(int hItem)
+		{
+			int pitem = hItem;
+			string typ;
+			while(true)
+			{
+				int h = xtreeview::GetItemData(tv_gs.GetId(), pitem);
+				msxml::IXMLDOMElement e = trust(h as msxml::IXMLDOMElement);
+				typ = GetEleString(e, "@tagname");
+				if(typ=="project")break;
+				pitem = xtreeview::GetParentItem(tv_gs.GetId(), pitem);
+				if(pitem<=0)break;
+			}
+			return pitem;
+		}
+		
+		int GetP2Item(int hItem)
+		{
+			int hDomainItem;
+			int hP2Item = hItem;
+			while(true)
+			{
+				hDomainItem = xtreeview::GetParentItem(tv_gs.GetId(), hP2Item);
+				if(xtreeview::GetParentItem(tv_gs.GetId(), hDomainItem)<=0)break;
+				hP2Item = hDomainItem;
+			}
+			return hP2Item;
+		}
+			
+		string GetItemGuid(int hItem)
+		{
+			int h = xtreeview::GetItemData(tv_gs.GetId(), hItem);
+			msxml::IXMLDOMElement e = trust(h as msxml::IXMLDOMElement);
+			string guid = e.GetAttribute("guid");
+			return guid;
+		}
+			
+		xaserverarg GetDataArg(int hItem, xaserverarg arg)
+		{
+			int h = xtreeview::GetItemData(tv_gs.GetId(), hItem);
+			msxml::IXMLDOMElement e = trust(h as msxml::IXMLDOMElement);
+			string node = GetEleString(e, "@tagname");
+			//WriteLog(e.xml);
+			if(node=="File" || node=="file")
+			{
+				string caption = e.getAttribute("caption");
+				
+				int hP2Item = 0;
+				int hDomainItem = 0;
+				if(xtreeview::GetParentItem(tv_gs.GetId(), hItem)<=0)
+				{
+					hDomainItem = hItem;
+				}else
+				{
+					hP2Item = GetP2Item(hItem);
+					hDomainItem = xtreeview::GetParentItem(tv_gs.GetId(), hP2Item);
+				}	
+
+				//find project folder
+				string prjguid="";
+				int pitem = this.GetProjectItem(hItem);
+				if(pitem > 0)
+					prjguid = GetItemGuid(pitem);
+
+				//xaserverarg arg = new xaserverarg;
+				//arg.setNativePointer(arg.CreateInstance());
+				arg.AddArg("project.guid",prjguid);
+				if(hP2Item)
+				{
+					if(hP2Item != hItem)
+					{
+						string guid = e.getAttribute("guid");
+						arg.AddArg("guid",guid);
+					}
+					string guid2 = GetItemGuid(hP2Item);
+					arg.AddArg("root.guid",guid2);
+				}else if(hDomainItem > 0)
+				{
+					string guid3 = GetItemGuid(hDomainItem);
+					arg.AddArg("domain.guid",guid3);
+				}
+				return 1;
+			}
+			else if(node=="folder" || node=="project")
+				return 2;
+			else
+				return 0;			
+		}
+
+		int SaveData(int hItem)
+		{
+			xcontrol xc = GetControl("surl");
+			string surl = xc.GetText();
+			if(surl == "")
+			{
+				alert("请输入同步服务器地址");
+				return 1;
+			}
+			
+			string name = xtreeview::GetItemLabel(tv_gs.GetId(), hItem);
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());
+			int ret = GetDataArg(hItem, arg);
+			//alert(arg.GetString());
+			if(ret == 0) 
+			{
+				WriteLog(name+" 失败, 原因:获取工程或文件夹失败!");
+				return -1;
+			}
+			else if(ret == 2) 
+			{
+				ret = SynchFolder(hItem);
+				if(ret == -1)
+					WriteLog(name+" 失败, 原因:获取文件数据失败!");
+				else if(ret == 0)
+					WriteLog(name+" 失败, 原因:复制文件失败!");
+				else
+					WriteLog(name);
+				return -1;
+			}
+			SynchFolder(hItem);
+			arg.AddArg("__name",name);
+			arg.AddArg("__url",surl);
+			synchServer(arg);
+			if(name.right(3) == ".vx" || name.right(5) == ".xpage")
+			{
+				arg.AddArg("__name",name + "[Code]");
+				arg.AddArg("iscode","yes");
+				synchServer(arg);
+			}
+			return 1;
+		}
+			
+		string GetFolderPath(int hItem)
+		{
+			int k = hItem;
+			if(k == 0) return "";
+			string src = "";
+			//string name = "";
+			while(k > 0)
+			{
+				int h = xtreeview::GetItemData(tv_gs.GetId(), k);
+				k = xtreeview::GetParentItem(tv_gs.GetId(), k);
+				msxml::IXMLDOMElement e = trust(h as msxml::IXMLDOMElement);
+				string node = GetEleString(e, "@tagname");
+				if(node != "File" && node != "file")
+				{
+					string tmp = GetEleString(e, "@src");
+					//if(name == "") name = GetEleString(e, "@caption");
+					if(tmp != "")
+					{
+						SynchFolder(k);
+						if(src == "") src = tmp;
+						else
+						{
+							int j = 1;
+							int s =  tmp.length();
+							string t = tmp.right(j).left(1);
+							while(t != "\\" && j < s)
+							{
+								//WriteLog(t);
+								j++;
+								t = tmp.right(j).left(1);
+							}
+							if(j >= s)
+								src = tmp+ "\\" + src; 
+							else
+								src = tmp.left(s - j)+ "\\" + src;
+						}
+					}
+				}
+			}
+			if(src == "")
+			{
+				//WriteLog(name+" 同步失败, 原因:获取文件数据失败0!");
+				return "";
+			}
+			//if(src.left(9) =="Projects\\") src = src.mid(9, src.length());
+			src = "\\" + src;//.replace("Projects\\","");
+			//WriteLog(src);
+			return src;
+		}
+			
+		int SynchFolder(int hItem)
+		{
+			string src =  GetFolderPath(hItem);
+			if(src== "") return -1;
+			if(xaserver::FileCopy("devfolder8001", src, "devfolder5001", src) != 1)
+				return 0;
+			//WriteLog(src);
+			return 1;
+		}
+			
+		int synchServer(xaserverarg arg)
+		{
+			string name = arg.GetArgString("__name");
+			string surl = arg.GetArgString("__url");
+			string d =  ProcessDevCmd("getobject",arg.GetString());
+			if(d == "") 
+			{
+				WriteLog(name+" 失败, 原因:获取文件数据失败!");
+				return -1;
+			}
+			//WriteLog(d);
+			arg.AddArg("content",d);
+			ProcessDevCmd("saveobject",arg.GetString(), surl,true);
+			WriteLog(name);
+			return 1;
+		}
+			
+		int WriteLog(string str)
+		{
+			if(sContent == "")
+				sContent = str;
+			else
+				sContent += "\r\n" + str;
+			//alert(sContent);
+			dw_log.SetContent(sContent, "");
+			return 1;
+		}
+	
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			SetAgent();
+			return 1;
+		}
+	
+		int Add(int hItem)
+		{	
+			if(nCount >99)
+			{
+				alert("同时同步的数量不能大于100个!");
+				return 1;
+			}
+			nItems[nCount] = hItem; 
+			nCount++;
+			return 1;
+		}
+			
+		int Del(int hItem)
+		{	
+			for(int i=0; i<nCount; i++)
+			{
+				int p = nItems[i];
+				if(p == hItem) break;
+			}
+			if(i<nCount)
+			{
+				for(int j=i; j<nCount - 1; j++)
+				{
+					int k = nItems[j + 1];
+					nItems[j] = k;
+				}
+				nCount --;
+			}
+			return 1;
+		}
+
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if(comdid != "synch") return 1;
+			
+			int hCursor = xutil::SetCursorWait();
+			sContent = "";
+			for(int i=0; i<nCount; i++)
+			{
+				int p = nItems[i];
+				//int h = xtreeview::GetItemData(tv_gs.GetId(), p);
+				//msxml::IXMLDOMElement e = trust(h as msxml::IXMLDOMElement);
+				//alert(e.xml);
+				SaveData(p);
+				xtreeview::SetChecked(tv_gs.GetId(), p,0);
+			}
+			xutil::RestoreCursor(hCursor);
+			nCount = 0;
+			return 0;
+		}
+	
+		int OnTreeCheckBoxSel(ref TNotifyEvent evt,int p)
+		{
+			ref TVNNMHDR nmtv = trust(evt.pnmh as ref TVNNMHDR);
+			int hItem = nmtv.FromItem;
+			int hCursor = xutil::SetCursorWait();
+			int hwnd = nmtv.hwndFrom;
+			int c = 1 - xtreeview::GetChecked(hwnd, hItem);
+			if(c == 1)
+				Add(hItem);
+			else
+				Del(hItem);
+			xutil::RestoreCursor(hCursor);
+			return 1;
+		}	
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			//AttachEvent("WM_SETFOCUS",OnSetFocus);
+			AttachEvent("DevExplorer","TVN_CHECKBOXSEL",OnTreeCheckBoxSel);	
+			AttachEvent("DevExplorer", "TVN_ITEMEXPANDING",OnTreeExpanding);
+			return 1;
+		}
+		
+		int OnTreeExpanding(ref TNotifyEvent evt,int lparam)	
+		{
+			ref NMTREEVIEW nmtv = trust(evt.pnmh as ref NMTREEVIEW);
+			int hItem = nmtv.itemNew.hItem;
+			int cItem=xtreeview::GetChildItem(tv_gs.GetId(), hItem);
+			if(cItem > 0) return 1;
+			int p = xtreeview::GetItemData(tv_gs.GetId(), hItem);
+			msxml::IXMLDOMElement ele = trust(p as msxml::IXMLDOMElement);
+			string src =GetEleString(ele, "@src");
+			string tagname =GetEleString(ele, "@tagname");
+			if (src == "" || tagname == "file" || tagname == "File") return 1;
+			OnSetTree(hItem, GetFolderPath(hItem));
+			
+			return 1;
+		}		
+			
+		int OnSetTree(int pItem, msxml::IXMLDOMElement e)
+		{
+			msxml::IXMLDOMNodeList li=e.selectNodes("*");
+			int i=0;
+			int s=li.length;
+			for (i=0;i<s;i++){
+				msxml::IXMLDOMElement  ele= li.item(s - i - 1);
+				string caption = GetEleString(ele, "@caption");
+				string src =GetEleString(ele, "@src");
+				string image =GetEleString(ele, "@image");
+				int p = trust(ele as int);
+				int hItem=xtreeview::InsertItem(tv_gs.GetId(), pItem,0,caption,p,image.toInt());
+				string tagname =GetEleString(ele, "@tagname");
+				if (src != "" && tagname != "file" && tagname != "File")
+					xtreeview::SetItemChild1(tv_gs.GetId(), hItem,1);
+				OnSetTree(hItem, ele);
+			}
+		
+			return 1;
+		}
+			
+		int OnSetTree(int hItem, string src)
+		{
+			xml x=new xml;
+			x.setNativePointer(xml::CreateInstance());
+			xaserverarg arg=new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			arg.AddArg("src",src);
+			if(xaserver::ExecXQuery(GetServerUrl(),"[Developer.Tree.xq]",arg.GetString(),x)!=1)
+			{
+				alert("读取节点失败!");
+				return 1;
+			}
+			msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+			OnSetTree(hItem, e);
+			return 1;
+		}
+		
+		int onload()
+		{
+			nCount = 0;
+			tv_gs = GetControl("DevExplorer");			
+			dw_log = GetControl("xlog");
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			OnSetTree(0, "Projects/projects.xhw");
+			return 1;
+		}		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Flow3.cpp b/jrj/project/business/SystemSettings/Flow3.cpp
new file mode 100644
index 0000000..53605d6
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Flow3.cpp
@@ -0,0 +1,464 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+use "base.view.vd"
+use "xflowchart.wobject.wface.vd"
+
+unit trade 
+[
+	class flow :  public xframe
+	{
+		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;
+		string 	flowid;
+	
+		xtreeview tv_folder;
+
+		xnode	m_agentNode;	//Agent Condition
+
+		string GetSheetType(int index)
+		{
+			if (index == 0)  return "flowitem";
+			else if (index == 1) return "state";
+			else if (index == 2) return "actionrole";
+			else if (index == 3) return "button";
+			else if (index == 4) return "role";
+			else if (index == 5) return "bill";
+			else if (index == 6) return "scene";
+			else if (index ==7) return "fieldrole";
+			else return "unkown";
+		}
+		xdwgrid GetSheetDwgrid(int index)
+		{
+			string typ = GetSheetType(index);
+			if(typ=="flowitem") return dw_flow;
+			if(typ=="actionrole") return dw_buttonright;
+			if(typ=="state") return dw_state;
+			if(typ=="button") return dw_button;
+			if(typ=="role") return dw_role;
+			if(typ=="bill") return dw_bill;
+			if(typ=="scene") return dw_scene;
+			if(typ=="fieldrole") return dw_datafieldright;
+			return 0;
+		}
+		xdwgrid GetSheetDbmap(int index)
+		{
+			string typ = GetSheetType(index);
+			if(typ=="flowitem") return "flow.dbmap";
+			if(typ=="actionrole") return "workflow.actionrole.dbmap";
+			if(typ=="state") return "state.dbmap";
+			if(typ=="button") return "button.dbmap";
+			if(typ=="role") return "role.dbmap";
+			if(typ=="bill") return "bill.dbmap";
+			if(typ=="scene") return "scene.dbmap";
+			if(typ=="fieldrole") return "workflow.datarole.dbmap";
+			return 0;
+		}
+		
+		string GetDwname(string typ)
+		{
+			if(typ=="flowitem") return "/sale/view/Flow3/template/flow";
+			if(typ=="actionrole") return "/sale/view/Flow3/template/buttonright";
+			if(typ=="state") return "/sale/view/Flow3/template/state";
+			if(typ=="button") return "/sale/view/Flow3/template/button";
+			if(typ=="role") return "/sale/view/Flow3/template/role";
+			if(typ=="bill") return "/sale/view/Flow3/template/bill";
+			if(typ=="scene") return "/sale/view/Flow3/template/scene";
+			if(typ=="fieldrole") return "/sale/view/Flow3/template/datafieldright";
+			return "";
+		}
+		
+		
+		int SetAgent()
+		{
+			string xfNodeAgentArea  = "agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			if(m_agentNode)
+			{
+				SetAgentNodeContent (anode,m_agentNode);
+			}
+			else
+			{
+				msxml::IXMLDOMElement xframeElement =  GetElement();
+				msxml::IXMLDOMElement agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+			}
+			return 1;
+		}
+		int OnSave()
+		{
+			if(flowid=="") return 1;
+				
+			string sdbmap;
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			int index = tab_1.GetSheetIndex();
+			sdbmap = GetSheetDbmap(index);
+			xdwgrid dw_list = GetSheetDwgrid(index);
+			dw_list.DwUpdateAllToEx(x.GetXmlDoc());
+			//trace(x.GetXml());
+
+			msxml::IXMLDOMNodeList ls = x.GetXmlDoc().documentElement.SelectNodes("*[@update.modify='1' and @update.new='1']");
+			int len = ls.length;
+			for(int k=0;k<len;k++)
+			{
+				msxml::IXMLDOMElement e;
+				if(ls.item(k).selectSingleNode("flowID"))
+				{
+					e = ls.item(k).selectSingleNode("flowID");
+					e.setAttribute("update.modify","1");
+					e.text = flowid;
+				}else
+				{
+					e = x.GetXmlDoc().createElement("flowID");
+					e.setAttribute("update.modify","1");
+					e.text = flowid;
+					ls.item(k).appendChild(e);
+				}
+			}
+				
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());
+			arg.AddArg("content",x.GetXml());
+			arg.AddArg("sdbmap",sdbmap);
+			trace(x.GetXml());
+			if(url::get("/sale/data/Flow3/save/flow", arg.GetString(),x)!=1)
+			{
+				string error = x.GetXmlDoc().text;
+				alert("err:"+error);
+				return 1;
+			}
+			
+			dw_list.ResetUpdateStatus();
+			
+			//alert(x.GetXml());
+			alert("保存成功!");
+			
+			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(ref TEvent evt,int param)
+		{
+			//重置工具条
+			SetAgent();
+			
+			//alert(evt.hWnd.toString());
+			
+			return 1;
+		}
+
+		int OnClicked(ref TNotifyEvent evt,int p)
+		{	
+			ref DWNMHDR  hdr = evt.pnmh;				
+			int row = hdr.row;
+			string colname=hdr.colname;
+
+			//trace(colname);
+			
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+
+			string comdid ="";
+			string data="";
+			string display="";
+			xdwgrid dw_list;
+			
+			int index = tab_1.GetSheetIndex();
+			dw_list = GetSheetDwgrid(index);
+			
+			arg.AddArg("sdata","");
+			arg.AddArg("flowid",flowid);
+			
+			if(colname=="billID")
+			{
+				arg.AddArg("stype","bill");
+				arg.AddArg("datacolumn","billID");
+				arg.AddArg("displaycolumn","billName");
+				arg.AddArg("dwname","/sale/view/Flow3/template/bill");
+			}
+			else if(colname=="stateSource")
+			{
+				arg.AddArg("stype","state");
+				arg.AddArg("datacolumn","stateID");
+				arg.AddArg("displaycolumn","stateName");
+				arg.AddArg("dwname","/sale/view/Flow3/template/state");
+			}
+			else if(colname=="state")
+			{
+				arg.AddArg("stype","state");
+				arg.AddArg("datacolumn","stateID");
+				arg.AddArg("displaycolumn","stateName");
+				arg.AddArg("dwname","/sale/view/Flow3/template/state");
+			}
+			else if(colname=="stateTarget")
+			{
+				arg.AddArg("stype","state");
+				arg.AddArg("datacolumn","stateID");
+				arg.AddArg("displaycolumn","stateName");
+				arg.AddArg("dwname","/sale/view/Flow3/template/state");
+			}
+			else if(colname=="roles")
+			{
+				arg.AddArg("stype","role");
+				arg.AddArg("datacolumn","roleName");
+				arg.AddArg("displaycolumn","roleName");
+				arg.AddArg("dwname","/sale/view/Flow3/template/role");
+			}
+			else if(colname=="flowAction")
+			{
+				arg.AddArg("stype","button");
+				arg.AddArg("datacolumn","buttonName");
+				arg.AddArg("displaycolumn","buttonName");
+				arg.AddArg("dwname","/sale/view/Flow3/template/button");
+			}
+			else 
+				return 1;
+			
+			OpenWindow("dev:xpage[FlowTermSelect.vx]",cast(arg as int));
+			comdid = arg.GetArgString("comdid");
+			
+			if(comdid=="xmOk")
+			{
+				data = arg.GetArgString("data");
+				display = arg.GetArgString("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 = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			arg.SetArg("stype",GetSheetType(i),"string");
+			arg.SetArg("sdata","ddd","string");
+			arg.SetArg("flowID",flowid,"string");
+			int obj = cast(dw_list as int);
+			arg.SetArg("dwobj",obj.toString(),"string");
+			arg.SetArg("dwname",GetDwname(GetSheetType(i)),"string");
+			OpenWindow("dev:xpage[FlowTermImport.vx]",cast(arg as int));
+
+			return 1;
+		}
+			
+		int  OnRetrieve()
+		{
+			if(flowid=="") return 1;
+			
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			
+			//int i = tab_1.GetSheetIndex();
+			for(int i=0;i<7;i++)
+			{
+				//alert(i.toString());
+				arg.SetArg("stype",GetSheetType(i),"string");
+				arg.SetArg("sdata","ddd","string");
+				arg.SetArg("flowID",flowid,"string");
+				
+				//trace(arg.GetString());
+				if (getUrl("/sale/data/Flow3/retrieve/flowex",arg.GetString(),x)!=1)
+				{
+					//trace(x.GetXmlDoc().text);
+					//return -1;
+					continue;
+				}
+				xdwgrid dw_list = GetSheetDwgrid(i);
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+			}
+			
+			return 1;
+		}
+		
+		int OnTreeSelChanged(ref TNotifyEvent evt,int p)
+		{
+			ref NMTREEVIEW nmtv = cast(evt.pnmh as NMTREEVIEW);
+			int hItem = nmtv.itemNew.hItem;
+			msxml::IXMLDOMElement e = cast(tv_folder.GetItemData(hItem) as msxml::IXMLDOMElement);
+			flowid = e.getAttribute("flowID");
+				
+			int hCursor = xutil::SetCursorWait();
+			SetFlowChart(e);
+			OnRetrieve();
+			xutil::RestoreCursor(hCursor);
+			
+			return 1;
+		}	
+
+		int OnTabSelectSheet(ref TNotifyEvent evt,int p)
+		{
+			//OnRetrieve();
+			
+			return 1;
+		}
+			
+		int SetFlowChart(msxml::IXMLDOMElement e)
+		{
+			string flowUrl = e.getAttribute("flowchart");
+			xflowchart flowchart = GetControl("flowchart");
+			xml f = new xml;
+			f.setNativePointer(xml::CreateInstance());
+			if(flowUrl != "")
+			{
+				if(xaserver::FetchXml(flowUrl,"",f)==1)
+				{
+					flowchart.LoadEx(f.GetXmlDoc().documentElement);
+				}
+			}else
+			{
+				f.LoadXml("<sheet/>");
+				flowchart.LoadEx(f.GetXmlDoc().documentElement);
+			}
+			return 1;
+		}
+
+			
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if (comdid == "xmSave") 
+				return OnSave();
+			if (comdid == "xmAddrow")
+				return OnAddrow();
+			if (comdid == "xmInsertrow")
+				return OnInsertrow();
+			if (comdid == "xmDeleterow")
+				return OnDeleterow();
+			if (comdid == "xmImport")
+				return OnImport();
+				
+			return 0;
+		}
+
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+			
+			AttachEvent("tv_folder", "TVN_SELCHANGED",OnTreeSelChanged);
+			AttachEvent("tab_1","LYSN_SELECTEDSHEET",OnTabSelectSheet);
+			AttachEvent("dw_flow","DWV_CLICKED",OnClicked);			
+			AttachEvent("dw_buttonright","DWV_CLICKED",OnClicked);			
+			AttachEvent("dw_button","DWV_CLICKED",OnClicked);			
+			AttachEvent("dw_state","DWV_CLICKED",OnClicked);			
+			
+			return 1;
+		}
+		
+		int CreateFlowFloder()
+		{
+			
+			xml x = ViewObject::RetrieveData("/sale/data/flow3/flowfolder");
+			if(x)
+			{
+				msxml::IXMLDOMNodeList nlist = x.GetXmlDoc().SelectNodes("//item"); 
+				int len = nlist.length;
+				int hItem = 0;
+				for (int i = 0; i < len; i++)
+				{	
+					msxml::IXMLDOMElement e = nlist.item(i);
+					string name = e.getAttribute("flowName");
+					string no = e.getAttribute("flowNo");
+					string label = name;//no.trim() + " " + name;
+					int h= tv_folder.InsertChildItem(hItem,label, trust(e as int),22);				
+					//tv_folder.SetItemChild(h,1);
+				}
+			}
+			
+			return 1;
+		}
+
+		int onload()
+		{
+			flowid = "";
+			tv_folder = GetControl("tv_folder");
+			CreateFlowFloder();
+			
+			tv_1 = GetControl("tv_1");
+			tab_1 = GetControl("tab_1");
+			dw_flow = GetControl("dw_flow");
+			dw_flow.openUrl("/sale/view/Flow3/template/flow");
+			dw_state = GetControl("dw_state");
+			dw_state.openUrl("/sale/view/Flow3/template/state");
+			dw_button = GetControl("dw_button");
+			dw_button.openUrl("/sale/view/Flow3/template/button");
+			dw_role = GetControl("dw_role");
+			dw_role.openUrl("/sale/view/Flow3/template/role");
+			dw_bill = GetControl("dw_bill");
+			dw_bill.openUrl("/sale/view/Flow3/template/bill");
+			dw_scene = GetControl("dw_scene");
+			dw_scene.openUrl("/sale/view/Flow3/template/scene");
+			dw_buttonright = GetControl("dw_buttonright");
+			dw_buttonright.openUrl("/sale/view/Flow3/template/buttonright");
+			dw_datafieldright = GetControl("dw_datafieldright");
+			dw_datafieldright.openUrl("/sale/view/Flow3/template/datafieldright");
+			
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			SetAgent();			
+			
+			OnRetrieve();
+			
+			return 1;
+		}		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/FlowTermImport.cpp b/jrj/project/business/SystemSettings/FlowTermImport.cpp
new file mode 100644
index 0000000..4579e84
--- /dev/null
+++ b/jrj/project/business/SystemSettings/FlowTermImport.cpp
@@ -0,0 +1,162 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class FlowTermImport :  public xframe
+	{
+		xdwgrid	dw_list;
+		string stype;
+		string sdata;
+		string flowid;
+		string datacolumn;
+		string displaycolumn;
+		xdwgrid dw_obj;
+	
+		xnode	m_agentNode;	//Agent Condition
+
+		int SetAgent()
+		{
+			string xfNodeAgentArea  = "agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			if(m_agentNode)
+			{
+				SetAgentNodeContent (anode,m_agentNode);
+			}
+			else
+			{
+				msxml::IXMLDOMElement xframeElement =  GetElement();
+				msxml::IXMLDOMElement agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+			}
+			return 1;
+		}
+
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			//SetAgent();
+			return 1;
+		}
+
+		int OnOK(string comdid)
+		{
+			int row = dw_list.GetNextSelectRow(1);
+			if(row < 1 && dw_list.GetRowCount()==1) row = 1;
+			if (row<1)
+			{
+				alert("请选择项!");
+				return 1;
+			}	
+			
+			while (row>0)
+			{
+				int nrow = dw_obj.InsertRow(0);
+				int columnCount = dw_obj.GetColumnCount();
+				for(int i=1;i<=columnCount;i++)
+				{
+					if(dw_list.GetColumnName(i)=="guid") continue;
+					dw_obj.SetItemString(nrow,i,dw_list.GetItemString(row,i));
+					if(dw_list.GetItemDisplayString(row,i)!="")
+						dw_obj.SetItemDisplayString(nrow,i,dw_list.GetItemDisplayString(row,i));
+				}
+				row = dw_list.GetNextSelectRow(row + 1);
+			}
+			
+			CloseWindow();
+			return 1;
+		}
+				
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if (comdid=="xmOk")
+			{
+				OnOK(comdid);
+				return 1;
+			}
+			else if (comdid=="xmCancel")
+			{
+				CloseWindow();
+				return 1;
+			}
+			return 0;
+		}
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+		}
+		
+		int  OnRetrieve()
+		{
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			
+			arg.AddArg("stype",stype);
+			arg.AddArg("sdata",sdata);
+			arg.AddArg("flowID",flowid);
+
+			if (getUrl("/sale/data/Flow3/retrieve/flowimport",arg.GetString(),x)!=1)
+			{
+				trace(x.GetXmlDoc().text);
+				return -1;
+			}else	
+			{
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+				dw_list.SetReadOnly(true);
+			}
+			return 1;
+		}
+		
+		int onload()
+		{
+			
+			dw_list = GetControl("dw_list");
+			//dw_list.openUrl("xxx");
+			if(GetParam())
+			{
+				xaserverarg arg = GetParam();
+				stype = arg.GetArgString("stype");
+				sdata = arg.GetArgString("sdata");
+				flowid = arg.GetArgString("flowid");
+			
+				string dwname = arg.GetArgString("dwname");
+				int dwobj = arg.GetArgString("dwobj").toInt();
+				dw_obj = cast(dwobj as xdwgrid);
+			
+				dw_list.openUrl(dwname);
+				OnRetrieve();
+				dw_list.SetSelectionMode(3);
+			}
+		
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			//SetAgent();			
+			
+			return 1;
+		}		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/FlowTermSelect.cpp b/jrj/project/business/SystemSettings/FlowTermSelect.cpp
new file mode 100644
index 0000000..29f7b09
--- /dev/null
+++ b/jrj/project/business/SystemSettings/FlowTermSelect.cpp
@@ -0,0 +1,161 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class FlowTermSelect :  public xframe
+	{
+		xdwgrid	dw_list;
+		string stype;
+		string sdata;
+		string flowid;
+		string datacolumn;
+		string displaycolumn;
+	
+		xnode	m_agentNode;	//Agent Condition
+
+		int SetAgent()
+		{
+			string xfNodeAgentArea  = "agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			if(m_agentNode)
+			{
+				SetAgentNodeContent (anode,m_agentNode);
+			}
+			else
+			{
+				msxml::IXMLDOMElement xframeElement =  GetElement();
+				msxml::IXMLDOMElement agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+			}
+			return 1;
+		}
+
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			//SetAgent();
+			return 1;
+		}
+
+		int OnOK(string comdid)
+		{
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());							
+			arg = GetParam();
+			arg.AddArg("comdid",comdid);	
+
+			int row = dw_list.GetNextSelectRow(1);
+			if(row < 1 && dw_list.GetRowCount()==1) row = 1;
+			if (row<1)
+			{
+				alert("请选择项!");
+				return 1;
+			}	
+			
+			while (row>0)
+			{			
+				msxml::IXMLDOMElement e = dw_list.GetRowElement(row);
+				string data = e.selectSingleNode(datacolumn).text+"";
+				string display = e.selectSingleNode(displaycolumn).text+"";
+				arg.AddArg("data",data);
+				arg.AddArg("display",display);						
+				row = dw_list.GetNextSelectRow(row + 1);
+			}
+			CloseWindow();
+			return 1;
+		}
+				
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if (comdid=="xmOk")
+			{
+				OnOK(comdid);
+				return 1;
+			}
+			else if (comdid=="xmCancel")
+			{
+				CloseWindow();
+				return 1;
+			}
+			return 0;
+		}
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+		}
+		
+		int  OnRetrieve()
+		{
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			
+			arg.AddArg("stype",stype);
+			arg.AddArg("sdata",sdata);
+			arg.AddArg("flowID",flowid);
+
+			if (getUrl("/sale/data/Flow3/retrieve/flowex",arg.GetString(),x)!=1)
+			{
+				trace(x.GetXmlDoc().text);
+				return -1;
+			}else	
+			{
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+				dw_list.SetReadOnly(true);
+			}
+			return 1;
+		}
+		
+		int onload()
+		{
+			
+			dw_list = GetControl("dw_list");
+			//dw_list.openUrl("xxx");
+			if(GetParam())
+			{
+				xaserverarg arg = GetParam();
+				stype = arg.GetArgString("stype");
+				sdata = arg.GetArgString("sdata");
+				flowid = arg.GetArgString("flowid");
+			
+				datacolumn = arg.GetArgString("datacolumn");
+				displaycolumn = arg.GetArgString("displaycolumn");
+			
+				string dwname = arg.GetArgString("dwname");
+				dw_list.openUrl(dwname);
+				OnRetrieve();
+				dw_list.SetSelectionMode(1);
+			}
+		
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			//SetAgent();			
+			
+			return 1;
+		}		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/GroupManagerList_A.cpp b/jrj/project/business/SystemSettings/GroupManagerList_A.cpp
new file mode 100644
index 0000000..ca9b3d6
--- /dev/null
+++ b/jrj/project/business/SystemSettings/GroupManagerList_A.cpp
@@ -0,0 +1,1576 @@
+#include <wobject/xstring.hpp>
+#include <wobject/xdouble.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xdwgrid.hpp>
+#include <xcontrol/ximageview.hpp>
+
+#include "vbusiness/vframe/maint.vframe.vbusiness.hpp"
+#include "viewobject/view.base.hpp"
+#include "viewobject/saleorder.view.hpp"
+#include "viewobject/quote.view.hpp"
+#include "viewobject/shoppingcart.view.hpp"
+#include "viewobject/productLibrary.view.hpp"
+#include "xcontrol/xcheckbox.hpp"
+#include "xcontrol/xshtml.hpp"
+
+class __declspec(dllexport) ProductLibrary4Win : public xframe
+{
+public:
+	//产品库产品列表
+	xdwgrid	dw_list;
+	//购物车产品列表
+	xdwgrid	dwc_list;
+
+	//产品缓存对象
+	//xdataset g_xdoc_product;
+	//xdataset g_xdoc_shoppingcart;
+
+	xcombobox  cbx_goodscar;
+	//是否多选
+
+	xnode	m_agentNode;	//Agent Condition
+	xtreeview tv_folder;
+	xstring 	agentFor;
+	KXMLDOMElement imageElement;
+	xstring m_customer;
+
+public:
+	ProductLibrary4Win(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
+public:
+	static ProductLibrary4Win* CreateInstance(void* implPtr, void* hWnd)
+	{
+		ProductLibrary4Win* pWin = new ProductLibrary4Win(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+public:
+	int FillGoodsCarList()
+	{
+		xcombobox xc = GetControl(L"frame:cbx_goodscar");
+		if (!xc) return 0;
+		xml  x = ShoppingCartView::GetRoleList();
+		if (!x) return 0;
+		xc.SetText(L"==选择购物车==L");
+
+		KXMLDOMNodeList nlist = x.selectNodes(L"//item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"name");
+			xc.AddItem( name);
+		}
+		return 1;
+	}
+
+	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"[@for='" + agentFor + L"']/*");
+			if (agent)
+			{
+				bstring s = agent.xml();
+				m_agentNode = SetAgentNode(anode, s);
+				//FillGoodsCarList();
+			}
+		}
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent * evt, int param)
+	{
+		//重置工具条
+		SetAgent();
+		return 1;
+	}
+
+	KXMLDOMElement OnGetCarListRowElement(int row = 0)
+	{
+		if (row < 1) row = dwc_list.GetRow();
+		if (row < 1 || row > dwc_list.GetRowCount()) return KXMLDOMElement();
+		KXMLDOMElement e = dw_list.GetRowElement(row);
+		return e;
+	}
+
+	int OnShowImage(xstring skuid)
+	{
+		ximageview im = GetControl(L"im1");
+		//im.RemoveImage();
+		im.Reset();
+
+		xml xp ;
+		xaserverarg arg_pic;
+		arg_pic.AddArg(L"SKUID", skuid);
+		if (xurl::get(L"/sale/data/ProductLibrary3/pref/picture/imagelistSKU", arg_pic.GetString(), xp) != 1)
+		{
+			trace(xstring(L"xxx")+xp.xml());
+		}
+		else
+		{
+			//trace(skuid+L" "+xp.GetXml());
+			imageElement = xp.documentElement();
+			KXMLDOMNodeList  nlistp = xp.selectNodes(L"ImageList/image");
+			int lenp = nlistp.length();
+			for (int ip = 0; ip < lenp; ip++)
+			{
+				KXMLDOMElement xitem = nlistp.item(ip);
+				xstring picname = xitem.selectSingleNode(L"PicPath").text();
+				xstring goodno = xitem.selectSingleNode(L"GoodsNo").text();
+				if (picname == L"/business/products/Thumbs//")
+					picname = L"/business/products/Thumbs/00/00000000-0000-0000-0000-000000000000.jpg";
+				im.AddImages(picname, (LPTSTR)L"");
+			}
+			im.Redraw();
+			//win32::SendMessage(im.GetId(),0x000f,0,1);
+			//win32::InvalidateRect(im.GetId(),cast(0 as ref xrect),true);
+		}
+		return 1;
+	}
+
+	int OnShowImage(xstring skuid, xstring customerItemNo)
+	{
+		ximageview im = GetControl(L"im1");
+		//im.RemoveImage();
+		im.Reset();
+
+		xml xp ;
+		xaserverarg arg_pic ;
+		arg_pic.AddArg(L"SKUID", skuid);
+		arg_pic.AddArg(L"CustomerID", m_customer);
+		arg_pic.AddArg(L"CustomerItemNo", customerItemNo);
+
+		if (xurl::get(L"/sale/data/ProductLibrary3/pref/picture/customer/imagelistSKU", arg_pic.GetString(), xp) != 1)
+		{
+			trace(L"error:" + xstring(xp.xml(),true));
+		}
+		else
+		{
+			imageElement = xp.documentElement();
+			KXMLDOMNodeList  nlistp = xp.selectNodes(L"ImageList/image");
+			int lenp = nlistp.length();
+			for (int ip = 0; ip < lenp; ip++)
+			{
+				KXMLDOMElement xitem = nlistp.item(ip);
+				bstring picname = xitem.selectSingleNode(L"PicPath").text();
+				bstring goodno = xitem.selectSingleNode(L"GoodsNo").text();
+				if (picname == L"/business/products/Thumbs//")
+					picname = L"/business/products/Thumbs/00/00000000-0000-0000-0000-000000000000.jpg";
+				im.AddImages(picname, L"");
+			}
+			im.Redraw();
+		}
+		return 1;
+	}
+
+	int OnRowChanged(TEvent * evt, int p)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+
+		xshtml xs = GetControl(L"html_detail");
+		xstring html = makeHtml(row);
+		xs.SetContent(html);
+		xs.Redraw();
+
+		xstring id = dw_list.GetGuid(row);
+		OnShowImage(id);
+		trace(id);
+		return 1;
+	}
+
+	int OnGoodsCarRowChanged(TEvent * evt, int p)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+
+		xshtml xs = GetControl(L"html_detail");
+		xstring html = makeGoodscarHtml(row);
+		xs.SetContent(html);
+		xs.Redraw();
+		if (m_customer)
+		{
+			xstring id = dw_list.GetItemString(row, L"SKUID");
+			xstring customerItemNo =dw_list.GetItemString( row, L"CustomerItemNo");
+			OnShowImage(id, customerItemNo);
+		}
+
+		return 1;
+	}
+
+	int DeleteRow(int row)
+	{
+		int IDOK = 1;
+		int MB_OKCANCEL = 1;
+		int MB_ICONQUESTION = 32;
+		if (MessageBoxW(GetHWND(), L"确认删除指定的项,删除后将不能恢复?", L"提示", MB_OKCANCEL | MB_ICONQUESTION) != IDOK) return 1;
+		xstring id = dw_list.GetGuid(row);
+
+		if (ProductLibraryView::DeleteItem(id) == 1)	dw_list.DeleteRow(0);
+		return 1;
+	}
+
+	int SetSelectState(xdwgrid dw_obj, int state)
+	{
+		if (state == 1)
+		{
+			dw_obj.SetSelectionMode(3);
+		}
+		else if (state == -1)
+		{
+			dw_obj.SelectRow(0, false);
+			dw_obj.SetSelectionMode(0);
+		}
+		return 1;
+	}
+	int OnCkbCLick(TEvent * evt, int p)
+	{
+		xcheckbox cbx_1 = GetControl(L"frame:cbx1");
+		int state = cbx_1.GetCheck();
+		return SetSelectState(dw_list, state);
+	}
+
+	int OnCkbCLick2(TEvent * evt, int p)
+	{
+		xcheckbox cbx_2 = GetControl(L"frame:cbx2");
+		int state = cbx_2.GetCheck();
+		return SetSelectState(dwc_list, state);
+	}
+
+	xml  GetGoodsPropList(xstring guid)
+	{
+		xml x;
+		xaserverarg arg;
+		arg.AddArg(L"guid", guid);
+		if (xurl::get(L"/sale/data/SO/goods/goodsprop/list", arg.GetString(), x) != 1)
+		{
+			bstring error = x.text();
+			alert(error);
+		}
+		return x;
+	}
+
+	xml  GetGoodsPropListEx(xstring guid)
+	{
+		xml x;
+		xstring fields = L"<data>";
+		//fields +=L"<field name='HighestPrice' label='最高价'/>";
+		//fields +=L"<field name='LowestPrice' label='最低价'/>";
+
+		//fields +=L"<field name='BulkPrice' label='散货价'/>";
+		//fields +=L"<field name='CardPrice' label='纸卡价'/>";
+		//fields +=L"<field name='BuyPrice' label='采购价'/>";
+		//fields +=L"<field name='SupplierID' label='货源'/>";
+
+		fields += L"<field name='Packing' label='包装方式'/>";
+		fields += L"<field name='PackingRate' label='每箱数量'/>";
+		fields += L"<field name='VolumeDesc' label='包装尺码'/>";
+		fields += L"<field name='GWPerPkg' label='毛重'/>";
+		fields += L"<field name='NWPerPkg' label='净重'/>";
+		//fields +=L"<field name='DeveloperID' label='开发人员'/>";
+		fields += L"<field name='AttributeValue_1' label='产品属性'/>";
+		//fields +=L"<field name='Remark' label='备注'/>";
+
+		fields += L"</data>";
+		x.loadXML(fields);
+
+		return x;
+	}
+
+	xstring makeHtml(int row)
+	{
+		xstring id = dw_list.GetItemString(row, L"@guid");
+		xml x = GetGoodsPropList(id);
+		xml x1 = GetGoodsPropListEx(id);
+
+		xstring html = L"<html><style> .text{ font-weight:400} .label { font-weight:400;}</style><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >编号:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"SKUNo") +
+			L"</span> <span style='font-weight:700;width:50;font-size:10pt' >类项:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"RefNo") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >公司型号:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"GoodsNo") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >品名:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"CName") +
+			L"</span></div>";
+		if (dw_list.GetItemString(row, L"CSpec") != L"")
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >规格:</span><span  style='width:90;font-size:10pt'>" + dw_list.GetItemString(row, L"CSpec") +
+				L"</span></div>";
+
+		KXMLDOMNodeList fieldsEx = x1.selectNodes(L"data/field");
+		xstring ls_detail = L"";
+		xstring ls_item = L"";
+		xstring name;
+		xstring label;
+		int len = fieldsEx.length();
+		int i = 0;
+
+		for (i = 0; i < len; true)
+		{
+			int cnt = 0;
+			ls_item = L"";
+			while (cnt < 2)
+			{
+				name = fieldsEx.item(i).selectSingleNode(L"@name").text();
+				label = fieldsEx.item(i).selectSingleNode(L"@label").text();
+				ls_item += L"<td>" + label + L"</td>" + L"<td style='text-align:center'>" + dw_list.GetItemString( row, (LPCTSTR)name) + L"</td>";
+				cnt++;
+				i++;
+				if (i == len)break;
+			}
+			ls_detail += L"<tr>" + ls_item + L"</tr>";
+		}
+		html += (xstring)L"<div style='margin-left:8px;margin-right:16px;'>" +
+			+ L"<table><colgroup span='1' width='70'/><colgroup span='1' width='120'/><colgroup span='1' width='70'/><colgroup span='1' width='120'/>"
+			+ ls_detail
+			+ L"</table>"
+			+ L"</div>";
+
+		xstring ls_star = L"";
+		KXMLDOMNodeList fields = x.selectNodes(L"data/field");
+		len = fields.length();
+
+		ls_detail = L"";
+		if (len > 0)
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >技术要求:</span></div>";
+		for (i = 0; i < len; true)
+		{
+			ls_item = L"";
+
+			int count = 0;
+			while (count < 2)
+			{
+				name = fields.item(i).selectSingleNode(L"@name").text();
+				label = fields.item(i).selectSingleNode(L"@label").text();
+				if (name == L"QualityTerm" || name == L"PackTerm" || label == L"质量" || label == L"包装质量" || label == L"技术要求")
+				{
+					i++;
+					if (i >= len)count = 2;
+					continue;
+				}
+				else if (dw_list.GetItemString( row, (LPCTSTR)name) == L"")
+				{
+					KXMLDOMNodeList options = fields.item(i).selectNodes(L"item");
+					int tlen = options.length();
+					xstring terms = L"";
+					for (int k = 0; k < tlen; k++)
+					{
+						if (xstring(options.item(k).text()))
+						{
+							if (k > 0) terms += L", L";
+							terms += (xstring)L"[" + options.item(k).text() + L"]";
+						}
+					}
+					ls_star += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >" + label + L"*:</span><span  style='width:90;font-size:10pt'>" + terms + L"</span></div>";
+				}
+				else
+				{
+					ls_item = L"<td>" + label + L"</td>" + L"<td>" + dw_list.GetItemString( row, (LPCTSTR)name) + L"</td>";
+					count++;
+				}
+				i++;
+				if (i >= len)count = 2;
+			}
+			ls_item = L"<tr>" + ls_item + L"</tr>";
+			ls_detail += ls_item;
+		}
+
+		html += (xstring)L"<div style='margin-left:8px;margin-right:16px;'>" +
+			+L"<table><colgroup span='1' width='70'/><colgroup span='1' width='120'/><colgroup span='1' width='70'/><colgroup span='1' width='120'/>"
+			+ ls_detail
+			+ L"</table>"
+			+ L"</div>";
+		if (dw_list.GetItemString(row, L"QualityTerm") != L"")
+		{
+			html += L"<div style='height:12px'/>";
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >质量:</span></div>";
+			html += L"<div ><span style='margin-left:8px;margin-right:16px;font-weight:400;font-size:10pt'  >" + dw_list.GetItemString(row, L"QualityTerm") + L"</span></div>";
+		}
+
+		if (dw_list.GetItemString(row, L"PackTerm") != L"")
+		{
+			html += L"<div style='height:12px'/>";
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >包装质量:</span></div>";
+			html += L"<div ><span style='margin-left:8px;margin-right:16px;font-weight:400;font-size:10pt' >" + dw_list.GetItemString(row, L"PackTerm") + L"</span></div>";
+		}
+
+		if (dw_list.GetItemString( row, L"Remark") != L"")
+		{
+			//html +=  L"<div style='height:12px'/>";
+			html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >备注:</span></div>";
+			html += L"<div ><span style='margin-left:8px;margin-right:16px;font-weight:400;font-size:10pt' >" + dw_list.GetItemString( row, L"Remark") + L"</span></div>";
+		}
+
+		html += L"<div style='height:24px'/>";
+
+		//星标项
+		html += ls_star;
+
+		//显示图片	
+		/*
+		if (id != L"")
+		{
+			xml xp=new xml;
+			xp.setNativePointer(xml::CreateInstance());
+			xaserverarg arg_pic=new xaserverarg;
+			arg_pic.setNativePointer(arg_pic.CreateInstance());
+			arg_pic.AddArg(L"SKUID",id);
+			if(url::get(L"/sale/data/ProductLibrary3/pref/picture/imagelistSKU",arg_pic.GetString(),xp)!=1)
+			{
+				trace(L"xxx",xp.GetXml());
+			}else {
+				html +=  L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >图片:</span>"	;
+				KXMLDOMElement ep=  xp.selectSingleNode(L"ImageList");
+				if (ep)
+				{
+					if (ep.SelectNodes(L"image")){
+						KXMLDOMNodeList  nlistp = ep.SelectNodes(L"image");
+						int ip=0;
+						int lenp = nlistp.length;
+						for(ip=0;ip<lenp;ip++)
+						{
+							KXMLDOMElement xitemp = nlistp.item(ip);
+							xstring filename = xitemp.selectSingleNode(L"PicPath").text;
+							//trace(filename);
+							html +=  L"<control visible='layer' controlclass='ximage'  data='' src='http://192.168.7.241:7001" +  filename +L"'/>";
+						}
+					}
+				}
+				html +=  L"</div>";
+			}
+		}else {
+			xstring picname = L"1FA9E331-F95C-4E51-B80C-73FB9B911D8D.jpg";//dw_list.GetItemString(row,L"ImgName"); //ItemID+L".jpg";
+			xstring str = picname.mid(0,2);
+			str = str.upper();
+			xstring serversrc =L"http://192.168.7.241:1001/business/products/chanpin/"+str+L"/"+picname;
+			html +=  L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >图片:</span>";
+			html +=  L"<control visible='layer' controlclass='ximage'  data='' src='"+ serversrc +L"'/></div>";
+		}
+		*/
+		html += L"</body></html>";
+		//trace(html);
+		return html;
+	}
+
+	xstring makeGoodscarHtml(int row)
+	{
+		xstring No = dwc_list.GetItemString(row, L"RefNo");//获取属性值id					
+		xml x = GetGoodsPropList(No);
+
+		xstring html = L"<html><style> .text{ font-weight:400} .label { font-weight:400;}</style><body style='margin:2;background-color1:#ccdccc none #f0f0f0 none'>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >编号:</span><span  style='width:90;font-size:10pt'>" + dwc_list.GetItemString(row, L"No") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >品名:</span><span  style='width:90;font-size:10pt'>" + dwc_list.GetItemString(row, L"CName") +
+			L"</span></div>";
+		html += L"<div ><span style='font-weight:700;width:50;font-size:10pt'  >规格:</span><span  style='width:90;font-size:10pt'>" + dwc_list.GetItemString(row, L"CSpec") +
+			L"</span></div>";
+
+		KXMLDOMNodeList fields = x.selectNodes(L"data/field");
+		int len = fields.length();
+		html += (xstring)L"<table>" +
+			L"<colgroup span='1' width='80'/>" +
+			L"<colgroup span='1' width='120'/>" +
+			L"<colgroup span='1' width='420'/>";
+		html += L"<tr>";
+		html += L"<td style='text-align:center'>编号</td><td style='text-align:center'>项目</td><td style='text-align:center'>内容</td>";
+		html += L"</tr>";
+		for (int i = 0; i < len; i++)
+		{
+			xstring name = fields.item(i).selectSingleNode(L"@name").text();
+			xstring label = fields.item(i).selectSingleNode(L"@label").text();
+			html += L"<tr>";
+			if (i == 0)
+				html += L"<td rowspan='" + xstring(len) + L"'>" + No + L"</td><td >" + label + L"</td><td >" + L"</td>";
+			else
+				html += L"<td >" + label + L"</td><td >" +dw_list.GetItemString( row, (LPCTSTR)name) + L"</td>";
+			html += L"</tr>";
+		}
+
+		html += L"<tr>";
+		html += L"<td rowspan='3'>" +dw_list.GetItemString( row, L"PackCode") + L"</td><td >包装方式</td><td >" +
+			dw_list.GetItemString(row, L"CPack") + L"</td>";
+		html += L"</tr>";
+		html += L"<tr height='48'>";
+		html += L"<td >包装要求</td><td >" +dw_list.GetItemString( row, L"PackQualityTerm") + L"</td>";
+		html += L"</tr>";
+		html += L"<tr>";
+		html += L"<td >侧唛</td><td ></td>";
+		html += L"</tr>";
+
+		html += L"<tr height='72'>";
+		html += L"<td>" +dw_list.GetItemString( row, L"QualityCode") + L"</td><td >质量要求</td><td >" +
+			dw_list.GetItemString(row, L"QualityTerm") + L"</td>";
+		html += L"</tr>";
+
+		html += L"</table>";
+
+		html += L"</body></html>";
+		return html;
+
+	}
+
+	int CarGoodsDelete()
+	{
+		return 1;
+	}
+
+	xstring Up(xstring name) {
+		xstring str = name.mid(0, 2);
+		str = str.toUpper();
+		return xaserver::UploadFile(L"product" + str, name + L".jpg", GetHWND(), L"", false);
+	}
+
+	int OnAddImage() {
+		if (m_customer != L"") return OnAddImageEx();
+		int row = dw_list.GetNextSelectRow(1);
+		if (row < 1) row = dw_list.GetRow();
+		if (row < 1 || row > dw_list.GetRowCount()) return 0;
+
+		KXMLDOMElement e = dw_list.GetRowElement(row);
+		xstring skuid = dw_list.GetItemString( row, L"@guid");
+		xstring SKUNo = dw_list.GetItemString( row, L"SKUNo");
+		xstring id = ViewObject::GetGuid();
+		xstring ret1 = Up(id);
+		if (ret1 == L"-1") return -1;
+		if (ret1 == L"0")
+		{
+			alert(L"上传图片失败");
+			return -1;
+		}
+		xstring originfile = ret1;
+		xstring ext = originfile.right(7);
+		if (ext.find(L".") >= 0)
+			ext = ext.mid(ext.find(L".") + 1, 9999);
+		else
+			ext = L"jpg";
+
+		// 图片名加入数据库
+		xml x ;
+		x.loadXML(L"<Item update.new='1' update.modify='1' guid='" + id + L"'>" +
+			L"<ProductPictureID>" + id + L"</ProductPictureID>" +
+			L"<OriginFile>" + originfile + L"</OriginFile>" +
+			L"<FileExt>" + ext + L"</FileExt>" +
+			L"<SKUID>" + skuid + L"</SKUID>" +
+			L"<Name>[" + SKUNo.trim() + L"]</Name>" +
+			L"<FileName>" + id + L".jpg</FileName>" +
+			L"</Item>"
+		);
+
+		xaserverarg arg;
+		arg.AddArg(L"content", x.xml());
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		dw_list.SetItemString(row, L"pic", L"*");
+		dw_list.Redraw();
+		//刷新一下界面,显示图片
+		OnShowImage(skuid);
+		return 1;
+	}
+
+	int OnAddImageEx() {
+		int row = dwc_list.GetNextSelectRow(1);
+		if (row < 1) row = dwc_list.GetRow();
+		if (row < 1 || row > dwc_list.GetRowCount()) return 0;
+
+		KXMLDOMElement e = dw_list.GetRowElement( row);
+		xstring skuid =dw_list.GetItemString( row, L"SKUID");
+		xstring SKUNo =dw_list.GetItemString( row, L"SKUID/@__displaystring");
+		xstring CustomerID = m_customer;
+		xstring CustomerItemNo =dw_list.GetItemString( row, L"CustomerItemNo");
+		xstring id = ViewObject::GetGuid();
+		xstring ret1 = Up(id);
+		if (ret1 == L"-1") return -1;
+		if (ret1 == L"0")
+		{
+			alert(L"上传图片失败");
+			return -1;
+		}
+		xstring originfile = ret1;
+		xstring ext = originfile.right(7);
+		if (ext.find(L".") >= 0)
+			ext = ext.mid(ext.find(L".") + 1, 9999);
+		else
+			ext = L"jpg";
+
+		// 图片名加入数据库
+		xml x;
+		x.loadXML(L"<Item update.new='1' update.modify='1' guid='" + id + L"'>" +
+			L"<ProductPictureID>" + id + L"</ProductPictureID>" +
+			L"<OriginFile>" + originfile + L"</OriginFile>" +
+			L"<FileExt>" + ext + L"</FileExt>" +
+			L"<SKUID>" + skuid + L"</SKUID>" +
+			L"<CustomerItemNo>" + CustomerItemNo + L"</CustomerItemNo>" +
+			L"<CustomerID>" + CustomerID + L"</CustomerID>" +
+			L"<Name>[" + SKUNo.trim() + L"]</Name>" +
+			L"<FileName>" + id + L".jpg</FileName>" +
+			L"</Item>"
+		);
+
+		xaserverarg arg;
+		arg.AddArg(L"content", x.xml());
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		dwc_list.SetItemString(row, L"pic", L"*");
+		dwc_list.Redraw();
+		//刷新一下界面,显示图片
+		OnShowImage(skuid, CustomerItemNo);
+		return 1;
+	}
+
+	int OnDeleteImageEx()
+	{
+		int row = dwc_list.GetNextSelectRow(1);
+		if (row < 1) row = dwc_list.GetRow();
+		if (row < 1 || row > dwc_list.GetRowCount()) return 0;
+
+		ximageview im = GetControl(L"im1");
+		int index = im.GetSelectIndex();
+		int count = im.GetImageCount();
+
+		if (count < 1) return 1;
+
+		KXMLDOMNodeList images = imageElement.selectNodes(L"image");
+		int length = images.length();
+		if (length < index) return 1;
+
+		int MB_OKCANCEL = 0x00000001;
+		int IDOK = 1;
+		if (MessageBox(GetHWND(), L"确认删除当前图片?", L"提示", MB_OKCANCEL) != IDOK) return 1;
+
+		xstring id = images.item(index).selectSingleNode(L"@guid").text();
+
+		xml x ;
+		xaserverarg arg;
+		arg.setNativePointer(arg.CreateInstance());
+		xstring str = L"<Item update.modify='1' update.delete='1' guid='" + id + L"'/>";
+		arg.AddArg(L"content", str);
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		if (count == 1)
+		{
+			dwc_list.SetItemString(row, L"pic", L"");
+			dwc_list.Redraw();
+		}
+
+		xstring skuid =dw_list.GetItemString( row, L"SKUID");
+		xstring SKUNo =dw_list.GetItemString( row, L"SKUID/@__displaystring");
+		xstring CustomerID = m_customer;
+		xstring CustomerItemNo =dw_list.GetItemString( row, L"CustomerItemNo");
+		OnShowImage(skuid, CustomerItemNo);
+
+		return 1;
+	}
+
+	int OnDeleteImage() {
+		if (m_customer != L"") return OnDeleteImageEx();
+
+		int row = dw_list.GetNextSelectRow(1);
+		if (row < 1) row = dw_list.GetRow();
+		if (row < 1 || row > dw_list.GetRowCount()) return 0;
+
+		ximageview im = GetControl(L"im1");
+		int index = im.GetSelectIndex();
+		int count = im.GetImageCount();
+
+		if (count < 1) return 1;
+
+		KXMLDOMNodeList images = imageElement.selectNodes(L"image");
+		int length = images.length();
+		if (length < index) return 1;
+
+		int MB_OKCANCEL = 0x00000001;
+		int IDOK = 1;
+		if (MessageBox(GetHWND(), L"确认删除当前图片?", L"提示", MB_OKCANCEL) != IDOK) return 1;
+
+		xstring id = images.item(index).selectSingleNode(L"@guid").text();
+
+		xml x;
+		xaserverarg arg;
+		xstring str = L"<Item update.modify='1' update.delete='1' guid='" + id + L"'/>";
+		arg.AddArg(L"content", str);
+		if (xurl::get(L"/sale/data/ProductLibrary/image/update", arg.GetString(), x) != 1)
+		{
+			alert(x.text());
+			return -1;
+		}
+		if (count == 1)
+		{
+			dw_list.SetItemString(row, L"pic", L"");
+			dw_list.Redraw();
+		}
+
+		KXMLDOMElement e1 = dw_list.GetRowElement(row);
+		xstring skuid = e1.getAttribute(L"guid");
+		OnShowImage(skuid);
+
+		return 1;
+	}
+	int OnPreviewImage()
+	{
+		int row = dw_list.GetNextSelectRow(1);
+		if (row < 1) row = dw_list.GetRow();
+		if (row < 1 || row > dw_list.GetRowCount()) return 0;
+		KXMLDOMElement e = dw_list.GetRowElement(row);
+		//KXMLDOMElement e = dw_list.GetRowElement(row);
+		//alert(e.xml);
+		xstring id = dw_list.GetItemString( row, L"@guid");
+		//alert(id);
+
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+		xstring categoryid = e1.selectSingleNode(L"@guid").text();
+		//alert(categoryid);
+		xaserverarg* arg = new xaserverarg;
+		arg->AddArg(L"SKUID", id);
+		arg->AddArg(L"CategoryID", categoryid);
+
+		OpenWindow(L"dev:xpage[PictureView.Product3.vx]", (LPARAM)arg);
+
+		return 1;
+	}
+
+	int ItemMaint()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		//xstring no = e.getAttribute(L"no");
+		//if(no==L"") return 1;
+		xstring guid = e.getAttribute(L"guid");
+		if (guid == L"") return 1;
+
+		/*
+		if(no==L"NP0000FS" || no==L"UP0000FS")
+		{
+			OpenWindow(L"dev:xpage[PackSchemaMaint.goodslib.vx]");
+		}else
+		{
+			int pr = g_xdoc_product;
+			OpenWindow(L"dev:xpage[ProductLibraryItemMaint.vx]",pr);
+		}
+		*/
+		//KXMLDOMElement ele = g_xdoc_product.getRowElement(L"data/Item", 1);
+		//alert(ele.xml);
+#ifdef shouldfinished
+		int pr = g_xdoc_product;
+		OpenWindow(L"dev:xpage[ProductLibraryItemMaint3.vx]", pr);
+#endif
+		return 1;
+	}
+
+	int ItemAdd()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		//alert(e.xml);
+		/*xstring no = e.getAttribute(L"no");
+		if(no==L"") return 1;
+		if(no==L"NP0000FS" || no==L"UP0000FS")
+		{
+			OpenWindow(L"dev:xpage[PackSchemaMaint.goodslib.vx]");
+		}else
+		{
+			int p = no;
+			OpenWindow(L"dev:xpage[SO.autolist.goodslib.add.vx]",p);
+		}*/
+		xstring guid = e.getAttribute(L"guid");
+		if (guid == L"") return 1;
+		xaserverarg arg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg(L"guid", e.getAttribute(L"guid"));
+		if (name == L"个人产品")
+			arg.AddArg(L"FolderID", e.getAttribute(L"guid"));
+		else
+			arg.AddArg(L"CategoryID", e.getAttribute(L"guid"));
+		xstring No = e.getAttribute(L"CategoryNo");
+		if (No == L"") No = e.getAttribute(L"no");
+		xstring Name = e.getAttribute(L"CName");
+		if (Name == L"") Name = e.getAttribute(L"cname");
+		arg.AddArg(L"No", No);
+		arg.AddArg(L"CName", Name);
+		OpenWindow(L"dev:xpage[Quick.Input.NewProduct.vx]", (LPARAM)&arg);
+
+		if (arg.GetArgString(L"data.modify") == L"1")RetrieveData();
+
+		return 1;
+	}
+
+	int OnAddFolder()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+
+		xaserverarg arg;
+		if (hItem != hTopItem)
+		{
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring folder = e.getAttribute(L"guid");
+			if (folder != L"")
+			{
+				arg.AddArg(L"parentCategoryID", folder);
+				OpenWindow(L"dev:xpage[UserFolderMaint.vx]",(LPARAM)&arg);
+				/*if(arg.GetArgString(L"FolderID")!=L"")
+				{
+					int child = tv_folder.GetChildItem(hItem);
+					if(!child)
+					{
+						ExpandItem(hItem);
+					}
+					else
+					{
+						KXMLDOMElement e1 = cast(tv_folder.GetItemData(hItem) as KXMLDOMElement);
+						KXMLDOMElement e2 = e1.cloneNode(0);
+						e2.
+					}
+				}*/
+			}
+		}
+
+		return 1;
+	}
+
+	int OnMaintFolder()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+
+		xaserverarg arg;
+		if (name == L"个人库" && selectname == L"新产品" && tv_folder.GetParentItem(hItem) == hTopItem) return 1;
+		if (hItem != hTopItem)
+		{
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring folder = e.getAttribute(L"guid");
+			if (folder != L"")
+			{
+				arg.AddArg(L"CategoryID", folder);
+				OpenWindow(L"dev:xpage[UserFolderMaint.vx]", (LPARAM)&arg);
+				if (arg.GetArgString(L"label") != L"")
+				{
+					tv_folder.SetItemLabel(hItem, arg.GetArgString(L"label"));
+				}
+			}
+		}
+		return 1;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		int hCursor;
+		xstring name = L"";
+		if (comdid == L"xmRefresh")
+		{
+			return RetrieveData();
+		}
+		else if (comdid == L"xmCarGoodsDelete")
+		{
+			CarGoodsDelete();
+			return 1;
+		}
+		else if (comdid == L"xmAddFolder")
+		{
+			return OnAddFolder();
+		}
+		else if (comdid == L"xmMaintFolder")
+		{
+			return OnMaintFolder();
+		}
+		else if (comdid == L"xmClose")
+		{
+			CloseWindow();
+			return 1;
+		}
+		else if (comdid == L"xmCarGoodsMaint")
+		{
+#ifdef shouldfinish
+			OpenWindow(L"dev:xpage[ShoppingCartProductMaint.vx]", trust(g_xdoc_shoppingcart as int));
+#endif
+			return 1;
+		}
+		else if (comdid == L"xmCarMaint")
+		{
+			OpenWindow(L"dev:xpage[SO.autolist.Shopcar.vx]");
+			return 1;
+		}
+		else if (comdid == L"xmSaleOrder")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+
+			}
+			content += L"</data>";
+			xaserverarg carg;
+			carg.setNativePointer(carg.CreateInstance());
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[SO.Simulation.Import.vx]", (LPARAM) & carg);
+			return 1;
+		}
+		else if (comdid == L"xmEnquiry")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+			}
+			content += L"</data>";
+			xaserverarg carg;
+			carg.setNativePointer(carg.CreateInstance());
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[Enquiry.Import.vx]", (LPARAM)&carg);
+			return 1;
+		}
+		else if (comdid == L"xmPurchar")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+			}
+			content += L"</data>";
+			xaserverarg carg ;
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[PO.Import.vx]", (LPARAM)&carg);
+			return 1;
+		}
+		else if (comdid == L"xmSearch")
+		{
+			RetrieveData();
+			return 1;
+		}
+		else if (comdid == L"xmQuote")
+		{
+			int rw = dwc_list.GetNextSelectRow(1);
+			xstring content = L"<data>";
+			while (rw > 0)
+			{
+				KXMLDOMElement xe = OnGetCarListRowElement(rw);
+				content += xe.xml();
+				rw = dwc_list.GetNextSelectRow(rw + 1);
+			}
+			content += L"</data>";
+			xaserverarg carg;
+			carg.AddArg(L"content", content);
+			OpenWindow(L"dev:xpage[Quote.Import.vx]",  (LPARAM) & carg);
+			return 1;
+		}
+		else if (comdid == L"xmAdd")
+		{
+			return ItemAdd();
+		}
+		else if (comdid == L"xmDelete")
+		{
+			int row = dw_list.GetRow();
+			if (row < 1) return 1;
+			xstring skuid = dw_list.GetItemString( row, L"@guid");
+			xml skuid_x = ViewObject::RetrieveData(L"/sale/data/ProductLibrary3/ProductNumberone", L"SKUID", skuid);
+			xstring  skuidEx = skuid_x.text();
+			int  skuid1 = skuidEx.toInt();
+			if (skuid1)
+			{
+				if (skuid1 > 0)
+				{
+					alert(L"订单已有产品,不允许删除!");
+					return 1;
+				}
+			}
+
+			DeleteRow(row);
+
+			return 1;
+		}
+		else if (comdid == L"xmCarAdd")
+		{
+			HCURSOR hCursor = xutil::SetCursorWait();
+			name = xcontrol(GetControl(L"frame:ed_goodscar")).GetText();
+			if (name != L"")
+			{
+				if (ShoppingCartView::AddCar(name) == 1)
+				{
+					tv_folder.InsertChildItem(LookupTopFolder(tv_folder.GetSelectedItem()),
+						name, 0, 35);
+				}
+			}
+			xutil::RestoreCursor(hCursor);
+			return 1;
+		}
+		else if (comdid == L"xmMaint")
+		{
+			return ItemMaint();
+		}
+		else if (comdid == L"xmAddImage")
+		{
+			return OnAddImage();
+		}
+		else if (comdid == L"xmDeleteImage")
+		{
+			return OnDeleteImage();
+		}
+		else if (comdid == L"xmPreviewImage")
+		{
+			return OnPreviewImage();
+		}
+		else if (comdid == L"xmPropConfigure")
+		{
+#ifdef shouldfinish
+			int r = cast(g_xdoc_product.getData(L"data/Item", L"@guid") as int);
+			OpenWindow(L"dev:xpage[Product.ItemProp.Maint.vx]", r);
+#endif
+			return 1;
+		}
+		else if (comdid == L"xmRertieve")
+		{
+			/*
+			int hItem1 = tv_folder.GetSelectedItem();
+			KXMLDOMElement e2= tv_folder.GetItemData(hItem1);
+			xstring no1 = e2.getAttribute(L"no");
+			xml x2 = vcontrol::RetrieveData(L"/sale/data/SO/goods/usergoods/listex1",L"parent",no1);
+			g_xdoc_product.Retrieve(x2);
+			*/
+			return 1;
+		}
+		else if (comdid == L"xmToCar")
+		{
+			name = xcontrol(GetControl(L"frame:cbx_goodscar")).GetText();
+			if (name == L"==选择购物车==L")
+			{
+				alert(L"请选择购物车");
+				return 1;
+			}
+			int xrow = dw_list.GetNextSelectRow(1);
+			xstring goodsid = L"";
+			xstring html = L"<data>";
+			while (xrow > 0)
+			{
+				KXMLDOMElement e =dw_list.GetRowElement(xrow);
+				goodsid = ProductLibraryView::GetElementString(e, L"@guid");
+				html += L"<item goodid='" + goodsid + L"' id ='" + ProductLibraryView::GetGuid() + L"'/>";
+				xrow = dw_list.GetNextSelectRow(xrow + 1);
+			}
+			html += L"</data>";
+			trace(html);
+			if (ShoppingCartView::GoodsImport(name, html) == 1)
+				alert(L"添加错误!");
+			else
+				alert(L"添加成功");
+			return 1;
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt, int param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	//查找当前树项的顶级目录
+	HTREEITEM LookupTopFolder(HTREEITEM hItem)
+	{
+		HTREEITEM hRoot = tv_folder.GetRootItem();
+		while (tv_folder.GetParentItem(hItem)) hItem = tv_folder.GetParentItem(hItem);
+		return hItem;
+	}
+
+	//插入产品类项的子项
+	int MakeGoodsFolderItem(HTREEITEM hItem, xstring sno)
+	{
+		xml x = ProductLibraryView::GetTreeChildItems3(sno);
+		if (!x) return 0;
+
+		KXMLDOMNodeList nlist = x.selectNodes(L"//Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"CName");
+			xstring no = e.getAttribute(L"CategoryNo");
+			xstring label = no.trim() + L" " + name;
+
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, label, e, 15);
+			xstring child = e.getAttribute(L"Childs");
+			if (child == L"")
+				tv_folder.SetItemChild(h, 1);
+			else if (child != L"0")
+				tv_folder.SetItemChild(h, 1);
+		}
+		return 1;
+	}
+
+	//插入新产品目录子项
+	int MakeUserGoodsFolderItem(HTREEITEM hItem, xstring sno)
+	{
+		xml x = ProductLibraryView::GetTreeUserChildItems3(sno);
+		if (!x) return 0;
+
+		KXMLDOMNodeList nlist = x.selectNodes(L"//Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"CName");
+			xstring no = e.getAttribute(L"CategoryNo");
+			xstring label = no.trim() + L" " + name;
+
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, label, e, 15);
+			xstring child = e.getAttribute(L"Childs");
+			if (child == L"")
+				tv_folder.SetItemChild(h, 1);
+			else if (child != L"0")
+				tv_folder.SetItemChild(h, 1);
+		}
+		return 1;
+	}
+
+	//插入购物车项
+	int ExpandCatChildFolder(HTREEITEM hItem, KXMLDOMElement ele, int image)
+	{
+		KXMLDOMNodeList nlist = ele.selectNodes(L"item");
+		int len = nlist.length();
+		if (len > 0) tv_folder.SetItemChild(hItem, 1);
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+	int MakeGoodCarFolderItem(HTREEITEM hItem)
+	{
+		xml x = ShoppingCartView::GetRoleList();
+		if (!x) return 0;
+		KXMLDOMNodeList nlist = x.selectNodes(L"/data/item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			xstring name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, 35);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+
+	int ExpandItem(HTREEITEM hItem)
+	{
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		HTREEITEM child = tv_folder.GetChildItem(hItem);
+		xstring no = L"";
+		KXMLDOMElement e;
+		if (name == L"公司库" && !child)
+		{
+			no = L"";
+			if (hTopItem != hItem)
+			{
+				e = tv_folder.GetItemData(hItem);
+				no = e.getAttribute(L"categoryid");
+			}
+			else
+			{
+				e = tv_folder.GetItemData(hItem);
+				no = e.getAttribute(L"categoryid");
+			}
+			MakeGoodsFolderItem(hItem, no);
+		}
+		else if (name == L"个人库" && !child)
+		{
+			no = L"";
+			if (hTopItem != hItem)
+			{
+				e = tv_folder.GetItemData(hItem);
+				no = e.getAttribute(L"categoryid");
+				MakeUserGoodsFolderItem(hItem, no);
+			}
+		}
+		else if (name == L"购物车" && !child)
+		{
+			if (hItem == hTopItem)MakeGoodCarFolderItem(hItem);
+		}
+		return 1;
+	}
+
+	//树展开
+	int OnTreeExpanding(TEvent * evt, int p)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+		return ExpandItem(hItem);
+	}
+
+	int ResetAgent(xstring agentAsk)
+	{
+		if (agentFor != agentAsk)
+		{
+			agentFor = agentAsk;
+			m_agentNode = 0;
+			SetAgent();
+		}
+		return 1;
+	}
+
+	HTREEITEM LookupCustomerFolder(HTREEITEM hItem)
+	{
+		while (true)
+		{
+			KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+			xstring str = e1.getAttribute(L"no");
+			if (str.find(L"Customer:") >= 0) return hItem;
+			hItem = tv_folder.GetParentItem(hItem);
+			if (hItem == 0) break;
+		}
+		return 0;
+	}
+
+	xstring LookupCustomer(HTREEITEM hItem)
+	{
+		hItem = LookupCustomerFolder(hItem);
+		if (hItem == 0) return L"";
+		KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+		xstring str = e1.getAttribute(L"no");
+		return str.mid(xstring(L"Customer:").length(), 9999);
+	}
+
+	int RetrieveData()
+	{
+		ximageview im = GetControl(L"im1");
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+
+		xcontrol query = GetControl(L"sl_search");
+		xstring queryString = query.GetText();
+
+		if (hItem == hTopItem)
+		{
+			dw_list.Reset();
+			dw_list.SetReadOnly(true);
+			dw_list.Redraw();
+			dwc_list.Reset();
+			dwc_list.SetReadOnly(true);
+			dwc_list.Redraw();
+
+			im.Reset();
+			im.Redraw();
+
+
+			xshtml xs1 = GetControl(L"html_detail");
+			xs1.SetContent(L"<html><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'/></html>");
+
+			if (name != L"公司库") return 1;
+		}
+		//return 1;
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+
+		if (name == L"购物车")
+		{
+			if (selectname != name)
+			{
+				KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+				xstring str = e1.getAttribute(L"no");
+				alert(str);
+				if (str.find(L"Customer:") == 0 || str.find(L"SO:") == 0)
+				{
+					m_customer = LookupCustomer(hItem);
+					if (str.find(L"Customer:") == 0)
+						dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodscustomerlist");
+					else
+						dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodssolist");
+					dwc_list.Reset();
+					dwc_list.SetReadOnly(true);
+					dw_list.Retrieve(ShoppingCartView::GetGoodsList(str, queryString));
+				}
+				else if (e1.getAttribute(L"categoryid") != L"")
+				{
+					xstring categoryid = e1.getAttribute(L"categoryid");
+					dwc_list.SetDataObject(ProductLibraryView::GetMaintListForm3(categoryid));
+					dwc_list.SetReadOnly(true);
+					dwc_list.Reset();
+					dw_list.Retrieve(ProductLibraryView::GetMaintList3(categoryid, queryString, L""));
+					dwc_list.Redraw();
+				}
+				else
+				{
+					dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodslist");
+					dwc_list.SetReadOnly(true);
+					dwc_list.Reset();
+					dw_list.Retrieve(ShoppingCartView::GetGoodsList(selectname, queryString));
+				}
+				//dwc_list.PostRetrieve();
+				dwc_list.Redraw();
+
+				xshtml xs = GetControl(L"html_detail");
+				if (dwc_list.GetRowCount() >= 1)
+				{
+					xs.SetContent(makeGoodscarHtml(1));
+
+					if (m_customer != L"")
+					{
+						xstring skuid =dw_list.GetItemString( 1, L"SKUID");
+						xstring customerItemNo =dw_list.GetItemString( 1, L"CustomerItemNo");
+						OnShowImage(skuid, customerItemNo);
+					}
+				}
+				else
+				{
+					im.Reset();
+					im.Redraw();
+
+					xs = GetControl(L"html_detail");
+					xs.SetContent(L"<html><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'/></html>");
+				}
+				xs.Redraw();
+			}
+		}
+		else
+		{
+
+			if (name == L"个人库" || name == L"公司库")
+			{
+				xstring no = L"N000005";
+				if (name == L"个人库") no = L"U000005";
+
+				if (hItem != hTopItem)
+				{
+					KXMLDOMElement e = tv_folder.GetItemData(hItem);
+					no = e.getAttribute(L"guid");
+				}
+				else
+					return 1;
+
+				/*	dw_list.SetDataObject(ProductLibraryView::GetMaintListForm3(no).GetXmlDoc());
+					dw_list = GetControl(L"dw_list");
+					dw_list.Reset();
+					dw_list.SetReadOnly(true);
+				*/
+
+				if (name == L"个人库")
+					dw_list.Retrieve(ProductLibraryView::GetMaintRoleList3(no));
+				else
+				{
+					if (queryString != L"")
+					{
+
+						if (no == L"N000005")
+							dw_list.Retrieve(ProductLibraryView::GetMaintList3(L"", queryString, L""));
+						else
+							dw_list.Retrieve(ProductLibraryView::GetMaintList3(no, queryString, L""));
+					}
+					else
+					{
+						if (no == L"N000005") return 1;
+						dw_list.Retrieve(ProductLibraryView::GetMaintList3(no));
+					}
+				}
+				//dw_list.PostRetrieve();
+				dw_list.Redraw();
+
+				xshtml xs = GetControl(L"html_detail");
+				if (dw_list.GetRowCount() > 0)
+				{
+					xs.SetContent(makeHtml(1));
+					xstring id = dw_list.GetItemString( 1, L"@guid");
+					OnShowImage(id);
+				}
+				else
+				{
+					im.Reset();
+					im.Redraw();
+
+					xs.SetContent(L"<html><body style='margin:2;background-color:#ccdccc none #f0f0f0 none'/></html>");
+				}
+				xs.Redraw();
+			}
+		}
+		xutil::RestoreCursor(hCursor);
+
+		return 1;
+	}
+
+	int OnTreeSelChanged(TEvent * evt, int p)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		xstring name = tv_folder.GetItemLabel(hTopItem);
+		xstring selectname = tv_folder.GetItemLabel(hItem);
+		ximageview im = GetControl(L"im1");
+		m_customer = L"";
+		//alert(name);
+		if (name == L"购物车")
+		{
+			if (agentFor != L"goodscar")SwitchLayer(L"goodscarsheet", L"sheetframe");
+			ResetAgent(L"goodscar");
+		}
+		else
+		{
+			if (agentFor != L"goodslib")SwitchLayer(L"goodslibsheet", L"sheetframe");
+			if (name == L"个人库")
+				ResetAgent(L"userlib");
+			else
+				ResetAgent(L"goodslib");
+		}
+		//RetrieveData();
+		PostMessage(GetHWND(), 0x401, (WPARAM)L"xmRefresh", 0);
+
+		return 1;
+	}
+
+	int  ExpandChildFolder(HTREEITEM hItem, KXMLDOMElement pElement)
+	{
+		KXMLDOMNodeList nlist = pElement.selectNodes(L"Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement& e = * new KXMLDOMElement(nlist.item(i));
+			xstring name = e.getAttribute(L"cname");
+			xstring sImage = e.getAttribute(L"image");
+			int image = 15;
+			//if(sImage) image = sImage.toInt();
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			tv_folder.SetItemChild(h, 1);
+			ExpandChildFolder(h, e);
+		}
+		return 1;
+	}
+
+	int  InitialFolder()
+	{
+		KXMLDOMElement xframeElement = GetElement();
+		KXMLDOMElement e = xframeElement.selectSingleNode(L"//xtree[@name='tv_folder']/initial");
+		ExpandChildFolder(0, e);
+		return 1;
+	}
+
+	int OnViewZoomChange(TEvent* evt, int lParam)
+	{
+		ximageview im = GetControl(L"im1");
+		xcombobox xc = GetControl(L"precent");
+		xstring text = xc.GetLBText();
+		int p = text.toInt();
+		if (p == 0) p = 100;
+		im.Preview(p);
+		return 1;
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&ProductLibrary4Win::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&ProductLibrary4Win::OnSetFocus);
+		AttachEvent(L"dw_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&ProductLibrary4Win::OnRowChanged);
+		AttachEvent(L"dwc_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&ProductLibrary4Win::OnGoodsCarRowChanged);
+		AttachEvent(L"tv_folder", L"TVN_ITEMEXPANDING", (FEvent)&ProductLibrary4Win::OnTreeExpanding);
+		AttachEvent(L"tv_folder", L"TVN_SELCHANGED", (FEvent)&ProductLibrary4Win::OnTreeSelChanged);
+		AttachEvent(L"WM_COMMAND", (FEvent)&ProductLibrary4Win::OnCkbCLick);	//checkbox打钩事件
+		AttachEvent(L"WM_COMMAND", (FEvent)&ProductLibrary4Win::OnCkbCLick2);	//checkbox打钩事件	
+
+		AttachEvent(L"im1", L"IMG_LDBCLICK", (FEvent)&ProductLibrary4Win::OnImgDBClicked);
+		AttachEvent(L"precent", L"CBN_SELCHANGE", (FEvent)&ProductLibrary4Win::OnViewZoomChange);
+
+		return 1;
+	}
+
+	int onload()
+	{
+		agentFor = L"goodslib";
+		m_customer = 0;
+
+		OnAttachEvent();
+
+		tv_folder = GetControl(L"tv_folder");
+		dw_list = GetControl(L"dw_list");
+		dwc_list = GetControl(L"dwc_list");
+
+		InitialFolder();
+
+		dw_list.SetDataObject(ProductLibraryView::GetMaintListForm3(L""));
+		dw_list = GetControl(L"dw_list");
+		dw_list.SetReadOnly(true);
+
+		dwc_list.openUrl(L"/sale/view/ProductLibrary/template/cart/goodslist");
+		dwc_list.SetReadOnly(true);
+
+		tv_folder.ExpandItem(tv_folder.GetRootItem());
+		tv_folder.ItemFocus(tv_folder.GetRootItem());
+
+		if (dw_list.GetRowCount())
+		{
+			xshtml xs = GetControl(L"html_detail");
+			xs.SetContent(makeHtml(1));
+		}
+
+		return 1;
+	}
+
+	int onloaded()
+	{
+		SetAgent();
+
+		return 1;
+	}
+
+	int OnImgDBClicked(TEvent * evt, int pr)
+	{
+		IMGNNMHDR& nmtv = *(IMGNNMHDR*)evt->notify.pnmh;
+		xstring src = nmtv.path;
+		/*if(src.length() > 60)
+			src = src.right(44);
+		else
+			src=src.mid(src.find(L"Thumbs", 0)+6, 50);
+		*/
+		xaserverarg& arg = *new xaserverarg;
+		//arg.AddArg(L"src",L"/business/products/chanpin"+src);	
+		arg.AddArg(L"src", src);
+
+		//win::OpenWindow(L"dev:xpage[BigPicture.vx]",arg);	
+
+		int h = openUrl(L"/sale/view/ProductLibrary/xpage/bigpictureview", &arg);
+		return 1;
+		/*
+		xwin x = new xwin;
+		x.setNativePointer(h);
+		m_winHwnd = x.GetHWND();
+
+		xstring sh = doc.GetXml();
+		int p = cast(sh as int);
+		win32::SendMessage(m_winHwnd, 0x401, p, 0);
+		*/
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/LogList.cpp b/jrj/project/business/SystemSettings/LogList.cpp
new file mode 100644
index 0000000..f781cf6
--- /dev/null
+++ b/jrj/project/business/SystemSettings/LogList.cpp
@@ -0,0 +1,203 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class ViewLogList : public xwin
+	{
+		xdwgrid	dw_list;
+		xoffice 	dw_office;
+		xcell		dw_cell;
+		xnode	m_agentNode;	//Agent Condition
+		string m_category;
+		string argStr;
+		string	searchStr;
+	
+		int SetAgent()
+		{
+			string xfNodeAgentArea  = "agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			if(m_agentNode)
+			{
+				SetAgentNodeContent (anode,m_agentNode);
+			}
+			else
+			{
+				msxml::IXMLDOMElement xframeElement =  GetElement();
+				msxml::IXMLDOMElement agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+			}
+			return 1;
+		}
+
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			SetAgent();
+			return 1;
+		}
+
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			int hCursor =  0;
+			 if(comdid=="xmQuery")
+			{
+						xaserverarg ar = new xaserverarg;
+						ar.setNativePointer(ar.CreateInstance());
+						ar.AddArg("argurl","/sale/view/Total3/arg/LogListItem");
+						if(argStr !="") 
+							ar.AddArg("arg",argStr);
+						OpenWindow("dev:xpage[view.total.arg.vx]",cast(ar as int));
+						string arstr = ar.GetArgString("arg");
+						if(arstr != "" && ar.GetArgString("action")=="ok")
+						{
+							argStr = arstr;
+							hCursor = xutil::SetCursorWait();
+							OnRetrieve("/sale/data/Total3/total/GDNTotal/Item/LogList",argStr);
+							
+							xutil::RestoreCursor(hCursor);
+						}
+					
+					else
+					{
+						argStr="";
+						OnRetrieve("/sale/data/Total3/total/GDNTotal/Item/LogList",argStr);
+					}
+				
+				return 1;
+			 }
+					 if(comdid=="xmAnalysis")
+			{
+				hCursor = xutil::SetCursorWait();
+				string str = dw_list.DataAnalysis("");
+				xaserverarg arg=new xaserverarg;
+				arg.setNativePointer(arg.CreateInstance());						
+				arg.AddArg("html", str);
+				int obj = cast(dw_list as int);
+				arg.AddArg("obj",obj.toString());
+				OpenWindow("dev:xpage[data.vanalysis.vx]", cast(arg as int));
+				xutil::RestoreCursor(hCursor);
+				return 1;
+			 }
+					 if(comdid=="xmSearch") return OnSearch();
+			return 0;
+		}
+					 
+		int OnSearch()
+		{
+			xaserverarg arg=new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());						
+			arg.AddArg("text", searchStr);
+			OpenWindow("dev:xpage[search.dialog.vx]", cast(arg as int));
+			string str = arg.GetArgString("text");
+			if(str != searchStr)
+			{
+				searchStr = str;
+				dw_list.Filter("*",searchStr);
+				return 1;
+			}
+			return 1;
+		}
+		
+
+		
+		int OnCombboChanged(ref TCommandEvent evt,int lParam)
+		{
+			int h = xcombobox::GetCurSel(evt.hCtrl);
+			if(h > -1) 
+			{
+				int hCursor = xutil::SetCursorWait();
+				msxml::IXMLDOMElement e = xcombobox::GetItemData(evt.hCtrl, h);
+				
+				win32::PostMessage(GetHWND(),0x401,"xmQuery",0);
+				//OnCmdDispatch("xmQuery");
+				xutil::RestoreCursor(hCursor);
+			}
+			return 1;
+		}
+
+		
+			
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnDWClick(ref TNotifyEvent evt,int p)
+		{
+			ref DWNMHDR  hdr = trust(evt.pnmh as ref DWNMHDR);
+			string value = hdr.data;
+			string colname = hdr.colname;
+			int row = hdr.row;
+			
+			if(row < 1) return 1;
+			
+			return 1;
+		}
+
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+			AttachEvent("cb_report","CBN_SELCHANGE",OnCombboChanged);
+			AttachEvent("dw_report","DWV_CLICKED",OnDWClick);
+		}
+		
+		int  OnRetrieve(string dataurl, string argstr)
+		{
+			dw_list.Reset();
+			
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			arg.AddArg("arg",argstr);
+			//alert(argstr);
+				
+			if (url::get(dataurl,arg.GetString(),x)!=1)
+			{
+				//alert(x.GetXml());			
+				trace(x.GetXmlDoc().text);
+				dw_list.Redraw();
+				return -1;
+			}
+			//alert(x.GetXml());			
+			dw_list.Retrieve(x);
+			dw_list.Redraw();
+			dw_list.SetReadOnly(true);
+
+			return 1;
+		}
+
+		int onload()
+		{
+			dw_list = GetControl("dw_report");
+			dw_office  = GetControl("dw_office");
+			dw_cell = GetControl("dw_cell");
+			dw_list.openUrl("/sale/view/Total3/template/business/gdn/LogList/ship/full");
+			
+			argStr ="";
+			xcombobox xc = GetControl("cb_report");
+			
+
+			OnAttachEvent();	
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			SetAgent();
+			OnCmdDispatch("xmQuery");
+			return 1;
+		}		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Organization_A.cpp b/jrj/project/business/SystemSettings/Organization_A.cpp
new file mode 100644
index 0000000..8f92f1c
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Organization_A.cpp
@@ -0,0 +1,513 @@
+#include <wobject/xstring.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xdwgrid.hpp>
+
+#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
+#include "viewobject/view.base.hpp"
+
+class __declspec(dllexport) SO3list : public listwin
+{
+public:
+	string m_sType; //树选中的类型
+	string m_sTypeTxt; //树选中的数据
+	string urlTree;
+	string myDataUrl;
+	string rows;
+	xcombobox ddlb_1;
+	xcombobox cbx_datashow;
+
+	int changeddlb;
+
+	xtreeview tv_folder;
+	xdwgrid dw_goods;
+	xdwgrid dw_source;
+public:
+	SO3list(void* implPtr, HWND hWnd) :listwin(implPtr, hWnd) {}
+public:
+	static SO3list* CreateInstance(void* implPtr, void* hWnd)
+	{
+		SO3list* pWin = new SO3list(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+
+	//process tree
+	//查找当前树项的顶级目录
+	HTREEITEM LookupTopFolder(HTREEITEM hItem)
+	{
+		HTREEITEM hRoot = tv_folder.GetRootItem();
+		while (tv_folder.GetParentItem(hItem)) hItem = tv_folder.GetParentItem(hItem);
+		return hItem;
+	}
+
+	int ExpandCatChildFolder(HTREEITEM hItem, KXMLDOMElement ele, int image)
+	{
+		KXMLDOMNodeList nlist = ele.selectNodes(L"item");
+		int len = nlist.length();
+		if (len > 0) tv_folder.SetItemChild(hItem, 1);
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			string name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+
+	int ExpandFolderItem(HTREEITEM hItem, string no)
+	{
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),urlTree, L"no", no, L"rows", rows);
+		if (!x) return 0;
+		KXMLDOMNodeList nlist = x.selectNodes(L"/data/item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			string name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, 35);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+
+	//树展开
+	int OnTreeExpanding(TEvent* evt, int p)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		string name = tv_folder.GetItemLabel(hTopItem);
+		HTREEITEM child = tv_folder.GetChildItem(hItem);
+
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		if (!child)ExpandFolderItem(hItem, e.getAttribute(L"no"));
+
+		return 1;
+	}
+
+	//展开子文件
+	int  ExpandChildFolder(HTREEITEM hItem, KXMLDOMElement pElement)
+	{
+		KXMLDOMNodeList nlist = pElement.selectNodes(L"Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			string name = e.getAttribute(L"name");
+			xstring sImage = e.getAttribute(L"image");
+			xstring child = e.getAttribute(L"child");
+			int image = 15;
+			if (sImage) image = sImage.toInt();
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			if (child != L"no") tv_folder.SetItemChild(h, 1);
+			//ExpandChildFolder(h, e);
+		}
+		return 1;
+	}
+
+	//初始化文件夹
+	int  InitialFolder()
+	{
+		KXMLDOMElement xframeElement = GetElement();
+		KXMLDOMElement e = xframeElement.selectSingleNode(L"//xtree[@name='tv_folder']/initial");
+		if (e)
+			ExpandChildFolder(0, e);
+		return 1;
+	}
+
+	int OnTreeSelChanged(TEvent* evt, LPARAM p)
+	{
+		if (changeddlb) return 1;
+		return OnPreRetrieve();
+	}
+
+	int ViewUpdate(LPARAM pr, xstring updateItem, xaserverarg  arg)
+	{
+		if (updateItem == L"del")
+		{
+			int DelRow = dw_list.GetRow();
+			dw_list.DeleteRow(DelRow);
+			return 1;
+		}
+		else if (updateItem == L"setstate")
+		{
+			int row = dw_list.GetRow();
+			if (row < 1) return 1;
+			KXMLDOMElement ele = dw_list.GetRowElement(row);
+			string id = GetEntityIDName(1);
+			string entity = ele.selectSingleNode(id).text();
+			//trace(entity);
+			SetAgent(L"list", entity);
+			if (arg.GetArgString(L"state") != L"")
+				//this.dw_list.SetItemString(row, "ApprovalStatus", arg.GetArgString(L"state"));
+				dw_list.SetItemString(row, L"ApplyStatus", arg.GetArgString(L"state"));
+			if (arg.GetArgString(L"billstatus") != L"")
+			{
+				xstring billstatus = arg.GetArgString(L"billstatus");
+				xstring statusName = GetBillStatusName(billstatus);
+				dw_list.SetItemString(row, L"ApprovalStatus", billstatus);
+				dw_list.SetItemDisplayString(row, L"ApprovalStatus", statusName);
+			}
+
+			dw_list.Redraw();
+		}
+		return 1;
+	}
+
+	bool IsEmptyQueryStr(string queryStr)
+	{
+		if (queryStr == L"") return true;
+		if (queryStr == L"<items join='and'/>") return true;
+		if (queryStr == L"<items join=\"and\"/>") return true;
+		//trace(queryStr);
+		return false;
+	}
+
+	//检索
+	int OnPreRetrieve()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		if (!hItem) return 1;
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+		string no = e1.getAttribute(L"no");
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),myDataUrl, L"no", no, L"QueryTxt", m_QueryTxt, L"rows", rows);
+		if (x)
+		{
+			dw_list.Retrieve(x);
+			dw_list.Redraw();
+		}
+		else
+		{
+			dw_list.Reset();
+			dw_list.Redraw();
+			dw_goods.Reset();
+			dw_goods.Redraw();
+		}
+		dw_list.SetReadOnly(true);
+		xutil::RestoreCursor(hCursor);
+		return 1;
+		/*
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg(L"pageindex", m_pageIndex.toString(),""); //第几页
+		arg.AddArg(L"pagenumber", m_pageNumber.toString(),""); //每页数量
+		arg.AddArg(L"QueryTxt", m_QueryTxt,""); //查询条件
+		arg.AddArg(L"sType",m_sType,"");
+		arg.AddArg(L"sTypeTxt",m_sTypeTxt,"");
+		xml x =  ViewObject::MakeXml();
+
+		KXMLDOMElement   n = m_configDoc.selectSingleNode(L"//list/dwview[@type='dwgrid'][1]");
+		if(n)
+		{
+			KXMLDOMElement e = n;
+			if(e.selectSingleNode(L"@dataUrl"))
+			{
+				string dataUrl = e.selectSingleNode(L"@dataUrl").text;
+				if(dataUrl.left(1)!="/") dataUrl = GetEntityName(1)+"/"+dataUrl;
+				getUrl(dataUrl, arg.GetString(), x);
+				KXMLDOMElement ele=x.GetXmlDoc().documentElement;
+				if(dw_pages.ptr_native_)
+				{
+					if(ele.selectSingleNode(L"@TotalPage"))
+					{
+						string s=ele.selectSingleNode(L"@TotalPage").text; //总数量
+						dw_pages.SetMaxPage(s.toInt());
+					}
+				}
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+				dw_list.SetReadOnly(true);
+			}
+			else
+			{
+				SetEntityData(arg);
+			}
+		}
+		else
+		{
+			SetEntityData(arg);
+		}
+		*/
+	}
+
+	//历史数据
+	int Onhistroydata()
+	{
+		int row = dw_list.GetNextSelectRow(1);
+		if (row > 0)
+		{
+			KXMLDOMElement e = dw_list.GetRowElement(row);
+			xaserverarg& arg = * new xaserverarg;
+			string sCustomerID = e.selectSingleNode(L"CustomerID").text();
+			arg.AddArg(L"CustomerID", sCustomerID, L"");
+			string sCustomerName = e.selectSingleNode(L"CustomerName").text();
+			arg.AddArg(L"CustomerName", sCustomerName, L"");
+			arg.AddArg(L"EntityName", GetEntityName(1), L"");
+			arg.AddArg(L"EntityID", GetEntityID(1), L"");
+			openUrl(L"/sale/view/SO/xpage/histroydata", &arg);
+		}
+		return 1;
+	}
+
+	//xcombobox下拉
+	int OnSelectDdlb(TEvent* evt, LPARAM p)
+	{
+		changeddlb = 1;
+		HWND wid = ddlb_1.GetHWND();
+		int CB_GETCURSEL = 0x0147;
+		int nIndex =SendMessage(wid, CB_GETCURSEL, 0, 0);
+		KXMLDOMElement e = ddlb_1.GetElement();
+		KXMLDOMElement e2 = e.selectSingleNode(L"item[" + xstring(nIndex + 1) + L"]");
+		string no = e2.selectSingleNode(L"@element").text();
+
+		HTREEITEM hItem = tv_folder.GetRootItem();
+		while (tv_folder.GetChildItem(hItem))
+			tv_folder.DeleteItem(tv_folder.GetChildItem(hItem));
+		ExpandFolderItem(hItem, no);
+
+		changeddlb = 0;
+		return 1;
+	}
+
+
+	int OnSelectDataShowDdlb(TEvent* evt, LPARAM p)
+	{
+		HWND wid = cbx_datashow.GetHWND();
+		int CB_GETCURSEL = 0x0147;
+		int nIndex = SendMessage(wid, CB_GETCURSEL, 0, 0);
+		KXMLDOMElement e = cbx_datashow.GetElement();
+		KXMLDOMElement e2 = e.selectSingleNode(L"item[" + xstring(nIndex + 1) + L"]");
+		rows = e2.selectSingleNode(L"@rows").text();
+		OnPreRetrieve();
+
+		return 1;
+	}
+
+	int PreOnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"action:bill.new")
+		{
+			xstring s = publiccode::GetUser().id;
+			xstring no = publiccode::GetUser().no;
+			if (no != L"00303" && no != L"admin")
+			{
+				KXMLDOMDocument supplier_x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/SupplierV3/entity/FindBySaleType", L"id", s);
+				if (supplier_x)
+				{
+					if ((xstring)supplier_x.text() != L"业务员")
+					{
+						alert(L"当前角色不是业务员不能新增单子,请重新选择角色");
+						return 0;
+					}
+				}
+			}
+		}
+		if (comdid == L"action:bill.annex")
+		{
+			xstring deptname = publiccode::GetUser().deptname;
+			if (deptname == L"采购部")
+			{
+				return 1;
+			}
+
+			int row = dw_list.GetRow();
+			if (row < 1) return 1;
+			xstring guid = dw_list.GetItemString(row, L"SOID");
+			xaserverarg& arg = * new xaserverarg();
+
+			if (guid.length() <= 0)return 1;
+			
+			arg.AddArg(L"entityid", guid);
+			arg.AddArg(L"Type", L"Y");
+			OpenWindow(L"dev:xpage[maint.Document.SO3.v3.vx]", arg);
+
+			return 0;
+		}
+		if (comdid == L"action:bill.histroydata") return Onhistroydata();
+		else if (comdid == L"action:bill.refresh")
+		{
+			changeddlb = 1;
+			HTREEITEM RItem = tv_folder.GetRootItem();
+			while (tv_folder.GetChildItem(RItem))
+				tv_folder.DeleteItem(tv_folder.GetChildItem(RItem));
+			ExpandFolderItem(RItem, L"Category:Customer");
+			tv_folder.ExpandItem(RItem);
+			tv_folder.ItemFocus(RItem);
+			changeddlb = 0;
+			return OnPreRetrieve();
+		}
+		if (comdid == L"action:bill.saveas")
+		{
+			dw_list.SaveAs(L"");
+			return 1;
+		}
+		if (comdid == L"action:bill.SourceRemark") return OnSourceRemark();
+
+		return 1;
+	}
+
+	int OnSourceRemark()
+	{
+		xstring name = L"外销合同";
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/TradeFinance3/GetSetUpRemarks", L"Type", name);
+		KXMLDOMNodeList items = x.selectNodes(L"data/Item");
+		KXMLDOMNode t = items.item(0);
+		xstring Content = L"";
+		if (t.selectSingleNode(L"Content"))
+		{
+			Content = t.selectSingleNode(L"Content").text();
+		}
+		xaserverarg& arg = *new xaserverarg;
+		arg.AddArg(L"value", Content);
+		OpenWindow(L"dev:xpage[memo.edit.new.vx]", arg);
+
+		return 1;
+	}
+
+	int OnRowChanged(TEvent* evt, LPARAM p)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+
+
+		if (row < 1) return 1;
+
+		//fixed one event only one process
+		listwin::OnRowChanged(evt, p);
+
+		HCURSOR 	hCursor = xutil::SetCursorWait();
+
+		xstring SONo = dw_list.GetItemString(row, L"SONo");
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/SaleOrder/maint/item", L"id", SONo);
+		if (x)
+			dw_goods.Retrieve(x);
+		else
+			dw_goods.Reset();
+		dw_goods.Redraw();
+		dw_goods.SetReadOnly(true);
+
+		x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/SaleOrder/maint/itemwithsource", L"id", SONo);
+		if (x)
+			dw_source.Retrieve(x);
+		else
+			dw_source.Reset();
+		dw_source.Redraw();
+		dw_source.SetReadOnly(true);
+
+		xutil::RestoreCursor(hCursor);
+
+		return 1;
+	}
+
+
+	int AttachListon()
+	{
+		AttachEvent(L"tv_folder", L"TVN_SELCHANGED", (FEvent)&SO3list::OnTreeSelChanged); //树选择
+		AttachEvent(L"dw_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&SO3list::OnRowChanged);//绑定行更改触发事件OnRowChanged
+		//AttachEvent(L"dw_list", L"DWV_DOUBLECLICKED", (FEvent)&listwin::OnDoubleClicked);
+		AttachEvent(L"cbx_1", L"CBN_SELCHANGE", (FEvent)&SO3list::OnSelectDdlb);//绑定下拉框更改触发事件OnSelectDdlb
+		AttachEvent(L"cbx_datashow", L"CBN_SELCHANGE", (FEvent)&SO3list::OnSelectDataShowDdlb);//绑定选择数据显示下拉列表事件OnSelectDataShowDdlb
+		return 1;
+	}
+
+	int onload()
+	{
+		changeddlb = 0;
+		listwin::onload();
+		ddlb_1 = GetControl(L"cbx_1");
+		cbx_datashow = GetControl(L"cbx_datashow");
+		dw_goods = GetControl(L"dw_goods");
+		dw_goods.openUrl(GetServerUrl(),L"/sale/view/SaleOrder/template/item");
+		dw_source = GetControl(L"dw_source");
+		dw_source.openUrl(GetServerUrl(), L"/sale/view/SaleOrder/template/sourceitem");
+
+		dw_goods.SetColumnState(L"ItemID", false);
+		dw_goods.SetColumnState(L"LineType", false);
+		dw_goods.SetColumnState(L"Brand", false);
+		dw_goods.SetColumnState(L"Assortment", false);
+		dw_goods.SetColumnState(L"ClassifyID", false);
+		dw_goods.SetColumnState(L"UnitFreight", false);
+		//dw_goods.SetColumnState(L"CName",false);//隐藏列
+
+		dw_goods.SetColumnState(L"Brand", false);
+		dw_goods.SetColumnState(L"SKUNo", false);
+		dw_goods.SetColumnState(L"SOLineNo", false);
+		dw_goods.SetColumnState(L"CustomerPONo", false);
+		dw_goods.SetColumnState(L"ScheduleShipDate", false);
+
+		dw_goods.SetColumnState(L"PackTechNote", false);
+		dw_goods.SetColumnState(L"EnquiryPriceListID", false);
+		dw_goods.SetColumnState(L"Submitter", false);
+		dw_goods.SetColumnState(L"POSupplierID", false);
+		dw_goods.SetColumnState(L"QuoteLineID", false);
+
+		dw_list.SetColumnState(L"CreatorID", false);
+		dw_list.SetColumnState(L"SOID", false);
+
+
+		string groupname = publiccode::GetUser().groupname;
+		if (groupname == L"采购小组")
+		{
+			dw_list.SetColumnState(L"USDAmount", false);
+			dw_list.SetColumnState(L"RMBAmount", false);
+
+			dw_goods.SetColumnState(L"UnitPrice", false);
+			dw_goods.SetColumnState(L"Amount", false);
+			dw_goods.SetColumnState(L"UnitCommPrice", false);
+			dw_goods.SetColumnState(L"CommissionRate", false);
+
+			dw_source.SetColumnState(L"UnitPrice", false);
+			dw_source.SetColumnState(L"Amount", false);
+			dw_source.SetColumnState(L"FOBAmount", false);
+			dw_source.SetColumnState(L"BuyUnitPrice", false);
+			dw_source.SetColumnState(L"BuyAmount", false);
+			dw_source.SetColumnState(L"CostRate", false);
+		}
+
+		rows = L"500";
+		myDataUrl = L"/sale/data/SaleOrder/folder/list";
+		urlTree = L"/sale/data/SaleOrder/folder";
+		tv_folder = GetControl(L"tv_folder");
+		tv_folder.SetLineAtRoot(true);
+		InitialFolder();
+
+		return 1;
+	}
+
+	int onloaded()
+	{
+		listwin::onloaded();
+
+		//attach my control event
+		AttachListon();
+
+		dw_list.SetColumnState(L"SOID", false);
+
+		HTREEITEM hItem = tv_folder.GetRootItem();
+		ExpandFolderItem(hItem, L"Category:Customer");
+		tv_folder.ExpandItem(hItem);
+		//tv_folder.ItemFocus(tv_folder.GetChildItem(hItem));
+		tv_folder.ItemFocus(hItem);
+
+
+		return -1;
+	}
+
+	int ProcessUsedArg(xaserverarg arg)
+	{
+		HTREEITEM hItem = tv_folder.GetCaretItem();
+		if (hItem ) return 1;
+		KXMLDOMElement e =  tv_folder.GetItemData(hItem);
+		xstring  no = e.getAttribute(L"no");
+		if (no.find(L"Customer:") >= 0)
+		{
+			arg.AddArg(L"CustomerID", e.getAttribute(L"id"));
+			xstring name = e.getAttribute(L"name");
+			if (name.find(L"(L") >= 0) name = name.left(name.find(L"(L"));
+			arg.AddArg(L"CustomerName", name);
+		}
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/ProcessManagement_A.cpp b/jrj/project/business/SystemSettings/ProcessManagement_A.cpp
new file mode 100644
index 0000000..8f92f1c
--- /dev/null
+++ b/jrj/project/business/SystemSettings/ProcessManagement_A.cpp
@@ -0,0 +1,513 @@
+#include <wobject/xstring.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xdwgrid.hpp>
+
+#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
+#include "viewobject/view.base.hpp"
+
+class __declspec(dllexport) SO3list : public listwin
+{
+public:
+	string m_sType; //树选中的类型
+	string m_sTypeTxt; //树选中的数据
+	string urlTree;
+	string myDataUrl;
+	string rows;
+	xcombobox ddlb_1;
+	xcombobox cbx_datashow;
+
+	int changeddlb;
+
+	xtreeview tv_folder;
+	xdwgrid dw_goods;
+	xdwgrid dw_source;
+public:
+	SO3list(void* implPtr, HWND hWnd) :listwin(implPtr, hWnd) {}
+public:
+	static SO3list* CreateInstance(void* implPtr, void* hWnd)
+	{
+		SO3list* pWin = new SO3list(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+
+	//process tree
+	//查找当前树项的顶级目录
+	HTREEITEM LookupTopFolder(HTREEITEM hItem)
+	{
+		HTREEITEM hRoot = tv_folder.GetRootItem();
+		while (tv_folder.GetParentItem(hItem)) hItem = tv_folder.GetParentItem(hItem);
+		return hItem;
+	}
+
+	int ExpandCatChildFolder(HTREEITEM hItem, KXMLDOMElement ele, int image)
+	{
+		KXMLDOMNodeList nlist = ele.selectNodes(L"item");
+		int len = nlist.length();
+		if (len > 0) tv_folder.SetItemChild(hItem, 1);
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			string name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+
+	int ExpandFolderItem(HTREEITEM hItem, string no)
+	{
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),urlTree, L"no", no, L"rows", rows);
+		if (!x) return 0;
+		KXMLDOMNodeList nlist = x.selectNodes(L"/data/item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			string name = e.getAttribute(L"name");
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, 35);
+			ExpandCatChildFolder(h, e, 35);
+		}
+		return 1;
+	}
+
+	//树展开
+	int OnTreeExpanding(TEvent* evt, int p)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+		HTREEITEM hTopItem = LookupTopFolder(hItem);
+		string name = tv_folder.GetItemLabel(hTopItem);
+		HTREEITEM child = tv_folder.GetChildItem(hItem);
+
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		if (!child)ExpandFolderItem(hItem, e.getAttribute(L"no"));
+
+		return 1;
+	}
+
+	//展开子文件
+	int  ExpandChildFolder(HTREEITEM hItem, KXMLDOMElement pElement)
+	{
+		KXMLDOMNodeList nlist = pElement.selectNodes(L"Item");
+		int len = nlist.length();
+		for (int i = 0; i < len; i++)
+		{
+			KXMLDOMElement e = nlist.item(i);
+			string name = e.getAttribute(L"name");
+			xstring sImage = e.getAttribute(L"image");
+			xstring child = e.getAttribute(L"child");
+			int image = 15;
+			if (sImage) image = sImage.toInt();
+			HTREEITEM h = tv_folder.InsertChildItem(hItem, name, e, image);
+			if (child != L"no") tv_folder.SetItemChild(h, 1);
+			//ExpandChildFolder(h, e);
+		}
+		return 1;
+	}
+
+	//初始化文件夹
+	int  InitialFolder()
+	{
+		KXMLDOMElement xframeElement = GetElement();
+		KXMLDOMElement e = xframeElement.selectSingleNode(L"//xtree[@name='tv_folder']/initial");
+		if (e)
+			ExpandChildFolder(0, e);
+		return 1;
+	}
+
+	int OnTreeSelChanged(TEvent* evt, LPARAM p)
+	{
+		if (changeddlb) return 1;
+		return OnPreRetrieve();
+	}
+
+	int ViewUpdate(LPARAM pr, xstring updateItem, xaserverarg  arg)
+	{
+		if (updateItem == L"del")
+		{
+			int DelRow = dw_list.GetRow();
+			dw_list.DeleteRow(DelRow);
+			return 1;
+		}
+		else if (updateItem == L"setstate")
+		{
+			int row = dw_list.GetRow();
+			if (row < 1) return 1;
+			KXMLDOMElement ele = dw_list.GetRowElement(row);
+			string id = GetEntityIDName(1);
+			string entity = ele.selectSingleNode(id).text();
+			//trace(entity);
+			SetAgent(L"list", entity);
+			if (arg.GetArgString(L"state") != L"")
+				//this.dw_list.SetItemString(row, "ApprovalStatus", arg.GetArgString(L"state"));
+				dw_list.SetItemString(row, L"ApplyStatus", arg.GetArgString(L"state"));
+			if (arg.GetArgString(L"billstatus") != L"")
+			{
+				xstring billstatus = arg.GetArgString(L"billstatus");
+				xstring statusName = GetBillStatusName(billstatus);
+				dw_list.SetItemString(row, L"ApprovalStatus", billstatus);
+				dw_list.SetItemDisplayString(row, L"ApprovalStatus", statusName);
+			}
+
+			dw_list.Redraw();
+		}
+		return 1;
+	}
+
+	bool IsEmptyQueryStr(string queryStr)
+	{
+		if (queryStr == L"") return true;
+		if (queryStr == L"<items join='and'/>") return true;
+		if (queryStr == L"<items join=\"and\"/>") return true;
+		//trace(queryStr);
+		return false;
+	}
+
+	//检索
+	int OnPreRetrieve()
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		if (!hItem) return 1;
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		KXMLDOMElement e1 = tv_folder.GetItemData(hItem);
+		string no = e1.getAttribute(L"no");
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),myDataUrl, L"no", no, L"QueryTxt", m_QueryTxt, L"rows", rows);
+		if (x)
+		{
+			dw_list.Retrieve(x);
+			dw_list.Redraw();
+		}
+		else
+		{
+			dw_list.Reset();
+			dw_list.Redraw();
+			dw_goods.Reset();
+			dw_goods.Redraw();
+		}
+		dw_list.SetReadOnly(true);
+		xutil::RestoreCursor(hCursor);
+		return 1;
+		/*
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg(L"pageindex", m_pageIndex.toString(),""); //第几页
+		arg.AddArg(L"pagenumber", m_pageNumber.toString(),""); //每页数量
+		arg.AddArg(L"QueryTxt", m_QueryTxt,""); //查询条件
+		arg.AddArg(L"sType",m_sType,"");
+		arg.AddArg(L"sTypeTxt",m_sTypeTxt,"");
+		xml x =  ViewObject::MakeXml();
+
+		KXMLDOMElement   n = m_configDoc.selectSingleNode(L"//list/dwview[@type='dwgrid'][1]");
+		if(n)
+		{
+			KXMLDOMElement e = n;
+			if(e.selectSingleNode(L"@dataUrl"))
+			{
+				string dataUrl = e.selectSingleNode(L"@dataUrl").text;
+				if(dataUrl.left(1)!="/") dataUrl = GetEntityName(1)+"/"+dataUrl;
+				getUrl(dataUrl, arg.GetString(), x);
+				KXMLDOMElement ele=x.GetXmlDoc().documentElement;
+				if(dw_pages.ptr_native_)
+				{
+					if(ele.selectSingleNode(L"@TotalPage"))
+					{
+						string s=ele.selectSingleNode(L"@TotalPage").text; //总数量
+						dw_pages.SetMaxPage(s.toInt());
+					}
+				}
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+				dw_list.SetReadOnly(true);
+			}
+			else
+			{
+				SetEntityData(arg);
+			}
+		}
+		else
+		{
+			SetEntityData(arg);
+		}
+		*/
+	}
+
+	//历史数据
+	int Onhistroydata()
+	{
+		int row = dw_list.GetNextSelectRow(1);
+		if (row > 0)
+		{
+			KXMLDOMElement e = dw_list.GetRowElement(row);
+			xaserverarg& arg = * new xaserverarg;
+			string sCustomerID = e.selectSingleNode(L"CustomerID").text();
+			arg.AddArg(L"CustomerID", sCustomerID, L"");
+			string sCustomerName = e.selectSingleNode(L"CustomerName").text();
+			arg.AddArg(L"CustomerName", sCustomerName, L"");
+			arg.AddArg(L"EntityName", GetEntityName(1), L"");
+			arg.AddArg(L"EntityID", GetEntityID(1), L"");
+			openUrl(L"/sale/view/SO/xpage/histroydata", &arg);
+		}
+		return 1;
+	}
+
+	//xcombobox下拉
+	int OnSelectDdlb(TEvent* evt, LPARAM p)
+	{
+		changeddlb = 1;
+		HWND wid = ddlb_1.GetHWND();
+		int CB_GETCURSEL = 0x0147;
+		int nIndex =SendMessage(wid, CB_GETCURSEL, 0, 0);
+		KXMLDOMElement e = ddlb_1.GetElement();
+		KXMLDOMElement e2 = e.selectSingleNode(L"item[" + xstring(nIndex + 1) + L"]");
+		string no = e2.selectSingleNode(L"@element").text();
+
+		HTREEITEM hItem = tv_folder.GetRootItem();
+		while (tv_folder.GetChildItem(hItem))
+			tv_folder.DeleteItem(tv_folder.GetChildItem(hItem));
+		ExpandFolderItem(hItem, no);
+
+		changeddlb = 0;
+		return 1;
+	}
+
+
+	int OnSelectDataShowDdlb(TEvent* evt, LPARAM p)
+	{
+		HWND wid = cbx_datashow.GetHWND();
+		int CB_GETCURSEL = 0x0147;
+		int nIndex = SendMessage(wid, CB_GETCURSEL, 0, 0);
+		KXMLDOMElement e = cbx_datashow.GetElement();
+		KXMLDOMElement e2 = e.selectSingleNode(L"item[" + xstring(nIndex + 1) + L"]");
+		rows = e2.selectSingleNode(L"@rows").text();
+		OnPreRetrieve();
+
+		return 1;
+	}
+
+	int PreOnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"action:bill.new")
+		{
+			xstring s = publiccode::GetUser().id;
+			xstring no = publiccode::GetUser().no;
+			if (no != L"00303" && no != L"admin")
+			{
+				KXMLDOMDocument supplier_x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/SupplierV3/entity/FindBySaleType", L"id", s);
+				if (supplier_x)
+				{
+					if ((xstring)supplier_x.text() != L"业务员")
+					{
+						alert(L"当前角色不是业务员不能新增单子,请重新选择角色");
+						return 0;
+					}
+				}
+			}
+		}
+		if (comdid == L"action:bill.annex")
+		{
+			xstring deptname = publiccode::GetUser().deptname;
+			if (deptname == L"采购部")
+			{
+				return 1;
+			}
+
+			int row = dw_list.GetRow();
+			if (row < 1) return 1;
+			xstring guid = dw_list.GetItemString(row, L"SOID");
+			xaserverarg& arg = * new xaserverarg();
+
+			if (guid.length() <= 0)return 1;
+			
+			arg.AddArg(L"entityid", guid);
+			arg.AddArg(L"Type", L"Y");
+			OpenWindow(L"dev:xpage[maint.Document.SO3.v3.vx]", arg);
+
+			return 0;
+		}
+		if (comdid == L"action:bill.histroydata") return Onhistroydata();
+		else if (comdid == L"action:bill.refresh")
+		{
+			changeddlb = 1;
+			HTREEITEM RItem = tv_folder.GetRootItem();
+			while (tv_folder.GetChildItem(RItem))
+				tv_folder.DeleteItem(tv_folder.GetChildItem(RItem));
+			ExpandFolderItem(RItem, L"Category:Customer");
+			tv_folder.ExpandItem(RItem);
+			tv_folder.ItemFocus(RItem);
+			changeddlb = 0;
+			return OnPreRetrieve();
+		}
+		if (comdid == L"action:bill.saveas")
+		{
+			dw_list.SaveAs(L"");
+			return 1;
+		}
+		if (comdid == L"action:bill.SourceRemark") return OnSourceRemark();
+
+		return 1;
+	}
+
+	int OnSourceRemark()
+	{
+		xstring name = L"外销合同";
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/TradeFinance3/GetSetUpRemarks", L"Type", name);
+		KXMLDOMNodeList items = x.selectNodes(L"data/Item");
+		KXMLDOMNode t = items.item(0);
+		xstring Content = L"";
+		if (t.selectSingleNode(L"Content"))
+		{
+			Content = t.selectSingleNode(L"Content").text();
+		}
+		xaserverarg& arg = *new xaserverarg;
+		arg.AddArg(L"value", Content);
+		OpenWindow(L"dev:xpage[memo.edit.new.vx]", arg);
+
+		return 1;
+	}
+
+	int OnRowChanged(TEvent* evt, LPARAM p)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+
+
+		if (row < 1) return 1;
+
+		//fixed one event only one process
+		listwin::OnRowChanged(evt, p);
+
+		HCURSOR 	hCursor = xutil::SetCursorWait();
+
+		xstring SONo = dw_list.GetItemString(row, L"SONo");
+		KXMLDOMDocument x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/SaleOrder/maint/item", L"id", SONo);
+		if (x)
+			dw_goods.Retrieve(x);
+		else
+			dw_goods.Reset();
+		dw_goods.Redraw();
+		dw_goods.SetReadOnly(true);
+
+		x = ViewObject::RetrieveData(GetServerUrl(),L"/sale/data/SaleOrder/maint/itemwithsource", L"id", SONo);
+		if (x)
+			dw_source.Retrieve(x);
+		else
+			dw_source.Reset();
+		dw_source.Redraw();
+		dw_source.SetReadOnly(true);
+
+		xutil::RestoreCursor(hCursor);
+
+		return 1;
+	}
+
+
+	int AttachListon()
+	{
+		AttachEvent(L"tv_folder", L"TVN_SELCHANGED", (FEvent)&SO3list::OnTreeSelChanged); //树选择
+		AttachEvent(L"dw_list", L"DWV_ROWFOCUSCHANGED", (FEvent)&SO3list::OnRowChanged);//绑定行更改触发事件OnRowChanged
+		//AttachEvent(L"dw_list", L"DWV_DOUBLECLICKED", (FEvent)&listwin::OnDoubleClicked);
+		AttachEvent(L"cbx_1", L"CBN_SELCHANGE", (FEvent)&SO3list::OnSelectDdlb);//绑定下拉框更改触发事件OnSelectDdlb
+		AttachEvent(L"cbx_datashow", L"CBN_SELCHANGE", (FEvent)&SO3list::OnSelectDataShowDdlb);//绑定选择数据显示下拉列表事件OnSelectDataShowDdlb
+		return 1;
+	}
+
+	int onload()
+	{
+		changeddlb = 0;
+		listwin::onload();
+		ddlb_1 = GetControl(L"cbx_1");
+		cbx_datashow = GetControl(L"cbx_datashow");
+		dw_goods = GetControl(L"dw_goods");
+		dw_goods.openUrl(GetServerUrl(),L"/sale/view/SaleOrder/template/item");
+		dw_source = GetControl(L"dw_source");
+		dw_source.openUrl(GetServerUrl(), L"/sale/view/SaleOrder/template/sourceitem");
+
+		dw_goods.SetColumnState(L"ItemID", false);
+		dw_goods.SetColumnState(L"LineType", false);
+		dw_goods.SetColumnState(L"Brand", false);
+		dw_goods.SetColumnState(L"Assortment", false);
+		dw_goods.SetColumnState(L"ClassifyID", false);
+		dw_goods.SetColumnState(L"UnitFreight", false);
+		//dw_goods.SetColumnState(L"CName",false);//隐藏列
+
+		dw_goods.SetColumnState(L"Brand", false);
+		dw_goods.SetColumnState(L"SKUNo", false);
+		dw_goods.SetColumnState(L"SOLineNo", false);
+		dw_goods.SetColumnState(L"CustomerPONo", false);
+		dw_goods.SetColumnState(L"ScheduleShipDate", false);
+
+		dw_goods.SetColumnState(L"PackTechNote", false);
+		dw_goods.SetColumnState(L"EnquiryPriceListID", false);
+		dw_goods.SetColumnState(L"Submitter", false);
+		dw_goods.SetColumnState(L"POSupplierID", false);
+		dw_goods.SetColumnState(L"QuoteLineID", false);
+
+		dw_list.SetColumnState(L"CreatorID", false);
+		dw_list.SetColumnState(L"SOID", false);
+
+
+		string groupname = publiccode::GetUser().groupname;
+		if (groupname == L"采购小组")
+		{
+			dw_list.SetColumnState(L"USDAmount", false);
+			dw_list.SetColumnState(L"RMBAmount", false);
+
+			dw_goods.SetColumnState(L"UnitPrice", false);
+			dw_goods.SetColumnState(L"Amount", false);
+			dw_goods.SetColumnState(L"UnitCommPrice", false);
+			dw_goods.SetColumnState(L"CommissionRate", false);
+
+			dw_source.SetColumnState(L"UnitPrice", false);
+			dw_source.SetColumnState(L"Amount", false);
+			dw_source.SetColumnState(L"FOBAmount", false);
+			dw_source.SetColumnState(L"BuyUnitPrice", false);
+			dw_source.SetColumnState(L"BuyAmount", false);
+			dw_source.SetColumnState(L"CostRate", false);
+		}
+
+		rows = L"500";
+		myDataUrl = L"/sale/data/SaleOrder/folder/list";
+		urlTree = L"/sale/data/SaleOrder/folder";
+		tv_folder = GetControl(L"tv_folder");
+		tv_folder.SetLineAtRoot(true);
+		InitialFolder();
+
+		return 1;
+	}
+
+	int onloaded()
+	{
+		listwin::onloaded();
+
+		//attach my control event
+		AttachListon();
+
+		dw_list.SetColumnState(L"SOID", false);
+
+		HTREEITEM hItem = tv_folder.GetRootItem();
+		ExpandFolderItem(hItem, L"Category:Customer");
+		tv_folder.ExpandItem(hItem);
+		//tv_folder.ItemFocus(tv_folder.GetChildItem(hItem));
+		tv_folder.ItemFocus(hItem);
+
+
+		return -1;
+	}
+
+	int ProcessUsedArg(xaserverarg arg)
+	{
+		HTREEITEM hItem = tv_folder.GetCaretItem();
+		if (hItem ) return 1;
+		KXMLDOMElement e =  tv_folder.GetItemData(hItem);
+		xstring  no = e.getAttribute(L"no");
+		if (no.find(L"Customer:") >= 0)
+		{
+			arg.AddArg(L"CustomerID", e.getAttribute(L"id"));
+			xstring name = e.getAttribute(L"name");
+			if (name.find(L"(L") >= 0) name = name.left(name.find(L"(L"));
+			arg.AddArg(L"CustomerName", name);
+		}
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Resource.select.data.config.cpp b/jrj/project/business/SystemSettings/Resource.select.data.config.cpp
new file mode 100644
index 0000000..ea28235
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Resource.select.data.config.cpp
@@ -0,0 +1,93 @@
+use "dev:code[Data.resource.config.vx]"
+
+unit vbusiness.vpage
+[
+	resourceselectRole is extend DataRConfig;
+	about resourceselectRole
+	[
+		field:
+			
+		method:
+		[
+			int ForChild()
+			{
+				this.dw_list.SetReadOnly(true);
+				return 0;
+			}		
+		
+			int OnSelectAll()
+			{
+				if(this.dw_list.GetRowCount() > 0 )
+					this.dw_list.SelectRow(1,true);
+
+				this.dw_list.SelectRow(0,true);
+				this.dw_list.Redraw();
+				return 1;
+			}
+			
+			int OnSelectNo()
+			{
+				this.dw_list.SelectRow(0,false);
+				this.dw_list.Redraw();
+				return 1;
+			}
+			
+			int OnOk()
+			{
+				xdwgrid__ dw_param = this.GetParam();
+				if (dw_param)
+				{
+					int row = this.dw_list.GetNextSelectRow(1);
+					int dw_row = dw_param.GetRowCount();
+					while (row>0){
+						msxml::IXMLDOMElement e = this.dw_list.GetRowElement(row);
+						string scetegory = e.selectSingleNode("cetegory").text;
+						string sResource = e.selectSingleNode("resource").text;
+						string sName = e.selectSingleNode("name").text;
+						string sResConfigID = e.selectSingleNode("ResConfigID").text;
+						dw_row += 1;
+						dw_param.InsertRow(-1);
+						dw_param.SetItemString(dw_row,"cetegory",scetegory);
+						dw_param.SetItemString(dw_row,"resource",sResource);
+						dw_param.SetItemString(dw_row,"name",sName);
+						dw_param.SetItemString(dw_row,"ResConfigID",sResConfigID);
+					
+						this.dw_list.SelectRow(row,false);
+						row = this.dw_list.GetNextSelectRow(row + 1);
+					}
+					this.dw_list.Redraw();
+				}	
+				CloseWindow();
+				return 1;
+			}
+			
+			int OnCancel()
+			{
+				win__::CloseWindow();		
+				return 1;
+			}
+
+			int OnCmdDispatch(string comdid)
+			{
+				if (comdid=="SelectAll") OnSelectAll();
+				else if (comdid=="SelectNo") OnSelectNo();
+				else if (comdid=="Ok") OnOk();
+				else if (comdid=="Cancel") OnCancel();					
+				return 0;
+			}
+			
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+			
+			int onload()
+			{
+				DataRConfig::onload();
+				this.dw_list.SetSelectionMode(3);
+				
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+			}
+		]
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/Role.config.cpp b/jrj/project/business/SystemSettings/Role.config.cpp
new file mode 100644
index 0000000..f0287cc
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Role.config.cpp
@@ -0,0 +1,548 @@
+use "lang.vl"
+use "win.vl"
+use "treeview.vm"
+use "dev:vm[xutil.vm]"
+use "dev:vm[xdwtable.vm]"
+use "dev:vm[xdwgrid.vm]"
+use "sys.base.vl"
+
+use "dev:vm[xcell.vm]"
+
+unit vbusiness.vpage
+[
+	Roleconfig is extend TProject;
+	about Roleconfig
+	[
+		field:
+			
+		method:
+		[
+			treeview__	tv_menu;
+			xdwtable__ dw_list;
+			xdwgrid__ dw_param;
+			xdwgrid__ dw_role;
+			string m_status;
+			
+			int SetAgent()
+			{
+				string xfNodeAgentArea  = "agentarea";
+				xnode__ anode = new xnode__;
+				anode.setNativePointer(GetAgentNode(xfNodeAgentArea));
+				var xframeElement =  win__::GetElement();
+				var agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]");
+				if(agent)
+				{
+					string s = agent.xml+"";
+					SetAgentNodeContent (anode,s);
+				}
+				return 1;
+			}
+		
+			int createTree(string id, int parentItem)
+			{	
+				if(treeview__::GetChildItem(tv_menu.GetId(), parentItem) > 0) return 0;
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("pid",id);
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[leftFrame.xq]",arg.GetString(),x)!=1)
+				//if(url::get(m_iface+"/pref/tree",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/tree",arg.GetString(),x)!=1)
+				{
+					trace(x.GetXml());
+					return -1;	
+				}
+				//trace(x.GetXml());
+				var list=x.GetXmlDoc().selectNodes("items/item");
+				int i=0,s=list.length;
+				msxml::IXMLDOMElement xitem;
+				for (i=0;i<s;i++)
+				{
+					xitem= list.item(s - i - 1);
+					string id = xitem.selectSingleNode("ModuleID").text;
+					string Name="";
+					if(xitem.selectSingleNode("ModuleName")) Name=xitem.selectSingleNode("ModuleName").text;
+					string image = 15;
+					if(xitem.selectSingleNode("ModuelImage")) image=xitem.selectSingleNode("ModuelImage").text;
+					int curItem=treeview__::InsertItem(tv_menu.GetId(), parentItem,0,Name,id,image.toInt());		
+					string child=xitem.selectSingleNode("@child").text;//item.getAttribute("HasChild");	
+					if (child != "0")
+						treeview__::SetItemChild1(tv_menu.GetId(), curItem,1);
+				}
+			}
+				
+			int OnNew()
+			{
+				int i =1;
+				while(dw_list.GetColumnName(i) != "")
+				{
+					dw_list.SetItemString(1, i, "");
+					i++;
+				}
+				dw_list.ResetUpdateStatus();
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				x.LoadXml("<item><ModuelPage/><status _displaystring='启用'>Y</status><type _displaystring='菜单'>0</type><ModuelImage>17</ModuelImage><ModuelParam><args/></ModuelParam><roles/></item>");
+				dw_list.Retrieve(x);
+				dw_list.ResetUpdateStatus();
+				dw_list.Redraw();
+				dw_param.Retrieve(x.GetXmlDoc().selectSingleNode("item/ModuelParam/args"));
+				dw_param.ResetUpdateStatus();
+				dw_param.Redraw();
+				dw_role.Retrieve(x.GetXmlDoc().selectSingleNode("item/roles"));
+				dw_role.ResetUpdateStatus();
+				dw_role.Redraw();
+				return 1;
+			}
+			
+			int OnAddRow(xdwgrid__ dw)
+			{
+				dw.InsertRow(0);
+				return 1;
+			}
+			
+			int OnDelRow(xdwgrid__ dw)
+			{
+				int row = dw.GetRow();
+				if(row<1 || row > dw.GetRowCount()) return -1;
+				dw.DeleteRow(row);
+				return 1;
+			}
+/*			
+			int openUrl(string aurl, param para)
+			{
+				int pos = aurl.find("/",0);
+				if(pos<0) return "";
+				string iface = aurl.left(pos);
+				string root = aurl.mid(pos + 1,9999);
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				if( iface.find(".vface",0)<0 ) 
+				{
+					return -1;
+				}
+				else
+				{
+					string typ = iface.mid(iface.find(".",0) + 1,9999);
+					xaserver__::LoadUrl("","dev:"+typ+"["+iface+"]","",x);
+				}
+				var doc = x.GetXmlDoc();
+				var n = doc.selectSingleNode("//resource[@url='" + root+"']/@src");
+				if(n)
+				{
+					string xq = n.text;
+					return OpenWindow(xq, para);
+				}else
+				{
+					n = doc.selectSingleNode("//group[@for='worknode']/resource[@url='" + root+"']");
+					if(n)
+					{
+						string vface  = n.selectSingleNode("@vface").text;
+						string view   = n.selectSingleNode("@view").text;
+						string config = n.selectSingleNode("@config").text;
+						if(config != "" )
+						{
+							xaserverarg__ arg = para;
+							arg.AddArg("config",config);
+						}
+						
+						if(vface=="."|| vface=="")
+						{
+							var v = doc.selectSingleNode("//resource[@url='" + view+"']/@src");
+							if(v)
+							{
+								return OpenWindow(v.text, para);
+							}
+						}else
+							return openUrl(vface+"/"+view,para);
+					}
+				}
+				return -1;
+			}
+*/			
+			int OnAddRole()
+			{
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				//OpenWindow("dev:xpage[selectRole.vx]", arg);
+				//openUrl(m_vface+"/xpage/role/select/user", arg);
+				openUrl("/sale/view/Role.config/xpage/role/select/user", arg);
+				string str = arg.GetArgString("item");
+				if(str == "") return -1;
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				x.LoadXml(str);
+				var list=x.GetXmlDoc().selectNodes("items/item");
+				int i=0,s=list.length;
+				msxml::IXMLDOMElement xitem;
+				int row = dw_role.GetRowCount() + 1;
+				for (i=0;i<s;i++)
+				{
+					xitem= list.item(i);
+					string id = ""+xitem.selectSingleNode("@id").text;
+					string name=""+xitem.selectSingleNode("@name").text;
+					string tpy=""+xitem.selectSingleNode("@type").text;
+					dw_role.InsertRow(0);
+					dw_role.SetItemString(row + i, "id", id);
+					dw_role.SetItemString(row + i, "name", name);
+					dw_role.SetItemString(row + i, "type", tpy);
+				}
+				return 1;
+			}
+			
+			int OnDel()
+			{
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				dw_list.DwUpdateAllTo(x.GetXmlDoc());
+				msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				string id = e.selectSingleNode("@guid").text;
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				arg.AddArg("id", id);
+				//trace(id);
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[deleteModule.xq]",arg.GetString(),x)!=1)
+				//if(url::get(m_iface+"/pref/delete",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/delete",arg.GetString(),x)!=1)
+				{
+					trace("error:"+x.GetXml());
+					alert("删除出错!");
+					return 0;
+				}
+				if(x.GetXmlDoc().selectSingleNode("error"))
+				{
+					alert("请先删除子项!");
+					return 0;				
+				}
+				int sitem = treeview__::GetSelectedItem(tv_menu.GetId());
+				treeview__::DeleteItem(tv_menu.GetId(), sitem);
+				return 1;
+			}
+			
+			int OnSave()
+			{
+				dw_param.AcceptText();
+				dw_list.AcceptText();
+				/*int aa=1,bb=1;
+				xpoint p;
+				dw_list.getNullCell(p);
+				int xx = p.x;
+				trace(xx);
+				int yy = p.y;
+				trace(yy);
+				string zz = dw_list.GetColumnName(yy);
+				trace(zz);*/
+				
+				int m = treeview__::GetSelectedItem(tv_menu.GetId());
+				if(m == 0) return -1;
+				
+				int n = treeview__::GetRootItem(tv_menu.GetId());
+				if(m == n)
+					if(m_status == "update.modify")
+					{
+						alert("根节点不能修改!");
+						return 1;
+					}
+				
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				dw_list.DwUpdateAllTo(x.GetXmlDoc());
+				msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				e.SetAttribute(m_status, "1");
+				//trace(e.xml);
+				//return 1;
+				
+				xml__ x1 = new xml__;
+				x1.setNativePointer(xml__ ::CreateInstance());
+				dw_param.DwUpdateAllTo(x1.GetXmlDoc());
+				msxml::IXMLDOMElement p = x1.GetXmlDoc().documentElement;
+				e.AppendChild(p);
+				
+				xml__ x2 = new xml__;
+				x2.setNativePointer(xml__ ::CreateInstance());
+				dw_role.DwUpdateAllToEx(x2.GetXmlDoc());
+				msxml::IXMLDOMElement r = x2.GetXmlDoc().documentElement;
+				e.AppendChild(r);
+				
+				//trace(e.xml);
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				arg.AddArg("content", e.xml);
+				arg.AddArg("dbmap", "Role.config.dbmap");
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[saveModule.xq]",arg.GetString(),x)!=1)
+				//if(url::get(m_iface+"/pref/save",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/save",arg.GetString(),x)!=1)
+				{
+					trace("error:"+x.GetXml());
+					alert("保存出错!");
+					return 0;
+				}
+				//trace(x.GetXml());
+				if(x.GetXmlDoc().selectSingleNode("error"))
+				{
+					alert("保存出错2!");
+					return 0;				
+				}				
+				dw_list.ResetUpdateStatus();
+				dw_param.ResetUpdateStatus();
+				dw_role.ResetUpdateStatus();
+				
+				string id = e.selectSingleNode("@guid").text;
+				string name = "";
+				if(e.selectSingleNode("ModuleName"))
+					name = e.selectSingleNode("ModuleName").text;
+				string image = 15;
+				if(e.selectSingleNode("ModuelImage"))
+					image = e.selectSingleNode("ModuelImage").text;
+				int sitem = treeview__::GetSelectedItem(tv_menu.GetId());
+				if(m_status == "update.new")
+					treeview__::InsertChildItem(tv_menu.GetId(), sitem, name, id, image.toInt());
+				else if(m_status == "update.modify")
+					treeview__::SetItemLabel(tv_menu.GetId(), sitem, name);
+				
+				if(m_status == "update.new")
+				{
+					OnNew();				
+					int sitem = treeview__::GetSelectedItem(tv_menu.GetId());
+					string xxid = treeview__::GetItemData(tv_menu.GetId(), sitem);
+					dw_list.SetItemString(1, "ModulePID", xxid);
+				}
+				alert("保存成功!");
+				return 1;
+			}
+
+			int OnCmdDispatch(string comdid)
+			{
+				int hCursor = xutil__::SetCursorWait();
+				if(comdid == "New")
+				{
+					m_status = "update.new";
+					OnNew();				
+					int sitem = treeview__::GetSelectedItem(tv_menu.GetId());
+					string id = treeview__::GetItemData(tv_menu.GetId(), sitem);
+					dw_list.SetItemString(1, "ModulePID", id);
+				}
+				else if(comdid == "addparam")
+					OnAddRow(dw_param);
+				else if(comdid == "delparam")
+					OnDelRow(dw_param);
+				else if(comdid == "addrole")
+					OnAddRole();
+				else if(comdid == "delrole")
+					OnDelRow(dw_role);
+				else if(comdid == "Del")
+					OnDel();
+				else if(comdid == "Save")
+					OnSave();
+
+				xutil__::RestoreCursor(hCursor);
+				return 0;
+			}
+
+			int OnTreeMoveNode(ref TNotifyEvent evt,int p)	
+			{
+				ref TVNNMHDR nmtv = evt.pnmh;
+				int xfrom = nmtv.FromItem;
+				int xto = nmtv.ToItem;
+				
+				int ret = win__::MessageBox(this.GetHWND(), "确定移动节点!","提示:",1);
+				//trace(ret);
+				if(ret == 2)
+				{
+					treeview__::DeleteItem(tv_menu.GetId(), xto);
+					return -1;
+				}
+				
+				string fid = treeview__::GetItemData(tv_menu.GetId(), xfrom);
+				int xpto = treeview__::GetParentItem(tv_menu.GetId(), xto);
+				string tid = treeview__::GetItemData(tv_menu.GetId(), xpto);
+				
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());		
+				arg.AddArg("from", fid);
+				arg.AddArg("to", tid);
+				trace(arg.GetString());
+				//if(url::get(m_iface+"/pref/tree/move",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/tree/move",arg.GetString(),x)!=1)
+				{
+					trace("error:"+x.GetXml());
+					alert("移动节点出错!");
+					treeview__::DeleteItem(tv_menu.GetId(), xto);
+					return 0;
+				}
+				treeview__::DeleteItem(tv_menu.GetId(), xfrom);
+				return 1;
+			}
+
+			int OnTreeExpanding(ref TNotifyEvent evt,int p)	
+			{
+				ref NMTREEVIEW nmtv = evt.pnmh;
+				int sitem = nmtv.itemNew.hItem;
+					
+				string id = treeview__::GetItemData(tv_menu.GetId(), sitem);
+				int hCursor = xutil__::SetCursorWait();
+				createTree(id, sitem);
+				xutil__::RestoreCursor(hCursor);
+				return 1;
+			}
+			
+			int OnTreeSelChanged(ref TNotifyEvent evt,int p)
+			{
+				ref NMTREEVIEW nmtv = evt.pnmh;
+				int hItem = nmtv.itemNew.hItem;
+				
+				int hCursor = xutil__::SetCursorWait();
+				string id = treeview__::GetItemData(tv_menu.GetId(), hItem);
+				//trace(id);
+				m_status = "update.modify";
+				
+				OnNew();
+				
+				int xItem = treeview__::GetRootItem(tv_menu.GetId());
+				if(hItem == xItem)
+				{
+					string label = treeview__::GetItemLabel(tv_menu.GetId(), xItem);
+					dw_list.SetItemString(1, "ModuleName", label);
+					dw_list.ResetUpdateStatus();
+					return 0;
+				}
+				
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("id",id);
+				//if(xaserver__::ExecXQuery(GetServerUrl(),"[leftMenu.xq]",arg.GetString(),x)!=1)
+				//if(url::get(m_iface+"/pref/maint",arg.GetString(),x)!=1)
+				if(url::get("/sale/data/Role.config/pref/maint",arg.GetString(),x)!=1)
+				{
+					trace(x.GetXml());
+					return -1;	
+				}
+				dw_list.Retrieve(x);
+				dw_list.ResetUpdateStatus();
+				dw_list.Redraw();
+				if(x.GetXmlDoc().selectSingleNode("item/ModuelParam/args"))
+				{
+					dw_param.Retrieve(x.GetXmlDoc().selectSingleNode("item/ModuelParam/args"));
+					dw_param.ResetUpdateStatus();
+					dw_param.Redraw();
+				}
+				if(x.GetXmlDoc().selectSingleNode("item/roles"))
+				{
+					dw_role.Retrieve(x.GetXmlDoc().selectSingleNode("item/roles"));
+					dw_role.ResetUpdateStatus();
+					dw_role.SetReadOnly(true);
+					dw_role.Redraw();
+				}
+				//msxml::IXMLDOMElement e = x.GetXmlDoc().documentElement;
+				
+				xutil__::RestoreCursor(hCursor);
+				return 1;
+			}
+			
+			int OnSetFocus(ref TEvent evt,int p)
+			{
+				SetAgent();
+				return 1;
+			}
+
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+			
+			int OnItemChanged(ref TNotifyEvent evt,int p)
+			{
+				ref DWNMHDR  hdr = evt.pnmh;
+				string colname=hdr.colname;
+				if(colname == "type")
+				{
+					string value = hdr.data;
+					//trace(colname, value);
+					if(value == "0")
+						dw_list.SetItemString(1, "ModuelImage", "17");
+					else
+						dw_list.SetItemString(1, "ModuelImage", "16");
+				}
+				return 1;		
+			}
+					
+			int OnDBClick(ref TNotifyEvent evt,int p)
+			{
+				ref DWNMHDR  hdr = evt.pnmh;
+				string colname=hdr.colname;
+				if(colname == "type")
+				{
+					string value = hdr.data;
+					//trace(colname, value);
+					if(value == "0")
+						dw_list.SetItemString(1, "ModuelImage", "17");
+					else
+						dw_list.SetItemString(1, "ModuelImage", "16");
+				}
+				return 1;
+			}
+
+			int OnItemError(ref TNotifyEvent evt,int p)
+			{
+				ref DWNMHDR  hdr = evt.pnmh;
+				string colname=hdr.colname;
+				trace(colname);
+				int e = hdr.idFrom;
+				trace(e);
+
+				return 1;
+			}
+
+			int onload()
+			{
+				tv_menu = new treeview__;
+				tv_menu.setNativePointer(GetControl("tv_folder"));
+				int hItem = treeview__::InsertChildItem(tv_menu.GetId(), 0, "模块", "", 17);
+				createTree("null", hItem);
+				treeview__::ExpandItemEx(tv_menu.GetId(), hItem);
+				
+				dw_list = new xdwtable__;
+				dw_list.setNativePointer(GetControl("dw_base"));				
+				//dw_list.SetDataObject(GetServerUrl(), "dev:sheet[leftFrame.tpl/module]");
+				//dw_list.openUrl(m_vface+"/template/role/config/module");
+				dw_list.openUrl("/sale/view/Role.config/template/role/config/module");
+				dw_list.SetColHeaderHeight(0);
+				dw_list.SetRowSelectorWidth(0);
+				dw_list.SetScrollState(false);
+				
+				dw_param = new xdwgrid__;
+				dw_param.setNativePointer(GetControl("dw_param"));			
+				//dw_param.SetDataObject(GetServerUrl(), "dev:sheet[leftFrame.tpl/param]");
+				//dw_param.openUrl(m_vface+"/template/role/config/param");
+				dw_param.openUrl("/sale/view/Role.config/template/role/config/param");
+				
+				dw_role = new xdwgrid__;
+				dw_role.setNativePointer(GetControl("dw_role"));	
+				//dw_role.SetDataObject(GetServerUrl(), "dev:sheet[leftFrame.tpl/role]");
+				//dw_role.openUrl(m_vface+"/template/role/config/role");
+				dw_role.openUrl("/sale/view/Role.config/template/role/config/role");
+				dw_role.SetReadOnly(false);
+
+				AttachEvent("tv_folder", "TVN_ITEMEXPANDING",OnTreeExpanding);
+				AttachEvent("tv_folder", "TVN_SELCHANGED",OnTreeSelChanged);	
+				AttachEvent("tv_folder", "TVN_ENDDRAG",OnTreeMoveNode);	
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				AttachEvent("WM_SETFOCUS",OnSetFocus);
+				AttachEvent("dw_base","DWV_ITEMCHANGED",OnItemChanged);
+				AttachEvent("dw_base","DWV_DOUBLECLICKED",OnDBClick);
+				AttachEvent("dw_base","DWV_ITEMERROR",OnItemError);
+
+				SetAgent();
+
+				return 1;
+			}
+		]
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/SysLoginRecord.cpp b/jrj/project/business/SystemSettings/SysLoginRecord.cpp
new file mode 100644
index 0000000..64f2570
--- /dev/null
+++ b/jrj/project/business/SystemSettings/SysLoginRecord.cpp
@@ -0,0 +1,89 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+use "base.view.vd"
+
+unit vbusiness
+[
+	class SysLoginRecord : public frame
+	{
+		xdwgrid  dw_logrecord;		
+		xdwtable dw_arg;
+		int OnRetrieve()
+			{
+				xcontrol xc_text =GetControl("QueryTxt");				
+				xcontrol xc_cbx = GetControl("cbx_type");				
+				string ls_querytxt;
+				string ls_querytype;
+				ls_querytxt =   xc_text.GetText();
+				ls_querytype = xc_cbx.GetText();
+				xml x = new xml;
+				x.setNativePointer(x.CreateInstance());
+				xaserverarg arg = new xaserverarg;
+				arg.setNativePointer(arg.CreateInstance());
+				arg.AddArg("sType",ls_querytype);
+				arg.AddArg("QueryText",ls_querytxt);
+				arg.AddArg("QueryArg",GetQueryArg());
+				//alert(ls_querytxt);
+				if (url::get("/sale/data/Total3/total/GDNTotal/Item/GetSysLoginLog",arg.GetString(),x) == 1)
+				{
+					//trace(x.GetXml());
+					dw_logrecord.Retrieve(x);
+					dw_logrecord.Redraw();
+					dw_logrecord.SetSelectionMode(1);
+				}
+				else
+					alert("查不到");				
+				return 1;
+			}
+			//命令发布函数
+			int OnCmdDispatch(string comdid)
+			{
+				int hCursor = xutil::SetCursorWait();
+				if(comdid=="ContSearch")
+					OnRetrieve();
+				return 0;
+			}
+			
+			//命令处理事件
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+				
+				string GetQueryArg()
+		{
+			dw_arg.AcceptText();
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			dw_arg.DwUpdateAllTo(x.GetXmlDoc());
+			return x.GetXml();
+		}	
+						
+						
+			int OnAttachEvent()
+			{
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				return 1;
+			}
+		
+		int onload()
+		{
+			dw_logrecord = GetControl("dw_logrecord");
+			dw_logrecord.openUrl("/sale/view/SysUser/template/SysLoginRecord");
+			dw_arg = GetControl("dw_arg");
+			dw_arg.openUrl("/sale/view/AR/template/queryarg");
+			dw_arg.SetColHeaderHeight(0);
+			dw_arg.SetRowSelectorWidth(0);
+			dw_arg.SetHScrollState(false);
+			dw_arg.SetVScrollState(false);
+			return 0;
+		}
+		int onloaded()
+		{
+				//alert("xxx");
+				OnAttachEvent();
+				//OnRetrieve();
+				return 1;
+			}			
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/SysUser.cpp b/jrj/project/business/SystemSettings/SysUser.cpp
new file mode 100644
index 0000000..51322ba
--- /dev/null
+++ b/jrj/project/business/SystemSettings/SysUser.cpp
@@ -0,0 +1,330 @@
+use "win.vl"
+use "treeview.vm"
+use "dev:vm[xdwgrid.vm]"
+use "dev:vm[xdwtable.vm]"
+use "pref.vl"
+use "dev:vm[xml.vm]"
+use "dev:vm[xaserverarg.vm]"
+use "dev:vm[xaserver.vm]"
+use "dev:vm[xutil.vm]"
+use "dev:code[pa.tpp]"
+use "list.vl"
+
+unit vbusiness.xpage
+[
+	SysUser is extend list;
+	about SysUser
+	[
+		
+		method:
+		[
+			treeview__ tv_usergroup;
+			xdwgrid__ dw_user;
+			xnode__	m_agentNode;
+			string strJobID;			
+			int SetAgent()
+			{
+				string xfNodeAgentArea  = "agentarea";
+				xnode__ anode = new xnode__;
+				anode.setNativePointer(GetAgentNode(xfNodeAgentArea));
+				var xframeElement =  GetElement();
+				var agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					SetAgentNodeContent (anode,s);
+				}
+				return 1;
+			}
+			
+			//焦点激活处理函数
+			int OnSetFocus(ref TEvent evt,int param)
+			{
+				SetAgent();
+				//重置工具条
+				return 1;
+			}
+				
+			int SetEntityData(param p)
+			{
+				xml__ x=new xml__;	
+				x.setNativePointer(x.CreateInstance());
+				xaserverarg__ arg = new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());
+				string str = this.m_QueryTxt;
+				//trace(ele.xml);
+				//alert(str);
+				arg.AddArg("guid",str);
+				//trace(strJobID);
+				if (xaserver__::ExecXQuery("","[list.SysUser.xq]",arg.GetString(),x) == 1)
+				{
+					dw_user.AcceptText();					
+					dw_user.Retrieve(x);
+					dw_user.Redraw();
+				}
+				return 1;
+			}
+			
+			int OnTreeSelChanged(ref TNotifyEvent evt,int p)
+			{
+				ref NMTREEVIEW nmtv = evt.pnmh;
+				int hItem = nmtv.itemNew.hItem;	
+			
+				int wid = tv_usergroup.GetId();
+				int hitem=treeview__::GetSelectedItem(wid);
+				int rootItem = treeview__::GetRootItem(wid);
+				//if (hItem <=0 || hItem == rootItem) 
+				//	return 0;	
+				msxml::IXMLDOMElement ele = treeview__::GetItemData(wid,hitem);
+				//trace("ok");
+				if (ele)
+				{				
+					xml__ x=new xml__;	
+					x.setNativePointer(x.CreateInstance());
+					xaserverarg__ arg = new xaserverarg__;
+					arg.setNativePointer(arg.CreateInstance());
+					strJobID = ele.selectSingleNode("@JobID").text;
+					//trace(ele.xml);
+					//alert(strJobID);
+					arg.AddArg("guid",strJobID);
+					//trace(strJobID);
+					if (xaserver__::ExecXQuery("","[list.SysUser.xq]",arg.GetString(),x) == 1)
+					{
+						dw_user.AcceptText();					
+						dw_user.Retrieve(x);
+						dw_user.Redraw();
+					}
+				}
+				
+				return 1;
+			}
+
+			int xmImport()
+			{
+				
+				int wid = tv_usergroup.GetId();
+				int hitem=treeview__::GetSelectedItem(wid);
+				if (!hitem)
+				{
+					alert("请选择职位!");
+					return 0;
+				}
+				OpenWindow("dev:xpage[UserImport.vx]",this);						
+				//openUrl("系统用户.vface/xpage/SysUser/UserImport", this);
+				return 1;		
+			}
+			int OnSave()
+			{
+				xml__ x=new xml__;
+				x.setNativePointer(x.CreateInstance());			
+				dw_user.DwUpdateAllToEx(x.GetXmlDoc());
+				xaserverarg__ arg = new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());
+				arg.AddArg("content",x.GetXml());
+				arg.AddArg("dbmap","SysUser.dbmap");
+				if(getUrl("/sale/data/SysUser/SysUser",arg.GetString(),x)!=1)
+				{
+					//trace("error:"+x.GetXml());
+					alert("保存失败");
+				}
+				else{
+					if(x.GetXmlDoc().selectSingleNode("erroe"))
+					{
+						alert("保存出错2! ");
+						return 0;				
+					}
+					//trace(x.GetXml());
+					dw_user.ResetUpdateStatus();
+					win__::MessageBox(GetHWND(),"保存成功!","提示",0);	
+				}
+				
+/*					arg.AddArg("xdata",x.GetXml());
+				//arg.AddArg("jobguid",strJobID);
+				//trace(x.GetXml());
+				//trace(strJobID);				
+				//if (getUrl("/sale/data/SysUser/SysUser",arg.GetString(),x) != 1)
+				//trace(xaserver__::ExecXAction(GetServerUrl(),"[SysUser.xa]",arg.GetString(),x));
+			if (xaserver__::ExecXAction(GetServerUrl(),"[SysUser.xa]",arg.GetString(),x)!=1)				
+				{
+					//trace("error:"+x.GetXml());
+					alert("保存失败");
+				}
+				else{
+					if(x.GetXmlDoc().selectSingleNode("ERROR"))
+					{
+						alert("保存出错2! ");
+						return 0;				
+					}
+					win__::MessageBox(GetHWND(),"保存成功!","提示",0);	
+				}*/
+				return 1;
+			}				
+			int OnAddRow()
+			{
+				int wid = tv_usergroup.GetId();
+				int hitem=treeview__::GetSelectedItem(wid);
+				if(hitem==0)
+				{
+					alert("请先选择职位类型!");
+				}
+				else
+				{
+					int row = dw_user.InsertRow(0);
+					dw_user.SetItemString(row,"Status","Y");				
+				}
+				return 1;
+			}
+			
+			int OnInsertRow()
+			{
+				int wid = tv_usergroup.GetId();
+				int hitem=treeview__::GetSelectedItem(wid);
+				if(hitem==0)
+				{
+					alert("请先选择职位类型!");
+				}
+				else
+				{
+					int crow=dw_user.GetRow();
+					int row=dw_user.InsertRow(crow);
+					dw_user.SetItemString(row,"Status","Y");				
+				}
+				return 1;
+			}
+
+			int OnDeleteRow()
+			{
+				int row=dw_user.GetRow();
+				dw_user.DeleteRow(row);
+				return 1;
+			}
+				
+			int OnJobType()
+			{
+				openUrl("组织架构.vface/worknode/Hr/HrJob");
+				return 1;
+			}
+				
+			int OnClicked(ref TNotifyEvent evt,int p)
+			{	
+				ref DWNMHDR  hdr = evt.pnmh;				
+				int row = hdr.row;
+				int col=hdr.col ;
+				string colname=dw_user.GetColumnName(col);
+				msxml::IXMLDOMElement xrow = dw_user.GetRowElement(row);
+				string BindComputer=xrow.selectSingleNode("BindComputer").text;			
+				xaserverarg__ arg = new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());
+				if(BindComputer  != "" )
+				{	
+					arg.AddArg("BindComputer",BindComputer);					
+				}
+			
+				string comdid;
+				if(colname=="BindComputer")
+				{	
+					openUrl("系统用户.vface/xpage/SysUser/BindComputer/dialog", arg);		
+					comdid = arg.GetArgString("comdid");			
+					if(comdid=="ok")
+					{
+						string strxml = arg.GetArgString("xml");					
+						dw_user.SetItemDisplayString(row,colname,strxml); 
+						dw_user.SetItemString(row,colname,strxml); 					
+						dw_user.Redraw();
+					}
+				}				
+				return 1;
+			}	
+					
+			int OnResetPass()
+			{
+				xaserverarg__ arg = new xaserverarg__;
+				int pt = arg.CreateInstance();
+				arg.setNativePointer(pt);
+					
+				int row = dw_user.GetRow();
+				if(row < 1) return 1;
+				arg.AddArg("user", dw_user.GetItemString(row,"EmployeeNo"));
+				
+				OpenWindow("dev:xpage[ResetUserPassDlg.vx]",pt);
+				return 1;
+			}
+					
+			int Onlog()
+			{
+				openUrl("/sale/view/SysUser/xpage/SysUser/SysLoginRecord");
+				return 1;
+			}
+			//命令发布函数
+			int OnCmdDispatch(string comdid)
+			{
+				if (comdid =="Save")  OnSave();
+				else if (comdid =="AddRow") OnAddRow();
+				else if (comdid =="InsertRow") OnInsertRow();
+				else if (comdid =="DeleteRow") OnDeleteRow();
+				else if (comdid =="JobType") OnJobType();
+				else if (comdid=="xmImport") xmImport();
+				else if (comdid == "xmLog") Onlog();
+				else if(comdid=="_cb_grid_search") return GridSearchEx();
+				else if(comdid=="xmResetPass") return OnResetPass();
+				else if(comdid=="xmResetPassEx") OpenWindow("dev:xpage[SysForcePassward.vx]");
+				return 0;			
+			}
+			
+			
+			//命令处理事件
+			int OnXCommand(ref TXCommandEvent evt,int param)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+
+			int OnAttachEvent()
+			{
+				//绑定工具条点击事件
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				//获取焦点事件,用于重置工具条
+				AttachEvent("WM_SETFOCUS",OnSetFocus);
+				//获得树的选择事件
+				AttachEvent("tv_usergroup", "TVN_SELCHANGED",OnTreeSelChanged);
+				//AttachEvent("dw_user","DWV_ITEMBEINGEDIT",OnClicked);					
+				AttachEvent("dw_user","DWV_DOUBLECLICKED",OnClicked);					
+			}
+			
+			int OnInitial()
+			{
+				SetAgent();
+
+				OnAttachEvent();
+				return 1;
+			}
+			
+			int onload()
+			{
+				m_agentNode = new xnode__;
+				
+				tv_usergroup =  new treeview__;
+				tv_usergroup.setNativePointer(this.GetControl("tv_usergroup"));			
+				dw_user =  new xdwgrid__;
+				dw_user.setNativePointer(this.GetControl("dw_user"));				
+				dw_user.SetDataObject(GetServerUrl(),"dev:sheet[SysUser.tpl/UserList]");	
+				dw_user.SetReadOnly(true);		
+				dw_user.SetSelectionMode(1);
+
+				OnInitial();
+				int wid = tv_usergroup.GetId();
+				int root = treeview__::GetRootItem(wid);		
+				treeview__::ExpandItem(wid,root);
+
+				xml__ x=new xml__;
+				x.setNativePointer(xml__::CreateInstance());				
+				x.LoadXml("<Config/>");
+				this.m_configDoc = x.GetXmlDoc();
+				rowSearch("系统用户.vface/template/SysUser/list");
+				GridSearchEx();
+				
+				return 1;
+			}
+		]
+		
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/TestRetrieveing.cpp b/jrj/project/business/SystemSettings/TestRetrieveing.cpp
new file mode 100644
index 0000000..65769bf
--- /dev/null
+++ b/jrj/project/business/SystemSettings/TestRetrieveing.cpp
@@ -0,0 +1,52 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class TestRetrieveingWin:  public xframe
+	{
+		//xdwgrid	dw_list;
+
+		xnode	m_agentNode;	//Agent Condition
+
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			return 1;
+		}
+
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if(comdid=="RetrieveFinished")
+			{
+				CloseWindow();
+				return 1;
+			}
+			return 0;
+		}
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+		}
+		
+		int onload()
+		{
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/UserImport.cpp b/jrj/project/business/SystemSettings/UserImport.cpp
new file mode 100644
index 0000000..801196b
--- /dev/null
+++ b/jrj/project/business/SystemSettings/UserImport.cpp
@@ -0,0 +1,329 @@
+use "win.vl"
+use "treeview.vm"
+use "dev:vm[xdwgrid.vm]"
+use "dev:vm[xdwtable.vm]"
+use "pref.vl"
+use "dev:vm[xml.vm]"
+use "dev:vm[xaserverarg.vm]"
+use "dev:vm[xaserver.vm]"
+use "dev:vm[xutil.vm]"
+use "dev:code[SysUser.vx]"
+use "frame.vl"
+use "file.vl"
+unit vbusiness.xpage
+[
+	UserImport is extend frame;
+	about UserImport
+	[
+		field:
+		[
+			SysUser lw_obj;
+			xdwgrid__	dw_list;
+			treeview__		tv_org;
+			xnode__	m_agentNode;	//Agent Condition
+			string	m_agentCond;	//Agent Node
+			string	m_sTxt;
+			string		is_orgid;			
+		]
+		
+		method:
+		[
+			int SetAgent()
+			{
+				string xfNodeAgentArea  = "agentarea";
+				xnode__ anode = new xnode__;
+				anode.setNativePointer(GetAgentNode(xfNodeAgentArea));
+				var xframeElement =  GetElement();
+				var agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					SetAgentNodeContent (anode,s);
+				}
+				return 1;
+			}
+
+			//焦点激活处理函数
+			int OnSetFocus(ref TEvent evt,int param)
+			{
+				SetAgent();
+				//重置工具条
+				return 1;
+			}
+
+			int  OnRetrieve(string ls_orgid)
+			{
+
+				xml__ x=new xml__;
+				x.setNativePointer(x.CreateInstance());
+				xaserverarg__ arg = new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());
+				arg.AddArg("OrgID",ls_orgid);
+				//trace(ls_orgid);
+				//if (xaserver__::ExecXQuery(GetServerUrl(),"[MSSqlHrEmployee.xq]",arg.GetString(),x) == 1)
+				if (url::get("SysUser.config/UserSelect.xq",arg.GetString(),x) == 1)
+				{
+					dw_list.Retrieve(x);
+					dw_list.Redraw();
+				}
+				//trace(x.GetXml());
+				return 1;
+			}
+			
+			int OnOK()
+			{
+				if (GetParam())
+				{
+					lw_obj = new SysUser;
+					lw_obj.setNativePointer(GetParam());
+					lw_obj = GetParam();
+				}
+				else
+					return 0;
+
+				int row = dw_list.GetNextSelectRow(1);
+				trace(row);
+				if (row<1)
+				{
+					alert("请选择人员!");
+					return 1;
+				}	
+				
+				string sPositionID,sPositionName;
+				string sOrgID,sOrgName;
+				string sJobID,sJobName;
+				int wid = lw_obj.tv_usergroup.GetId();
+				int hitem=treeview__::GetSelectedItem(wid);
+				msxml::IXMLDOMElement ele = treeview__::GetItemData(wid,hitem);
+
+				
+				while (row>0)
+				{	
+					trace(row);
+					msxml::IXMLDOMElement e = dw_list.GetRowElement(row);
+					trace(e.xml);				
+					string sEmployeeNo = e.selectSingleNode("EmployeeNo").text+"";
+					string sOldEmpNo = e.selectSingleNode("OldEmpNo").text+"";				
+					string sPersonID = e.selectSingleNode("PersonID").text+"";
+					string sPersonName = e.selectSingleNode("Name").text+"";
+					string sPassWord = xutil__::MD5(sOldEmpNo);
+				
+					/*
+					xml__ xx = new xml__;
+					xx.setNativePointer(xml__ ::CreateInstance());
+					xaserverarg__ arg=new xaserverarg__;
+					arg.setNativePointer(arg.CreateInstance());	
+					arg.AddArg("userno",sOldEmpNo);
+					arg.AddArg("password",sPassWord);
+					if(url::get("/sale/data/SysUser/GetOldPassWord",arg.GetString(),xx)==1)
+					{
+						if(xx.GetXml()!="")
+						{
+							msxml::IXMLDOMElement ex = xx.GetXmlDoc().documentElement;
+							sPassWord = ""+ex.text;
+						}
+					}*/
+
+					int nRow = lw_obj.dw_user.InsertRow(0);
+					lw_obj.dw_user.SetItemString(nRow,"EmployeeNo",sEmployeeNo);
+					lw_obj.dw_user.SetItemString(nRow,"UserName",sOldEmpNo);
+					lw_obj.dw_user.SetItemString(nRow,"PassWord",sPassWord);						
+					lw_obj.dw_user.SetItemString(nRow,"PersonID",sPersonID);
+					lw_obj.dw_user.SetItemDisplayString(nRow,"PersonID",sPersonName);
+					lw_obj.dw_user.SetItemString(nRow,"Status","Y");
+					lw_obj.dw_user.SetItemDisplayString(nRow,"Status","有效");
+					lw_obj.dw_user.SetItemString(nRow,"OldEmpNo",sOldEmpNo);						
+				/*
+					lw_obj.dw_user.SetItemString(nRow,"PositionID",sPositionID);
+					lw_obj.dw_user.SetItemDisplayString(nRow,"PositionID",sPositionName);
+					lw_obj.dw_user.SetItemString(nRow,"OrgID",sOrgID);
+					lw_obj.dw_user.SetItemDisplayString(nRow,"OrgID",sOrgName);
+					lw_obj.dw_user.SetItemString(nRow,"JobID",sJobID);
+					lw_obj.dw_user.SetItemDisplayString(nRow,"JobID",sJobName);
+				
+					lw_obj.dw_user.SetItemString(nRow,"Status","Y");
+					lw_obj.dw_user.SetItemDisplayString(nRow,"Status","有效");
+					string sdate = TApp::GetCurDate()+"";
+					lw_obj.dw_user.SetItemString(nRow,"StartDate",sdate+"");
+					lw_obj.dw_user.SetItemString(nRow,"EndDate","2050-12-31");*/
+				
+					row = dw_list.GetNextSelectRow(row + 1);
+					trace(row);
+				}
+				CloseWindow();
+				return 1;
+			}
+			int OnSubTree(string id,int parentitem)
+			{
+				int wid = tv_org.GetId();
+				if (treeview__::GetChildItem(wid,parentitem) >0) return 1;
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("sguid",id);
+				if(url::post("/sale/data/OrganizationStruct/tree.child.OrgChart",arg.GetString(),x)!=1)
+				{
+					trace(x.GetXml());
+					return -1;	
+				}
+				//trace(x.GetXml());
+				var list=x.GetXmlDoc().selectNodes("//item");
+				int i=0,s=list.length;
+				msxml::IXMLDOMElement xitem;
+				string sName; 
+				string sguid; 
+				string stype; 
+				if (s >0)
+				{
+					for (i=0;i<s;i++)
+					{
+						xitem= list.item(i);
+						sName = xitem.SelectSingleNode("name").text;
+						sguid = xitem.SelectSingleNode("id").text;
+						stype = xitem.SelectSingleNode("typ").text;
+						//int curItem = tv_org.InsertChildItemEx(wid,parentitem,sName,xitem,15,4);
+						int curItem=0;
+						if (stype =="Org")
+						{
+							curItem=tv_org.InsertChildItemEx(wid,parentitem,sName,xitem,15,4);
+							tv_org.SetItemChild1(wid,curItem,1);
+						}
+						else
+							{
+							curItem=tv_org.InsertChildItemEx(wid,parentitem,sName,xitem,21,21);
+						}
+						//OnSubTree(sguid,curItem);
+					}
+				}
+				return 1;
+			}
+				
+			int OnCreateTree(string id,int parentitem)
+			{
+				//while (tv_1.GetRootItem()>0)
+				//	tv_1.DeleteItem(tv_1.GetRootItem());				
+				int wid = tv_org.GetId();
+				xml__ x = new xml__;
+				x.setNativePointer(xml__ ::CreateInstance());
+				x.LoadXml("<item><id>"+id+"</id><no/><name>凤凰集团</name><typ>Org</typ></item>");
+				//msxml::IXMLDOMDocument root = x.GetXmlDoc();
+				//msxml::IXMLDOMElement RDoc = x.GetXmlDoc().documentElement;
+				//msxml::IXMLDOMElement ele = RDoc.SelectSingleNode("//Org");
+				msxml::IXMLDOMElement ele = x.GetXmlDoc().SelectSingleNode("//item");
+				int hItem = treeview__::InsertChildItemEx(wid,0,"凤凰集团",ele,15,4);
+				treeview__::SetItemChild1(wid,hItem,1);
+				return 1;
+				
+				/*xaserverarg__ arg=new xaserverarg__;
+				arg.setNativePointer(arg.CreateInstance());	
+				arg.AddArg("sguid",id);
+				if(url::post("/sale/data/OrganizationStruct/tree.child.OrgChart",arg.GetString(),x)!=1)
+				{
+					trace(x.GetXml());
+					return -1;	
+				}
+				//trace(x.GetXml());
+				var list=x.GetXmlDoc().selectNodes("//item");
+				int i=0,s=list.length;
+				msxml::IXMLDOMElement xitem;
+				string sName; 
+				string sguid;
+				if (s >0)
+				{
+					for (i=0;i<s;i++)
+					{
+						xitem= list.item(i);
+						sName = xitem.SelectSingleNode("@name").text;
+						sguid = xitem.SelectSingleNode("@id").text;
+						int curItem = tv_org.InsertChildItemEx(wid,hItem,sName,xitem,15,4);
+						tv_org.SetItemChild1(wid,curItem,1);
+						//OnSubTree(sguid,curItem);
+					}
+				}
+				return 1;*/
+			}
+				
+			int OnTreeExpanding(ref TNotifyEvent evt,int p)	
+			{
+				ref NMTREEVIEW nmtv = evt.pnmh;
+				int sitem = nmtv.itemNew.hItem;
+					
+				int hCursor = xutil__::SetCursorWait();
+				//string id = treeview__::GetItemData(tv_org.GetId(), sitem);
+				msxml::IXMLDOMElement ele = treeview__::GetItemData(tv_org.GetId(),sitem);
+				string id = ele.SelectSingleNode("id").text;
+				OnSubTree(id, sitem);
+				xutil__::RestoreCursor(hCursor);
+				return 1;
+			}
+			
+			int OnTreeSelChanged(ref TXCommandEvent evt,int p)
+			{
+				int wid = tv_org.GetId();
+				int hitem=treeview__::GetSelectedItem(wid);
+				msxml::IXMLDOMElement ele = treeview__::GetItemData(wid,hitem);
+				if (ele)
+				{
+					string ls_orgid = ele.SelectSingleNode("id").text;
+					is_orgid = ls_orgid;
+					OnRetrieve(ls_orgid);
+				}
+				return 1;
+			}			
+			//命令发布函数
+			int OnCmdDispatch(string comdid)
+			{
+				if (comdid=="cb_import")
+					OnOK();
+				else if (comdid=="cb_close")
+					CloseWindow();
+				return 0;
+			}
+			
+			//命令处理事件
+			int OnXCommand(ref TXCommandEvent evt,int p)
+			{
+				return OnCmdDispatch(evt.pStrID);
+			}
+			
+			int OnAttachEvent()
+			{
+				//绑定工具条点击事件
+				AttachEvent("WM_XCOMMAND",OnXCommand);
+				//获取焦点事件,用于重置工具条
+				AttachEvent("WM_SETFOCUS",OnSetFocus);
+				//获得树的选择事件
+				AttachEvent("tv_org", "TVN_SELCHANGED",OnTreeSelChanged);
+				AttachEvent("tv_org", "TVN_ITEMEXPANDING",OnTreeExpanding);				
+			}
+			
+			int OnInitial()
+			{
+				SetAgent();
+				OnAttachEvent();		
+				return 1;
+			}
+			
+			int onload()
+			{			
+				tv_org = new treeview__ ;
+				tv_org.setNativePointer(this.GetControl("tv_org"));
+				dw_list =  new xdwgrid__;
+				dw_list.setNativePointer(this.GetControl("dw_list"));						
+				dw_list.openUrl("系统用户.vface/template/SysUser/EmpSelect");		
+				dw_list.SetSelectionMode(3); //3
+				dw_list.SetReadOnly(true);
+
+				OnInitial();
+				OnCreateTree("00000000-0000-0000-0000-000000000000", 0);
+				int wid = tv_org.GetId();
+				int root = treeview__::GetRootItem(wid);		
+				treeview__::ExpandItem(wid,root);				
+				OnRetrieve("00000000-0000-0000-0000-000000000000");
+				return 1;
+			}
+		]
+		
+	]
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/UserPassDlg.cpp b/jrj/project/business/SystemSettings/UserPassDlg.cpp
new file mode 100644
index 0000000..92aeffc
--- /dev/null
+++ b/jrj/project/business/SystemSettings/UserPassDlg.cpp
@@ -0,0 +1,131 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class UserPassDlg :  public xframe
+	{
+		//xdwgrid	dw_list;
+
+		xnode	m_agentNode;	//Agent Condition
+
+		static string MD5(string) native from "XUtil.dll" alias "?MD5@IXFUtil@XFrame@Hxsoft@@SAPA_WPA_W@Z";
+		int SetAgent()
+		{
+			string xfNodeAgentArea  = "agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			if(m_agentNode)
+			{
+				SetAgentNodeContent (anode,m_agentNode);
+			}
+			else
+			{
+				msxml::IXMLDOMElement xframeElement =  GetElement();
+				msxml::IXMLDOMElement agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+			}
+			return 1;
+		}
+
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			SetAgent();
+			return 1;
+		}
+
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if(comdid=="xmCancel")
+			{
+				CloseWindow();
+				return 1;
+			}
+			else if(comdid=="xmOk")
+			{
+				if(GetControl("old_pass").GetText()=="")
+				{
+					alert("请输入旧口令!");
+					win32::SetFocus(GetControl("old_pass").GetId());
+					return 1;
+				}
+				
+				string ostr = GetControl("old_pass").GetText();
+				string str1 = GetControl("new_pass").GetText();
+				string str2 = GetControl("new_pass1").GetText();
+				if(str1 != str2)
+				{
+					alert("两遍新口令不一致!");
+					win32::SetFocus(GetControl("new_pass1").GetId());
+					return 1;
+				}
+				
+				string oldpass = MD5(ostr);
+				string newpass = MD5(str1);
+				
+				xml x=new xml;
+				x.setNativePointer(x.CreateInstance());
+				xaserverarg arg = new xaserverarg;
+				arg.setNativePointer(arg.CreateInstance());
+				arg.AddArg("old_password",oldpass);
+				arg.AddArg("new_password",newpass);
+				
+				if(getUrl("/sale/data/SysUser/update/password",arg.GetString(),x)!=1)
+				{
+					alert("修改失败");
+				}
+				else{
+					if(x.GetXmlDoc().selectSingleNode("error"))
+					{
+						alert(x.GetXmlDoc().selectSingleNode("error").text);
+						return 1;				
+					}
+					win32::MessageBox(GetHWND(),"修改口令成功!","提示",0);	
+					CloseWindow();
+				}
+				return 1;
+			}
+			return 0;
+		}
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+		}
+		
+		int onload()
+		{
+
+			//const int EM_SETPASSWORDCHAR =0x00CC;
+			//win32::SendMessage(GetControl("old_pass").GetId(),EM_SETPASSWORDCHAR,42,0);
+			//win32::SendMessage(GetControl("new_pass").GetId(),EM_SETPASSWORDCHAR,42,0);
+			//win32::SendMessage(GetControl("new_pass1").GetId(),EM_SETPASSWORDCHAR,42,0);
+			
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			SetAgent();			
+			
+			return 1;
+		}		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/level.Customer.v3.cpp b/jrj/project/business/SystemSettings/level.Customer.v3.cpp
new file mode 100644
index 0000000..a3615e3
--- /dev/null
+++ b/jrj/project/business/SystemSettings/level.Customer.v3.cpp
@@ -0,0 +1,359 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+class levelCustomerv3 : public listwin
+{
+	xdwgrid dw_goods;
+	xtreeview tv_1;
+	xcombobox ddlb_1;
+	int	changeddlb;
+	
+	string m_sType; //type
+	string m_sTypeTxt; //选中树的data
+//	string m_searchtxt;
+	int PIndex;
+	xnode	m_agentNode;	//Agent Condition
+	string	m_agentCond;	//Agent Node
+
+
+	int OnPreRetrieve()
+	{
+		xml x = new xml;
+		x.setNativePointer(xml ::CreateInstance());
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());	
+		arg.AddArg("pageindex", PIndex.toString()); //第几页
+		arg.AddArg("pagenumber", m_pageNumber.toString()); //每页数量
+		arg.AddArg("QueryTxt",m_QueryTxt );
+		arg.AddArg("sType", m_sType);//没有参数
+		arg.AddArg("sTypeTxt", m_sTypeTxt);//没有参数		
+		
+		if(getUrl("/sale/data/"+GetEntityName(1)+"/entity/list",arg.GetString(),x)!=1)
+		{
+			alert("出现错误请联系管理员!");
+			return 0;
+		}else	
+		{
+			msxml::IXMLDOMElement e=x.GetXmlDoc().documentElement;
+			if(listwin::dw_pages.ptr_native_ && e.selectSingleNode("@TotalPage"))
+			{
+				string s=e.selectSingleNode("@TotalPage").text; //总数量				
+				listwin::dw_pages.SetMaxPage(s.toInt());
+			}
+			listwin::dw_list.Retrieve(x);
+			listwin::dw_list.Redraw();
+			listwin::dw_list.SetReadOnly(true);		
+		}
+		return 1;
+	}
+			
+	int OnChangePages(ref TNotifyEvent evt,int p)
+	{
+		ref PAGENMHDR h = evt.pnmh;
+		int c = h.cur;
+		int hCursor = xutil::SetCursorWait();
+		OnRetrieve();
+		PIndex=c;
+		xutil::RestoreCursor(hCursor);
+		return 1;
+	}
+	
+	int ViewUpdate(int pr,string updateItem,xaserverarg  arg)
+	{
+		if(updateItem == "refresh")
+		{
+			xdwpages zz = this.GetControl("pages");
+			int h = zz.SetCurPage(1);	
+			OnRetrieve();
+		}
+		return 1;
+	}
+
+	//树选择
+	int OnTreeSelChanged(ref TNotifyEvent evt,int p)
+	{
+		if (changeddlb != 1)
+		{				
+			int wid = tv_1.GetId();
+			int h=xtreeview::GetSelectedItem(wid);
+			msxml::IXMLDOMElement e = xtreeview::GetItemData(wid,h);
+			
+			string t = e.SelectSingleNode("@type").text;
+			m_sType=t+"";
+			string txt = e.SelectSingleNode("@code").text;
+			if (txt == "")
+				txt = e.SelectSingleNode("@name").text;
+			m_sTypeTxt= txt+"";
+
+			PIndex= 1;	
+			OnRetrieve();
+		}			
+		return 1;
+	}
+			
+	int createSubTree(int wid,int h, msxml::IXMLDOMElement ele)
+	{
+		msxml::IXMLDOMNodeList nlist=ele.SelectNodes("item");
+		int i;
+		int s=nlist.length;
+		if (s>0)
+			for (i=0; i<s; i++)
+			{
+				msxml::IXMLDOMElement e=nlist.item(i);
+				string name=e.SelectSingleNode("@name").text;
+				int hw=xtreeview::InsertChildItem(wid,h,name,trust(e as int),15);
+				createSubTree(wid,hw, e);
+			}		
+		return 1;
+	}
+
+	int OnCreateTree(string sType)
+	{
+		int wid = tv_1.GetId();
+		while (xtreeview::GetRootItem(wid)>0)
+			xtreeview::DeleteItem(wid,xtreeview::GetRootItem(wid));
+		
+		xml x = new xml;
+		x.setNativePointer(x.CreateInstance());
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg("sType",sType);
+		if(getUrl("/sale/data/"+GetEntityName(1)+"/pref/list/tree",arg.GetString(),x)!=1)
+		{
+			trace(x.GetXmlDoc().text);
+			return -1;
+		}else	
+		{
+			msxml::IXMLDOMNodeList nlist=x.GetXmlDoc().SelectNodes("root/item");
+			int len = nlist.length;
+			if (len >0)
+			{
+				int i;
+				for (i=0;i <len; i++)
+				{
+					msxml::IXMLDOMElement e = nlist.item(i);
+					string name = e.SelectSingleNode("@name").text;
+					int h = xtreeview::InsertChildItem(wid,0,name,trust(e as int),15);
+					createSubTree(wid,h,e);
+					xtreeview::ExpandItem(wid,h);
+				}
+				xtreeview::ExpandItem(wid,0);
+			}
+		}	
+		
+		return 1;
+	}
+			
+	//xcombobox下拉
+	int OnSelectDdlb(ref TNotifyEvent evt,int p)
+	{
+		changeddlb=1;
+		int wid = ddlb_1.GetId();
+		int CB_GETCURSEL  = 0x0147;
+		int nIndex = win32::SendMessage(wid,CB_GETCURSEL,0,0);
+		msxml::IXMLDOMElement e = ddlb_1.GetElement();
+		msxml::IXMLDOMElement e2 = e.selectSingleNode("item["+(nIndex+1).toString()+"]");
+		string text=e2.selectSingleNode("@element").text;
+		OnCreateTree(text);
+		changeddlb=0;
+		return 1;
+	}
+
+	int OnDeleteRow()
+	{
+		int row = listwin::dw_list.GetNextSelectRow(1);
+		if (row < 1){
+			row = listwin::dw_list.GetRow();
+			if (row < 1) {
+				return -1;
+			}
+		}
+			
+		msxml::IXMLDOMElement e = listwin::dw_list.GetRowElement(row);
+		string sguid = e.SelectSingleNode("@guid").text;
+		string sName = e.selectSingleNode("Name").text+"";
+		int  MB_YESNO = 0x00000004;
+		int  IDYES =  6;	
+		if(win32::MessageBox(GetHWND(),"确认要删除客户 "+sName+" 的信息吗?","提示",MB_YESNO)!=IDYES) return 1;
+		xml x = new xml;
+		x.setNativePointer(x.CreateInstance());
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg("guid",sguid);
+		if (url::post("/sale/data/"+GetEntityName(1)+"/entity/delete",arg.GetString(),x) != 1)
+		{
+			string error = x.GetXmlDoc().text;
+			trace(error);
+		}
+		else
+		{
+			listwin::dw_list.DeleteRow(row);
+		}
+		return 1;
+	}
+
+	int OnSelectAllRow()
+	{
+		int rows =  listwin::dw_list.GetRowCount();
+		if(rows < 1) return -1;
+		 listwin::dw_list.SelectRow(1, rows, true);
+		 listwin::dw_list.Redraw();
+		return 1;
+	}
+
+	int OnRClick(ref TNotifyEvent evt,int p)
+	{
+		return 1;
+	}			
+	int OnLogOff()
+	{
+		return 1;
+	}
+	//设置层级弹出窗与保存
+	int OnLevelCustomer()
+	{
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());
+		OpenWindow("dev:xpage[maint.Level.Customer3.vx]", cast(arg as int));
+		
+		xml ux = new xml;
+		ux.setNativePointer(ux.CreateInstance());
+		ux.LoadXml("<Partys/>");
+		msxml::IXMLDOMElement ele = ux.GetXmlDoc().documentElement;
+
+		if(arg.GetArgString("ok")=="true")
+		{
+			xml x = new xml;
+			x.setNativePointer(x.CreateInstance());
+			x.LoadXml(arg.GetArgString("arg"));
+			msxml::IXMLDOMElement uele = x.GetXmlDoc().documentElement; 
+			string ParentPartyID = uele.selectSingleNode("//ParentPartyID").text;
+			string ParentPartyName = "";
+			string GroupPartyID = uele.selectSingleNode("//GroupPartyID").text;
+			string GroupPartyName = "";
+			
+			if( uele.selectSingleNode("//ParentPartyID/@_displaystring"))
+				ParentPartyName = uele.selectSingleNode("//ParentPartyID/@_displaystring").text;
+			if(uele.selectSingleNode("//GroupPartyID/@_displaystring"))
+				GroupPartyName = uele.selectSingleNode("//GroupPartyID/@_displaystring").text;
+			
+			int row =  dw_list.GetNextSelectRow(1);
+			while(row > 0)
+			{
+				dw_list.SetItemString(row,"ParentPartyID",ParentPartyID);
+				dw_list.SetItemDisplayString(row,"ParentPartyID",ParentPartyName);
+				dw_list.SetItemString(row,"GroupPartyID",GroupPartyID);
+				dw_list.SetItemDisplayString(row,"GroupPartyID",GroupPartyName);
+				ele.appendChild(dw_list.GetRowElement(row).cloneNode(-1));
+				row =  dw_list.GetNextSelectRow(row + 1);
+			}
+			dw_list.RedrawEx();
+			arg.AddArg("content",ele.xml);
+			if (getUrl("/sale/data/CustomerV3/level/update",arg.GetString(),x)!=1)
+			{
+				trace(x.GetXmlDoc().text);
+				 alert("设置错误!");
+				return -1;
+			}else
+			{
+				 alert("设置成功!");
+			}
+		}		
+		return 1;
+	}
+	
+	int PreOnCmdDispatch(string comdid)
+	{
+		if(comdid.find("action:LogOff",0)>=0) return OnLogOff();
+		if(comdid.find("action:bill.delete",0)>=0) return OnDeleteRow();
+		//if(comdid=="action:search1") return GridSearch();
+		if(comdid=="action:bill.refresh") 
+		{
+			return OnRetrieve();
+		}
+		if(comdid=="action:level.customer")
+		{
+			return OnLevelCustomer();
+		}
+
+		return 1;
+	}
+
+	int OnRowChangedEx(ref TNotifyEvent evt,int p)
+	{
+		alert("999");
+		ref DWNMHDR  hdr =cast(evt.pnmh as ref DWNMHDR);
+		int row = hdr.row;
+		msxml::IXMLDOMElement ele = listwin::dw_list.GetRowElement(row);
+		string entity = ele.selectSingleNode("CustomerID").text;
+		xml x = new xml;
+		x.setNativePointer(xml::CreateInstance());
+		xaserverarg arg = new xaserverarg;
+		arg.setNativePointer(arg.CreateInstance());
+		arg.AddArg("EntityID",entity);
+		if (getUrl("/sale/data/CustomerV3/entity/customeritem",arg.GetString(),x)!=1)
+		{
+			trace(x.GetXmlDoc().text);
+			return -1;
+		}else
+		{
+			dw_goods.Retrieve(x);
+			dw_goods.Redraw();
+			dw_goods.SetReadOnly(true);
+		}
+		return 1;
+	}
+		
+
+	int PostOnAttachEvent()
+	{
+		//获得树的选择事件
+		AttachEvent("tv_1", "TVN_SELCHANGED",OnTreeSelChanged);
+		AttachEvent("cbx_1","CBN_SELCHANGE",OnSelectDdlb);
+		AttachEvent("pages","PAGE_CLICK",OnChangePages);
+		AttachEvent("dw_list","DWV_RCLICKED",OnRClick);//鼠标右键
+		//AttachEvent("dw_list","DWV_CLICKED",OnClick);//鼠标右键
+		AttachEvent("dw_list","DWV_ROWFOCUSCHANGED",OnRowChangedEx);
+		
+		return 1;
+	}
+			
+	int onload()
+	{
+		PIndex=1;
+		listwin::m_QueryTxt =""; //查询条件
+		m_sType=""; //type
+		m_sTypeTxt=""; //选中树的data
+
+		listwin::onload();
+		
+		tv_1 =  this.GetControl("tv_1");	
+		ddlb_1 =  this.GetControl("cbx_1");
+		
+		changeddlb = 0;
+		OnCreateTree("Source");
+		dw_goods = GetControl("dw_goods");
+		dw_goods.openUrl("/sale/view/CustomerV3/template/customer/customeritem");
+
+		return 1;
+	}
+	
+	int onloaded()
+	{
+		listwin::onloaded();
+		
+		string EntityID;
+		int row =  dw_list.GetRow();
+		if(row<0 || row>dw_list.GetRowCount()) return "";
+		msxml::IXMLDOMElement ele = dw_list.GetRowElement(row);
+		string id = listwin::m_configDoc.selectSingleNode("//entity/EntityID[1]").text;
+		if(ele.selectSingleNode(id))
+			EntityID = ele.selectSingleNode(id).text;
+		
+		return 1;
+	}
+
+};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/maint.Level.Customer3.cpp b/jrj/project/business/SystemSettings/maint.Level.Customer3.cpp
new file mode 100644
index 0000000..3938f6f
--- /dev/null
+++ b/jrj/project/business/SystemSettings/maint.Level.Customer3.cpp
@@ -0,0 +1,72 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+
+unit trade 
+[
+	class MaintLevelCustomerWin :  public xframe
+	{
+		xdwtable dw_arg;
+		xaserverarg  arg;
+
+
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if(comdid=="xmOk")
+			{
+				xml x = new xml;
+				x.setNativePointer(x.CreateInstance());
+				dw_arg.AcceptText();
+				dw_arg.DwUpdateAllTo(x.GetXmlDoc());
+				if(arg)
+				{					
+					arg.AddArg("arg",x.GetXml());
+					arg.AddArg("ok","true");
+				}
+				CloseWindow();
+				
+				return 1;
+			}
+			else if(comdid=="xmCancel")
+			{
+				if(arg)arg.AddArg("ok","false");
+				CloseWindow();
+				return 1;
+			}
+			return 0;
+		}
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+		}
+		
+		int onload()
+		{
+			dw_arg = GetControl("dw_arg");
+			
+			if(GetParam())arg = GetParam();
+			
+			string dw = "/sale/view/CustomerV3/template/customer/level.maint";
+			dw_arg.openUrl(dw);
+		
+			dw_arg.SetColHeaderHeight(0);
+			dw_arg.SetRowSelectorWidth(0);
+			dw_arg.SetHScrollState(false);
+			dw_arg.SetVScrollState(false);
+			
+		
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+	};
+]
\ No newline at end of file
diff --git a/jrj/project/business/SystemSettings/view.assignadjust.cpp b/jrj/project/business/SystemSettings/view.assignadjust.cpp
new file mode 100644
index 0000000..f11d11a
--- /dev/null
+++ b/jrj/project/business/SystemSettings/view.assignadjust.cpp
@@ -0,0 +1,267 @@
+use "xcontrol.vframe.vbusiness.vd"
+use "xbase.vframe.vbusiness.vd"
+use "base.view.vd"
+use "datastore_bind.vd"
+
+
+unit trade 
+[
+	class AssignAdjustWin :  public xframe
+	{
+		xdwgrid	dw_list;
+		xnode	m_agentNode;	//Agent Condition
+		msxml::IXMLDOMElement rptEle;
+		string argStr;
+		string	searchStr;
+		int      hWndRetrieveTip;
+		bool    dataretrieveing;
+	
+		int SetAgent()
+		{
+			string xfNodeAgentArea  = "agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			if(m_agentNode)
+			{
+				SetAgentNodeContent (anode,m_agentNode);
+			}
+			else
+			{
+				msxml::IXMLDOMElement xframeElement =  GetElement();
+				msxml::IXMLDOMElement agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+				if(agent)
+				{
+					string s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+			}
+			return 1;
+		}
+				
+		int OnSave()
+		{
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			dw_list.AcceptText();
+			dw_list.DwUpdateAllToEx(x.GetXmlDoc());
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(xaserverarg::CreateInstance());	
+			
+			xml x0 = ViewObject::MakeXml();
+			x0.LoadXml("<data/>");
+			msxml::IXMLDOMNodeList t = x.GetXmlDoc().selectNodes("data/node()[(@update.new='1') or (@update.modify='1') or (@update.delete='1') ]");
+			msxml::IXMLDOMElement e1= x0.GetXmlDoc().documentElement;
+			
+			string val0 = x.GetXml();
+			for(int i=0; i < t.length; i++)
+			{
+				msxml::IXMLDOMElement e= t.item(i);
+				e1.appendChild(e);
+			}
+			
+			x = ViewObject::RetrieveData(rptEle.getAttribute("update"),"content",x0.GetXml());		
+			string str = x.GetXmlDoc().documentElement.getAttribute("text");
+			if(str == "true")
+			{
+				dw_list.ResetUpdateStatus();
+				alert("保存成功!"); 
+			}else 
+			{
+				alert("保存失败!");
+			}
+			return 1;
+		}
+		
+		//焦点激活处理函数
+		int OnSetFocus(ref TEvent evt,int param)
+		{
+			//重置工具条
+			SetAgent();
+			return 1;
+		}
+			
+			int  OnMultiDeal()
+			{
+				dw_list.AcceptText();
+				int row = dw_list.GetNextSelectRow(1);
+				string SalespersonID = dw_list.GetItemString(row, "SalespersonID");
+				string Sales = dw_list.GetItemDisplayString(row, "SalespersonID");
+				while(row > 0 && row <= dw_list.GetRowCount())
+				{
+						row =  dw_list.GetNextSelectRow(row + 1);
+						dw_list.SetItemString(row, "SalespersonID", SalespersonID);
+						dw_list.SetItemDisplayString(row, "SalespersonID", Sales);
+						
+				}
+				dw_list.Redraw();
+			}
+				
+				
+		int OnSearch()
+		{
+			xaserverarg arg=new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());						
+			arg.AddArg("text", searchStr);
+			OpenWindow("dev:xpage[search.dialog.vx]", cast(arg as int));
+			string str = arg.GetArgString("text");
+			if(str != searchStr)
+			{
+				searchStr = str;
+				dw_list.Filter("*",searchStr);
+				return 1;
+			}
+			return 1;
+		}
+
+		//命令发布函数
+		int OnCmdDispatch(string comdid)
+		{
+			if(comdid=="xmSave")return OnSave();
+			if(comdid=="xmMultiDeal")return OnMultiDeal();
+			if(comdid=="xmSearch") return OnSearch();	
+			 if(comdid=="xmAnalysis")
+			{
+				//hCursor = xutil::SetCursorWait();
+				string str = dw_list.DataAnalysis("");
+				xaserverarg arg=new xaserverarg;
+				arg.setNativePointer(arg.CreateInstance());						
+				arg.AddArg("html", str);
+				int obj = cast(dw_list as int);
+				arg.AddArg("obj",obj.toString());
+				OpenWindow("dev:xpage[data.vanalysis.vx]", cast(arg as int));
+				//xutil::RestoreCursor(hCursor);
+				return 1;
+			 }
+			if(comdid=="xmQuery")
+			{
+				if(rptEle)
+				{
+					string argUrl = rptEle.getAttribute("arg");
+					if(argUrl !="")
+					{
+						xaserverarg ar = new xaserverarg;
+						ar.setNativePointer(ar.CreateInstance());
+						ar.AddArg("argurl",argUrl);
+						if(argStr !="") 
+							ar.AddArg("arg",argStr);
+						OpenWindow("dev:xpage[view.total.arg.vx]",cast(ar as int));
+						string arstr = ar.GetArgString("arg");
+						if(arstr != "" && ar.GetArgString("action")=="ok")
+						{
+							argStr = arstr;
+							OnRetrieve(rptEle.getAttribute("data"),argStr);
+						}
+					}
+					else
+					{
+						argStr="";
+						OnRetrieve(rptEle.getAttribute("data"),argStr);
+					}
+				}
+				return 1;
+			 }
+			return 0;
+		}
+		
+		//命令处理事件
+		int OnXCommand(ref TXCommandEvent evt,int param)
+		{
+			return OnCmdDispatch(evt.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent("WM_XCOMMAND",OnXCommand);
+			//获取焦点事件,用于重置工具条
+			AttachEvent("WM_SETFOCUS",OnSetFocus);
+			
+			AttachEvent("cb_report","CBN_SELCHANGE",OnCombboChanged);
+		}
+		
+		int OnCombboChanged(ref TCommandEvent evt,int lParam)
+		{
+			int h = xcombobox::GetCurSel(evt.hCtrl);
+			if(h > -1) ShowList(h);
+			return 1;
+		}
+			
+		int SwitchReport(msxml::IXMLDOMElement e)
+		{
+			rptEle = e;
+			string dwname = e.getAttribute("template");
+			dw_list.openUrl(dwname);
+			dw_list.Redraw();
+			return 1;
+		}
+
+		int ShowList(int h)
+		{
+			msxml::IXMLDOMElement xframeElement =  GetElement();
+			msxml::IXMLDOMElement e =  xframeElement.selectSingleNode("//xcombobox[@name='cb_report']/item["+(h+1).toString()+"]");
+			if(e)	SwitchReport(e);
+			win32::PostMessage(GetHWND(),0x401,"xmQuery",0);
+			return 1;
+		}
+
+				int ShowRetrieveingTip()
+		{
+			dataretrieveing = true;
+			xwin pwin = OpenWindow("dev:xpage[TestRetrieveing.vx]",0);
+			hWndRetrieveTip =pwin.GetHWND();
+			return 1;
+		}
+		int CloseRetrieveTip()
+		{
+			dataretrieveing = false;
+			win32::SendMessage(hWndRetrieveTip,0x401,"RetrieveFinished",0);
+			hWndRetrieveTip = 0;
+			
+			return 1;
+		}
+		
+		int  OnRetrieve(string dataurl, string argstr)
+		{
+			if(!rptEle) return 0;
+			dw_list.Reset();
+			
+			xml x = new xml;
+			x.setNativePointer(xml::CreateInstance());
+			xaserverarg arg = new xaserverarg;
+			arg.setNativePointer(arg.CreateInstance());	
+			arg.AddArg("arg",argstr);
+			if (url::get(dataurl,arg.GetString(),x)!=1)
+			{
+				
+				trace("错误信息="+x.GetXmlDoc().text);
+				dw_list.Redraw();
+				return -1;
+			}else	
+			{
+				dw_list.Retrieve(x);
+				dw_list.Redraw();
+				dw_list.SetSelectionMode(4);
+				//dw_list.SetReadOnly(true);
+			}
+			return 1;
+		}
+		
+		int onload()
+		{
+			rptEle = 0;
+			dw_list = GetControl("dw_list");
+			OnAttachEvent();	
+			
+			hWndRetrieveTip = 0;
+			dataretrieveing = false;
+			ShowList(0);
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			SetAgent();			
+			
+			return 1;
+		}		
+	};
+]
\ No newline at end of file

--
Gitblit v1.9.3