材料单价包含两个部分:一个是材料分类,一个是材料单价。材料分类的是一个下拉树,可以对其进行新增,删除和修改它的节点。当双击材料分类时,材料单价会出现相应的数据。
材料单价数据处理包括添加、修改、删除、复制、粘贴、导入、导出、还可以隐藏分类列表、显示分类列表。
对于材料单价的导出、导入:系统将自动给出一个路径,把材料单价的所有数据导入到一张Excel表。导入:先手动填写一些数据,这些数据要根据数据库的参数来写,一一对应才能导入到
材料单价的表里。导入之前先选择要导入的文件。
材料单价的添加、修改、删除:当点击添加按钮时,会弹出一个窗体,里面会有相应的文本框进行填写相应要添加的字段,然后进行保存。修改,对原有的数据进行修改,然后进行保存。删除选中的数据。
材料单价的复制、粘贴:复制现有的数据,复制后的数据代号后会有”复制“两字,进行区分。然后进行粘贴到最后一行。
材料单价的查询分为模糊查询和精确查询:查询分为:根剧代号、名称、名称的首字母查询,当选中方式中的代号,如果不选中模糊先查询,则为精确查询,反之,则为模糊查询。
材料单价所涉及到的表有:材料分类表(MaterialPriceClassesList)、材料单价表(MaterialPriceList)、属性集合表(NatureGatherList)、属性明细表(NatureGatherDetailList)、建立项目表(BuildProjectList)、定额表(QuoteEditionList),运输项目表(Sys_YunShuXiangMuBiao),运杂费表(YunZaFeiBiao)
材料单价表的主要字段有:建立项目ID、材料单价ID、材料单价分类ID、代号、名称、单位、材料原价, 包装费, 运杂费,采购及保管费、运输 保 险费、预算价格、是否主材、业主供材。
运输项目表(Sys_YunShuXiangMuBiao)的主要字段:运输项目ID、材料单价ID、运输项目、费用。
运杂费表(YunZaFeiBiao)的主要字段:YunShuXiangMuID,运输起点, 装车费, 每公里运费,运距, 系数, 装载系数,卸车费, 其它, 计算公式,每吨运杂费, 交货地点, 交货条件,交货等级
SYS_MaterialPriceList
資料表名稱 |
SYS_MaterialPriceList |
資料表描述 |
|
||||
SN |
欄位 |
資料型態 |
長度 |
null |
PK |
描述 |
|
1 |
MaterialPriceID |
int identity |
(10, 0) |
NO |
PK |
材料单价ID |
|
2 |
BuildProjectID |
int |
(10, 0) |
YES |
外键 |
建立项目ID |
|
3 |
MaterialPriceClassesID |
int |
(10, 0) |
YES |
外键 |
材料单价分类ID |
|
4 |
Code |
nchar |
150 |
YES |
|
代号 |
|
5 |
Name |
nchar |
150 |
YES |
|
名称 |
|
6 |
Unit |
nchar |
150 |
YES |
|
单位 |
|
7 |
MaterialCostPrice |
decimal |
(18, 3) |
YES |
|
材料原价 |
|
8 |
PackagingPrice |
decimal |
(18, 3) |
YES |
|
包装费 |
|
9 |
Fare |
decimal |
(18, 3) |
YES |
|
运杂费 |
|
10 |
BuyingAndHoldPrice |
decimal |
(18, 3) |
YES |
|
采购保管费 |
|
11 |
TransferSafeCost |
decimal |
(18, 3) |
YES |
|
运输保险费 |
|
12 |
BudgetPrice |
decimal |
(18, 3) |
YES |
|
预算价格 |
|
13 |
IfMainMaterial |
bit |
1 |
YES |
|
是否主材 |
|
14 |
OwnerSupplyMaterial |
bit |
1 |
YES |
|
是否供材 |
|
15 |
Pinyincode |
nchar |
10 |
YES |
|
拼音码 |
|
16 |
effectivityno |
bit |
1 |
YES |
|
|
|
|
|
|
|
|
|
|
SYS_MaterialPriceClassesList
材料单价分类表的主要字段有:材料单价分类ID、材料单价分类名称、材料单价分类Fur-ID、备注
資料表名稱 |
SYS_MaterialPriceClassesList |
資料表描述 |
|
||||
SN |
欄位 |
資料型態 |
長度 |
null |
PK |
描述 |
|
1 |
MaterialPriceClassesID |
int identity |
(10, 0) |
NO |
PK |
材料单价分类ID |
|
2 |
MaterialPriceClassesName |
nchar |
150 |
YES |
|
材料单价分类名称 |
|
3 |
MaterialPriceClassesFur_ID |
int |
(10, 0) |
YES |
|
材料单价分类Fur-ID |
|
4 |
Remark |
nchar |
15 |
YES |
|
备注 |
Sys_YunShuXiangMuBiao
資料表名稱 |
Sys_YunShuXiangMuBiao |
資料表描述 |
|
||||
SN |
欄位 |
資料型態 |
長度 |
null |
PK |
描述 |
|
1 |
YunShuXiangMuID |
int identity |
(10, 0) |
NO |
PK |
|
|
2 |
MaterialPriceID |
int |
(10, 0) |
YES |
|
材料单价ID |
|
3 |
YunShuXiangMu |
nchar |
100 |
YES |
|
运输项目 |
|
4 |
FeiYong |
nchar |
100 |
YES |
|
费用 |
Sys-YunZaFeiBiao
資料表名稱 |
Sys-YunZaFeiBiao |
資料表描述 |
|
||||
SN |
欄位 |
資料型態 |
長度 |
null |
PK |
描述 |
|
1 |
YunZaFeiID |
int identity |
(10, 0) |
NO |
PK |
运杂费ID |
|
2 |
YunShuXiangMuID |
int |
(10, 0) |
YES |
外键 |
运输项目ID |
|
3 |
运输起点 |
nchar |
100 |
YES |
|
运输起点 |
|
4 |
装车费 |
nchar |
150 |
YES |
|
装车费 |
|
5 |
每公里运费 |
nchar |
100 |
YES |
|
每公里运费 |
|
6 |
运距 |
nchar |
100 |
YES |
|
运距 |
|
7 |
系数 |
nchar |
100 |
YES |
|
系数 |
|
8 |
装载系数 |
nchar |
100 |
YES |
|
装载系数 |
|
9 |
卸车费 |
nchar |
100 |
YES |
|
卸车费 |
|
10 |
其它 |
nchar |
100 |
YES |
|
其它 |
|
11 |
计算公式 |
nchar |
100 |
YES |
|
计算公式 |
|
12 |
每吨运杂费 |
nchar |
100 |
YES |
|
每吨运杂费 |
|
13 |
交货地点 |
nchar |
100 |
YES |
|
交货地点 |
|
14 |
交货条件 |
nchar |
100 |
YES |
|
交货条件 |
|
15 |
交货等级 |
nchar |
100 |
YES |
|
交货等级 |
各个表的关系如下:
(1)动态下拉树截图
(图 3)(2)动态下拉树界面代码:
(3)赋值给界面的控件代码:
function BangDingTree() {
//自定义方法
$.getJSON("/CaiLiaoDanJia/TreeBangDing",
//从控制器传来的JSON代码
function (data) {
$('#treMaterial').tree('loadData', data);
//把从控制器传来的数据加载到下拉树中
});
}
(4)控制器的数据传入到界面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
using System.Data.SqlClient;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;//先引用
using System.IO; //先引用
namespace 凯云水利水电工程造价系统.Controllers
{
public class CaiLiaoDanJiaController : Controller
{
BLL新建项.CaiLiaoDanJia myCaiLiaoDanJia = new BLL新建项.CaiLiaoDanJia();//实例化逻辑层
//
// GET: /CaiLiaoDanJia/
public ActionResult CaiLiaoDanJia()
{
return View();//跳转到材料单价的主图
}
#region 树形绑定
public ActionResult TreeBangDing()//自定义控制器的方法,用于界面层的调用
{
DataTable dt = myCaiLiaoDanJia.BangDingTree();//调用逻辑层的方法
string stringtree = GetDataString(dt, "0"); //
stringtree = stringtree.Remove(stringtree.Length - 2, 2);//
return Content(stringtree);
}
#endregion
#region 树形绑定
public string GetDataString(DataTable dt, string id)
{
string stringbuilder = "";
DataView dv = new DataView(dt);//声明DataView,把数据赋值给dv
dv.RowFilter = "父ID=" + id;//
DataTable dtChild = dv.ToTable();//转换成DataTable
if (dtChild.Rows.Count > 0)//获取DataTable的行数,如果有数据,就执行下面的代码
{
stringbuilder += "[";
for (int i = 0; i < dtChild.Rows.Count; i++)
{
string leiid = dtChild.Rows[i]["部门ID"].ToString();
string chidstring = GetDataString(dt, leiid);
if (chidstring.Length > 0)
{
stringbuilder += "{ \"id\":\"" + dtChild.Rows[i]["部门ID"].ToString() + "\",\"text\":\"" + dtChild.Rows[i]["部门名称"].ToString().Trim() + "\",\"state\":\"closed\",\"children\":";//获取逻辑层传来的值,分别 赋值,然后传给界面层
stringbuilder += chidstring;
}
else
{
stringbuilder += "{\"id\":\"" + dtChild.Rows[i]["部门ID"].ToString() + "\",\"text\":\"" + dtChild.Rows[i]["部门名称"].ToString().Trim() + "\"},";
}
}
stringbuilder = stringbuilder.Remove(stringbuilder.Length - 1, 1);//移除获取出的数据的最后一个字符串
stringbuilder += "]},";
}
return stringbuilder;
}
#endregion
namespace BLL新建项
{
public class CaiLiaoDanJia
{
DALPublic.DALMethod myDALMethod = new DALPublic.DALMethod();//首先实例化数据层
#region 树形的绑定
public DataTable BangDingTree()//自定义逻辑层的方法
{
SqlParameter[] mySqlParameter ={
new SqlParameter("@Type",SqlDbType.Char),
};
mySqlParameter[0].Value = "BangDingShuXing";//存储过程名
DataTable dt = myDALMethod.DAL_SelectDB_Par("CaiLiaoDanJia", mySqlParameter);//把数据库的数据放在 dt 里
return dt;//把数据返回给控制器
}
#endregion
(6)数据层的数据传入到逻辑层的代码:
--树形递归的绑定
if @Type='BangDingShuXing'
begin
SELECT MaterialPriceClassesID AS 部门ID, MaterialPriceClassesName AS 部门名称, MaterialPriceClassesFur_ID AS 父ID // AS 就是把你查出来的数据重新命名
FROM SYS_MaterialPriceClassesList
end
(1)datagrid效果截图
(图 4)(2)datagrid界面代码:
// data-options里面设置的是datagr的属性。singleSelect设置是否单选, onClickRow单击事件
建立项目ID
// field:列名,用于传参数,而建立项目ID是界面显示的列名
材料单价ID
材料单价分类ID
代号
名称
单位
材料原价
包装费
运杂费
采购保管费
运输保险费
预算价格
材料单价分类
是否主材
业主供材
(3)赋值给界面控件的代码:
function BangDingSuoYouCaiLiao() {
$.getJSON("/CaiLiaoDanJia/SelectAllCaiLiao?BuildProjectID="+ @Session["项目ID"],
//项目ID是之前定义好的全局变量
///CaiLiaoDanJia/SelectAllCaiLiao? 某个控制器下的一个方法名
function(data){
//data 就是从控制器传来的数据
$('#w材料单价').datagrid('loadData',data);
//把数据加载到id为w材料单价的datag中
$('#w材料单价').datagrid('endEdit', Ibd);//结束编辑
$('#w材料单价').datagrid('beginEdit', Ibd);//开始编辑
} );
}
(4)控制器的数据传入到界面的代码:
public ActionResult SelectAllCaiLiao(string BuildProjectID)
{
DataTable dt = myCaiLiaoDanJia.SelectAllCaiLiao(Convert.ToInt32(BuildProjectID));
// Convert.ToInt32是把一个字符串型强制转换成int
List> ListResult = ConvertHelper.DtToList(dt);
return Json(ListResult, JsonRequestBehavior.AllowGet);
//把从逻辑层获取的数据转换成Json格式,返回给界面层
}
(5)逻辑层的数据传到控制器:
#region 查询全部材料组成
public DataTable SelectAllCaiLiao(int BuildProjectID)
//根据BuildProjectID这个参数来进行查询数据
{
SqlParameter[] mySqlParameter ={
new SqlParameter("@Type",SqlDbType.Char),
new SqlParameter("@BuildProjectID",SqlDbType.Int),
};
mySqlParameter[0].Value = "SelectAllCaiLiao";
mySqlParameter[1].Value = BuildProjectID;
DataTable dt = myDALMethod.DAL_SelectDB_Par("CaiLiaoDanJia", mySqlParameter);
return dt;
}
(6)数据层的数据传到逻辑层:
--查询所有的材料
if @Type='SelectAllCaiLiao'
begin
SELECT SYS_MaterialPriceList.MaterialPriceID,
SYS_MaterialPriceList.BuildProjectID,
SYS_MaterialPriceList.MaterialPriceClassesID,
ltrim(rtrim(SYS_MaterialPriceList.))as Code,
-- ltrim(rtrim(就是对Code去空格
ltrim(rtrim(SYS_MaterialPriceList.Name))as Name, Unit
ltrim(rtrim(SYS_MaterialPriceList.Unit))as Unit,
ltrim(rtrim( SYS_MaterialPriceList.MaterialCostPrice)) as MaterialCostPrice, ltrim(rtrim(SYS_MaterialPriceList.PackagingPrice)) as PackagingPrice, ltrim(rtrim(SYS_MaterialPriceList.Fare)) as Fare, ltrim(rtrim( SYS_MaterialPriceList.BuyingAndHoldPrice))as BuyingAndHoldPrice,
ltrim(rtrim(SYS_MaterialPriceList.TransferSafeCost))as TransferSafeCost, ltrim(rtrim(SYS_MaterialPriceList.BudgetPrice))as BudgetPrice, SYS_MaterialPriceList.IfMainMaterial, SYS_MaterialPriceList.OwnerSupplyMaterial, ltrim(rtrim(SYS_MaterialPriceClassesList.MaterialPriceClassesName))as MaterialPriceClassesName,ltrim(rtrim(SYS_BuildProjectList.BuildProjectName))as BuildProjectName, ltrim(rtrim(SYS_BuildProjectList.BuildProjectName))as BuildProjectName,ltrim(rtrim( SYS_MaterialPriceList.Pinyincode))as Pinyincode, SYS_MaterialPriceList.effectivityno
FROM SYS_MaterialPriceList INNER JOIN
SYS_MaterialPriceClassesList ON SYS_MaterialPriceList.MaterialPriceClassesID = SYS_MaterialPriceClassesList.MaterialPriceClassesID INNER JOIN
SYS_BuildProjectList ON SYS_MaterialPriceList.BuildProjectID = SYS_BuildProjectList.BuildProjectID
where SYS_BuildProjectList.BuildProjectID=@BuildProjectID
end
(1)panel窗体截图:
(图 5)
(2)panel窗体界面代码:
// iconCls:'icon-save'就是窗体里材料分类前的图标
// tools:'#tt' 就是那些按钮
(1) checkbox截图:
(图 6)(2) checkbox:界面代码
仅显示已使用
模糊查询
(3)在datagrid中的check的界面代码:
是否主材
//首先要在是否主材这一列调用一个 formatter事件,onCheck方法写在里
业主供材
(4)在datagrid中的onCheck方法代码:
function onCheck(BuZhi, Row, Indet) {
if(BuZhi == true){
//进行判断,如果控制器传来的是有数据的,那就是true,那相应的复选框就会被选中
return '';
}
}
(`1) Combotree的截图:
(2)Combotree的界面代码:
材料分类上级:
(3)界面层实现的代码:
function BangDingTree() {
$.getJSON("/CaiLiaoDanJia/TreeBangDing",
function (data) {
$('#txtTree').combotree('loadData',data);
//把控制器传来的数据加载到下拉树
});
}
(4)逻辑层和控制器就和绑定下拉树的方法一样。
(1)当你点击 新增 按钮,就会弹出一个新增材料单价分类的窗体
(2)新增窗体的界面代码:
(3)当你输入完数据之后,点击确定按钮,把值传给界面层:
(图 9)
代码如下:function InsertMaterialPriceClasses(){
function XuanZheKuan(BuZhi,Row, Indet) {
return'';
}
if(confirm ('是否新增材料分类?')){
//新增之前,先确认是否需要新增材料分类
$.getJSON("/CaiLiaoDanJia/InsertMaterialPriceClasses?MaterialPriceClassesName="+$('#txtMaterialClasses').val()+"&"
+"MaterialPriceClassesFur_ID="+$('#txtTree').combotree('getValue')+"&"
+"Remark="+$('#txtRemark').val(),
//把获取界面的值传给控制器
function (data){
if(data>0){
//如果控制器传来的data是有数据的,那就进行刷新下拉树
$.getJSON("/CaiLiaoDanJia/TreeBangDing",
function(data){
$('#treMaterial').tree('loadData', data);
//把新增的数据绑定给下拉树
alert("新增成功!");
//提醒你新增成功!
$('#wInsertMaterialClasses').window('close');
//新增成功后,新增窗体就会关闭
}
);
}
else{
//如果控制那边没有数据传来,那就新增失败了
alert("对不起,新增失败!")
}
} );
}
}
(4)界面层的数据通过参数传到控制器的代码:
#region 新增材料分类
public ContentResult InsertMaterialPriceClasses(string MaterialPriceClassesName, int MaterialPriceClassesFur_ID, string Remark)
{
int dt = myCaiLiaoDanJia.MaterialPriceClasses_Insert(MaterialPriceClassesName, MaterialPriceClassesFur_ID, Remark);
return Content(dt.ToString());
}
#endregion
(5)控制器的数据通过参数传到逻辑层的代码:
#region 新增材料分类
public int MaterialPriceClasses_Insert(string MaterialPriceClassesName, int MaterialPriceClassesFur_ID, string Remark)//参数要和数据层的个数对应
{
SqlParameter[] mySqlParameter = {
new SqlParameter("@Type",SqlDbType.Char),
new SqlParameter("@MaterialPriceClassesName",SqlDbType.Char),
new SqlParameter("@MaterialPriceClassesFur_ID",SqlDbType .Int),
new SqlParameter("@Remark",SqlDbType .Char),
};
//生成数组
mySqlParameter[0].Value = "MaterialPriceClasses_Insert";//对应存储过程名
mySqlParameter[1].Value = MaterialPriceClassesName;
mySqlParameter[2].Value = MaterialPriceClassesFur_ID;
mySqlParameter[3].Value = Remark;
int i = myDALMethod.DAL_OPTableDB_Par("CaiLiaoDanJia", mySqlParameter);
return i;//然后再返回给控制器
}
#endregion
(6)逻辑层的数据通过参数传到数据层的代码:
if @Type='MaterialPriceClasses_Insert'
begin
insert SYS_MaterialPriceClassesList(MaterialPriceClassesName,MaterialPriceClassesFur_ID,Remark)
values (@MaterialPriceClassesName,@MaterialPriceClassesFur_ID,@Remark)
end
(6)新增成功后的下拉树截图:
(1)对已经存在的下拉树的节点进行修改,首先先选中你要修改的节点,再点击修改按钮,会弹出修改材料单价分类的窗体:
(2)当你选中你要修改的节点,再点击修改按钮时,其实在打开修改窗体的同时,就在进行一个绑定数据的操作,代码如下:
//打开修改窗口
function UpdataMaterialPriceClasses() {
var Tree1 = $('#treMaterial').tree('getSelected');
//选中你要修改的节点
if (Tree1) {
//如果这个节点存在
//那修改窗体就会打开
$('#wUpdatetMaterialClasses').window('open');
BindingMaterialPriceClasses();
//调用帮的节点的方法
}
else {
//如果没有选中节点,就会提醒你选中
alert("请选择要修改的部门!")
}
}
//修改下拉树_ 绑定数据
function BindingMaterialPriceClasses(){
var TreeID=$('#treMaterial').tree('getSelected');
if(TreeID){
$('#txtTreeClasses').val(TreeID.text);
//把获取下拉树节点的值赋值给相应的文本框
var TreeTwo=TreeID.id;
}
}
(3)当你修改完节点之后,就点击确认按钮,就会把你修改的值传给界面层,代码如下:
(图 12) //修改下拉树
function MaterialPriceClasses_Updata(){
var TreeID2=$('#treMaterial').tree('getSelected');
//获取要修改的节点赋值给TreeID2
MaterialPriceClassesID=TreeID2.id;
//获取节点id赋值给MaterialPriceClassesID
if(TreeID2){
//判断节点是否存在
if (confirm('是否需要修改?')){
//修改之前再确认一下 $.getJSON("MaterialPriceClasses_Updata?MaterialPriceClassesName="+$('#txtTreeClasses').val()+"&"
+"MaterialPriceClassesFur_ID="+$('#txtTreeHall').combotree('getValue')+"&"
+"Remarkint="+$('#txtTreeRemark').val()+"&"
+"MaterialPriceClassesID="+MaterialPriceClassesID,
//把从界面获取出的值传给参数,传给控制器
function (data){
if (data>0){
//如果控制器那边有数据传来,就把修改后的下拉树刷新一次
$.getJSON("/CaiLiaoDanJia/TreeBangDing",
function (data) {
$('#treMaterial').tree('loadData', data);
//修改后的下拉树的数据再重新绑定
alert("修改成功!");
$('#wUpdatetMaterialClasses').window('close');
//修改成功之后,窗体自动关闭
});
}
else{
alert("修改失败!");
}
});
}
}
else{
alert("请选中需要修改的节点!");
}
}
(4)控制器的数据返回给界面层的代码:
#region 修改材料分类
public ContentResult MaterialPriceClasses_Updata(string MaterialPriceClassesName, int MaterialPriceClassesFur_ID, string Remarkint, int MaterialPriceClassesID)
{
int dt = myCaiLiaoDanJia.MaterialPriceClasses_Updata(MaterialPriceClassesName, MaterialPriceClassesFur_ID, Remarkint, MaterialPriceClassesID);
return Content(dt.ToString());
}
#endregion
(5)逻辑层的数据返回给控制器的代码:
#region 修改下拉树
public int MaterialPriceClasses_Updata(string MaterialPriceClassesName, int MaterialPriceClassesFur_ID, string Remarkint, int MaterialPriceClassesID)
{
SqlParameter[] mySqlParameter = {
new SqlParameter("@Type",SqlDbType.Char),
new SqlParameter ("@MaterialPriceClassesName",SqlDbType .Char),
new SqlParameter ("@MaterialPriceClassesFur_ID",SqlDbType .Int ),
new SqlParameter ("@Remark",SqlDbType .Char),
new SqlParameter ("@MaterialPriceClassesID",SqlDbType .Int),
};
mySqlParameter[0].Value = "MaterialPriceClasses_Updata";
mySqlParameter[1].Value = MaterialPriceClassesName;
mySqlParameter[2].Value = MaterialPriceClassesFur_ID;
mySqlParameter[3].Value = Remarkint;
mySqlParameter[4].Value = MaterialPriceClassesID;
int i = myDALMethod.DAL_OPTableDB_Par("CaiLiaoDanJia", mySqlParameter);
return i;
}
#endregion
(6)数据层的数据传给逻辑层控制器的代码:
--树形的修改
if @Type='MaterialPriceClasses_Updata'
begin
update SYS_MaterialPriceClassesList
set MaterialPriceClassesName=@MaterialPriceClassesName,MaterialPriceClassesFur_ID=@MaterialPriceClassesFur_ID,Remark=@Remark //要声明变量
where MaterialPriceClassesID=@MaterialPriceClassesID
end
(7) 对下拉树节点修改成功后的截图:
(图 13)(1)对于多余的下拉树节点,可以对其进行删除(其实就是删除某个节点的id),首先要先选中你要删除的节点,再点击删除按钮:
(2)点击确定按钮之后,会把获取的节点ID返回给界面层,代码如下:
//删除节点—材料分类
function MaterialPriceClasses_Delete(){
var TreeID2=$('#treMaterial').tree('getSelected');
//先选中要删除的节点
MaterialPriceClassesID=TreeID2.id;
//获取选中节点的id
if(TreeID2){
//判断是否选中节点
if(confirm('是否删除该节点及以下材料分类')){
//删除之前先进行确认
$.getJSON("MaterialPriceClasses_Delete?MaterialPriceClassesID="+MaterialPriceClassesID,
function (data){
if (data>0){
$.getJSON("/CaiLiaoDanJia/TreeBangDing",
function (data){
$('#treMaterial').tree('loadData', data);
alert("删除成功!");
});
}
else{
alert("删除失败!");
}
});
}
}
else{
alert("请选中需要删除的节点!");
}
}
(3)界面层获取的值传给控制器:
#region 删除材料分类-下拉树
public ContentResult MaterialPriceClasses_Delete(int MaterialPriceClassesID)
{
int i = myCaiLiaoDanJia.MaterialPriceClasses_Delete(MaterialPriceClassesID);
return Content(i.ToString());
}
#endregion
(4)逻辑层的数据返回给控制器,代码如下:
#region 删除下拉树-材料分类
public int MaterialPriceClasses_Delete(int MaterialPriceClassesID)
{
SqlParameter[] mySqlParameter = {
new SqlParameter ("@Type",SqlDbType .Char),
new SqlParameter ("@MaterialPriceClassesID",SqlDbType.Int),
};
mySqlParameter[0].Value = "MaterialPriceClasses_Delete";
mySqlParameter[1].Value = MaterialPriceClassesID;
int i = myDALMethod.DAL_OPTableDB_Par("CaiLiaoDanJia", mySqlParameter);
return i;
//把数据返回给控制器
}
#endregion
--材料分类的删除
if @Type='MaterialPriceClasses_Delete'
begin
delete SYS_MaterialPriceClassesList
where MaterialPriceClassesID=@MaterialPriceClassesID
--根据材料单价的ID进行删除
end
(6)删除成功后的截图:
(1)当点击添加按钮时,就会弹出添加材料单价的窗体:
添加材料单价的窗体如下图:
(图 16)添加材料单价窗体的界面代码:
(2)当你输完数据之后,要先计算预算单价,预算单价已经设置了只读属性,只能计算得出,不能手写,运杂费也不能输入,只能在datagrid中双击运杂费那一列,弹出专门计算运杂费的窗体进行计算。
(图 17)点击计算的界面方法:,代码如下:
/计算1
function Count(){
var MaterialCostPrice=$('#txtMaterialCostPrice').val();
//单个获取界面输入的各种价格
var PackagingPrice=$('#txtPackagingPrice').val();
var Fare=$('#txtFare').val();
var BuyingAndHoldPrice=$('#txtBuyingAndHoldPrice').val();
var TransferSafeCost=$('#txtTransferSafeCost').val();
var u=$('#txtBudgetPrice').val();
u=MaterialCostPrice*1+PackagingPrice*1+Fare*1+BuyingAndHoldPrice*1+TransferSafeCost*1//获取值后再进行组合,赋值给u
$('#txtBudgetPrice').val(u);
//把u赋值给 预算单价的文本框
}
(3)计算出预算价格后,点击保存,就会把 值传给界面层:
(图 18)(4) 当打开添加材料单价的窗体时,代码就会自动生成:
界面层的代码: //自动增加单号
var Code=0;
//声明变量Code;
function oddnumbers(){
if(confirm('您是否需要进行新增材料单价这一操作?')){
$('#wInsertMaterialPrice').window('open');
//添加材料窗体打开
$.getJSON("/CaiLiaoDanJia/Insert_Code/",
function (data) {
//从控制器传来的数据data
Code= data[0].InsertCode;
//获取data数据索引为0的数据,赋值给Code
var t="C0"+ Code;
$('#txtCode').val(t);
//把 t 的值赋值给代号的文本框
});
}
else{
alert("您已经取消新增材料单价这一操作!");
}
}
控制器的代码:
#region 自动增加单号
public ActionResult Insert_Code()
{
DataTable dt = myCaiLiaoDanJia.Insert_Code();
List> listReturn = ConvertHelper.DtToList(dt);
return Json(listReturn, JsonRequestBehavior.AllowGet);
}
#endregion
逻辑层的代码:
#region 自动增加单号
public DataTable Insert_Code()
{
SqlParameter[] mySQL = {
new SqlParameter("@type",SqlDbType.Char),
};
mySQL[0].Value = "Insert_Code";
DataTable dt = myDALMethod.DAL_SelectDB_Par("CaiLiaoDanJia", mySQL);
return dt;
}
#endregion
数据库的代码:
if @type='Insert_Code'
BEGIN
begin tran
update InsertCode
set InsertCode=InsertCode+1
SELECT InsertCode
FROM InsertCode
commit tran
end
(5)点击保存,把值传给界面层:
/新增材料单价
var sd=0;
//声明变量sd=0;
function MaterialPrice_Insert (){
var r=document.getElementById("repeat").checked;
//把id为repeat的复选框被选中时的状态赋值给 r (看是否选中多次重复添加)
var txtIfMainMaterial=false;
if( document.getElementById('txtIfMainMaterial').checked==true){
//判断checkBox是否被选中
txtIfMainMaterial=true;
}
var txtOwnerSupplyMaterial=false;
if(document.getElementById('txtOwnerSupplyMaterial').checked==true){
txtOwnerSupplyMaterial=true;
}
var MaterialPriceClassesID=$('#treMaterial').tree('getSelected');
// 先选中下拉树的节点
if(MaterialPriceClassesID){
//如果某个节点被选中
//就把被选中节点的id赋值给 sd
sd =MaterialPriceClassesID.id;
}
if(confirm('是否需要新增?')){
//先确定是否需要新增?
if(sd !=0){
//如果 sd 不等于0(也就是节点被选中),就执行下面的代码
$.getJSON("/CaiLiaoDanJia/MaterialPrice_Insert?Code="+$('#txtCode').val()+"&"
+"Name="+$('#txtName').val()+"&"
+"Unit="+$('#txtUnit').val()+"&"
+"MaterialCostPrice="+$('#txtMaterialCostPrice').val()+"&"
+"PackagingPrice="+$('#txtPackagingPrice').val()+"&"
+"Fare="+$('#txtFare').val()+"&"
+"BuyingAndHoldPrice="+$('#txtBuyingAndHoldPrice').val()+"&"
+"TransferSafeCost="+$('#txtTransferSafeCost').val()+"&"
+"BudgetPrice="+$('#txtBudgetPrice').val()+"&"
+"IfMainMaterial="+txtIfMainMaterial+"&"
+"OwnerSupplyMaterial="+txtOwnerSupplyMaterial+"&"
+"MaterialPriceClassesID="+sd+"&"
+"BuildProjectID="+@Session["项目ID"]
//把界面获取的值传给控制器的参数
,
function (data){
if (data>0){
//看是否控制器有数据传来$.getJSON("/CaiLiaoDanJia/SelectAllCaiLiao?BuildProjectID="+ @Session["项目ID"],
function(data){
$('#w材料单价').datagrid('loadData',data);
alert("新增成功!");
if (r){
//如果选中了多次重复添加的复选框
$('#wInsertMaterialPrice').window('open');
//那么添加材料单价的窗体就会打开
//并且会清空文本框的值
$('#txtCode').val("");
$('#txtName').val("");
$('#txtUnit').val("");
$('#txtMaterialCostPrice').val("");
$('#txtPackagingPrice').val("");
$('#txtFare').val("0.00");
$('#txtBuyingAndHoldPrice').val("");
$('#txtTransferSafeCost').val("");
$('#txtBudgetPrice').val("");
oddnumbers();
//自动生成代号的方法
}
else{
//如果没有选中多次重复添加,则会关闭其窗体
$('#wInsertMaterialPrice').window('close');
alert("新增成功后,请双击列名为“运杂费”,进行运杂费的计算!");
}
} );
}
else{
alert("新增失败");
}
});
}
else{
//如果没选中下拉树,就不能进行保存操作,系统会自动提醒
alert("请选中下拉树!");
}
}
}
(6)把界面保存的值传给控制器,代码如下:
#region 新增材料单价
public ContentResult MaterialPrice_Insert(string Code, string Name, string Unit, decimal MaterialCostPrice, decimal PackagingPrice, decimal Fare, decimal BuyingAndHoldPrice, decimal TransferSafeCost, decimal BudgetPrice, bool IfMainMaterial, bool OwnerSupplyMaterial, int MaterialPriceClassesID, int BuildProjectID)
{
int dt = myCaiLiaoDanJia.MaterialPrice_Insert(Code, Name, Unit, MaterialCostPrice, PackagingPrice, Fare, BuyingAndHoldPrice, TransferSafeCost, BudgetPrice, IfMainMaterial, OwnerSupplyMaterial, MaterialPriceClassesID, Bu ildProjectID);
return Content(dt.ToString());
}
#endregion
(7) 把控制器的值通过参数传给逻辑层,代码如下:
#region 新增材料单价
public int MaterialPrice_Insert(string Code, string Name, string Unit, decimal MaterialCostPrice, decimal PackagingPrice, decimal Fare, decimal BuyingAndHoldPrice, decimal TransferSafeCost, decimal BudgetPrice, bool IfMainMaterial, bool OwnerSupplyMaterial, int MaterialPriceClassesID, int BuildProjectID)
{
SqlParameter[] mySqlParameter = {
new SqlParameter("@Type",SqlDbType.Char),
new SqlParameter ("@Code",SqlDbType.Char),
new SqlParameter ("@Name",SqlDbType.Char),
new SqlParameter ("@Unit",SqlDbType.Char),
new SqlParameter ("@MaterialCostPrice",SqlDbType.Decimal),
new SqlParameter ("@PackagingPrice",SqlDbType.Decimal),
new SqlParameter ("@Fare",SqlDbType .Decimal),
new SqlParameter ("@BuyingAndHoldPrice",SqlDbType .Decimal),
new SqlParameter ("@TransferSafeCost",SqlDbType .Decimal ),
new SqlParameter ("@BudgetPrice",SqlDbType.Decimal ),
new SqlParameter ("@IfMainMaterial",SqlDbType.Bit),
new SqlParameter ("@OwnerSupplyMaterial",SqlDbType.Bit),
new SqlParameter ("@MaterialPriceClassesID",SqlDbType.Int),
new SqlParameter ("@BuildProjectID",SqlDbType.Int),
};
mySqlParameter[0].Value = "MaterialPrice_Insert";
mySqlParameter[1].Value = Code;
mySqlParameter[2].Value = Name;
mySqlParameter[3].Value = Unit;
mySqlParameter[4].Value = MaterialCostPrice;
mySqlParameter[5].Value = PackagingPrice;
mySqlParameter[6].Value = Fare;
mySqlParameter[7].Value = BuyingAndHoldPrice;
mySqlParameter[8].Value = TransferSafeCost;
mySqlParameter[9].Value = BudgetPrice;
mySqlParameter[10].Value = IfMainMaterial;
mySqlParameter[11].Value = OwnerSupplyMaterial;
mySqlParameter[12].Value = MaterialPriceClassesID;
mySqlParameter[13].Value = BuildProjectID;
int i = myDALMethod.DAL_OPTableDB_Par("CaiLiaoDanJia", mySqlParameter);
return i;
//返回数据给控制器
}
#endregion
(8)把逻辑层的值通过参数传给数据层,代码如下:
--材料单价的新增
if @Type='MaterialPrice_Insert'
begin
insert SYS_MaterialPriceList(Code, Name, Unit, MaterialCostPrice, PackagingPrice, Fare, BuyingAndHoldPrice, TransferSafeCost, BudgetPrice, IfMainMaterial, OwnerSupplyMaterial,MaterialPriceClassesID,BuildProjectID)
values (@Code,@Name, @Unit, @MaterialCostPrice, @PackagingPrice, @Fare, @BuyingAndHoldPrice, @TransferSafeCost, @BudgetPrice, @IfMainMaterial, @OwnerSupplyMaterial,@MaterialPriceClassesID,@BuildProjectID)
end
(9)新增完之后的截图,还需要新增运杂费:
双击运杂费,出现计算运杂费的窗体:
(图 20)计算运杂费的界面代码:
运输项目
运输项目
费用
(9.1)双击运杂费界面实现的方法:
//双击运杂费
function ShuangJiYunZaFei(rowIndex, field, value){
if(field=="Fare"){
//如果双击列名为Fare时,就会打开计算运输项目的窗体
$('#InsertyunZaFei').window('open');
Insertyunshu();
//加载左边运输项目的方法
}
}
function Insertyunshu(){
var CaiLiaoID=$('#w材料单价').datagrid('getSelected');
$.getJSON("/CaiLiaoDanJia/BangDingXiangMu?MaterialPriceID="+CaiLiaoID.MaterialPriceID,
function(data){
$('#InsertYunShuXiangMu').datagrid('loadData',data);
});
}
(9.2)(图 21)中添加的方法在界面层中的代码:
//左移
var trues=0;
function ZuoYi(){
var YunShuXiangMu=$('#TianJiaYunShuXiangMu').datagrid('getSelected');
//先选中右边运输项目的一行,赋值给YunShuXiangMu
var CaiLiaoID=$('#w材料单价').datagrid('getSelected');
var e=$('#InsertYunShuXiangMu').datagrid('getData');
//获取整个右边项目的数据
for(var j=0;j
(9.2.1)点击添加后,就会把界面层的数据通过参数传给控制器,代码如下:
#region 添加运输项目
public ContentResult TianJiaYunFeiXiangMu(int MaterialPriceID, string YunShuXiangMu, string FeiYong)
{
int dt = myCaiLiaoDanJia.TianJiaYunFeiXiangMu(MaterialPriceID, YunShuXiangMu, FeiYong);
return Content(dt.ToString());
}
#endregion
(9.2.2)控制器的数据传给逻辑层的代码:
#region 新增运输项目
public int TianJiaYunFeiXiangMu(int MaterialPriceID, string YunShuXiangMu, string FeiYong)
{
SqlParameter[] mySqlParameter = {
new SqlParameter("@Type",SqlDbType.Char),
new SqlParameter ("@MaterialPriceID",SqlDbType.Int),
new SqlParameter ("@YunShuXiangMu",SqlDbType.Char),
new SqlParameter ("@FeiYong",SqlDbType.Char),
};
mySqlParameter[0].Value = "InsertYunFeiXiangMu";
mySqlParameter[1].Value = MaterialPriceID;
mySqlParameter[2].Value = YunShuXiangMu;
mySqlParameter[3].Value = FeiYong;
int i = myDALMethod.DAL_OPTableDB_Par("CaiLiaoDanJia", mySqlParameter);
return i;
}
#endregion
(9.2.3)逻辑层的数据传给数剧层的代码:
--新增运费项目
if @Type='InsertYunFeiXiangMu'
begin
insert Sys_YunShuXiangMuBiao( MaterialPriceID, YunShuXiangMu, FeiYong)
values ( @MaterialPriceID, @YunShuXiangMu, @FeiYong)
end
(9.3)当你对里面涉及到费用的文本框时,运输公式中相应的数字会发生改变,运杂费也会自动计算出来,所用到的界面的代码如下:
(图 23)代码:
//在相应的文本框设置了onkeyup事件
var a="";
var b="";
var c="";
var d="";
var e="";
var f="";
var g="";
function ZhuangCheFei(){
a= ($('#ZhuangCheFei').val()).trim();
b= $('#YunFei').val().trim();
c=$('#YunJu').val().trim();
d=$('#ZhuangXishu').val().trim();
e=$('#XiShu').val().trim();
f= $('#XieCheFei').val().trim();
g= $('#QiTa').val().trim();
//获取文本框里的值
$('#YunShuGongShi').val(a+"+"+b+"*"+c+"*"+d+"/"+e+"+"+f+"+"+g);
var Count=a*1+b*c*d/e+f*1+g*1;
$('#yunzafei').val(Count);
//把计算出的结果赋值给运杂费的文本框
}
(图 24)
function InsertYunZaFei(){
var CaiLiaoID=$('#w材料单价').datagrid('getSelected');
//要选中需要新增运杂费的材料单价的datagrid
var XiangMu= $('#YunShuXiangMu').datagrid('getSelected');
//先选中左边的id为YunShuXiangMu'的datagrid
$.getJSON("/CaiLiaoDanJia/SelectedYunZaFei?YunShuXiangMuID="+XiangMu.YunShuXiangMuID,
//先进行查询,如果已经添加了,就不能进行添加
function(data){
if(data.length<1){
//如果从控制器传来的data无数据,就可以进行添加
$.getJSON("/CaiLiaoDanJia/InsertYunZaFei?YunShuXiangMuID="+XiangMu.YunShuXiangMuID+"&"
+"运输起点="+$('#YunShuQiDianWeiZhi').val().trim()+"&"
+"装车费="+a+"&"
+"每公里运费="+b+"&"
+"运距="+c+"&"
+"系数="+e+"&"
+"装载系数="+f+"&"
+"卸车费="+d+"&"
+"其它="+g+"&"
+"计算公式="+$('#YunShuGongShi').val().trim()+"&"
+"每吨运杂费="+$('#yunzafei').val().trim()+"&"
+"交货地点="+$('#JiaoHuoDiDiao').val()+"&"
+"交货条件="+$('#JiaoHuoTiaoJian').val()+"&"
+"交货等级="+$('#HuoWuDengJi').val()+"&",
function(data){
});
$.getJSON("/CaiLiaoDanJia/UpdateYunFeiXiangMu?MaterialPriceID="+CaiLiaoID.MaterialPriceID+"&"
+"FeiYong="+$('#yunzafei').val().trim()+"&"
+"YunShuXiangMuID="+XiangMu.YunShuXiangMuID,
function(data){
$.getJSON("/CaiLiaoDanJia/BangDingXiangMu?MaterialPriceID="+CaiLiaoID.MaterialPriceID,
function(data){
$('#YunShuXiangMu').datagrid('loadData',data);
});
});
}
else{
alert("不能进行添加,已添加了一条数据!");
}
});
XiangMu.FeiYong=$('#yunzafei').val().trim();
$('#YunShuXiangMu').datagrid('refreshRow',INdex);
}
#region 新增运杂费
public ContentResult InsertYunZaFei(string YunShuXiangMuID, string 运输起点, string 装车费, string 每公里运费,string 运距, string 系数, string 装载系数, string 卸车费, string 其它, string 计算公式, string 每吨运杂费,
string 交货地点, string 交货条件, string 交货等级)
{
int dt = myCaiLiaoDanJia.InsertYunZaFei(Convert.ToInt32(YunShuXiangMuID), 运输起点, 装车费, 每公里运费, 运距, 系数, 装载系数, 卸车费, 其它, 计算公式, 每吨运杂费, 交货地点, 交货条件, 交货等级);
return Content(dt.ToString());
}
#endregion
(9.4.2)逻辑层的代码:
#region 新增运杂费
public int InsertYunZaFei(int YunShuXiangMuID, string 运输起点, string 装车费, string 每公里运费,string 运距, string 系数, string 装载系数, string 卸车费, string 其它, string 计算公式, string 每吨运杂费,
string 交货地点, string 交货条件, string 交货等级)
{
SqlParameter[] mySqlParameter = {
new SqlParameter("@Type",SqlDbType.Char),
new SqlParameter ("@YunShuXiangMuID",SqlDbType.Int),
new SqlParameter ("@运输起点",SqlDbType.Char),
new SqlParameter ("@装车费",SqlDbType.Char),
new SqlParameter ("@每公里运费",SqlDbType.Char),
new SqlParameter ("@运距",SqlDbType.Char),
new SqlParameter ("@系数",SqlDbType .Char),
new SqlParameter ("@装载系数",SqlDbType .Char),
new SqlParameter ("@卸车费",SqlDbType .Char ),
new SqlParameter ("@其它",SqlDbType.Char ),
new SqlParameter ("@计算公式",SqlDbType.Char),
new SqlParameter ("@每吨运杂费",SqlDbType.Char),
new SqlParameter ("@交货地点",SqlDbType.Char ),
new SqlParameter ("@交货条件",SqlDbType.Char),
new SqlParameter ("@交货等级",SqlDbType.Char),
};
mySqlParameter[0].Value = "InsertYunZaFei";
mySqlParameter[1].Value = YunShuXiangMuID;
mySqlParameter[2].Value = 运输起点;
mySqlParameter[3].Value = 装车费;
mySqlParameter[4].Value = 每公里运费;
mySqlParameter[5].Value = 运距;
mySqlParameter[6].Value = 系数;
mySqlParameter[7].Value = 装载系数;
mySqlParameter[8].Value = 卸车费;
mySqlParameter[9].Value = 其它;
mySqlParameter[10].Value = 计算公式;
mySqlParameter[11].Value = 每吨运杂费;
mySqlParameter[12].Value = 交货地点;
mySqlParameter[13].Value = 交货条件;
mySqlParameter[14].Value = 交货等级;
int i = myDALMethod.DAL_OPTableDB_Par("CaiLiaoDanJia", mySqlParameter);
return i;
}
#endregion
(9.4.3)数据层的代码:
--新增运杂费
if @Type='InsertYunZaFei'
begin
insert [Sys-YunZaFeiBiao](YunShuXiangMuID, 运输起点,装车费,每公里运费,运距,系数,装载系数,卸车费,其它,计算公式, 每吨运杂费,交货地点,交货条件,交货等级)
values (@YunShuXiangMuID, @运输起点, @装车费, @每公里运费, @运距, @系数, @装载系数, @卸车费, @其它, @计算公式, @每吨运杂费, @交货地点, @交货条件, @交货等级)
end
(9.4.4)新增运杂费后的截图
(图 25)(图 26)