功能描述:
工单报价这个模块是从新给客户报价,当维修过程中发现需要更多的维修费用,就可以从新给客户报价,报价后客户可以继续维修,也可以取消维修。当报价完成,维修费就会修改为最新报价时的价钱。
实现思路:
点击需要报价的单据,然后按报价按钮,弹出报价窗口,填写报价金额和说明等信息,点击确认报价按钮,点击按钮后会生成报价记录并且修改工单的费用金额。
界面效果图:
从界面上看我们这里用到新的控件有:
数字文本框(easyui-numberbox) |
标签(label) |
第一步:数据库
表与关系:
2.2.3(图2)
表1:工单报价(pw_GongDanBaoJia)
用于存放报价的数据
列名 | 类型 | 主外键 | 说明 |
GongDanBaoJiaID | int | 主键 | 工单报价ID |
GongDanLuRuID | int | 外键 | 工单录入ID |
CaoZuoYuanID | int | 外键 | 录入员ID |
BaoJiaQianGongDanZhuangTaiID | int | 外键 | 报价时工单状态ID |
BaoJiaJinE | decimal(18, 4) |
| 报价金额 |
WeiXiuNeiRong | nchar(400) |
| 维修内容 |
BaoJiaShuoMing | nchar(400) |
| 报价说明 |
KeHuYiXiang | nchar(10) |
| 客户意向 |
YouXiaoFou | Bit |
| 有效否 |
GengXinShiJian | datetime |
| 更新时间 |
表2:工单录入表(pw_GongDianLuRu)
用于存放钟表录入的信息
列名 | 数据类型 | 主键/外键 | 说明 |
GongDanLuRuID | int | 主键 | 工单录入ID |
YuanShiDanHaoID | int | 外键 | 原始单号ID |
GongDanZhuanTaiID | int | 外键 | 工单状态ID |
JinEZhuangTaiID | int | 外键 | 金额状态ID |
GongDanLeiXingID | int | 外键 | 工单类型ID |
KeHuID | int | 外键 | 客户ID |
JianXiuLeiXingID | int | 外键 | 检修类型ID |
PinPaiID | int | 外键 | 品牌ID |
GongDanRiQi | date |
| 工单日期 |
GongDanBianHao | nchar(50) |
| 工单编号 |
SongXiuRiQi | data |
| 送修日期 |
YuFanRiQi | data |
| 预返日期 |
FenYongJinE | decimal(18, 2) |
| 费用金额 |
ZhongBiaoLeiXing | nchar(10) |
| 钟表类型 |
BiaoKuan | nchar(10) |
| 表款 |
GuiGe | text |
| 规格/名称 |
XiuPeiJiLu | text |
| 修配记录 |
JiXinXingHao | nchar(50) |
| 机芯号 |
BiaoXingHao | nchar(50) |
| 表型号 |
BiaoShenHao | nchar(50) |
| 表身号 |
BiaoDaiJieShu | nchar(50) |
| 表带节数 |
ZhongBiaoQiTaoMiaoShu | varchar(200) |
| 钟表其他描述 |
WaiGuan | text |
| 外观 |
KeHuZhiShu | varchar(200) |
| 客户自述 |
YouXiaoFou | Bit |
| 有效否 |
表3:员工表(sys_YuanGong)
列名 | 数据类型 | 主外键 | 说明 |
YuanGongID | int | 主键 | 员工ID |
LuRuYuanID | int | 外键 | 录入员ID |
JueSeID | int | 外键 | 角色ID |
YuanGongZhuangTaiID | int | 外键 | 员工状态ID |
MenDianID | int | 外键 | 门店ID |
YuanGongBianHao | nchar(50) |
| 员工编号 |
YuanGongXingMing | nchar(50) |
| 员工姓名 |
XingBie | nchar(50) |
| 性别 |
JiGuan | nchar(50) |
| 籍贯 |
XueLi | nchar(50) |
| 学历 |
ChuShengRiQi | date |
| 出生日期 |
ShenFenZhengHao | nchar(50) |
| 身份证号 |
RuZhiRiQi | date |
| 入职日期 |
RuZhiDiDian | nchar(50) |
| 入职地址 |
YiDongShouJi | nchar(50) |
| 移动手机 |
JiaTingDianHua | nchar(50) |
| 家庭电话 |
DiXin | nchar(50) |
| 底薪 |
DianZiYouXiang | nchar(50) |
| 电子邮箱 |
TongXunDiZhi | nchar(100) |
| 通讯地址 |
BeiZhu | nchar(100) |
| 备注 |
GengXinShiJian | datetime |
| 更新时间 |
YouXiaoFou | bit |
| 有效否 |
MiMa |
|
| 密码 |
表4:属性明细表(sys_PinPai)
列名 | 数据类型 | 主外键 | 说明 |
ShuXingMingXiID | int | 主键 | 属性明细ID |
LuRuYuanID | int | 外键 | 录入员ID |
ShuXingJiHeID | int | 外键 |
|
ShuXingMingXiMingCheng | nchar(50) |
|
|
GengXinShiJian | datetime |
|
|
YouXiaoFou | bit |
|
|
BeiZhu | nchar(50) |
|
|
控件使用:
1、 数字文本框(easyui-numberbox)
控件截图:
创建控件html代码:
特别说明:precision是设置能有多少位小数
<input id="txtBaoJiaJinE" name="BaoJiaJinE" class="easyui-numberbox" precision="2" style="width: 440px; height: 28px" />
获取界面控件值代码:
$("#txtBaoJiaJinE").numberbox("getValue");
注意:当numberbox控件处于焦点状态是无法获取它的值的
给界面控件赋值代码:
$("#txtBaoJiaJinE").numberbox("setValue",22.23);
第二步:打开控制器
2.2.3(图3)
#region 新增报价
/// <summary>
/// 插入报价单
/// </summary>
/// <param name="DtBaoJiaDan">报价表单</param>
/// <param name="intGongDanID">工单录入ID</param>
/// <param name="decBaoJiaJinE">报价金额</param>
/// <param name="intJinEZhaungTaiID">金额状态ID</param>
/// <param name="intGonDanZhuangTai">工单状态ID</param>
/// <returns></returns>
public ActionResult InsertBaoJiaDan(Models.pw_GongDanBaoJia DtBaoJiaDan, int intGongDanID, decimal decBaoJiaJinE, int intJinEZhaungTaiID, int intGonDanZhuangTai)
{
DtBaoJiaDan.YouXiaoFou = true;
DtBaoJiaDan.GengXinShiJian = DateTime.Now;
myMdl.pw_GongDanBaoJia.AddObject(DtBaoJiaDan);
if (myMdl.SaveChanges() > 0)//保存成功
{
UpdateBaiJia(intGongDanID, decBaoJiaJinE, intJinEZhaungTaiID, intGonDanZhuangTai);//调用最新报价
return Json(true, JsonRequestBehavior.AllowGet);
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
#endregion
#region 最新报价
/// <summary>
///
/// </summary>
/// <param name="intGongDanID"></param>
/// <param name="decBaoJiaJinE"></param>
/// <param name="intJinEZhaungTaiID"></param>
/// <param name="intGonDanZhuangTai"></param>
/// <returns></returns>
public ActionResult UpdateBaiJia(int intGongDanID, decimal decBaoJiaJinE, int intJinEZhaungTaiID, int intGonDanZhuangTai)
{
var varGongDan = (from dtGongDan in myMdl.pw_GongDianLuRu
where dtGongDan.GongDanLuRuID == intGongDanID
select dtGongDan).Single<Models.pw_GongDianLuRu>();
varGongDan.FenYongJinE = decBaoJiaJinE;
#region -----回滚工单状态-------
if (intJinEZhaungTaiID == 84 && intGonDanZhuangTai == 83)
{
//查询历史报价单
var varBaoJiaJiLu = (from dtBaoJiaJiLu in myMdl.pw_GongDanBaoJia
orderby dtBaoJiaJiLu.GongDanBaoJiaID descending
select dtBaoJiaJiLu).ToArray();//转为数组
for (var i = 0; i < varBaoJiaJiLu.Count(); i++)
{
if (varBaoJiaJiLu[i].BaoJiaQianGongDanZhuangTaiID != 83)//83是工单状态ID,对应的状态是取消维修
{
varGongDan.GongDanZhuanTaiID = Convert.ToInt32(varBaoJiaJiLu[i].BaoJiaQianGongDanZhuangTaiID);
break;
}
}
}
#endregion
if (intJinEZhaungTaiID == 1)
{
intJinEZhaungTaiID = 84;
varGongDan.GongDanZhuanTaiID = 83;
}
varGongDan.JinEZhuangTaiID = intJinEZhaungTaiID;
if (myMdl.SaveChanges() > 0)
{
return Json("报价成功", JsonRequestBehavior.AllowGet);
}
else
{
return Json(null, JsonRequestBehavior.AllowGet);
}
}
#endregion<span style="font-size: 24px;"><strong>
</strong></span>
报价功能界面html代码:
<div id="frmBaoJia" class="reveal-modal" style="width: 550px; height: 360px; padding: 10px;background-color:White" >
<center>
<table>
<tr>
<td style="width:5px;"></td>
<td style="width:200px;">工单编号:<label id="lblGongDanBianHao" style="color: #FF0000; border-bottom:1px solid #FF0000;"></label></td>
<td align="center" style="width:160px;">客户:<label id="lblKeHuXingMing" style="color: #FF0000;border-bottom:1px solid #FF0000;"></label></td>
<td style="width:190px;">电话:<label id="lblLianXiDianHua" style="color: #FF0000;border-bottom:1px solid #FF0000;"></label></td>
</tr>
</table>
<form id="formBaoJia">
<table>
<tr>
<td style="height: 10px">
</td>
</tr>
<tr>
<td>
报价金额:<input id="txtBaoJiaJinE" name="BaoJiaJinE" class="easyui-numberbox" precision="2" style="width: 440px; height: 28px" />
<input id="LuRuYuanID" name="CaoZuoYuanID" type="hidden"/>
<input id="GongDanID" name="GongDanLuRuID" type="hidden" />
<input id="GongDanZhuangTaiID" name="BaoJiaQianGongDanZhuangTaiID" type="hidden" />
</td>
</tr>
<tr>
<td>
报价说明:<input id="txtBaoJiaShuoMing" name="BaoJiaShuoMing" class="easyui-textbox" style="width: 440px;height: 28px" />
</td>
</tr>
<tr>
<td>
维修内容:<input id="txtWeiXiuNeiRong" name="WeiXiuNeiRong" class="easyui-textbox" style="width: 440px;
height: 28px" />
</td>
</tr>
<tr>
<td>
<table>
<tr>
<td align="right" style="width:60px">客户意向:</td>
<td><ul class="dowebok" style=" margin:0 0 0 0">
<li><input type="radio" id="TongYi" name="KeHuYiXiang" data-labelauty="同意" checked value="同意" οnclick="onclickrdoAgree()"/></li>
<li><input type="radio" id="WeiQueDing" name="KeHuYiXiang" data-labelauty="未确定" value="未确定" οnclick="onclickrdoAgree()"/></li>
<li><input type="radio" id="BuTongYi" name="KeHuYiXiang" data-labelauty="不同意" value="不同意" οnclick="onclickDisagree()"/></li>
<li><input type="radio" id="WeiJieDianHuo" name="KeHuYiXiang" data-labelauty="未接电话" value="未接电话" οnclick="onclickrdoAgree()"/></li>
</ul>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<table id="dgvBaoJia" class="easyui-datagrid" style="width: 530px; height: 140px">
<thead>
<tr>
<th data-options="field:'GongDanBaoJiaID',width:90,align:'center',hidden:true">
工单报价ID
</th>
<th data-options="field:'BaoJiaQianGongDanZhuangTaiID',width:90,align:'center',hidden:true">
工单状态ID
</th>
<th data-options="field:'BaoJiaJinE',width:60,align:'center'">
报价金额
</th>
<th data-options="field:'WeiXiuNeiRong',width:120,align:'center'">
维修内容
</th>
<th data-options="field:'BaoJiaShuoMing',width:120,align:'center'">
报价说明
</th>
<th data-options="field:'KeHuYiXiang',width:70,align:'center'">
客户意向
</th>
<th data-options="field:'GengXinShiJian',width:150,align:'center'">
更新时间
</th>
</tr>
</thead>
</table>
</td>
</tr>
<tr style="height:5px;"></tr>
<tr>
<td colspan="2" align="center">
<table>
<tr>
<td><a οnclick="QueRenBaoJia()" id="btnConfirmOffer" class="goodButton" style="width: 80px; height: 23px">确认报价</a></td>
<td><a οnclick="" class="goodButton_c1" style="width: 80px; height: 23px"> 取消</a></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</center>
<a class="close-reveal-modal">×</a>
</div>
</div><strong><span style="font-size: 24px;">
</span></strong>
报价功能jQuery代码:
//打开报价窗口
var varGongDanZhuagnTai = 0;
function BiaoJia() {
var Row = $('#dgvGongDan').datagrid("getSelected");//获取选中的单据
if (Row) {
if (Row.GongDanZhuanTaiID == 67) {//判断是否符合报价
alert("当前单据状态不可报价"); return;
}
$('#frmBaoJia').reveal($(this).data());//打开弹窗
$('#lblGongDanBianHao').html(Row.GongDanBianHao);
$('#lblKeHuXingMing').html(Row.KeHuXingMing);
$('#lblLianXiDianHua').html(Row.YiDongShouJi);
$('#GongDanID').val(Row.GongDanLuRuID);
varGongDanZhuagnTai = Row.GongDanZhuanTaiID;
$('#GongDanZhuangTaiID').val(Row.GongDanZhuanTaiID);
//调用控制器的方法
$.getJSON("/WeiXiuGuanLi/SelectBaiJiaJiLu?intGongDanID=" + Row.GongDanLuRuID,
function (data) {
$('#dgvBaoJia').datagrid("loadData", data);//给表格绑定数据
});
}
else {
alert("请选择要报价的单据");
}
}
//确认报价
function QueRenBaoJia() {
var varJinEZhuangTaiID = 0;
if ($("#txtBaoJiaJinE").numberbox("getValue") == "") {
alert("请填写报价金额"); return;
}
if ($("#TongYi").prop("checked")) {
varJinEZhuangTaiID = 84;
}
if ($('#BuTongYi').prop("checked")) {
varJinEZhuangTaiID = 1;
}
if ($('#WeiQueDing').prop("checked") || $('#WeiJieDianHuo').prop("checked")) {
varJinEZhuangTaiID = 82;
}
$.ajax({
type: 'post',
url: '/WeiXiuGuanLi/InsertBaoJiaDan?intGongDanID=' + $('#GongDanID').val()
+ "&" + "decBaoJiaJinE=" + $('#txtBaoJiaJinE').val()
+ "&" + "intJinEZhaungTaiID=" + varJinEZhuangTaiID
+ "&" + "intGonDanZhuangTai=" + varGongDanZhuagnTai,
data: $('#formBaoJia').serialize(),//获取整张表单
success: function (e) {
if (e) {
alert("报价成功");
$('#dgvBaoJia').datagrid("loadData", { total: 0, rows: {} });//清空表格
$.getJSON("/WeiXiuGuanLi/SelectBaiJiaJiLu?intGongDanID=" + $('#GongDanID').val(),
function (ShuJu) {
$('#dgvBaoJia').datagrid("loadData", ShuJu);
ClearBaoJia();//清空表单
SelectGongDan();//刷新数据
});
}
else {
alert("报价失败");
}
}
});
}