明源售楼系统技术解析 销售控制(三)
2.5 销售前台管理
2.51 销售控制
房源生成完毕后,系统自动传递至销售模块,此时房间的销售状态为未售状态。在开盘前用户可通过【销售控制】模块,进行保留单位的设置,从而达到辅助销售的目的,如图2.5.1(图1)所示。另,该模块提供换退房查询、更名查询和变更查询功能,用户可更方便的查询各种销售变更信息。
从界面上可以看到我们这里用到的控件有
控件名称 |
说明 |
下拉框(easyui-combobox) |
第一要设置每个控件的id,第二设置大小不设置也有默认,第三(data-options)是数据操作:可以设置控件的一些属性和事件 |
文本框(easyui-textbox) |
|
按钮(easyui-linkbutton) |
|
表格(easyui-datagrid) |
查询功能实现:
第一步:数据库
1、表与表的关系:
表1:SYS_销售变更表(SYS_StatusChangeTable)
列名 |
类型 |
主键/外键 |
说明 |
StatusChangeID |
int - Identity |
主键 |
销售变更ID |
RoomDatumID |
int |
外键 |
房间资料ID |
SellStatusDetailID |
int |
外键 |
销售状态明细ID |
DeleteNot |
bit |
删除否 |
表2:SYS_销售状态表(SYS_SellStatusTable)
列名 |
类型 |
主键/外键 |
说明 |
SellStatusID |
int - Identity |
主键 |
销售状态ID |
SellStatusName |
nchar (100) |
销售状态名称 |
表3:SYS销售状态明细表(SYS_SellStatusDetailID)
列名 |
类别 |
主键/外键 |
说明 |
SellStatusDetailID |
int - Identity |
主键 |
销售状态明细ID |
SellStatusID |
int |
外键 |
销售状态 |
SellStatusTime |
date |
销售状态时间 |
|
SellStatusCause |
nchar (50) |
销售状态原因 |
|
LawfulDay |
date |
有效日期 |
|
SubscribeHandsel |
money |
预订定金 |
|
SubscribeNumber |
nchar (30) |
预订编号 |
|
CurrencyID |
int |
外键 |
币种ID |
Operator |
nchar (30) |
经办人 |
|
ClientDatumID |
int |
外键 |
客户资料ID |
表4:SYS_房间资料表(SYS_RoomDataTable)
列名 |
类别 |
主键/外键 |
说明 |
|
RoomDataID |
int - Identity |
主键 |
房间资料ID |
|
HouseID |
int |
外键 |
楼栋ID |
|
RoomCode |
nchar (50) |
房间代码 |
||
RoomUnit |
nchar (10) |
房间单元 |
||
RoomNumber |
nchar (20) |
房号 |
||
natureNumber |
nchar (20) |
自然层号 |
||
Floor |
nchar (20) |
楼层号 |
||
ColumnNumber |
nchar (20) |
列号 |
||
CoveredArea |
decimal (18, 3) |
建筑面积 |
||
BuilDingExceptArea |
decimal (18, 3) |
套内面积 |
||
AreaShare |
decimal (18, 3) |
分摊面积 |
||
BalconyArea |
decimal (18, 3) |
阳台面积 |
||
RoomFaceDirectionID |
int |
外键 |
朝 向 |
|
LandscapeID |
int |
外键 |
景观ID |
|
HouseTypeID |
int |
外键 |
户型ID |
|
RoomTypeID |
int |
外键 |
房间类型ID |
|
RoomRanking |
nchar (20) |
房间排号 |
||
OnbuildingExceptAreaCountNot |
bit |
按套内面积计算否 |
||
LockNot |
bit |
是否锁定 |
||
CountWayID |
int |
外键 |
计算方式ID |
|
RoomDescribeID |
int |
外键 |
||
SellStatusID |
int |
外键 |
销售状态ID |
|
AffiliatedHousePropertyNot |
bit |
|||
BuildingPropertiesID |
int |
|||
BuildingNot |
bit |
|||
ZhuangTaiWeiZhenFou |
bit |
状态为真否 |
表3:SYS_HouseTable(SYS 楼栋表)
列名 |
类型 |
主键/外键 |
说明 |
HouseID |
int - Identity |
主键 |
楼栋ID |
HouseCode |
nchar (40) |
楼栋代码 |
|
HouseName |
nchar (40) |
楼栋名称 |
|
RoomNumberModelTypeID |
int |
外键 |
房间编号模式类型ID |
ContractHouseName |
nchar (40) |
合同栋号名称 |
|
GiveHouseStandardID |
int |
外键 |
交屋标准ID |
ShouldGiveHouseDate |
date |
应交房日期 |
|
BriefRemarks |
nchar (80) |
简要备注 |
|
NumberOfPlies |
int |
层数 |
|
BuildingPropertyID |
int |
外键 |
建筑性质ID |
SupervisionInstitutionID |
int |
外键 |
监理机构ID |
EstateNumber |
nchar (80) |
楼栋房地产证号 |
|
MassifNumber |
nchar (80) |
楼栋地块编号 |
|
LandArea |
decimal (18, 3) |
楼栋土地面积 |
|
LandSellAgreementNumber |
nchar (80) |
楼栋土地出让合同号 |
|
LandUserBeginDate |
date |
楼栋土地使用开始时间 |
|
LandUserEndDate |
date |
楼栋土地使用结束时间 |
|
HouseLandUse |
nchar (80) |
楼栋土地用途 |
|
HouseAreaTypeID |
int |
外键 |
楼栋面积类型ID |
ProjectSubregionID |
int |
外键 |
项目所属ID |
StructureID |
int |
外键 |
架构ID |
控件使用方法:
1、下拉框(easyui-combobox)
作用:绑定数据
下拉框控件截图:
创建下拉框控件界面代码:
<pre name="code" class="html"> <tr><td>项目名称</td><td><input class="easyui-combobox" id="comXiangMuMC" data-options="onChange:onChangeProject" style="width:150px" /></td><td style="width:20px"></td><td>项目分区名称</td><td><input class="easyui-combobox" id="comXiaoMuFenQuMC" data-options="onChange:onChangeProjectSubregion" style="width:150px"/></td><td style="width:20px"></td><td>楼栋名称</td><td><input class="easyui-combobox" id="comLouDongMC"data-options="onSelect:onChangeHouseID" style="width:150px" /></td></tr>
第一步:数据库
储存过程代码:
</pre><p></p><p>第二步:BLL层</p>代码<p align="left"></p><pre name="code" class="csharp"> #region 销控查询public DataTable SelectProject(){SqlParameter[] SQLCMpas = {new SqlParameter("@type",SqlDbType.Char)};SQLCMpas[0].Value = "SelectProject";DataTable dt = myDALMethod.DAL_SelectDB_Par("PW_MortgageManage", SQLCMpas);return dt;}public DataTable SelectProjectPartition(int ProjectID){SqlParameter[] SQLCMpas = {new SqlParameter("@type",SqlDbType.Char),new SqlParameter("@ProjectID",SqlDbType.Int)};SQLCMpas[0].Value = "SelectProjectPartition";SQLCMpas[1].Value = ProjectID;DataTable dt = myDALMethod.DAL_SelectDB_Par("PW_MortgageManage", SQLCMpas);return dt;}public DataTable SelectHouseOfID(int ProjectSubregionID){SqlParameter[] SQLCMpas = {new SqlParameter("@type",SqlDbType.Char),new SqlParameter("@ProjectSubregionID",SqlDbType.Int)};SQLCMpas[0].Value = "SelectHouseOfID";SQLCMpas[1].Value = ProjectSubregionID;DataTable dt = myDALMethod.DAL_SelectDB_Par("PW_MortgageManage", SQLCMpas);return dt;}#endregion
第三步:控制器
代码
#region 销控管理public ActionResult SelectProject()//查询项目{DataTable dt = myAnJieGuanLi.SelectProject();List<Dictionary<string, object>> ListRetrun = ConvertHelper.DtToList(dt);return Json(ListRetrun, JsonRequestBehavior.AllowGet);}public ActionResult SelectProjectPartition(int ProjectID)//查询项目分区{DataTable dt = myAnJieGuanLi.SelectProjectPartition(ProjectID);List<Dictionary<string, object>> ListRetrun = ConvertHelper.DtToList(dt);return Json(ListRetrun, JsonRequestBehavior.AllowGet);}public ActionResult SelectHouseOfID(int ProjectPartitionID)//查询楼栋{DataTable dt = myAnJieGuanLi.SelectHouseOfID(ProjectPartitionID);List<Dictionary<string, object>> ListRetrun = ConvertHelper.DtToList(dt);return Json(ListRetrun, JsonRequestBehavior.AllowGet);}#endregion
第四步:界面
function SelectProject() {$.getJSON("/XiaoShouHouTai/SelectProject", function (data) {$('#comXiangMuMC').combobox({ data: data, valueField: 'ProjectID', textField: 'ProjectName' });});}function onChangeProject() {$.getJSON("/XiaoShouHouTai/SelectProjectPartition?ProjectID=" + $('#comXiangMuMC').combobox('getValue'), function (data) {$('#comXiaoMuFenQuMC').combobox({ data: data, valueField: 'ProjectSubregionID', textField: 'ProjectSubregionName' });});}function onChangeProjectSubregion() {$.getJSON("/XiaoShouHouTai/SelectHouseOfID?ProjectPartitionID=" + $('#comXiaoMuFenQuMC').combobox('getValue'), function (data) {$('#comLouDongMC').combobox({ data: data, valueField: 'HouseID', textField: 'HouseName' });});}
2、表格(easyui-datagrid)
作用:动态生成房号排序
表格控件截图:
![](/assets/blank.gif)
创建表格控件界面代码:
<table class="easyui-datagrid" id="tbFangJianZiLiao" style="width:648px;height:442px" data-options="singleSelect:true,onClickCell:we,rowStyler:function(index,row) {return 'background:#FFFFFF';}"></table>
第一步:数据库
代码:
if @Type='ConditionSelectRoom'beginSELECT RoomDataID, HouseID, RoomNumber, Floor,ZhuangTaiWeiZhenFouFROM SYS_RoomDataTablewhere SYS_RoomDataTable.HouseID=@HouseID and SYS_RoomDataTable.Floor=@Floororder by RoomNumberendif @Type='ConditionSelect'beginSELECT RoomDescribeID, HouseID, ZhuiDaChengShu = NatureStoreyFinishNumber-NatureStoreyActionNumber+1FROM [SYS_ RoomDescribeTable]where [SYS_ RoomDescribeTable].HouseID=@HouseIDend
第二步:BLL层
代码:
#region 动态生成列public DataTable TiaoJianChaXunFangJian(int LouDongID, int LouCengHao){SqlParameter[] SQLCMDpas ={new SqlParameter("@Type",SqlDbType.Char),new SqlParameter("@HouseID",SqlDbType.Char),new SqlParameter("@Floor",SqlDbType.Char),};SQLCMDpas[0].Value = "ConditionSelectRoom";SQLCMDpas[1].Value = LouDongID;SQLCMDpas[2].Value = LouCengHao;DataTable dt = myDALMethod.DAL_SelectDB_Par("SYS_PublicTool", SQLCMDpas);return dt;}public DataTable TiaoJianChaXunFangJianMiaoShu(int LouDongID){SqlParameter[] SQLCMDpas ={new SqlParameter("@Type",SqlDbType.Char),new SqlParameter("@HouseID",SqlDbType.Char),};SQLCMDpas[0].Value = "ConditionSelect";SQLCMDpas[1].Value = LouDongID;DataTable dt = myDALMethod.DAL_SelectDB_Par("SYS_PublicTool", SQLCMDpas);return dt;}#endregion
第三步:控制器
代码:
#region 动态生成列public ActionResult LouDongBiaoMoXing(int LouDongID, int LouCengHao){DataTable dt2 = new DataTable();//新建DataTable DataTable dt = myAnJieGuanLi.TiaoJianChaXunFangJian(LouDongID, 1);//通过楼栋ID查询有多少房间DataTable MiaoShuDt = myAnJieGuanLi.TiaoJianChaXunFangJianMiaoShu(LouDongID);//查询最大楼层数dt2.Columns.Add("LouChen", typeof(string));//新增一列for (int i = 0; i < dt.Rows.Count; i++)//循环房号数{string DtLie = "F" + i;//拼接字符串dt2.Columns.Add(DtLie, typeof(string));//把拼接的字符串加入新增的那列中}int ZongLouChengShu = Convert.ToInt32(MiaoShuDt.Rows[0]["ZhuiDaChengShu"].ToString());//获取最大楼层for (int i = 0; i < ZongLouChengShu; i++)//循环最大楼层{dt2.Rows.Add();//在新建的DataTable里面新增一行string LouChen = "";//定义一个字符串if (ZongLouChengShu - i > 9){LouChen = (ZongLouChengShu - i).ToString();}else{LouChen = "0" + (ZongLouChengShu - i);}dt2.Rows[i]["LouChen"] = LouChen;//从大到小排列楼层号DataTable dt3 = myAnJieGuanLi.TiaoJianChaXunFangJian(LouDongID, ZongLouChengShu - i);//查询房号for (int j = 0; j < dt.Rows.Count; j++)//循环把房号加入DataTable里面{string A = "F" + j;//再次定义房号数string F1 = dt3.Rows[j]["RoomNumber"].ToString().Trim();//获取房号DataTable bt = myXiaoShouKongZhi.Select_SellStatusRoom(Convert.ToInt32(dt3.Rows[j]["RoomDataID"]));//通过房间ID查询销售状态int BaoLiuID = Convert.ToInt32(bt.Rows[0]["SellStatusDetailID"].ToString());//获取销售状态if(BaoLiuID == 4){//判断销售状态的ID为4时拼接字符串dt2.Rows[i][A] = F1+"留";}else{dt2.Rows[i][A] = F1;}}}List<Dictionary<string, object>> ListReturn = ConvertHelper.DtToList(dt2);//转换成list列表格式return Json(ListReturn, JsonRequestBehavior.AllowGet);//将list列表转换成Json数据返回界面}public ActionResult TiaoJianChaXunFangJianMiaoShu(int LouDongID){DataTable dt = myAnJieGuanLi.TiaoJianChaXunFangJianMiaoShu(LouDongID);//查询最大楼层数DataTable dt2 = myAnJieGuanLi.TiaoJianChaXunFangJian(LouDongID, 1);//通过楼栋ID查询有多少房间try//出错处理{string ZhuiDaChengShu = dt.Rows[0]["ZhuiDaChengShu"].ToString();}catch{}string FangHuiZhi = dt2.Rows.Count.ToString();return Content(FangHuiZhi);//返回数据}#endregion
第四步:界面
代码:
var y;var options = {};var String1 = "[[{ field:'LouChen', title: '楼层', width: 40},";//创建datagrid表格格式function onChangeHouseID() {Select_SellStatus();//查询销售状态$.getJSON("/XiaoShouHouTai/TiaoJianChaXunFangJianMiaoShu?LouDongID=" + $('#cboLouDongMingCheng').combobox('getValue'),//获取最大房号function (data) {//alert(data);if (data > 0) {for (var i = 0; i < data; i++) {//循环最大房号y = i + 1;if (i < data - 1) {var s = "{ field:'F" + i + "', title: '0" + y + "', width: 80,styler:cellStyler},"//拼接datagrid的列String1 = String1 + s;} else {var s = "{ field:'F" + i + "', title: '0" + y + "', width: 80,styler:cellStyler}"String1 = String1 + s + "]]";}}//alert(String1);options.columns = eval(String1);//将字符串转换为html格式//alert(options);$('#tbYeWuXiaoKong').datagrid(options);//加入到datagrid里面$.getJSON("/XiaoShouHouTai/LouDongBiaoMoXing?LouDongID=" + $('#cboLouDongMingCheng').combobox('getValue') + "&" + "LouCengHao=1",//查询datagrid的数据function (data) {$('#tbYeWuXiaoKong').datagrid("loadData", data);//把房号绑定到datagrid里面String1 = "[[{ field:'LouChen', title: '楼层', width: 40},";//重新定义字符串String1});} else {Kong();//清空datagrid}});}function Kong() {var String1 = "[[{}]]";//创建空的datagridoptions.columns = eval(String1);$('#tbYeWuXiaoKong').datagrid(options);$('#tbYeWuXiaoKong').datagrid('loadData', { total: 0, rows: [] });//清空datagrid的数据}var RoomNumber = '';var FangJianZhuangTaiID = 0;//声明一个变量function cellStyler(value, row, index) {var row = $('#wZT').datagrid("getData");//获取数据for (var i = 0; i < row.rows.length; i++) {FangJianZhuangTaiID = (row.rows[i].SellStatusID).toString().trim();//将datagrid中的SellStatusID赋值给变量RoomNumber = (row.rows[i].we).toString().trim(); //将datagrid中的SellStatusID赋值给RoomNumberif (FangJianZhuangTaiID == 5) {//判断FangJianZhuangTaiIDif (value == RoomNumber) {//判断房间房号是否相同return 'background-color:#FF0000;color:#000000;';//将单元格变为红色}}if (FangJianZhuangTaiID == 6) {if (value == RoomNumber) {return 'background-color:#00FF00;color:#000000;';}} }}
完成图:
3、按钮(easyui-linkbutton)
作用:单击事件
按钮截图:
界面按钮创建代码:
<div data-options="region:'east'" style="width:550px;height:432px"><table style="padding:20px;"><tr><td colspan=4 style="width:60px">操作提示:</td></tr><tr><td style="height:5px"></td></tr><tr><td style="width:30px"></td> <td colspan=3>鼠标左键点击 -- 选择需要变更的房间</td></tr><tr><td style="height:5px"></td></tr><tr><td style="width:30px"></td> <td colspan=3>单击"确定"键 -- 对选中的房间的状态进行变更!></td></tr><tr><td style="height:5px"></td></tr><tr><td colspan=4 style="width:60px">说明:</td></tr><tr><td style="height:5px"></td></tr><tr><td style="width:30px"></td> <td colspan=3>左图中"灰色"背景的房间为已经开始销售的房间,></td></tr><tr><td style="height:5px"></td></tr><tr><td style="width:30px"></td> <td colspan=3>不能进行保留或放盘操作。</td></tr><tr><td style="height:5px"></td></tr><tr><td colspan=4 style="width:60px">操作:(将选中的房间的状态变更为)</td></tr><tr><td style="height:5px"></td></tr><tr><td><input οnclick="BaoLiuLeiXing()" type="radio" name="LeiXing" id="KeShou" /></td><td>可售</td><td><input οnclick="BaoLiuLeiXing()" type="radio" name="LeiXing" id="BaoLiu" /></td><td>保留</td></tr><tr><td style="height:5px"></td></tr><tr><td style="width:60px" >保留原因:</td><td colspan=3><input id="BaoLiuYuanYin" style="width:150px" /></td></tr><tr><td style="height:5px"></td></tr><tr><td colspan=4><a id="确定操作类型" class="easyui-linkbutton" οnclick="QueDing()">确定</a></td></tr></table></div></div></div>
查询保留房间与对房间进行保留操作的代码:
查询保留房间:
第一步:数据库
--查询销售状态if @type='Select_SellStatus'beginSELECT SYS_StatusChangeTable.StatusChangeID, SYS_StatusChangeTable.RoomDatumID, SYS_StatusChangeTable.SellStatusDetailID, SYS_SellStatusDetailTable.SellStatusID, SYS_SellStatusDetailTable.SellStatusCause, SYS_SellStatusTable.SellStatusName, SYS_RoomDataTable.RoomNumber, SYS_RoomDataTable.HouseIDFROM SYS_StatusChangeTable INNER JOINSYS_SellStatusDetailTable ON SYS_StatusChangeTable.SellStatusDetailID = SYS_SellStatusDetailTable.SellStatusDetailID INNER JOINSYS_SellStatusTable ON SYS_SellStatusDetailTable.SellStatusID = SYS_SellStatusTable.SellStatusID INNER JOINSYS_RoomDataTable ON SYS_StatusChangeTable.RoomDatumID = SYS_RoomDataTable.RoomDataID where DeleteNot='False' and SYS_RoomDataTable.HouseID=@HouseIDend
第二步:BLL层
代码:
#region 查询销售状态房间public DataTable Select_SellStatusRoom(int RoomDatumID){SqlParameter[] SQL = {new SqlParameter("@type",SqlDbType.Char),new SqlParameter("@RoomDatumID",SqlDbType.Int)};SQL[0].Value = "Select_SellStatusRoom";SQL[1].Value = RoomDatumID;DataTable dt = myDALMethod.DAL_SelectDB_Par("SYS_MarketingControl", SQL);return dt;} #endregion
第三步:控制器
代码:
#region 销售状态public ActionResult Select_SellStatus(int HouseID) {DataTable dt = myXiaoShouKongZhi.Select_SellStatus(HouseID);dt.Columns.Add("we",typeof(string));for (int i = 0; i < dt.Rows.Count; i++){if (Convert.ToInt32(dt.Rows[i]["SellStatusID"]) == 4)//如果销售状态ID等于4{dt.Rows[i]["we"] = dt.Rows[i]["RoomNumber"].ToString().Trim()+"留";//拼接字符串}else {dt.Rows[i]["we"] = dt.Rows[i]["RoomNumber"];}}List<Dictionary<string, object>> ListReturn = ConvertHelper.DtToList(dt);return Json(ListReturn, JsonRequestBehavior.AllowGet);}#endregion
第四步:界面
代码:
var XiaoShouZhuangTai;//声明变量var FangJianID;//声明变量function we(rowIndex, field, value) {//方法名var ShiFouBaoLiu = "留";//声明变量alert(value); if (value.indexOf(ShiFouBaoLiu) < 0) {//字符窜截取$.getJSON("/XiaoShouQianTai/Select_SellStatusRoomNumber?RoomNumber=" + value + "&"+ "HouseID=" + $('#comLouDongMC').combobox('getValue'),function (data) {if (data != null) {XiaoShouZhuangTai = data[0].SellStatusID;//将变量赋值FangJianID = data[0].RoomDatumID; }});} else {$.getJSON("/XiaoShouQianTai/Select_SellStatusRoomNumber?RoomNumber=" + value.substring(0, value.indexOf(ShiFouBaoLiu,0)) + "&"//截取房号最后的字+ "HouseID=" + $('#comLouDongMC').combobox('getValue'),function (data) {if (data != null) {XiaoShouZhuangTai = data[0].SellStatusID; //将变量赋值FangJianID = data[0].RoomDatumID;}});}}
房间保留操作
第一步:数据库
代码:
--修改销售状态if @type='Update_SellStatus'begin SELECT StatusChangeID, RoomDatumID, SellStatusDetailIDFROM SYS_StatusChangeTable update SYS_StatusChangeTableset DeleteNot='true'where RoomDatumID=@RoomDatumIDendif @type='Insert_SellStatus'begin insert into SYS_StatusChangeTable(RoomDatumID, SellStatusDetailID, DeleteNot,XiaoShouJiaID)values (@RoomDatumID, @SellStatusDetailID, 'false','4')select @@IDENTITY end
第二步:BLL层
代码:
#region 修改销控状态public int Update_SellStatus(int RoomDatumID) {SqlParameter[] SQL = {new SqlParameter("@type",SqlDbType.Char),new SqlParameter("@RoomDatumID",SqlDbType.Int)};SQL[0].Value = "Update_SellStatus";SQL[1].Value = RoomDatumID;int i = myDALMethod.DAL_OPTableDB_Par("PW_SignAContractManage",SQL);return i;}public DataTable Insert_SellStatus(int RoomDatumID,int SellStatusDetailID) {SqlParameter[] SQL = {new SqlParameter("@type",SqlDbType.Char),new SqlParameter("@RoomDatumID",SqlDbType.Int),new SqlParameter("@SellStatusDetailID",SqlDbType.Int),};SQL[0].Value = "Insert_SellStatus";SQL[1].Value = RoomDatumID;SQL[2].Value = SellStatusDetailID;DataTable i = myDALMethod.DAL_SelectDB_Par("PW_SignAContractManage", SQL);return i;}#endregion
第三步:控制器
代码:
#region 修改销售状态public ActionResult Update_SellStatus(int RoomDatumID) {int i = myQianYueGuanLi.Update_SellStatus(RoomDatumID);return Content(i.ToString());}public ActionResult Insert_SellStatus(int RoomDatumID, int SellStatusDetailID) {DataTable i = myQianYueGuanLi.Insert_SellStatus(RoomDatumID,SellStatusDetailID);string XiaoShouBianGengID = i.Rows[0][0].ToString();return Content(XiaoShouBianGengID);}#endregion
第四步:界面
代码:
function QueDing() {if (XiaoShouZhuangTai == 5) {//判断状态alert("该房间已销售!!!");}if (XiaoShouZhuangTai == 6) {alert("该房间已销售!!!");}if (XiaoShouZhuangTai == 3) {alert("该房间已销售!!!");}if (ZhuangTai == 5) {if (XiaoShouZhuangTai == 1) {if (confirm('是否对该房间进行保留?')) {$.getJSON("/XiaoShouHouTai/Update_SellStatus?RoomDatumID=" + FangJianID,function (data) {if (data != null) {$.getJSON("/XiaoShouHouTai/Insert_SellStatus?RoomDatumID=" + FangJianID + "&"+ "SellStatusDetailID=4");alert("保留成功!");}});}}}if (ZhuangTai == 2) { if (XiaoShouZhuangTai == 4) {if (confirm('是否对该房间取消保留?')) {$.getJSON("/XiaoShouHouTai/Update_SellStatus?RoomDatumID=" + FangJianID,function (data) {if (data != null) {$.getJSON("/XiaoShouHouTai/Insert_SellStatus?RoomDatumID=" + FangJianID + "&"+ "SellStatusDetailID=1");alert("取消成功!");}});}}}}
4、选项卡(easyui-tabs)
作用:用于区分模块。
选项卡控件截图:
界面控件代码:
<div id="tt" class="easyui-tabs" data-options="maxminzed:true"><div title="销售控制"></div><div title="换退房查询"></div><div title="更名查询"></div><div title="变更查询"></div></div></div>
点击选项卡换退房查询打开换退房界面:
查询功能实现:
第一步:数据库
1、表与表的关系:
表1、SYS_房间描述表(SYS_ RoomDescribeTable)
列名 |
类别 |
主键/外键 |
说明 |
|
RoomBelongID |
int - Identity |
主键 |
房间所属ID |
|
CustomerDatumID |
int |
外键 |
客户资料ID |
|
RoomDatumID |
int |
外键 |
房间资料ID |
|
RetreatRoomNot |
nchar (100) |
退房否 |
||
RetreatRoomDate |
date |
换退房日期 |
||
RetreatRoomCommission |
nchar (100) |
退房手续费 |
||
commissionCurrencyID |
int |
外键 |
手续费币种ID |
|
RetreatRoomReason |
nchar (100) |
退房原因 |
||
ShouldDrawback |
nchar (100) |
应退款 |
||
RetreatRoomOperator |
nchar (100) |
退房经办人 |
||
RetreatRoomApprover |
nchar (100) |
退房批准人 |
||
ApproveDate |
date |
批准日期 |
||
ExchangeRoomNot |
bit |
换房否 |
||
ExchangeRoomNewRoomNumberID |
int |
外键 |
换房后房ID |
|
ExchangeRoomOldRoomNumberID |
int |
外键 |
换房前房ID |
|
AgreementDatumID |
int |
外键 |
合同资料ID |
|
ChangeNameNot |
bit |
更名否 |
||
DeleteNot |
bit |
作废否 |
||
ProfessionalWorkStatusID |
int |
外键 |
业务状态ID |
表2:SYS_ProjectTable(SYS_项目表)
用于存放项目录入的消息
列名 |
类型 |
主键/外键 |
说明 |
ProjectID |
int - Identity |
主键 |
项目ID |
PremisesName |
nchar (100) |
楼盘名称 |
|
ProjectCode |
nchar (100) |
项目代码 |
|
ProjectName |
nchar (100) |
项目名称 |
|
BuildingPropertyID |
int |
外键 |
建筑性质ID |
StructureID |
int |
外键 |
结构ID |
PlotRatio |
decimal (18, 3) |
容积率 |
|
RealEstateNumber |
nchar (100) |
项目房地产证号 |
|
DomesticLicence |
nchar (100) |
内销许可证 |
|
ExportLicence |
nchar (100) |
外销许可证 |
|
SupervisionInstitutionID |
int |
外键 |
监理机构ID |
ProjectRowNumber |
int |
项目排号 |
|
MassifNumber |
nchar (100) |
项目地块编号 |
|
LandArea |
nchar (100) |
项目土地面积 |
|
LandSellContractNumber |
nchar (100) |
项目土地出让合同号 |
|
LandUserBeginTime |
nchar (100) |
项目土地使用开始时间 |
|
LandUserEndTime |
nchar (100) |
项目土地使用结束时间 |
|
LandPurpose |
nchar (100) |
项目土地用途 |
|
AreaTypeID |
int |
外键 |
项目面积类型ID |
表3:SYS_AttributeAssembleDetailTable(SYS属性集合明细表)
用于记录简单的数据
列名 |
类型 |
主键/外键 |
说明 |
AttributeAssembleDetailID |
int - Identity |
主键 |
属性集合明细ID |
AttributeAssembleDetailName |
nchar (100) |
属性集合ID |
|
AttributeAssembleID |
int |
外键 |
属性集合明细名称 |
AttributeAssembleDetailFar_ID |
int |
属性集合明细Far_ID |
表4:SYS_HouseTable(SYS楼栋表)
列名 |
类型 |
主键/外键 |
说明 |
HouseID |
int - Identity |
主键 |
楼栋ID |
HouseCode |
nchar (40) |
楼栋代码 |
|
HouseName |
nchar (40) |
楼栋名称 |
|
RoomNumberModelTypeID |
int |
外键 |
房间编号模式类型ID |
ContractHouseName |
nchar (40) |
合同栋号名称 |
|
GiveHouseStandardID |
int |
外键 |
交屋标准ID |
ShouldGiveHouseDate |
date |
应交房日期 |
|
BriefRemarks |
nchar (80) |
简要备注 |
|
NumberOfPlies |
int |
层数 |
|
BuildingPropertyID |
int |
外键 |
建筑性质ID |
SupervisionInstitutionID |
int |
外键 |
监理机构ID |
EstateNumber |
nchar (80) |
楼栋房地产证号 |
|
MassifNumber |
nchar (80) |
楼栋地块编号 |
|
LandArea |
decimal (18, 3) |
楼栋土地面积 |
|
LandSellAgreementNumber |
nchar (80) |
楼栋土地出让合同号 |
|
LandUserBeginDate |
date |
楼栋土地使用开始时间 |
|
LandUserEndDate |
date |
楼栋土地使用结束时间 |
|
HouseLandUse |
nchar (80) |
楼栋土地用途 |
|
HouseAreaTypeID |
int |
外键 |
楼栋面积类型ID |
ProjectSubregionID |
int |
外键 |
项目所属ID |
StructureID |
int |
外键 |
架构ID |
表5:SYS_房间资料表(SYS_RoomData)
列名 |
类别 |
主键/外键 |
说明 |
|
RoomDataID |
int - Identity |
主键 |
房间资料ID |
|
HouseID |
int |
外键 |
楼栋ID |
|
RoomCode |
nchar (50) |
房间代码 |
||
RoomUnit |
nchar (10) |
房间单元 |
||
RoomNumber |
nchar (20) |
房号 |
||
natureNumber |
nchar (20) |
自然层号 |
||
Floor |
nchar (20) |
楼层号 |
||
ColumnNumber |
nchar (20) |
列号 |
||
CoveredArea |
decimal (18, 3) |
建筑面积 |
||
BuilDingExceptArea |
decimal (18, 3) |
套内面积 |
||
AreaShare |
decimal (18, 3) |
分摊面积 |
||
BalconyArea |
decimal (18, 3) |
阳台面积 |
||
RoomFaceDirectionID |
int |
外键 |
朝 向 |
|
LandscapeID |
int |
外键 |
景观ID |
|
HouseTypeID |
int |
外键 |
户型ID |
|
RoomTypeID |
int |
外键 |
房间类型ID |
|
RoomRanking |
nchar (20) |
房间排号 |
||
OnbuildingExceptAreaCountNot |
bit |
按套内面积计算否 |
||
LockNot |
bit |
是否锁定 |
||
CountWayID |
int |
外键 |
计算方式ID |
|
RoomDescribeID |
int |
外键 |
||
SellStatusID |
int |
外键 |
销售状态ID |
|
AffiliatedHousePropertyNot |
bit |
|||
BuildingPropertiesID |
int |
|||
BuildingNot |
bit |
|||
ZhuangTaiWeiZhenFou |
bit |
状态为真否 |
表6:SYS_ClientDatumTable(客户资料表)
Field |
Type |
主键/外键 |
说明 |
ClientDatumID |
int - Identity |
主键 |
客户资料ID |
ClientCode |
nchar (30) |
客户代码 |
|
ClientTypeID |
int |
外键 |
客户类型ID |
SalesmanID |
int |
外键 |
业务员ID |
ClientName |
nchar (20) |
客户名称 |
|
Nationality |
nchar (20) |
国籍 |
|
Sex |
nchar (10) |
性别 |
|
ClientContactNumber |
int |
客户联系电话 |
|
ClientMobilePhone |
int |
客户手机 |
|
ClientPortraiture |
nchar (30) |
客户传真 |
|
ClientAddress |
nchar (80) |
客户地址 |
|
ClientZipCode |
nchar (50) |
客户邮编 |
|
ClientcredentialsNumber |
nchar (70) |
客户证件号码 |
|
ClientcredentialsName |
nchar (30) |
客户证件名称 |
|
ClientVisitDate |
date |
客户到访日期 |
|
ClientBirthday |
date |
客户出生日期 |
|
ClientEmail |
nchar (40) |
客户电子邮件 |
|
ClientJobUnit |
nchar (40) |
客户工作单位 |
|
ClientDuties |
nchar (40) |
客户职务 |
|
ClientDatumRemarks |
nchar (80) |
客户资料备注 |
|
LiveArea |
nchar (50) |
居住区域 |
|
JobArea |
nchar (50) |
工作区域 |
|
Education |
nchar (40) |
教育程度 |
|
AgeGroup |
nchar (40) |
年龄段 |
|
FamilyStructure |
nchar (40) |
家庭结构 |
|
MaritalStatus |
nchar (10) |
婚姻状况 |
|
FamilyIncome |
nchar (80) |
家庭收入 |
|
Occupation |
nchar (50) |
职业 |
|
KnowRoad |
nchar (50) |
认识途径 |
|
ManagerSuggestion |
nchar (80) |
经理意见 |
|
DuplicateMarkingNot |
bit |
重复标识否 |
|
CorporationName |
nchar (50) |
公司名称 |
|
CorporationJuridicalPerson |
nchar (40) |
公司法人 |
|
JuridicalPersonCD |
nchar (80) |
法人证件 |
|
CorporationPhone |
int |
公司电话 |
|
CorporationAddress |
nchar (80) |
公司地址 |
|
ClientDatumDiscardNot |
bit |
表7:SYS_ProjectSubregionTable(项目分区)
Field |
Type |
主键/外键 |
说明 |
ProjectSubregionID |
int - Identity |
主键 |
项目分区ID |
ProjectSubregionName |
nchar (100) |
外键 |
项目分区名称 |
ProjectID |
int |
外键 |
项目ID |
第一步:储存过程
if @type='Select_ChangeRetreatRoomData'beginSELECT SYS_RoomBelongTable.CustomerDatumID, SYS_RoomBelongTable.RoomDatumID, SYS_RoomBelongTable.RetreatRoomNot, SYS_RoomBelongTable.RetreatRoomDate, SYS_RoomBelongTable.RetreatRoomOperator, SYS_RoomBelongTable.RetreatRoomApprover, SYS_RoomBelongTable.ApproveDate, SYS_RoomBelongTable.ExchangeRoomNot, SYS_ClientDatumTable.ClientName, SYS_RoomDataTable.HouseID, SYS_RoomDataTable.RoomCode, SYS_HouseTable.HouseName, SYS_HouseTable.ProjectSubregionID, SYS_ProjectSubregionTable.ProjectID, SYS_ProjectSubregionTable.ProjectSubregionName, SYS_ProjectTable.ProjectName, SYS_RoomBelongTable.RoomBelongID, SYS_RoomBelongTable.RetreatRoomCommission, SYS_RoomBelongTable.commissionCurrencyID, SYS_RoomBelongTable.RetreatRoomReason, SYS_RoomBelongTable.ShouldDrawback, SYS_AttributeAssembleDetailTable.AttributeAssembleDetailName AS CommissionCurrencyName, SYS_RoomBelongTable.DeleteNot
FROM SYS_RoomBelongTable INNER JOINSYS_ClientDatumTable ON SYS_RoomBelongTable.CustomerDatumID = SYS_ClientDatumTable.ClientDatumID INNER JOINSYS_RoomDataTable ON SYS_RoomBelongTable.RoomDatumID = SYS_RoomDataTable.RoomDataID INNER JOINSYS_HouseTable ON SYS_RoomDataTable.HouseID = SYS_HouseTable.HouseID INNER JOINSYS_ProjectSubregionTable ON SYS_HouseTable.ProjectSubregionID = SYS_ProjectSubregionTable.ProjectSubregionID INNER JOINSYS_ProjectTable ON SYS_ProjectSubregionTable.ProjectID = SYS_ProjectTable.ProjectID INNER JOINSYS_AttributeAssembleDetailTable ON SYS_RoomBelongTable.commissionCurrencyID = SYS_AttributeAssembleDetailTable.AttributeAssembleDetailID where DeleteNot='False' and RetreatRoomNot='true' or ExchangeRoomNot='true'
end
第二步:BLL层
代码:
#region 查询换退房资料public DataTable Select_ChangeRetreatRoomData() {SqlParameter[] SQL = {new SqlParameter("@type",SqlDbType.Char)};SQL[0].Value = "Select_ChangeRetreatRoomData";DataTable dt = myDALMethod.DAL_SelectDB_Par("SYS_MarketingControl",SQL);return dt;}#endregion
第四步:控制器
代码:
#region 查询换退房资料public ActionResult Select_ChangeRetreatRoomData() {DataTable dt = myXiaoShouKongZhi.Select_ChangeRetreatRoomData();dt.Columns.Add("HuanTuiRiQi", typeof(string));dt.Columns.Add("PiZhunRiQi", typeof(string));for (int i = 0; i < dt.Rows.Count; i++){DateTime HuanTuiRiQi = Convert.ToDateTime(dt.Rows[i]["RetreatRoomDate"].ToString());DateTime PiZhunRiQi = Convert.ToDateTime(dt.Rows[i]["ApproveDate"].ToString()); dt.Rows[i]["HuanTuiRiQi"] = HuanTuiRiQi.Year + "-" + HuanTuiRiQi.Month + "-" + HuanTuiRiQi.Day;dt.Rows[i]["PiZhunRiQi"] = PiZhunRiQi.Year + "-" + PiZhunRiQi.Month + "-" + PiZhunRiQi.Day; }List<Dictionary<string, object>> ListReturn = ConvertHelper.DtToList(dt);return Json(ListReturn, JsonRequestBehavior.AllowGet);}#endregion
第五步:界面
代码:
//查询function HuanTuiFangChaXun() {$.getJSON("/XiaoShouQianTai/Select_ChangeRetreatRoomData",function (data) {$('#w换退房查询').datagrid('loadData', data);});}
打开换退房界面界面
打开界面代码:
//打开换退房修改界面function UpdateChangeRetreatRoom() {var row = $('#w换退房查询').datagrid('getSelected');//选中datagrid中的一项if (row) {if (row.RetreatRoomNot == true) {//判断退房否是否为真$('#txtChange').val("退房原因:")//重写按钮显示内容}if (row.ExchangeRoomNot == true) {//判断换房否是否为真$('#txtChange').val("换房原因:")//重写按钮显示内容}BandHuanTuuiFang();//绑定界面数据$('#w修改退房资料').window("open");//} else {alert("请选择修改的资料!");} }
可以对换房与退房的房间进行调整:
第一步:数据库
代码:
--修改换退房资料if @type='Update_ChangeRetreatRoomData'beginupdate SYS_RoomBelongTableset RetreatRoomDate=@RetreatRoomDate, RetreatRoomCommission=@RetreatRoomCommission, commissionCurrencyID=@commissionCurrencyID,RetreatRoomReason=@RetreatRoomReason,ShouldDrawback=@ShouldDrawback, RetreatRoomOperator=@RetreatRoomOperator,RetreatRoomApprover=@RetreatRoomApprover, ApproveDate=@ApproveDatewhere RoomBelongID=@RoomBelongIDend
第二步:BLL层
代码:
#region 修改换退房资料public int Update_ChangeRetreatRoomData(DateTime RetreatRoomDate, string RetreatRoomCommission, int commissionCurrencyID, string RetreatRoomReason,string ShouldDrawback, string RetreatRoomOperator,string RetreatRoomApprover, DateTime ApproveDate, int RoomBelongID) {SqlParameter[] SQL = {new SqlParameter("@type",SqlDbType.Char),new SqlParameter("@RetreatRoomDate",SqlDbType.DateTime),new SqlParameter("@RetreatRoomCommission",SqlDbType.Char),new SqlParameter("@commissionCurrencyID",SqlDbType.Int),new SqlParameter("@RetreatRoomReason",SqlDbType.Char),new SqlParameter("@ShouldDrawback",SqlDbType.Char),new SqlParameter("@RetreatRoomOperator",SqlDbType.Char),new SqlParameter("@RetreatRoomApprover",SqlDbType.Char),new SqlParameter("@ApproveDate",SqlDbType.DateTime),new SqlParameter("@RoomBelongID",SqlDbType.Int)};SQL[0].Value = "Update_ChangeRetreatRoomData";SQL[1].Value = RetreatRoomDate;SQL[2].Value = RetreatRoomCommission;SQL[3].Value = commissionCurrencyID;SQL[4].Value = RetreatRoomReason;SQL[5].Value = ShouldDrawback;SQL[6].Value = RetreatRoomOperator;SQL[7].Value = RetreatRoomApprover;SQL[8].Value = ApproveDate;SQL[9].Value = RoomBelongID;int i = myDALMethod.DAL_OPTableDB_Par("SYS_MarketingControl", SQL);return i;}#endregion
第三步:控制器
代码:
#region 修改换退房资料public ActionResult Update_ChangeRetreatRoomData(string RetreatRoomDate, string RetreatRoomCommission,string commissionCurrencyID, string RetreatRoomReason,string ShouldDrawback, string RetreatRoomOperator,string RetreatRoomApprover, string ApproveDate, string RoomBelongID) {int i = myXiaoShouKongZhi.Update_ChangeRetreatRoomData(Convert.ToDateTime(RetreatRoomDate),RetreatRoomCommission,Convert.ToInt32(commissionCurrencyID),RetreatRoomReason,ShouldDrawback,RetreatRoomOperator,RetreatRoomApprover,Convert.ToDateTime(ApproveDate),Convert.ToInt32(RoomBelongID));return Content(i.ToString());}#endregion
第四步:界面
代码:
绑定界面数据代码:
//绑定换退房数据function BandHuanTuuiFang(){var row = $('#w换退房查询').datagrid('getSelected');$('#dtFaShengRiQi').datebox('setValue', row.HuanTuiRiQi);$('#txtShouXuFei').attr('Value', row.RetreatRoomCommission);$('#cboShouXuFeiBiZhong').combobox('setValue', row.commissionCurrencyID);$('#txtRetreatRoomReason').attr('Value', row.RetreatRoomReason);$('#txtYingTuiKuan').attr('Value', row.ShouldDrawback);$('#txtJingBanRen').attr('Value', row.RetreatRoomOperator);$('#txtPiZhunRen').attr('Value', row.RetreatRoomApprover);$('#dtPiZhunRenRiQi').datebox('setValue', row.PiZhunRiQi);}
点击修改代码:
//修改换退房资料function Update_ChangeRetreatRoomData() {var row = $('#w换退房查询').datagrid('getSelected'); if (confirm('是否修改?')) {$.getJSON("/XiaoShouQianTai/Update_ChangeRetreatRoomData?RetreatRoomDate=" + ($('#dtFaShengRiQi').datebox('getValue')).toString().trim() + "&"+ "RetreatRoomCommission=" + ($('#txtShouXuFei').val()).toString().trim() + "&"+ "commissionCurrencyID=" + ($('#cboShouXuFeiBiZhong').combobox('getValue')).toString().trim() + "&"+ "RetreatRoomReason=" + ($('#txtRetreatRoomReason').val()).toString().trim() + "&"+ "ShouldDrawback=" + ($('#txtYingTuiKuan').val()).toString().trim() + "&"+ "RetreatRoomOperator=" + ($('#txtJingBanRen').val()).toString().trim() + "&"+ "RetreatRoomApprover=" + ($('#txtPiZhunRen').val()).toString().trim() + "&"+ "ApproveDate=" + ($('#dtPiZhunRenRiQi').datebox('getValue')).toString().trim() + "&"+ "RoomBelongID=" + row.RoomBelongID,function (data) {if (data != null) {alert("修改成功!");$('#w修改退房资料').window("close");HuanTuiFangChaXun();} else {alert("修改失败!");}});} }
仅用于学习,禁用于商业用途
明源售楼系统技术解析 销售控制(三)相关推荐
- 明源售楼系统技术解析 销售控制(更名查询与变更查询)
在销售控制模块里 点击更名查询打开更名查询界面: 查询功能实现: 第一步:数据库 1.表与表的关系 表1.SYS_RenameTable(SYS_更名表) 用于存放更名信息 列名 数据类型 主键/外键 ...
- 明源售楼系统技术解析 MVC架构与房源生成(一)
第1章 使用Vs2010 版本搭建MVC3框架 1.1 新建项目 第一步:打开Vs界面,点击左上角文件,点击新建,选择项目 ...
- 明源售楼系统技术解析(二)付款方式定义——查询
付款方式定义--查询篇 1.1主界面效果图如下 从界面上可以看到我们这里用到的控件有 查询功能实现: 第一步:数据库 1.表与关 ...
- MVC北京络捷斯特第三方物流系统技术解析(三)订单运输管理
MVC北京络捷斯特第三方物流系统技术解析(三)订单运输管理 在"运输订单信息"页面用户可以编辑此订单的基本信息,如下图所示.在此页面用户选择[新增]按钮,此时系统会显示选择订单类型 ...
- C# MVC售楼系统开发
作者:ゞ瀟灑亾眚ゞ 前序:售楼前台就是客户可以来到这个网页进行查看楼栋房间信息,如果是初次来此网页可以进行注册,如果客户已经在卖楼人员的推荐下,而且已经在后台登记过了,可以直接选择登录再选择用手机验证 ...
- java计算机毕业设计售楼系统MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计售楼系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计售楼系统MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
- [附源码]Nodejs计算机毕业设计基于售楼系统Express(程序+LW)
该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: Node.js+ Vscode + Mysql5.7 + HBuilderX+Navicat11+Vue ...
- java售楼系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
java售楼系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 java售楼系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
- (附源码)计算机毕业设计SSM基于售楼系统
(附源码)计算机毕业设计SSM基于售楼系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Intelli ...
- (附源码)计算机毕业设计SSM综合售楼系统
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
最新文章
- 利用bigpipe机制实现页面模块的异步渲染 chunked技术
- Tensorflow tf.placeholder函数
- linux下面的时间设置
- SAP UI5 如何通过 manifest.json 文件定义第三方库依赖关系
- 博客园的BLOG也申请了
- doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)
- Java中正数与负数操作、的区别
- mysql拼接数组_Mysql合并结果接横向拼接字段的实现步骤
- 怎样调整input框背景颜色_还在用百度搜索PPT背景图?7个高大上的图片网站,个个都是高清免费无版权!...
- 分享一款思维导图工具-幕布(附在线工具合集、Android进阶知识体系)
- dtft性质及证明_FFT , DTFT, DFT 的区别和联系?
- python的就业方向有哪些城市_【行业分析|听说你选择python后就业迷茫?Python就业方向都有哪些】- 环球网校...
- 随机密聊 匿名聊天室程序源码
- Material Design系列,自定义Behavior实现Android知乎首页
- 参加网络安全培训班学习,就业有哪些方向?
- Pandas-时间(二)-数据类型:DatetimeIndex(其中每个元素的类型为:Timestamp)【创建方式:①pd.DatetimeIndex([]);②pd.to_datetime()】
- html5 audio样式修改,HTML5中 audio的样式设置
- 新款H3C服务器图形化界面配置raid
- 什么是AJAX?如何实现AJAX异步请求?
- 苹果id账号密码忘记了怎么办?分享官方教程,快速重置!