本次任务完成时间:2018年7月11日~2018年8月21日
开发工具与关键技术:MVC + SQL Server
完成模块功能: 汽修管理
一、 功能实现
1.1 登录
启动项目,进入登录页面,输入正确用名账号、密码、验证码,点击登录即可进入主页面,登录页面如下图显示:
1.2主页面
主页面如下图:
2.2 汽修管理
概述:汽修管理是整个汽修的一个重要环节,通过汽修管理功能可以科学、合理的管理整个修理过程及记录。
汽修管理主要功能如下:
事务流程:快速修车( 预约安排 --> 客户接待 --> 维修派工 --> 维修领料 --> 完工确认 --> 结算出厂 --> 三包索赔结算 --> 保险理赔结算 --> 售后服务 )
2.2.1预约安排
概述:预约安排主要是针对需要前来修车的客户的预约登记,录入车主、维修车辆基本信息(若已是老客户,可直接导入信息)及修理项目。
1. 登记车牌、车型、车主信息,方便后期查询车主资料。
2. 修理单号、修理类别、金额、开单日期和预约维修日期、接车人。
3. 修理项目(明细)、估计配件、其他费用、备注、保险索赔:方便维修人员进行维修领料,以及修理时的注意 事项,还有后期保险索赔的办理。
点击预约安排进入预约安排页面,如下图所示:
点击新增按钮清空文本框,选择车牌弹出车辆选择模态框,在模态框中可以进行新增保存的操作,也可以进行模糊查询车牌的操作,效果如下图所示:
选择一条车牌信息,点击‘选中’按钮或者双击表格行信息进行回填,如下图所示:
输入相关的文本框信息,在表格中添加相应的维修信息,如下图显示:
如果需要更改维修表格里面的内容,可以继续编辑表格的操作,如下图所示:
切换到产品材料点击添加弹出模态框,选择需要的数据然后点击‘选中’按钮如下图所示:
如果所需要的数据找不到可以点击‘增加’按钮,弹出增加配件模态框增加,如下图所示:
选中的数据会回填到主页面的配件信息表格里,也可以进行编辑表格信息,如下图所示:
数据没有错误,就可以点击保存按钮进行保存数据,如下图所示:
保存成功后提示是否进行审核预约安排,如果点击“是”后,数据不能再进行修改,如果需要改数据的话,先进行反审核操作,才能进行修改数据,如下图所示:
点击‘选择单据’按钮弹出单据记录模态框,选择一条数据可以进行回填,如下图所示:
审核并且未转维修单的数据可以进行转维修单操作,否则不能进行下一步操作,如下图所示:
2.2.2客户接待
概述:客户接待主要是对前来修车的客户及维修基本资料进行登记,把修理的明细录入,以便后期进行查询。
1. 登记车牌、车型、进厂里程、油量、车主信息、发动机号码:方便后期查询车主资料。
2. 修理编号、类别、金额、进厂日期和结算日期、送修人电话:方便管理人员管理,联系送修人在相应的时间来取车。
3. 修理项目(明细)、估计配件、其他费用、备注、保险索赔:方便维修人员进行维修领料,以及修理时的注意事项,还有后期保险索赔的办理。
预约安排单数据成功转维修单后,进入客户接待页面,并且把该单号车主信息进行回填,如下图所示:
填写相关的数据,选择相关的维修性质和金额,操作如下图:
当维修性质选择三包或者保险时,保险单会自动生成,如下图所示:
保存该单号信息后,会在单据里选择一条数据,当然也可以选择数据回填信息,如下图所示:
2.2.3维修派工
概述:对所有送来维修的车辆派工人去进行修理,同时方便后期查询修理项目和了解车辆维修的基本情况。
在客户接待回填数据后继续审核数据便可以转派工单继续派工,或者直接查询单据继续回填数据,如下图所示:
点击‘派工’按钮可以在表格里追加一行新的数据,点击‘多次派工’按钮会追加最后一行的数据,保存完整的信息后即默认已派工,否则视为未派工,该单据会在单据记录中显示,如下图所示:
2.2.4维修领料
概述:处理送修车辆的配件问题,可以查询送修车辆领料和退料以及领料人资料,以便后期结算。
1. 常用字段说明(编辑框操作说明请参见编辑框)
2. 领料员:记录是哪一位员工领的,领的什么配件,所在仓库及数量。
3. 业务操作说明:
4. 通过【查找单据】选择需要领用配件的单据号;
5. 点击【新增领料明细】选择需要领取的配件名称;
6. 如果该单据在接车登记过程中已经录入了估计配件,则可以通过【导入估计配件】选择已录入的配件;
7. 对不需要的配件可选择后点击【删除领料明细】进行删除;
点击维修领料,进入维修领料页面,如下图所示:
选择一条未领料的数据,然后点击‘领料’按钮进行领料操作,进入领料页面,如下图所示:
点击‘导入估计配件’弹出该单据之前所要的配件信息模态框,选择数据进行回填,如下图所示:
填写完整信息进行保存操作后,即可领料,相应的仓库会减掉相应的配件数,当然如果仓库没有该配件,是无法继续领料的操作的
退料和领料的操作基本一致,参考即可
2.2.5完工确认
概述:在送修车辆维修完工之后,需要对车辆进行出厂质检,在[完工审核]进行完工审核操作。如图:
1. 业务操作说明:
2. 完工审核:点击【查找单据】菜单,根据送修车辆的基本信息找到需要审核的车辆,点击【完工审核】菜单,然后【保存】完成审核。
3. 取消完工:如果需要对已完工的车辆进行返厂维修或者审核取消操作,点击【取消审核】然后【保存】完成取消。
2.2.6结算出厂
概述:对已经完成审核的车辆进行结算出厂。如果该维修单涉及到三包索赔或者保险,需要通过此处填写索赔信息。
1. 业务操作说明:
2. 点击【结算出厂】,会弹出查询窗口,选择你所要结算的车辆并且双击;
3. 点击【结算】,会弹出结算单进行收款,填上收款金额,入账方式,点击【确定】入账成功,最后保存。
点击结算出厂,进入结算出厂页面,默认弹出模态框选择一条结算的数据,如下图所示:
回填相关信息,确保信息无误后进行审核操作,未审核的数据是不能进行收款操作的,如果是已审核的数据便可以进行收款操作,如下图所示:
点击保存即可以进行收款
如果该单据有三包或者保险,要进行另外进行收款操作,如下图所示:
2.2.7 三包索赔结算
概述:对车辆进行三包理赔结算,填写好开单日期,维修单号,保险公司编号,保险公司名称等。
1. 业务操作说明:
2. 点击【查询单据】选择需要进行三包索赔的单据;
3. 确认金额无误后,点击【入账】在弹出入账窗口中输入入账金额进行保存;
4. 入账成功后,需要点击【审核】当前的单据进行审核。如果已审核单据,可以通过【反审核】进行再次入账操作;
可以点击三包索赔结算或者从结算出厂里‘三包索赔收款’按钮进入页面,进行回填数据,如下图所示:
收款操作和结算出厂的收款操作基本一致,参考即可
2.2.7 保险理赔结算
概述:对投保车辆进行保险理赔结算,填写好开单日期,维修单号,保险公司编号,保险公司名称等。
1. 业务操作说明:
2. 点击【查询单据】选择需要进行三包索赔的单据;
3. 选择相应的保险公司,录入理赔员工,报案编号,该车辆理赔的保单号,保单金额等信息后,点击保存。
4. 在确认金额无误后,点击【入账】在弹出入账窗口中输入入账金额进行保存;
5. 入账成功后,需要点击【审核】当前的单据进行审核。如果已审核单据,可以通过【反审核】进行再次入账操作;
具体操作参考三包索赔结算即可
2.2.8快速修车
概述:快速修车的功能是为了解决业务不是特别复杂的维修登记过程,如果汽修厂没有严格标准的前台接车、维修派工,仓库领料,维修接单处理,财务结算等独立的业务岗位,可以通过快速修车功能同窗口、一体化解决。
[快速修车]是将[客户接待]到[维修领料]整合到一起,实现快速修车登记管理的目的。
基本操作和前面的几大模块操作基本一致
点击快速修车进入快速修车页面,如下图所示
二、相关业务表和关系
三、经典代码
同时从页面传到控制台里的数据(新增的数据和删除的数据)进行处理的代码:
public ActionResult ListPredate(List<PW_Predate> listPredate, List<SYS_PreRepairItemDetail> listPreRepairItem,List<SYS_PreProductDetail> listPreProduct,
List<SYS_PreOtherCostDetail> listPreOtherCost )
{
var PredateID = 0;
try
{
//预约表
if (listPredate[0].PredateID == 0)
{
myModels.PW_Predate.Add(listPredate[0]);
}
else
{
myModels.Entry(listPredate[0]).State = System.Data.Entity.EntityState.Modified;
}
if (myModels.SaveChanges() > 0)
{
PredateID = listPredate[0].PredateID;
if (listPreRepairItem != null)
{ //维修明细表
List<int> oldID = new List<int>();//原来ID
List<int> newID = new List<int>();//新ID
List<int> listdelectID = new List<int>();//需要删除的ID集合
var list = myModels.SYS_PreRepairItemDetail.Where(m => m.PredateID == PredateID).Select(m => new { m.PreRepairItemDetailID }).ToList();
foreach (var item in list)
{
oldID.Add(item.PreRepairItemDetailID);
}
for (int i = 0; i < listPreRepairItem.Count; i++)
{
listPreRepairItem[i].PredateID = PredateID;
if (listPreRepairItem[i].PreRepairItemDetailID == 0)
{
myModels.SYS_PreRepairItemDetail.Add(listPreRepairItem[i]);//新增
}
else
{
newID.Add(listPreRepairItem[i].PreRepairItemDetailID);
myModels.Entry(listPreRepairItem[i]).State = System.Data.Entity.EntityState.Modified;//修改
}
}
listdelectID = oldID.Except(newID).ToList();//从某集合中删除其与另一个集合中相同的项;其实这个说简单点就是某集合中独有的元素(差集)
foreach (var item in listdelectID)
{
var listdelect = myModels.SYS_PreRepairItemDetail.Where(m => m.PreRepairItemDetailID == item).Single();//删除
myModels.SYS_PreRepairItemDetail.Remove(listdelect);
}
}
else {
var listdelect = myModels.SYS_PreRepairItemDetail.Where(m => m.PredateID == PredateID).ToList();//删除全部
myModels.SYS_PreRepairItemDetail.RemoveRange(listdelect);
}
if (listPreProduct != null)
{
//配件明细表
List<int> oldID = new List<int>();//原来ID
List<int> newID = new List<int>();//新ID
List<int> listdelectID = new List<int>();//需要删除的ID集合
var list = myModels.SYS_PreProductDetail.Where(m => m.PredateID == PredateID).Select(m => new { m.PreProductDetailID }).ToList();
foreach (var item in list)
{
oldID.Add(item.PreProductDetailID);
}
for (int i = 0; i < listPreProduct.Count; i++)
{
listPreProduct[i].PredateID = PredateID;
if (listPreProduct[i].PreProductDetailID == 0)
{
myModels.SYS_PreProductDetail.Add(listPreProduct[i]);//新增
}
else
{
newID.Add(listPreProduct[i].PreProductDetailID);
myModels.Entry(listPreProduct[i]).State = System.Data.Entity.EntityState.Modified;//修改
}
}
listdelectID = oldID.Except(newID).ToList();//从某集合中删除其与另一个集合中相同的项;其实这个说简单点就是某集合中独有的元素(差集)
foreach (var item in listdelectID)
{
var listdelect = myModels.SYS_PreProductDetail.Where(m => m.PreProductDetailID == item).Single();//删除
myModels.SYS_PreProductDetail.Remove(listdelect);
}
}
else
{
var listdelect = myModels.SYS_PreProductDetail.Where(m => m.PredateID == PredateID).ToList();//删除全部
myModels.SYS_PreProductDetail.RemoveRange(listdelect);
}
if (listPreOtherCost != null)
{
//费用明细表
List<int> oldID = new List<int>();//原来ID
List<int> newID = new List<int>();//新ID
List<int> listdelectID = new List<int>();//需要删除的ID集合
var list = myModels.SYS_PreOtherCostDetail.Where(m => m.PredateID == PredateID).Select(m => new { m.PreOtherCostDetailID }).ToList();
foreach (var item in list)
{
oldID.Add(item.PreOtherCostDetailID);
}
for (int i = 0; i < listPreOtherCost.Count; i++)
{
listPreOtherCost[i].PredateID = PredateID;
if (listPreOtherCost[i].PreOtherCostDetailID == 0)
{
myModels.SYS_PreOtherCostDetail.Add(listPreOtherCost[i]);//新增
}
else
{
newID.Add(listPreOtherCost[i].PreOtherCostDetailID);
myModels.Entry(listPreOtherCost[i]).State = System.Data.Entity.EntityState.Modified;//修改
}
}
listdelectID = oldID.Except(newID).ToList();//从某集合中删除其与另一个集合中相同的项;其实这个说简单点就是某集合中独有的元素(差集)
foreach (var item in listdelectID)
{
var listdelect = myModels.SYS_PreOtherCostDetail.Where(m => m.PreOtherCostDetailID == item).Single();//删除
myModels.SYS_PreOtherCostDetail.Remove(listdelect);
}
}
else
{
var listdelect = myModels.SYS_PreOtherCostDetail.Where(m => m.PredateID == PredateID).ToList();//删除全部
myModels.SYS_PreOtherCostDetail.RemoveRange(listdelect);
}
myModels.SaveChanges();
}
else
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
catch (Exception)
{
return Json(false, JsonRequestBehavior.AllowGet);
}
return Json(PredateID, JsonRequestBehavior.AllowGet);
}
四、开发总结
刚刚做这个项目的时候一脸懵逼,业务逻辑搞不懂,数据库关系理不清,后来通过操作了几遍该系统的软件思路才慢慢清晰起来,当然这个系统的业务逻辑大大提升了我对数据库关系的理解,还有一些代码的技巧,使我对功能的流程开发、文件流输出等技术有所提升;在做项目期间有时候对某些功能过于着急,一心急于求成,思路反而越来越乱,导致其他功能也不能做好,希望以后时刻注意,也要努力学习技术和放好心态;