铁水质量导出表开发过程
首先,熟读业务需求,调研数据,制定开发计划
(一)前端
一. 页面,即 . aspx文件:
1. 指定模板页是哪个
<%@ Page Title="" Language="C#" MasterPageFile="~/PageMaster.master" AutoEventWireup="true" CodeFile="AIronMakeReport.aspx.cs" Inherits="QDC_AIronMakeReport" %>
2. 在<asp></asp>标签中,写我们要展示的内容
<asp:Content ID="Content1" ContentPlaceHolderID="BodyContentPlaceHolder" runat="Server">
</asp:Content>
3.页面最上边,展示供客户使用的查询条件和按钮
<div id="searchDataForm" class="flow_data_form flow_data_form_search">
<label>
<span>工作时间: </span>
<input id="workDateInput" type="text" property="SampleNoTime" dataformat="Y-M-D" datatype="date" class="data_input date_picker" compare=">=" />
<span>至: </span>
<input id="workDateEndInput" type="text" property="SampleNoTime" dataformat="Y-M-D" datatype="date" class="data_input date_picker" compare="<" adddates="1" />
</label>
<label>
<span>炉座号:</span>
<input id="stoveNo" type="text" class="data_input" property="StoveNo" compare="like" comparevalue="'%?%'" />
</label>
<label>
<span>班次:</span>
<input id="workingShift" type="text" class="data_input" property="TeamNo" compare="like" comparevalue="'%?%'" />
</label>
<div>
<input id="searchBtn" type="button" value="查询" class="button" />
<input id="expBtn" type="button" value="导出" class="button" />
<input id="manageBtn" type="button" style="width: auto" value="批量处理" class="button" />
</div>
<div>
<input type="reset" class="button" id="button" value="重置" />
</div>
</div>
4.页面展示的table表格
<table class="grid_panel" id="ironReport" datastore="reportDataStore" exportable="false">
<tr>
<th checkbox="true" datamember="Id" dataalign="center" width="20">
<input class="data_check_all" type="checkbox" />
</th>
<th rownumber="true" dataalign="center" width="40">序号</th>
<th datamember="SampleNoTime" dataformat="Y-M-D" dataalign="center" summarytype="custom" sortable="false" render="renderWorkTimeColumn">工作时间</th>
<th datamember="StoveNo" dataalign="center"summarytype="custom" sortable="false" render="renderStoveNoColumn">炉座号</th>
<th datamember="TeamNo" dataalign="center" summarytype="custom" sortable="false" render="renderTeamNoColumn">班次</th>
<th datamember="Times" dataalign="center" summarytype="custom" sortable="false" render="renderTimesColumn">铁次</th>
<th datamember="PackageNum" dataalign="center" summarytype="custom" sortable="false" render="renderPackageNumColumn">包号</th>
<th datamember="SampleCode" dataalign="center" summarytype="custom" sortable="false" render="renderSampleCodeColumn">样品编码</th>
<th datamember="S" dataalign="center" summarytype="custom" sortable="false" render="renderSColumn">S</th>
<th datamember="Si" dataalign="center" sortable="false">Si</th>
<th datamember="DecideResult" dataalign="center" sortable="false" summarytype="custom" render="renderDecideResultColumn">判定结果</th>
<th datamember="IronWeight" dataalign="center" sortable="false">铁重(t)</th>
<th datamember="EliminateName" dataalign="center" sortable="false">是否剔除</th>
<th datamember="WeedOoutReason" dataalign="center">剔除原因</th>
</tr>
</table>
5. 用户点击【批量处理】按钮后,弹出的对话框
<div id="addEditDialog" class="nst_dialog nst_dialog_out" width="80%" height="90%">
<div class="nst_dialog_body">
<table class="grid_panel" id="manageGridPanel" datastore="manageDataStore" pagingtoolbar="false" nowrap="true" maxpanelheight="330" sortable="false">
<tr>
<th rownumber="true" dataalign="center">序号</th>
<th datamember="SampleNoTime" dataalign="left" dataformat="Y-M-D">日期</th>
<th datamember="StoveNo" dataalign="center">炉座号</th>
<th datamember="TeamNo" dataalign="center">班次</th>
<th datamember="Times" dataalign="center">铁次</th>
<th datamember="PackageNum" dataalign="center">包号</th>
<th datamember="SampleCode" dataalign="center">样品编码</th>
<th datamember="S" dataalign="center">S</th>
<th datamember="Si" dataalign="center">Si</th>
<th datamember="DecideResult" dataalign="center" >判定结果</th>
<th datamember="IronWeight" dataalign="center" render="renderIronColumn">铁重(t)</th>
<th datamember="EliminateId" dataalign="center" render="renderEliminateIdColumn">是否剔除</th>
<th datamember="WeedOoutReason" dataalign="right" render="renderReasonColumn">剔除原因</th>
</tr>
</table>
</div>
<div class="nst_dialog_action_bar">
<input id="saveBtn" type="button" value="保存" class="button" />
<input id="cancelBtn" type="button" value="取消" class="button" />
</div>
</div>
6. <iframe>标签:被用来在当前 HTML 中嵌入另一个文档
<iframe id="expIframe"></iframe>
二. 前端JavaScript 即 .js中的文件
1. “数据源”和“按钮”(包括弹框内的)
$(function () {
//定义页面数据源
new DataStore({
id: "reportDataStore",
dataSource: "RFN.BM.QDC.AIronMakeExperimentInfo",
idProperty: "Id",
sort: "SampleNoTime DESC",
pageSize: 15,
dataHandler: "RFN.BL.QDC.AIronMakeExperiment.Handler",
}).setData([]);
//定义弹窗数据源
new DataStore({
id: "manageDataStore",
dataSource: "RFN.BM.QDC.AIronMakeExperimentInfo",
//idProperty: "Id",
sort: "ExperimentTime DESC",
pageSize: 15,
dataHandler: "RFN.BL.QDC.AIronMakeExperiment.Handler",
}).setData([]);
//【是否剔除】数据源
new DataStore({
id: "eliminateDataStore",
idProperty: 'Id',
dataSource: "RFN.BM.HRM.DataDictInfo",
constraint: "[ParentCode]=?",
values: ["true_or_false"],
sort: "Sort ASC"
}).load();
//查找按钮;
$("#searchBtn").click(clickSearchBtn);
$("#searchBtn").click();
//点击批量处理 触发按钮
$("#manageBtn").click(clickManageBtn);
//点击(弹窗界面中的)保存 触发按钮
$("#saveBtn").click(clickSaveBtn);
//点击(弹窗界面中的)取消 触发按钮
$("#cancelBtn").click(clickCancelBtn);
//导出 按钮
$("#expBtn").click(clickExpBtn);
})
2.点击【查询】按钮时,所执行的方法
//点击【查找】按钮 所执行的方法
function clickSearchBtn() {
//constraint 是调用那些,自动生成的查询方法使用的; 而 sqlConstraint 是调用自己写的方法时,拼接SQL语句时使用的
var searchData = { sqlConstraint: " 1=1 ", constraint: "1=1", values: [] };
//查询条件:样品编码的字符串,下标为9的数值等于1,符合该条件就是'铁水'
searchData.constraint += " AND substr([SampleNo],9,1) = '1' ";
searchData.sqlConstraint += " AND substr(T.SAMPLE_NO,9,1) = '1' ";
//通过id,获得 工作开始时间 和 工作结束时间 的值
var workDateInput = DatePickerMgr.get("workDateInput").getValue();
var workDateEndInput = DatePickerMgr.get("workDateEndInput").getValue();
//设置 工作开始结束 时间 的格式
var workDateInput1 = Nst.formatDate(workDateInput, "Y-M-D");
var workDateEndInput1 = Nst.formatDate(workDateEndInput, "Y-M-D");
//获得 炉座号 和 班次
var stoveNo = $("#stoveNo").val();
var workingShift = $("#workingShift").val();
//如果有工作的开始和结束时间,拼接 SQL 语句
if (workDateInput) {
searchData.constraint += " AND [SampleNoTime]>=?";
searchData.values.push(workDateInput);
searchData.sqlConstraint += " and to_char(t.SAMPLE_NO_TIME,'yyyy-mm-dd') >= '" + workDateInput1 + "'";
}
if (workDateEndInput) {
searchData.constraint += " AND [SampleNoTime]< ?";
searchData.values.push(workDateEndInput);
searchData.sqlConstraint += " and to_char(t.SAMPLE_NO_TIME,'yyyy-mm-dd') < '" + workDateEndInput1 + "'";
}
//炉座号 模糊查询
if (stoveNo) {
searchData.constraint += " AND [StoveNo] LIKE '%?%'";
searchData.values.push(stoveNo);
searchData.sqlConstraint += " AND T.STOVE_NO LIKE '%'|| '" + stoveNo + "' ||'%'";
}
//班次 模糊查询
if (workingShift) {
searchData.constraint += " AND [TeamNo] LIKE '%?%'";
searchData.values.push(workingShift);
searchData.sqlConstraint += " AND T.TEAM_NO LIKE '%'|| '" + workingShift + "' ||'%'";
}
//var searchData = FlowDataFormMgr.get("searchDataForm").getSearchData();
//searchData.constraint = (searchData.constraint ? searchData.constraint + " AND " : "") + "substr([SampleNo],9,1) = '1' ";
DataStoreMgr.get("reportDataStore").load(searchData);
}
3. 点击【批量处理】时,弹出对话框
//点击【批量处理】按钮,弹出对话框
function clickManageBtn() {
//获取勾选的数据
var checkedDatas = GridPanelMgr.get("ironReport").getCheckedDatas();
//如果没勾选,弹出提示
if (checkedDatas.length == 0) {
alert("请勾选需要处理的数据")
return;
}
//把勾选的数据,装到弹窗的table里
DataStoreMgr.get("manageDataStore").setData(checkedDatas);
//弹窗放在一个div里,根据获取该div
var dialog = NstDialogMgr.get("addEditDialog");
dialog.setTitle("批量处理");
dialog.show();
}
4. 弹窗内展示的内容
//弹窗内:客户输入【铁重】列的展现内容
function renderIronColumn(cell, value, record, column) {
$(cell).html("");
var dataInput = document.createElement("input");
dataInput.className = "dataInput";
$(dataInput).attr("property", "IronWeight");
$(dataInput).attr("datatype", "float");
$(dataInput).attr("nullable", "false");
$(dataInput).attr("label", "铁重");
$(dataInput).val(value);
dataInput.onkeydown = function () {
$(this).attr("oldValue", $(this).val());
}.bind(dataInput);
dataInput.onkeyup = function (entity) {
var value = $(this).val();
if ($(this).attr("oldValue") == value) return;
//声明一个正则表达式对象
var regExp = /^(?:0|[1-9]+\d*)(?:\.\d+)?$/;
var result = regExp.test(value);
var iron = (regExp.test(value) ? parseFloat(value) : 0);
$("#deductTheScore_label_" + entity.DutyId).html(iron);
}.bind(dataInput, record);
$(cell).html("");
$(cell).append(dataInput);
}
//弹窗内:用户选择【是否剔除】列的展现内容,默认选择 "否"
function renderEliminateIdColumn(cell, value, record, column) {
var input = document.createElement("input");
var $input = $(input);
$input.attr("type", "text");
$input.attr("class", "combo_box dataInput");
$input.attr("property", "EliminateId");
$input.attr("datastore", "eliminateDataStore");
$input.attr("valuemember", "Id");
$input.attr("textmember", "Name");
$input.attr("defaultvalue", "{value:'-1',text:'请选择……'}");
//获取 下拉框 里的内容
var comboBox = new ComboBox(input);
//如果有内容,原来的内容 就继续放在下拉框里
if (value != null) {
comboBox.setValue(value);
}
//如果没有内容,就 通过 eliminateId 来获取,该参数是页面 CodeFile="AIronMakeReport.aspx.cs" 的类里传过来的
else {
comboBox.setValue(eliminateId);
}
$(cell).html("");
$(cell).append(input);
}
//弹窗内:用户输入【剔除原因】列的展现内容
function renderReasonColumn(cell, value, record, column) { //cell 单元格 record 记录 colunm 列;栏
$(cell).html("");
var causeInput = document.createElement("input");
causeInput.className = "dataInput";
$(causeInput).attr("property", "WeedOoutReason"); //property 属性 后边应该,对应到,实体类的属性
// $(dataInput).attr("nullable", "false"); //null lable 空标签 为false的话,就是不允许有空标签
$(causeInput).attr("label", "剔除原因"); //如果 lable标签 为空, 则弹窗内容显示【剔除原因】
$(causeInput).val(value); //设置 值为 value
causeInput.onkeydown = function () { //当按下一个按键时,触发方法
$(this).attr("oldValue", $(this).val());
}.bind(causeInput);
causeInput.onkeyup = function (entity) { //当抬起一个按键时,触发方法
var value = $(this).val();
if ($(this).attr("oldValue") == value) return;
}.bind(causeInput, record); //bind里边可以定义多个点击方法,或鼠标移出移入事件
$(cell).html("");
$(cell).append(causeInput); //在该单元格添加 causeInput
}
//弹窗内:点击【保存】按钮 所执行的方法
function clickSaveBtn() {
//先获取当前行的数据
var result = GridPanelMgr.get("manageGridPanel").getRecords();
//用户输入的内容放在集合里
var aIronMakeExperimentInfos = result.records;
//如果【是否剔除】选"是",且没写剔除原因,就提示用户写剔除原因; 如果【是否剔除】选"否",则不用写剔除原因。该判断交给BL处理,调BL的方法,把该集合传给BL
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.UpdateAIronMakeExperimentInfo", [aIronMakeExperimentInfos], function (res) {
//如果没获取到 BL的判断结果,就return掉
if (!Nst.Ajax.checkResult(res)) return;
//关闭弹窗
clickCancelBtn();
//更新页面数据
location.reload();
});
}
//弹窗内:点击【取消】按钮 所执行的方法
function clickCancelBtn() {
//关闭包含弹窗的div
NstDialogMgr.get("addEditDialog").close();
}
5. 为了使页面最后一行 显示汇总功能,table表格中的列 使用了 render 属性 自定义展示
//自定义列表【工作时间】列的展现内容。//最后一行展示【总产量】
function renderWorkTimeColumn(cell, value, record, column, summary) { //summary 总结
//页面对应列有 summarytype="custom" 这个属性,所以每行先进 if 判断一下有没有 summary ,如果没有,就走else
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetIronAmount", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
//如果保留两位小数,可以使用 round 函数 ("产量:" + Nst.round(res.value, 2))
$(cell).html("总产量: " + res.value)
}
});
}
}
//从新写当前列的展示内容,如果有日期,注意设置日期格式
else {
var label = document.createElement("label");
var sampleNoTime = record["SampleNoTime"];
$(label).html(Nst.formatDate(sampleNoTime, "Y-M-D"));
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【炉座号】列的展现内容。//最后一行展示【合格产量】
function renderStoveNoColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetQualifiedAmount", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("合格产量: " + res.value)
}
});
}
}
else {
var label = document.createElement("label");
var StoveNo = record["StoveNo"];
//不用写格式的,就直接把该对象传过来就行了
$(label).html(StoveNo);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【班次】列的展现内容。//最后一行展示【优质产量】
function renderTeamNoColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetExcellentAmount", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("优质产量: " + res.value)
}
});
}
}
else {
var label = document.createElement("label");
var TeamNo = record["TeamNo"];
$(label).html(TeamNo);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【铁次】列的展现内容。//最后一行展示【无样产量】
function renderTimesColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GetNullSpecimenAmount", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("无样产量: " + res.value)
}
});
}
}
else {
var label = document.createElement("label");
var Times = record["Times"];
$(label).html(Times);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【包号】列的展现内容。//最后一行展示【合格率】
function renderPackageNumColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.PercentOfPass", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("合格率: " + res.value + "%")
}
});
}
}
else {
var label = document.createElement("label");
var PackageNum = record["PackageNum"];
$(label).html(PackageNum);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【样品编码】列的展现内容。//最后一行展示【优质率】
function renderSampleCodeColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.PercentOfExcellent", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("优质率: " + res.value + "%")
}
});
}
}
else {
var label = document.createElement("label");
var SampleCode = record["SampleCode"];
$(label).html(SampleCode);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【S】列的展现内容。//最后一行展示【炉温稳定率】
function renderSColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.PercentOfStabilization", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("炉温稳定率: " + res.value + "%")
}
});
}
}
else {
var label = document.createElement("label");
var S = record["S"];
$(label).html(S);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【Si】列的展现内容。//最后一行展示【一般质量事故】
function renderSiColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.GeneralQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("一般质量事故: " + res.value)
}
});
}
}
else {
var label = document.createElement("label");
var Si = record["Si"];
$(label).html(Si);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【铁重(t)】列的展现内容。//最后一行展示【重大质量事故】
function renderIronWeightColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.ImportantQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("重大质量事故: " + res.value)
}
});
}
}
else {
var label = document.createElement("label");
var IronWeight = record["IronWeight"];
$(label).html(IronWeight);
$(cell).html("");
$(cell).append(label);
}
}
//自定义列表【是否剔除】列的展现内容。//最后一行展示【特大质量事故】
function renderEliminateNameColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.VeryBigQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("特大质量事故: " + res.value)
}
});
}
}
else {
var label = document.createElement("label");
var Eliminate = record["EliminateName"];
$(label).html(Eliminate);
$(cell).html("");
$(cell).append(label);
}
}
也是自定义列表里的方法——“标红出格品”
//自定义列表【判定结果】列的展现内容,并把"出格品"------标红------。 //最后一行展示【严重质量事故】
function renderDecideResultColumn(cell, value, record, column, summary) {
if (summary) {
$(cell).html("计算中...");
//获取当前数据源
var report = DataStoreMgr.get("reportDataStore");
if (report.options.sqlConstraint) {
Nst.Ajax.invoke("RFN.BL.QDC.AIronMakeExperiment.SeverityQualityAccident", [sqlConstraint = report.options.sqlConstraint], {
mask: false, callback: function (res) {
if (!Nst.Ajax.checkResult(res)) return;
$(cell).html("严重质量事故: " + res.value)
}
});
}
}
else {
//使用js在页面创建一个 span
var span = document.createElement("span");
var DecideResult = record["DecideResult"];
$(span).html(DecideResult);
$(span).val(value);
$(span).html(value);
$(cell).html("");
$(cell).append(span);
//变色
if (DecideResult == "出格品") {
$(cell).addClass("red");
} else {
$(cell).removeClass("red");
}
}
}
6. 点击【导出】所执行的方法
//点击【导出】按钮。
function clickExpBtn() {
//先获取数据源,因为 查询按钮 所执行的查询条件,是在该数据源中查询的
var reportDataStore = DataStoreMgr.get("reportDataStore");
//根据数据源,获取当前页面的查询条件的SQL语句,该sql语句,在业务逻辑层BL中,自动生成的 查询方法,会拼接该 SQL语句,再去数据库查询,
//然后再用 $.toJSON 压缩成json数组
var jsonData = $.toJSON({
//C#的数据字典 是这样的:Dictionary<[key], [value]> //有点类似于java中的Map //冒号 左边是 key, 右边是 value
constraint: reportDataStore.options.constraint,
values: reportDataStore.options.values
});
//也是根据数据源,获取SQL语句,只不过该SQL语句,是用来,在BL中拼接,我们自己写的方法中的SQL语句
var jsonSql = $.toJSON({sql: reportDataStore.options.sqlConstraint, values: reportDataStore.options.values});
//通过 iframe标签,嵌入到指定路径的页面,并以get请求方式,把上面获取到的 SQL语句,传给指定路径的页面
$("#expIframe").attr("src", "/QDC/Excel/AIronMakeReport.aspx?jsonData=" + jsonData + "&jsonSql=" + jsonSql);
}
三. 前端的样式,即 .css文件
.red *{
background: #F6CECE;
color: red !important;
}
#expIframe {
display: none;
}
四. 页面CodeFile里的内容
这里边是为了让【是否剔除】默认选”否“,用到了另一个表的字段
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//在打开当前页面的时候,就会自动执行该类中的方法
public partial class QDC_AIronMakeReport : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//连接数据库
using (NetStar.Orm.DataContext.OpenDataAccess())
{
//new一个数据字典对象,这里其实是new了另一个业务处理BL的类,调该类的方法查询另一个表的内容
var dataDict = new RFN.BL.HRM.DataDict();
//从数据字典获取 "否"
var eliminateInfo = dataDict.SelectSingleBy("[ParentCode]=? AND [Code]=? AND [Enabled]=?", null, "true_or_false", "false", true);
//获取到 "否" 以后,通过这种形式,传给页面对应的 .js文件
NetStar.Ajax.AjaxCore.RegisterJavaScript(this, new Dictionary<string, object>
{
{"eliminateId", eliminateInfo.Id}
});
}
}
}
五. 导出用的页面
1. 创建一个同名的页面,也是 .aspx后缀的文件,页面内容不用动
2. 导出Excel功能在该页面CodeFile对应的文件里写
using Aspose.Cells;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class QDC_Excel_AIronMakeReport : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//获取 .js 文件 传过来带有 sql 语句的 json数组
var jsonData = this.Request["jsonData"];
var jsonSql = this.Request["jsonSql"];
//把json数组 转换成数据字典Dictionary,它的结构是这样的:Dictionary<[key], [value]>,类似于java中的查找表Map
var dict = (Dictionary<string, object>)NetStar.Json.JsonConverter.FromJson<Dictionary<string, object>>(jsonData);
var jictSql = (Dictionary<string, object>)NetStar.Json.JsonConverter.FromJson<Dictionary<string, object>>(jsonSql);
using (var dataAccess = NetStar.Orm.DataContext.OpenDataAccess())
{
//Workbook对象是一个Microsoft Excel工作簿
var workbook = new Workbook();
var worksheet = workbook.Worksheets[0];
//在第一行设置所有的列, [行数,列数]
worksheet.Cells[0, 0].PutValue("序号");
worksheet.Cells[0, 1].PutValue("工作时间");
worksheet.Cells[0, 2].PutValue("炉座号");
worksheet.Cells[0, 3].PutValue("班次");
worksheet.Cells[0, 4].PutValue("铁次");
worksheet.Cells[0, 5].PutValue("包号");
worksheet.Cells[0, 6].PutValue("样品编码");
worksheet.Cells[0, 7].PutValue("S");
worksheet.Cells[0, 8].PutValue("Si");
worksheet.Cells[0, 9].PutValue("判定结果");
worksheet.Cells[0, 10].PutValue("铁重(t)");
worksheet.Cells[0, 11].PutValue("是否剔除");
worksheet.Cells[0, 12].PutValue("剔除原因");
//new一个业务逻辑层BL的对象
var aIronMakeExperiment = new RFN.BL.QDC.AIronMakeExperiment();
//调BL中自动生成的,带参数的,查询方法,从数据库中查数据,参数是从 .js文件中传过来的,框架中的 ORDER BY 排序里多个Id,所以在这里加个 [Id]
var irons = aIronMakeExperiment.SelectBy((string)dict["constraint"], "[SampleNoTime] DESC,[Id]", (object[])dict["values"]);
//查出来的许多条数据,需要一行一行的写在Excel表中,所以使用for循环来写
for (int i = 0; i < irons.Count; i++)
{
int row = i + 1;
var iron = irons[i];
//按需求,把 S 和 Si 保留指定位数的小数
double S = Math.Round(Convert.ToSingle(iron.SActual == null ? "0" : iron.SActual), 3);//保留3位小数
double Si = Math.Round(Convert.ToSingle(iron.SiActual ?? "0"), 2);//保留2位小数
//声明一个判定结果的字符串
string result = "";
if (S == 0 || Si == 0)
{
result = "无样";
}
else if (S <= 0.03 && 0.2 <= Si && Si <= 0.6)
{
result = "优质品";
}
else if (S <= 0.07 && Si <= 0.8)
{
result = "合格品";
}
else if (S > 0.07 || Si > 0.8)
{
result = "出格品";
}
worksheet.Cells[row, 0].PutValue(row);//序号
worksheet.Cells[row, 1].PutValue(iron.SampleNoTime.ToString("yyyy-MM-dd"));//工作时间,需要注意格式的转换
worksheet.Cells[row, 2].PutValue(iron.StoveNo);//炉座号
worksheet.Cells[row, 3].PutValue(iron.TeamNo);//班次
worksheet.Cells[row, 4].PutValue(iron.Times);//铁次
worksheet.Cells[row, 5].PutValue(iron.PackageNum);//包号
worksheet.Cells[row, 6].PutValue(iron.SampleCode);//样品编码
worksheet.Cells[row, 7].PutValue(S);//硫
worksheet.Cells[row, 8].PutValue(Si);//硅
worksheet.Cells[row, 9].PutValue(result);//判定结果
worksheet.Cells[row, 10].PutValue(iron.IronWeight);//铁重(t)
worksheet.Cells[row, 11].PutValue(iron.EliminateName);//是否剔除
worksheet.Cells[row, 12].PutValue(iron.WeedOoutReason);//剔除原因
}
//循环写完后,irons.Count + 1 就是最下边的行
worksheet.Cells[irons.Count + 1, 0].PutValue("汇总");
//调用BL中,自己写的方法。参数也是从 .js文件传过来的,这里 [" "] 中写的是 key 值
worksheet.Cells[irons.Count + 1, 1].PutValue("总产量:" + aIronMakeExperiment.GetIronAmount((string)jictSql["sql"]));
worksheet.Cells[irons.Count + 1, 2].PutValue("合格产量:" + aIronMakeExperiment.GetQualifiedAmount((string)jictSql["sql"]));
worksheet.Cells[irons.Count + 1, 3].PutValue("优质产量:" + aIronMakeExperiment.GetExcellentAmount((string)jictSql["sql"]));
worksheet.Cells[irons.Count + 1, 4].PutValue("无样产量:" + aIronMakeExperiment.GetNullSpecimenAmount((string)jictSql["sql"]));
worksheet.Cells[irons.Count + 1, 5].PutValue("合格率:" + aIronMakeExperiment.PercentOfPass((string)jictSql["sql"]) + " %");
worksheet.Cells[irons.Count + 1, 6].PutValue("优质率:" + aIronMakeExperiment.PercentOfExcellent((string)jictSql["sql"]) + " %");
worksheet.Cells[irons.Count + 1, 7].PutValue("炉温稳定率:" + aIronMakeExperiment.PercentOfStabilization((string)jictSql["sql"]) + " %");
//worksheet.Cells[irons.Count + 1, 8].PutValue("一般事故:" + 0);
//worksheet.Cells[irons.Count + 1, 9].PutValue("严重事故:" + 0);
//worksheet.Cells[irons.Count + 1, 10].PutValue("重大事故:" + 0);
//worksheet.Cells[irons.Count + 1, 11].PutValue("特大事故:" + 0);
//最后保存导出,至此,导出按钮所触发的功能实现完成
workbook.Save(this.Response, HttpUtility.UrlEncode("铁水质量报表.xls"), ContentDisposition.Attachment, new XlsSaveOptions(SaveFormat.Excel97To2003));
}
}
}
(二)后端
1.自动生成的实体类 .BM文件中,添加了三个属性
namespace RFN.BM.QDC
{
/// <summary>
/// 一炼铁化学实验业务实体类。
/// </summary>
[NetStar.Log.DataLog("一炼铁化学实验")]
[NetStar.Orm.Table("T_QDC_A_IRONMAKE_EXPERIMENT", "T0")]
public partial class AIronMakeExperimentInfo
{
#region Constructor
/// <summary>
/// 构造函数。
/// </summary>
public AIronMakeExperimentInfo()
{
}
#endregion
#region Entity Properties
/// <summary>
/// 获取或设置铁重。
/// </summary>
[NetStar.Log.DataLog("铁重")]
[NetStar.Orm.Column("T0.IRON_WEIGHT")]
public virtual decimal? IronWeight { get; set; }
/// <summary>
/// 获取或设置是否剔除。
/// </summary>
[NetStar.Log.DataLog("是否剔除")]
[NetStar.Orm.Column("T0.ELIMINATE_ID")]
public virtual string EliminateId { get; set; }
/// <summary>
/// 获取或设置剔除原因。
/// </summary>
[NetStar.Log.DataLog("剔除原因")]
[NetStar.Orm.Column("T0.WEED_OUT_REASON")]
public virtual string WeedOoutReason { get; set; }
}
}
2. 创建一个同名的实体类,即部分类,便于在前端展示数据
using System;
namespace RFN.BM.QDC
{
[NetStar.Orm.Join(@" LEFT JOIN T_STM_DATA_DICT T1 ON T0.ELIMINATE_ID = T1.ID ")]
public partial class AIronMakeExperimentInfo
{
/// <summary>
/// 获取或设置是否剔除。 //让该属性获得 T1 (数据字典)表 NAME 的值,别名为 ELIMINATE_NAME
/// </summary>
[NetStar.Orm.Column("T1.NAME", "ELIMINATE_NAME", false)]
public virtual string EliminateName { get; set; }
/// <summary>
/// 获取或设置判定结果。
/// </summary>
public virtual string DecideResult { get; set; }
/// <summary>
/// 获取或设置S实际值。
/// </summary>
public virtual double S { get; set; }
/// <summary>
/// 获取或设置Si实际值。
/// </summary>
public virtual double Si { get; set; }
}
}
3. 自动生成的业务逻辑层BL中,添加Handler和其它我们需要的的方法,其中要求Handler必须是void的
namespace RFN.BL.QDC
{
/// <summary>
/// 一炼铁化学实验业务处理类。
/// </summary>
[NetStar.Ajax.AjaxClass]
public partial class AIronMakeExperiment : NetStar.App.DataContext
{
/// <summary>
/// 总产量 = 当前数据源中,铁水产量总和,包含剔除的重量
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal GetIronAmount(string sqlConstraint)
{
decimal result = 0;
if (sqlConstraint != null)
{
//下边的SQL查询语句,是所有的"铁重"求和,包括【剔除】和【无样】的重量
var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t " + " where " + sqlConstraint;
var ironAmount = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);
result = ironAmount == DBNull.Value ? 0 : (decimal)ironAmount;
}
return result;
}
/// <summary>
/// 合格产量 = 当前数据源中,根据质量判定为合格的产量,不包含剔除的重量 也不包含无样
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal GetQualifiedAmount(string sqlConstraint)
{
decimal result = 0;
if (sqlConstraint != null)
{
//不包含 无样,也 不包含 剔除的重量
var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t LEFT JOIN T_STM_DATA_DICT T1 ON T.ELIMINATE_ID = T1.ID " + " where " + sqlConstraint + "and t1.code != 'true' and t.s_actual <= 0.07 and t.Si_Actual <= 0.8 and t.s_actual is not null and t.s_actual != 0 and t.Si_actual is not null and t.Si_actual != 0";
var qualifiedAmount = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);
result = qualifiedAmount == DBNull.Value ? 0 : (decimal)qualifiedAmount;
}
return result;
}
/// <summary>
/// 优质产量,根据质量判定为优质的产量,不包括剔除重量
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal GetExcellentAmount(string sqlConstraint)
{
decimal result = 0;
if (sqlConstraint != null)
{
var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t LEFT JOIN T_STM_DATA_DICT T1 ON T.ELIMINATE_ID = T1.ID " + " where " + sqlConstraint + "and t1.code != 'true' and t.s_actual <= 0.03 and 0.2 <= t.Si_Actual and t.Si_Actual <= 0.6 and t.s_actual is not null and t.s_actual != 0 and t.Si_actual is not null and t.Si_actual != 0";
var excellentAmount = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);
result = excellentAmount == DBNull.Value ? 0 : (decimal)excellentAmount;
}
return result;
}
/// <summary>
/// 无样产量,取不到样品的重量,即 S 和 Si 的值为 0 或为空的重量,不包括剔除重量
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal GetNullSpecimenAmount(string sqlConstraint)
{
decimal result = 0;
if (sqlConstraint != null)
{
var sql = "select sum(nvl(t.Iron_Weight,0)) from T_QDC_A_IRONMAKE_EXPERIMENT t LEFT JOIN T_STM_DATA_DICT T1 ON T.ELIMINATE_ID = T1.ID " + " where " + sqlConstraint + "and t1.code != 'true' and ((t.S_actual is null and t.Si_actual is null) or (t.S_actual = 0 and t.Si_actual = 0) or (t.s_actual is null and t.Si_actual = 0) or (t.S_actual = 0 and t.Si_actual is null))";
var noneSpecimen = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sql);
result = noneSpecimen == DBNull.Value ? 0 : (decimal)noneSpecimen;
}
return result;
}
/// <summary>
/// 合格率 = 合格产量/总产量
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal PercentOfPass(string sqlConstraint)
{
decimal pass = GetQualifiedAmount(sqlConstraint);
decimal all = GetIronAmount(sqlConstraint);
if (all == 0)
{
return 0;
}
decimal result = Math.Round((pass / all) * 100, 2);
return result;
}
/// <summary>
/// 优质率 = 优质重量/(总产量-无样重量)
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal PercentOfExcellent(string sqlConstraint)
{
decimal excellent = GetExcellentAmount(sqlConstraint);//优质重量
decimal all = GetIronAmount(sqlConstraint); //总产量
decimal none = GetNullSpecimenAmount(sqlConstraint); //无样重量
if ((all - none) == 0)
{
return 0;
}
decimal result = Math.Round((excellent / (all - none)) * 100, 2);
return result;
}
/// <summary>
/// 炉温稳定率 = 取值范围内的 Si个数 / Si 总个数
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal PercentOfStabilization(string sqlConstraint)
{
decimal Si = 0;
decimal SiAll = 0;
if (sqlConstraint != null)
{
var sqlCountSi = "select count(t.Si_Actual) from T_QDC_A_IRONMAKE_EXPERIMENT t " + " where " + sqlConstraint + " and 0.2 <= t.Si_Actual and t.Si_Actual <= 0.6";
var sqlCountSiAll = "select count(*) from T_QDC_A_IRONMAKE_EXPERIMENT t " + " where " + sqlConstraint;
var countSi = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlCountSi);
var countSiAll = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlCountSiAll);
Si = countSi == DBNull.Value ? 0 : (decimal)countSi;
SiAll = countSiAll == DBNull.Value ? 0 : (decimal)countSiAll;
}
//处理分母可能为 0 的情况
if (SiAll == 0)
{
return 0;
}
decimal result = Math.Round((Si / SiAll) * 100, 2);
return result;
}
/// <summary>
/// 一般质量事故:同一炉座,连续的2个铁次的出格铁,或24小时内累计出现4-7个铁次的出格铁
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal GeneralQualityAccident(string sqlConstraint)
{
return 0;
}
/// <summary>
/// 单独查包号:出格品的“包号”哈希表(id,包号),返回
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual Hashtable PackageNum(string sqlConstraint)
{
Hashtable ht = new Hashtable();
decimal idResult = 0;
decimal packageResult = 0;
if (sqlConstraint != null)
{
var sqlId = "select t.id from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
var sqlPackage = "select t.package_num from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
//var dataSet = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteQuery(sql);
var id = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlId);
var package = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlPackage);
idResult = id == DBNull.Value ? -1 : (decimal)id;
packageResult = package == DBNull.Value ? -1 : (decimal)package;
}
ht.Add(idResult, packageResult);
return ht;
}
/// <summary>
/// 单独查铁次:出格品的“铁次”哈希表(id,铁次)
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual Hashtable IronTimes(string sqlConstraint)
{
Hashtable ht = new Hashtable();
decimal idResult = 0;
decimal ironTimesResult = 0;
if (sqlConstraint != null)
{
var sqlId = "select t.id from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
var sqlPackage = "select t.times from t_qdc_a_ironmake_experiment t " + " where " + sqlConstraint + " and (t.s_Actual > 0.07 or t.Si_Actual > 0.8)";
//var dataSet = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteQuery(sql);
var id = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlId);
var package = NetStar.Orm.DataContext.CurrentDataAccess.ExecuteScalar(sqlPackage);
idResult = id == DBNull.Value ? 0 : (decimal)id;
ironTimesResult = package == DBNull.Value ? 0 : (decimal)package;
}
ht.Add(idResult, ironTimesResult);
return ht;
}
/// <summary>
/// 严重质量事故:同一炉座,连续的3-4个铁次的出格铁,或24小时内累计出现8-11个铁次的出格铁
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal SeverityQualityAccident(string sqlConstraint)
{
return 0;
}
/// <summary>
/// 重大质量事故:同一炉座,连续的5-6个铁次的出格铁,或24小时内累计出现12个铁次的出格铁
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal ImportantQualityAccident(string sqlConstraint)
{
return 0;
}
/// <summary>
/// 特大质量事故:同一炉座,连续的7个
/// </summary>
/// <param name="aIronMakeExperimentInfo">实体类对象</param>
[NetStar.Ajax.AjaxMethod]
[NetStar.App.DataAccess(true)]
public virtual decimal VeryBigQualityAccident(string sqlConstraint)
{
decimal result = 0;
return result;
}
/// <summary>
/// Handler : 事件处理器。当前Handler的作用是处理判定结果,并把结果赋值给同名实体类的属性,顺便把S和Si保留小数
/// </summary>
/// <param name="aIronMakeExperimentInfo">参数</param>
/// <returns> void 无返回值,采用赋值的形式,赋值给同名实体类的属性上</returns>
public virtual void Handler(RFN.BM.QDC.AIronMakeExperimentInfo aIronMakeExperimentInfo)
{
float s_f = Convert.ToSingle(aIronMakeExperimentInfo.SActual == null ? "0" : aIronMakeExperimentInfo.SActual);
//字符串转成double类型,再使用 Math.Round 函数保留小数
double S = Math.Round(s_f, 3);//保留3位小数
double Si = Math.Round(Convert.ToDouble(aIronMakeExperimentInfo.SiActual == null ? "0" : aIronMakeExperimentInfo.SiActual), 2);//保留2位小数
//判断是否合格
string result = "";
if (S == 0 || Si == 0)
{
result = "无样";
}
else if (S <= 0.03 && 0.2 <= Si && Si <= 0.6)
{
result = "优质品";
}
else if (S <= 0.07 && Si <= 0.8)
{
result = "合格品";
}
else if (S > 0.07 || Si > 0.8)
{
result = "出格品";
}
//把判断结果,赋值给同名实体类的属性上
aIronMakeExperimentInfo.DecideResult = result;
aIronMakeExperimentInfo.S = S;
aIronMakeExperimentInfo.Si = Si;
}
#endregion
}
}
(三)Oracle数据库
添加了3个字段
1. 铁重
alter table T_QDC_A_IronMake_Experiment add Iron_Weight number(15,4);
2. 是否剔除,这个存的是对应另一个表的“true_or_false”的ID,回显的时候使用了两表联查。
alter table T_QDC_A_IronMake_Experiment add Eliminate number;
3. 剔除原因
alter table T_QDC_A_IronMake_Experiment add Weed_Out_Reason varchar2(500);
你已经落后身边的同学太多了,不付出比他人更努力的代价,是不可能脱颖而出的。