北京络捷斯特第三方物流信息系统技术解析(六) 订单录入-加工订单
2.1.5 加工订单
加工订单界面包括订单信息和货品信息两个标签页。
订单信息界面截图:
货品信息截图:
从界面上可以看到我们这里用到的控件有
控件名称 | 说明 |
下拉表(easyui-combogrid) | 第一要设置每个控件的id,第二设置大小不设置也有默认,第三(data-options)是数据操作:可以设置控件的一些属性和事件 |
运输订单功能实现:
第一步:数据库
1、 表和关系:
2.1.5图(3)
表1:订单信息表(PW_OrdersInformationTable)
列名 | 数据类型 | 主键/外键 | 说明 |
OrdersInformationID | int | 主键 | 订单信息ID |
OrdersMark | nchar(50) |
| 订单号 |
ClientID | int | 外键 | 客户ID |
ClientInstructMark | nchar(50) |
| 客户指令号 |
PurchaseOrdersNumber | nchar(50) |
| 采购订单号 |
OrdersTypeID | int | 外键 | 订单类型ID |
UrgencyDegreeID | int | 外键 | 紧急程度ID |
OrdersSourceID | int | 外键 | 订单来源ID |
OrderTime | date |
| 下达时间 |
StateID | int | 外键 | 状态ID |
ExecuteStateID | int | 外键 | 执行状态ID |
OrdersPriorLevel | nchar(50) |
| 订单优先级 |
PledgeBankID | int | 外键 | 质押银行ID |
Note | nchar(50) |
| 备注 |
EntryTime | date |
| 录入时间 |
RepairNo | Bit |
| 补录否 |
表2:加工订单明细表(PW_MachiningOrdersDetailedTable)
列名 | 数据类型 | 主键/外键 | 说明 |
MachiningOrdersDetailedID | int | 主键 | 加工明细ID |
OrdersInformationID | int | 外键 | 订单信息ID |
MachiningTypeID | int | 外键 | 加工类型ID |
StoreroomID | int | 外键 | 库房ID |
表3:加工货品表(PW_MachiningGoodsTable)
列名 | 数据类型 | 主键/外键 | 说明 |
MachiningGoodsID | int | 主键 | 加工货品ID |
MachiningOrdersDetailedID | int | 外键 | 加工明细ID |
GoodsID | int | 外键 | 货品ID |
Batch | nchar(50) |
| 批次 |
Quantity | decimal(18, 2) |
| 数量 |
表5:库房表(SYS_StoreroomTable)
列名 | 数据类型 | 主键/外键 | 说明 |
StoreroomID | int | 主键 | 库房ID |
StoreroomCoding | nchar(50) |
| 库房编码 |
StoreroomName | nchar(50) |
| 库房名称 |
SpellCode | nchar(50) |
| 拼音码 |
SpellTypeID | int | 外键 | 库房类型ID |
PlaceAreaID | int | 外键 | 所在区域ID |
Phone | nchar(50) |
| 电话 |
Fax | nchar(50) |
| 传真 |
Address | nchar(50) |
| 地址 |
Length | decimal(18, 2) |
| 长度 |
Width | decimal(18, 2) |
| 宽度 |
Height | decimal(18, 2) |
| 高度 |
Area | decimal(18, 2) |
| 面积 |
GalleryWidth | decimal(18, 2) |
| 通道宽度 |
SpinRadius | decimal(18, 2) |
| 旋转半径 |
StateID | int | 外键 | 状态ID |
Note | nchar(50) |
| 备注 |
列名 | 数据类型 | 主键/外键 | 说明 |
BankID | int | 主键 | 银行ID |
BankName | nchar(50) |
| 银行名称 |
Phone | nchar(50) |
| 电话 |
Address | nchar(50) |
| 地址 |
控件使用方法:
下拉表格控件(easyui-combogrid)
下拉表格控件截图:
创建下拉表格控件界面代码:
<input class="easyui-combogrid" id="cboKufang" style="border-width: thin; width:200px; height:30px; "
data-options="panelWidth: 200, idField: 'StoreroomID', textField: 'StoreroomName',
url: '/DingDanLuRu/SelectStoreroomTable',onSelect:Onselectcombogrid,
columns: [[{ field: 'StoreroomCoding', title: '库房编码', width: 50 },
{ field: 'StoreroomName', title: '库房名称', width: 60 },
{ field: 'SpellCode', title: '拼音码', width: 80}]]"/>
//url是连接控制器获取下拉表格数据,onSelect是下拉选中事件。
获取界面控件的值代码:
$('#cboKufang).combogrid ("getValue")
第二步:控制器(Controllers)
2.1.5图(5)
2.1.5图(6)
Contrlles(控制器)代码:
#region 新增加工订单明细
/// <summary>
/// 接收界面参数,新增加工订单信息
/// </summary>
/// <param name="MachiningOrdersInformationID">订单信息ID</param>
/// <param name="MachiningTypeID">加工类型ID</param>
/// <param name="StoreroomID">库房ID</param>
/// <returns>int</returns>
public int InsertMachiningOrdersDetailed(int MachiningOrdersInformationID, int MachiningTypeID, int StoreroomID)
{
Models.PW_MachiningOrdersDetailedTable myMachiningGoods = new Models.PW_MachiningOrdersDetailedTable();
myMachiningGoods.MachiningOrdersInformationID = MachiningOrdersInformationID;
myMachiningGoods.MachiningTypeID = MachiningTypeID;
myMachiningGoods.StoreroomID = StoreroomID;
myDDGL.PW_MachiningOrdersDetailedTable.AddObject(myMachiningGoods); //保存以上参数到数据库表
int i = myDDGL.SaveChanges();
if (i > 0)
{
int MachiningOrdersDetailedID = (from tbOrdersInformation in myDDGL.PW_MachiningOrdersDetailedTable select tbOrdersInformation.MachiningOrdersDetailedID).Max();
return MachiningOrdersDetailedID;//返回该数据的主键ID值
}
else
{
return 0;
}
}
#endregion
#region 新增加工货品明细
/// <summary>
/// 接收界面传来的参数,新增加工货品信息
/// </summary>
/// <param name="MachiningOrdersInformationID">加工明细ID</param>
/// <param name="GoodsID">货品ID</param>
/// <param name="Batch">批次</param>
/// <param name="Quantity">数量</param>
/// <returns>Json</returns>
public ActionResult InsertMachiningGoods(int MachiningOrdersInformationID, int GoodsID, decimal Batch, decimal Quantity)
{
Models.PW_MachiningGoodsTable myMachiningGoods = new Models.PW_MachiningGoodsTable();
myMachiningGoods.MachiningOrdersInformationID = MachiningOrdersInformationID;
myMachiningGoods.GoodsID = GoodsID;
myMachiningGoods.Batch = Batch;
myMachiningGoods.Quantity = Quantity;
myDDGL.PW_MachiningGoodsTable.AddObject(myMachiningGoods);//保存以上参数到数据库表
int i = myDDGL.SaveChanges();
if (i > 0)
{
return Json("true", JsonRequestBehavior.AllowGet);
}
else
{
return Json("false", JsonRequestBehavior.AllowGet);
}
}
#endregion
#region 查询库房货品
/// <summary>
/// 通过ID值查询库房里的货品
/// </summary>
/// <param name="StoreroomID">库房ID</param>
/// <returns>Json</returns>
public ActionResult SelectStorageGoods(int StoreroomID)
{
var dtStorage = from tbStorage in myDDGL.SYS_StorageTable
join tbGoods in myDDGL.SYS_GoodsTable on tbStorage.GoodsID equals tbGoods.GoodsID
join tbUnit in myDDGL.SYS_AttributeDetailedTable on tbGoods.UnitID equals tbUnit.AttributeDetailedID
join tbQuality in myDDGL.SYS_AttributeDetailedTable on tbGoods.QualityID equals tbQuality.AttributeDetailedID
join tbDistrict in myDDGL.SYS_DistrictTable on tbStorage.DistrictID equals tbDistrict.DistrictID
join tbStoreroom in myDDGL.SYS_StoreroomTable on tbDistrict.StoreroomID equals tbStoreroom.StoreroomID
where tbStoreroom.StoreroomID == StoreroomID
select new
{
GoodsID = tbGoods.GoodsID,
GoodsCoding = tbGoods.GoodsCoding,
GoodsName = tbGoods.GoodsName,
Standard = tbGoods.Standard,
Weight = tbGoods.Weight,
UnitID = tbGoods.UnitID,
Unit = tbUnit.AttributeDetailedName,
BarCode = tbGoods.BarCode,
SpellCode = tbGoods.SpellCode,
QualityID = tbGoods.QualityID,
Quality = tbQuality.AttributeDetailedName
};
List<Dictionary<string, object>> ListReturn = new List<Dictionary<string, object>>();
foreach (var item in dtStorage)//循环数据库表,将该表的数据查询出来,转换为列表形式
{
Dictionary<string, object> itemGoods = new Dictionary<string, object>();
foreach (System.Reflection.PropertyInfo p in item.GetType().GetProperties())
{
itemGoods.Add(p.Name, p.GetValue(item, null));//数据库表的数控查询出来后,循环变成(键名,键值)形式
}
ListReturn.Add(itemGoods);
}
return Json(ListReturn, JsonRequestBehavior.AllowGet);//返回Json格式
}
#endregion
第三步:视图层(Views)
加工订单界面效果截图:
2.1.5图(7)
HTML代码:
<!DOCTYPE html>
<html>
<head>
<meta content="text/javascript;charset=utf-8"/> //<head>标签里的是jQuery包的引用
<link rel="stylesheet" type="text/css" href="../../Content/themes/jquery-easyui-1.3.3/themes/default/easyui.css"/>
<link rel="stylesheet" type="text/css" href="../../Content/themes/jquery-easyui-1.3.3/themes/icon.css"/>
<link rel="stylesheet" type="text/css" href="../../Content/themes/jquery-easyui-1.3.3/demo/demo.css"/>
<script type="text/javascript" src="../../Content/themes/jquery-easyui-1.3.3/jquery.min.js"></script>
<script type="text/javascript" src="../../Content/themes/jquery-easyui-1.3.3/jquery.easyui.min.js"></script>
</head>
<body>
<div class="easyui-tabs" style="border-style: none; margin-top: -18px; margin-left: -17px; margin-right: -18px;">
<div title="库 内 加 工">
<div class="easyui-tabs" style="border-width: thick; border-style: none;">
<div title="订单信息">
<div class="easyui-panel" style="border-style: none; width:auto; height:auto; border-radius:15px 15px 0px 0px;">
<table style="margin-left: 50px; margin-top: 10px;">
<tr>
<td align="right"><strong style="font-size: medium">订单号:</strong></td><td>
<input type="text" id="txtDingDanhao" style="border-style: hidden hidden outset hidden; border-width: thin; width:300px; height:30px; " /></td>
<td> </td>
<td align="right"><strong style="font-size: medium">客户码:</strong></td><td>
<input type="text" id="txtKeHuma" style="border-style: hidden hidden outset hidden; border-width: thin; width:300px; height:30px; " /></td>
<td><input type="button" οnclick="OpenKeHu()" value="••" style="font-size: 13px;width:30px;height:30px; font-family: 楷体; color: #000000; font-weight: bold;" /></td>
</tr>
<tr>
<td align="right"><strong style="font-size: medium">客户指令号:</strong></td><td>
<input type="text" id="txtKeHuZhiLinghao" style="border-style: hidden hidden outset hidden; border-width: thin; width:300px; height:30px; " /></td>
<td> </td>
<td align="right"><strong style="font-size: medium">采购订单号:</strong></td><td>
<input type="text" id="txtCaiGouDanhao" style="border-style: hidden hidden outset hidden; border-width: thin; width:300px; height:30px; " /></td>
</tr>
<tr>
<td align="right"><strong style="font-size: medium">订单类型:</strong></td><td>
<input class="easyui-combobox" id="cboDingDanLeixing" style="border-style: hidden hidden outset hidden; border-width: thin; width:150px; height:30px; " /></td>
<td> </td>
<td align="right"><strong style="font-size: medium">紧急程度:</strong></td><td>
<input class="easyui-combobox" id="cboJinJiChengdu" style="border-style: hidden hidden outset hidden; border-width: thin; width:150px; height:30px; " /></td>
</tr>
<tr>
<td align="right"><strong style="font-size: medium">订单来源:</strong></td><td>
<input class="easyui-combobox" id="cboDingDanLaiyuan" style="border-style: hidden hidden outset hidden; border-width: thin; width:150px; height:30px; " /></td>
<td> </td>
<td align="right"><strong style="font-size: medium">下达时间:</strong></td><td>
<input class="easyui-datebox" id="datXiaDaShijian" data-options="formatter:myformatter" style="border-style: hidden hidden outset hidden; border-width: thin; width:200px; height:30px; " /></td>
</tr>
<tr>
<td align="right"><strong style="font-size: medium">状态:</strong></td><td>
<input class="easyui-combobox" id="cboZhuangtai" style="border-style: hidden hidden outset hidden; border-width: thin; width:150px; height:30px; " /></td>
<td> </td>
<td align="right"><strong style="font-size: medium">执行状态:</strong></td><td>
<input class="easyui-combobox" id="cboZhiXingZhuangtai" style="border-style: hidden hidden outset hidden; border-width: thin; width:200px; height:30px; " /></td>
</tr>
<tr>
<td align="right"><strong style="font-size: medium">订单优先级:</strong></td><td>
<input type="text" id="txtDingDanYouXianji" style="border-style: hidden hidden outset hidden; border-width: thin; width:300px; height:30px; " /></td>
<td> </td>
<td align="right"><strong style="font-size: medium">质押银行:</strong></td><td>
<input type="text" id="txtZhiYaYinhang" style="border-style: hidden hidden outset hidden; border-width: thin; width:300px; height:30px; " /></td>
<td><input type="button" οnclick="OpenZhiYaYinHang()" value="••" style="font-size: 13px;width:30px;height:30px; font-family: 楷体; color: #000000; font-weight: bold;" /></td>
</tr>
</table>
<table style="margin-left: 50px; margin-top: 10px;">
<tr>
<td align="right"><strong style="font-size: medium">备注:</strong></td><td>
<input type="text" id="txtBeizhu" style="border-style: hidden hidden outset hidden; border-width: thin; width:500px; height:30px; " /></td>
</tr>
</table>
</div>
</div>
<div title="订单货品">
<div class="easyui-panel" style="border-style: none; width:auto; height:450px; border-radius:15px 15px 0px 0px;">
<table style="margin-left: 50px; margin-top: 10px;">
<tr>
<td align="right"><strong style="font-size: medium">库房:</strong></td><td>
<input class="easyui-combogrid" id="cboKufang" style="border-width: thin; width:200px; height:30px; "
data-options="panelWidth: 200, idField: 'StoreroomID', textField: 'StoreroomName',
url: '/DingDanLuRu/SelectStoreroomTable',onSelect:Onselectcombogrid,
columns: [[{ field: 'StoreroomCoding', title: '库房编码', width: 50 },
{ field: 'StoreroomName', title: '库房名称', width: 60 },
{ field: 'SpellCode', title: '拼音码', width: 80}]]"
/></td>
<td> </td>
<td align="right"><strong style="font-size: medium">加工类型:</strong></td><td>
<input class="easyui-combobox" id="txtJiaGongLeixing" style="border-style: hidden hidden outset hidden; border-width: thin; width:200px; height:30px; " /></td>
</tr>
</table>
<table id="tb加工订单货品" class="easyui-datagrid" style="width:auto; height:200px;" data-options="singleSelect:true,scrolling:true,onClickRow:onClickRowQiYongEdit,onAfterEdit:onJiaGongAfterEdit">
<pre name="code" class="html"> //datagrid里的onClickRow事件,onAfterEdit事件,在jQuery里要写方法代码,不然界面会出错
<thead> <tr> <th data-options="field:'GoodsID',width:50,align:'center',formatter:returnBtnJG"><img src="../../Content/图片/删除.jpg" /></th> <th data-options="field:'GoodsCoding',width:100,align:'center'">货品编码</th> <th data-options="field:'GoodsName',width:100,editor:'true',align:'center'">货品名称</th> <th data-options="field:'Standard',width:100,editor:'true',align:'center'">规格</th> <th data-options="field:'Batch',width:100,editor:'numberbox',align:'center'">批次</th> <th data-options="field:'Unit',width:100,editor:'combobox',align:'center'">单位</th> <th data-options="field:'Quality',width:100,editor:'combobox',align:'center'">质量</th> <th data-options="field:'Quantity',width:100,editor:'numberbox',align:'center'">数量</th> </tr> </thead> </table> <table id="tb加工订单货品信息" class="easyui-datagrid" style="width:auto; height:200px;" data-options="singleSelect:true,scrolling:true,onDblClickRow:DblJiaGongHuoPinDatagrid"> <thead> <tr> <th data-options="field:'GoodsID',width:100,hidden:true,align:'center'">货品ID</th> <th data-options="field:'GoodsCoding',width:100,align:'center'">货品编码</th> <th data-options="field:'GoodsName',width:100,align:'center'">货品名称</th> <th data-options="field:'BarCode',width:100,align:'center'">条形码</th> <th data-options="field:'SpellCode',width:100,align:'center'">拼音码</th> <th data-options="field:'Standard',width:100,align:'center'">规格</th> <th data-options="field:'UnitID',width:100,hidden:true,align:'center'">单位ID</th> <th data-options="field:'Unit',width:100,align:'center'">单位</th> <th data-options="field:'QualityID',width:100,hidden:true,align:'center'">质量ID</th> <th data-options="field:'Quality',width:100,align:'center'">质量</th> <th data-options="field:'Weight',width:100,align:'center'">重量</th> </tr> </thead> </table> </div> </div> </div> <table style="margin-left: 450px;"> <tr> <td><input type="button" οnclick="JiaGongInsertOrdersInformationTable()" value="保存订单" style="font-size: 18px;width:100px; font-family: 楷体; color: #CC33FF" /></td> </tr> </table></div></div></body></html>
jQuery代码:
<script type="text/javascript">
$(document).ready(function () {
cboBinDing();//HTML加载时,预先执行下拉框绑定方法
});
function returnBtnJG(GoodsID, row, rowIndex) {
return "<a href='javascript:JGShanChu(" + GoodsID + "," + rowIndex + ")'>" + '<img src="../../Content/图片/删除.jpg" />' + "</a>";//订单货品数据表格datagrid里添加删除按钮,点击删除图标执行下面删除方法
}
function JGShanChu(GoodsID, rowIndex) { //删除加工明细
$('#tb加工订单货品').datagrid('cancelEdit', editIndex)
.datagrid('deleteRow', editIndex);
}
function cboBinDing() { //加工订单各种下拉框的绑定
$.getJSON("/DingDanLuRu/cboBinDing?AttributeAssembleID=22",
function (data) {
$("#cboDingDanLeixing").combobox({ data: data, valueField: 'AttributeDetailedID',
textField: 'AttributeDetailedName'
});
$("#cboDingDanLeixing").combobox('select', 271);
});
$.getJSON("/DingDanLuRu/cboBinDing?AttributeAssembleID=23",
function (data) {
$("#cboJinJiChengdu").combobox({ data: data, valueField: 'AttributeDetailedID',
textField: 'AttributeDetailedName'
});
});
$.getJSON("/DingDanLuru/cboBinDing?AttributeAssembleID=24",
function (data) {
$("#cboDingDanLaiyuan").combobox({ data: data, valueField: 'AttributeDetailedID',
textField: 'AttributeDetailedName'
});
});
$.getJSON("/DingDanLuRu/cboBinDing?AttributeAssembleID=4",
function (data) {
$("#cboZhuangtai").combobox({ data: data, valueField: 'AttributeDetailedID',
textField: 'AttributeDetailedName'
});
});
$.getJSON("/DingDanLuRu/cboBinDing?AttributeAssembleID=25",
function (data) {
$("#cboZhiXingZhuangtai").combobox({ data: data, valueField: 'AttributeDetailedID',
textField: 'AttributeDetailedName'
});
});
$.getJSON("/DingDanLuRu/cboBinDing?AttributeAssembleID=34",
function (data) {
$("#txtJiaGongLeixing").combobox({ data: data, valueField: 'AttributeDetailedID',
textField: 'AttributeDetailedName'
});
});
}
//定义一个全局变量,并把它赋值为未定义
var editIndex = undefined;
//启用单元格编辑状态
function onClickRowQiYongEdit(index) {
if (editIndex != index) {
$('#tb加工订单货品').datagrid('beginEdit', index);
$('#tb加工订单货品').datagrid('endEdit', editIndex);
editIndex = index;
}
}
function DblJiaGongHuoPinDatagrid() { //双击事件,将货品信息更新到加工订单货品
var rowHuoPinDatagrid = $('#tb加工订单货品信息').datagrid('getSelected');
var rowMingXi = $('#tb加工订单货品').datagrid('getSelected');
$('#tb加工订单货品').datagrid('appendRow',
{ GoodsID: rowHuoPinDatagrid.GoodsID,
GoodsCoding: rowHuoPinDatagrid.GoodsCoding,
GoodsName: rowHuoPinDatagrid.GoodsName,
Standard: rowHuoPinDatagrid.Standard,
Batch: "0.00",
UnitID: rowHuoPinDatagrid.UnitID,
Unit: rowHuoPinDatagrid.Unit,
QualityID: rowHuoPinDatagrid.QualityID,
Quality: rowHuoPinDatagrid.Quality,
Quantity: "0.00"
});
editIndex = $('#tb加工订单货品').datagrid('getRows').length - 1;
$('#tb加工订单货品').datagrid('selectRow', editIndex);
$('#tb加工订单货品').datagrid('beginEdit', editIndex).datagrid('endEdit', editIndex - 1);
}
function onJiaGongAfterEdit(rowIndex, rowData, changes) { //当用户编辑完成时触发事件,获取编辑行的数据,再返回改变显示值
var dataMingXi = $('#tb加工订单货品').datagrid('getData');
var Batch = dataMingXi.rows[rowIndex].Batch;
var Quantity = dataMingXi.rows[rowIndex].Quantity;
var Note = dataMingXi.rows[rowIndex].Note;
$('#tb加工订单货品').datagrid('refreshRow', rowIndex); //refreshRow:刷新一行
}
function Onselectcombogrid() { //combogrid的onSelect方法,选择不同库房,查询不同货品
id = $('#cboKufang').combogrid('getValue');
$('#tb加工订单货品信息').datagrid({ url: "/DingDanLuRu/SelectStorageGoods?StoreroomID=" + id });
}
Var OrdersInformationID = 0;
function JiaGongInsertOrdersInformationTable() { //新增订单信息
if (confirm("是否添加?")) {
$.getJSON("/DingDanLuRu/InsertOrdersInformationTable?OrdersMark=" + $('#txtDingDanhao').val() +
"&ClientID=" + ClientID +
"&ClientInstructMark=" + $('#txtKeHuZhiLinghao').val() +
"&PurchaseOrdersNumber=" + $('#txtCaiGouDanhao').val() +
"&OrdersTypeID=" + $('#cboDingDanLeixing').combobox('getValue') +
"&UrgencyDegreeID=" + $('#cboJinJiChengdu').combobox('getValue') +
"&OrdersSourceID=" + $('#cboDingDanLaiyuan').combobox('getValue') +
"&OrderTime=" + $('#datXiaDaShijian').datebox('getValue') +
"&StateID=" + $('#cboZhuangtai').combobox('getValue') +
"&ExecuteStateID=" + $('#cboZhiXingZhuangtai').combobox('getValue') +
"&OrdersPriorLevel=" + $('#txtDingDanYouXianji').val() +
"&PledgeBankID=" + BankID +
"&Note=" + $('#txtBeizhu').val() +
"&EntryTime=" + EntryTime,
function (data) {
OrdersInformationID = data; //返回新增最大值ID
if (data != null) {
InsertMachiningGoods();//满足条件执行新增加工货品方法
alert("添加成功!");
} else {
alert("添加失败!");
}
});
} else {
return null;
}
}
function InsertMachiningGoods() { //新增加工货品 $.getJSON("/DingDanLuRu/InsertMachiningOrdersDetailed?MachiningOrdersInformationID=" + OrdersInformationID +
"&MachiningTypeID=" + $('#txtJiaGongLeixing').combobox('getValue') +
"&StoreroomID=" + $('#cboKufang').combogrid('getValue'),
function (data) {
if (data != 0) {
var dataMingXi = $('#tb加工订单货品').datagrid('getData');
for (var i = 0; i < dataMingXi.rows.length; i++) {
$.getJSON("/DingDanLuRu/InsertMachiningGoods?MachiningOrdersInformationID=" + data +
"&GoodsID=" + dataMingXi.rows[i].GoodsID +
"&Batch=" + dataMingXi.rows[i].Batch +
"&Quantity=" + dataMingXi.rows[i].Quantity,
function (data) {
if (data == "false") {
alert("新增失败!");
}
});
}
}
});
}
</script>
仅供学习,禁止用于商业用途