本文主要是介绍RPMS_4s汽车维修管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Saas
什么是Saas
SaaS是Software-as-a-service(软件即服务)。SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统
Saas模式:
Saas 模式下面的数据安全问题
方案一: 可一个租户都单独的数据库 – 安全性最高
方案二: 共享数据库 ,独立schema(oracle比较明显)(用户 方案 – 表)
方案三: 共享数据库 ,共享表 . – 目前
saas的权限设计
以前权限设计的模式:
Saas(平台) 怎么设计权限 ?
1.4 租户注册–流程
实现注册流程
学会: (1)怎么去保存 多张表
t_tenant /t_employee
(2)怎么处理 对象里面 有关联对象
employee (tenant)
前台封装参数值:
let para = Object.assign({}, this.employee);
let tenant = {companyName: para.companyName,companyNum:para.companyNum,address:para.address,logo:para.logo
}
para.tenant = tenant;
后台通过Employee对象接收
分页
(1) 创建PageList
pageSize page total rows
(2) 创建BaseQuery对象 – >接收到前台传过来的值
(3)在对应的service成添加了分页的方法
public PageList<Department> findPage(DepartmentQuery departmentQuery) {PageList<Department> pageList = new PageList();//查询总数 select count(*) from xxx where xxxxLong total = departmentMapper.findTotal(departmentQuery);//总的条数pageList.setTotal(total);// select *from xx where limit 0, 10List<Department> departments = departmentMapper.findData(departmentQuery);//当前页的数据pageList.setRows(departments);return pageList;}
高级查询
<!-- 分页查询总数据的方法 findTatal(DepartmentQuery query)--><select id="findTotal" parameterType="departmentQuery" resultType="long">select count(*) from t_department<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where></select><!--limit 0,10 10,10--><select id="findData" parameterType="departmentQuery" resultType="Department">select * from t_department<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where>limit #{start},#{pageSize}</select>
mybatis关系处理
jpa /mybatis
一对一 多对一 – >1方处理
一对多 多对多 --> 多方处理
查询操作
对1方(1对1 多对1)
<resultMap id="DepartmentMap" type="department"><id column="id" property="id"></id><result column="name" property="name"></result><result column="sn" property="sn"></result><!--对一方处理--><association property="manage" javaType="employee"><id column="eid" property="id"></id><result column="username" property="username"></result></association><association property="parent" javaType="department"><id column="pid" property="id"></id><result column="pname" property="name"></result></association><association property="tenant" javaType="tenant"><id column="tid" property="id"></id><result column="companyName" property="companyName"></result></association></resultMap><!--limit 0,10 10,10--><select id="findData" parameterType="departmentQuery" resultMap="DepartmentMap">select d.id , d.name , d.sn , e.id eid,e.username , p.id pid, p.name pname,t.id tid, t.companyNamefrom t_department djoin t_employee e on d.manager_id = e.idjoin t_department p on d.parent_id = p.idjoin t_tenant t on d.tenant_id = t.id<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where>limit #{start},#{pageSize}</select>
对多(1对多 多对多)
<!-- 查询子部门处理多方--><select id="loadChildrenDept" resultMap="childrenDeptMap">select distinct d.id,d.name ,p.id pid ,p.name pname from t_department djoin t_department p on d.parent_id = p.idorder by p.id</select><resultMap id="childrenDeptMap" type="department"><id column="pid" property="id"></id><result column="pname" property="name"></result><collection property="childrens" javaType="department"><id column="id" property="id"></id><result column="name" property="name"></result></collection></resultMap>
多对多注意:
在分页的时候,不要嵌套结果 要使用嵌套查询
增(修改) 删除
(1)对1方处理 (1对1 多对1)-- 增加/修改
多个员工对应1个部门 – >
Emloyee:
usename, pwd,Department dept;
新增/修改
insert into t_employee (username,pwd,dept_id) values(#{username},#{pwd},#{dept.id})update t_employee set username = #{username},dept_id=#{dept.id} where id=#{id}insert into t_department(name,manage_id) values(#{name},#{manage.id})
(2)对多方处理(1对多/多对多)–保存修改
升级elementui版本:
修改 package.json
"element-ui": "^2.12.0",
修改main.js 的index.css文件
import 'element-ui/lib/theme-chalk/index.css'
对话框:
修改 dialog 添加属性:
:visible.sync="addFormVisible"
穿梭框
<el-form-item label="权限" prop="permissions"><el-transfer v-model="selectedPermissions" :data="allPermissions" :titles="titles" :props="{key: 'id',label: 'name'}" @change="handleChange"></el-transfer></el-form-item>
selectedPermissions:[],allPermissions:[{"id":1,"name":"添加员工"},{"id":2,"name":"修改员工"},{"id":3,"name":"删除员工"}],titles:['所有权限', '已选权限'],-----------------传值的时候,封装的参数-------------------------------- let paraselectPermsion = Object.assign({},this.selectedPermissions);para.permissions = [];for(let key in paraselectPermsion ){let permission ={"id": paraselectPermsion[key]}para.permissions.push(permission);}
接收保存
public void saveRolePermisison(Role role){//保存角色t_roleroleMapper.save(role);// 方案一 : 多次操作数据库//方案二: 批量新增 insert into t_role_permission(role_id,permission_id) values(1,1),(1,2)// insert into// t_role_permission(role_id,permission_id) values(1,100),(1,201)List<Map<String,Object>> rplist = new ArrayList();List<Permission> permissions = role.getPermissions();for (Permission permission : permissions) {Long pid = permission.getId();Long rid = role.getId();Map rpMap = new HashMap();rpMap.put("roleId",rid);rpMap.put("permissionId",pid);rplist.add(rpMap);}roleMapper.saveRolePermission(rplist);}
<insert id="saveRolePermission" parameterType="arrayList">insert into t_role_permission(role_id,permission_id) VALUES<foreach collection="list" item="item" separator=",">(#{item.roleId},#{item.permissionId})</foreach></insert>
常用组件
(1)下拉组件
<el-form-item label="部门经理" prop="username"><el-select v-model="managerId" placeholder="请选择"><el-optionv-for="item in managers":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item>
(2)穿梭框
<el-form-item label="权限" prop="permissions"><el-transfer v-model="selectedPermissions" :data="allPermissions" :titles="titles" :props="{key: 'id',label: 'name'}" @change="handleChange"></el-transfer></el-form-item>
(3)上传
<el-uploadclass="upload-demo"action="http://localhost/file/upload":on-success="handleSuccess":file-list="fileList"list-type="picture"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
百度地图–看官网
地图 在很多场景下面都在使用
地图有很多种类 – 百度地图 / 高德 /腾讯/谷歌
(1)百度平台得的key=123123123123123123123
百度地图
(2)怎么使用
a) 安装 vue-baidu-map
npm install vue-baidu-map --save
b) 全局引入百度地图 --main.js
import Vue from 'vue'
import BaiduMap from 'vue-baidu-map'Vue.use(BaiduMap,{// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: 'Hfr6TfnXRMrg1Df5P2VjwORlDrR8BvTR'
})
c)测试
<!-- 准备一个对话框--><el-dialog title="百度地图" width="60%" :visible.sync="mapDialogVisibale" v-model="mapDialogVisibale" :close-on-click-modal="false"><baidu-map center="成都市" :zoom="11"><bm-auto-complete v-model="keyword" :sugStyle="{zIndex: 2100}"><div style="margin-bottom:10px"><input id="searchInput" type="text" placeholder="请输入关键字" class="searchinput"/><el-button type="success" @click="selectAdrressConfirm">确定</el-button></div></bm-auto-complete><bm-view class="bmap"/><bm-local-search :keyword="keyword" :auto-viewport="true" :panel="false"></bm-local-search></baidu-map></el-dialog>
# 1. 登录(掌握)
shiro: 安全框架,四大基石(身份认证 授权 密码学 会话管理)
项目里面怎么添加shiro
(1)创建一个shiro的maven模块
(2)导入jar包
<dependencies> <dependency><groupId>cn.itsource</groupId><artifactId>crm_service</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.4.1</version></dependency><!--servlet httpServletRequest --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency>
</dependencies>
3)配置 web.xml 配置 代理过滤器
shiro的配置
登录流程
4 登录之后访问数据流程
lucene
场景: 模糊查询
select * from xxx where name like ‘%xxx%’;
好不好:
如果数据量比较多,效率就会很低
lucene:解决这个问题
lucene是什么
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)
lucene: (1)它是apache下面的开源项目
(2)全文检索引擎工具包 – 对所有内容(文本 图片 视频 音频)进行检索 – 以后主要针对文本去搜索
(3) 全文检索的好处:
a)比较模糊查询的效率高,底层做了写优化
b)进行关键字的高亮显示
c)进行相关度 排序 --匹配多的排在最前面
d)模糊查询的效果不好 比如 查询 select * from xxx where language like ‘%java%’ – javascript --分词
e)对摘要截取
全文检索: 对所有内容(文本 图片 视频 音频)进行检索 – 以后主要针对文本去搜索
了解:
结构化数据: 有结构的数据,比较关系型数据库的数据 (行和列有结构)
半结构化数据: 非关系模型的、有基本固定结构模式的数据,例如日志文件、XML文档、JSON文档、
非结构化数据: 没有固定模式的数据,如WORD、PDF、PPT、EXL,各种格式的图片、视频等
把非结构化数据转换成结构化数据
图片(xxx.jpg) – > 内容存入数据库 图片地址
lucene场景
在小的项目 – lucene – jdbc
大的项目 – elasticseach --springjdbc/jpa
使用lucene
了解一个写lucene核心
创建索引
public void testCreateIndex() throws IOException {//得到存储目录Directory d = FSDirectory.open(Paths.get(path));//Directory d, IndexWriterConfig conf//索引写入配置对象 Analyzer analyzerAnalyzer analyzer = new SimpleAnalyzer();IndexWriterConfig conf = new IndexWriterConfig(analyzer);//得到一个索引的写入器对象IndexWriter indexWriter = new IndexWriter(d,conf);//相当于 一个行数据 -- 一个对象 new PersonDocument doc_1= new Document();doc_1.add(new TextField("title","doc文档1", Field.Store.YES));doc_1.add(new TextField("content",doc1, Field.Store.YES));Document doc_2= new Document();doc_2.add(new TextField("title","doc文档2", Field.Store.YES));doc_2.add(new TextField("content",doc2, Field.Store.YES));Document doc_3= new Document();doc_3.add(new TextField("title","doc文档3", Field.Store.YES));doc_3.add(new TextField("content",doc3, Field.Store.YES));//添加索引库indexWriter.addDocument(doc_1);indexWriter.addDocument(doc_2);indexWriter.addDocument(doc_3);indexWriter.commit();indexWriter.close();}
索引搜索
public void testSeachIndex(String content) throws Exception {//得到query对象String f = "content"; //查询字段// QueryParser(String f, Analyzer a)Analyzer analyzer = new SimpleAnalyzer();QueryParser queryParser = new QueryParser(f,analyzer);Query query = queryParser.parse("content:"+content);//得到索引的查询对象Directory d = FSDirectory.open(Paths.get(path));IndexReader reader = DirectoryReader.open(d);IndexSearcher indexSearcher = new IndexSearcher(reader);//调用方法 10 查询满足条件的前面10条数据TopDocs topDocs = indexSearcher.search(query, 10);//得到命中的数组ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int docId = scoreDoc.doc;//docId (0,1,2)Document doc = indexSearcher.doc(docId);System.out.println("查询内容:"+doc.get("title")+"----"+doc.get("content"));}}
Lucene的API的认识
(1) Directory 目录
Directory d = FSDirectory.open(Paths.get(path)); --底层代码 会自动选择我们目录类型来存储索引
目录类型:
MMapDirectory : 针对64系统,它在维护索引库时,会结合“内存”与硬盘同步来处理索引。
SimpleFSDirectory : 传统的文件系统索引库。 window系统就是使用 --(现在)
RAMDirectory : 内存索引库
(2) Document类型
映射关系 lucene和数据库的映射关系
document | row 行 | |
---|---|---|
Field(TextField,LongTield,…) | column列(类型 varchar bit bigint…decimal(19,2).) | |
new Document() | 有一行数据 | |
index索引库 | 数据库db |
Document TextField
Field:
doc_1.add(new TextField(“content”,doc1, Field.Store.YES));
还可以:–自定义类类型
Document document = new Document();
FieldType fieldType = new FieldType();fieldType.setStored(true); //是否存储
fieldType.setTokenized(true); //是否分词
fieldType.setIndexOptions(IndexOptions.DOCS); //是否索引document.add(new Field("name",department.getName(),fieldType));
1)是否分词:
fieldType.setTokenized(true); //是否分词
地名 人名 不应该分词
描述 , 介绍 应该分词
比如 一个字段的内容存储索引库 ,需要考虑这个字段是否需要分词
比如 中国首都在哪里 --需要
比如 黑龙江 日本 – (日(…) 本(…)–没有必要分词
2)是否存储 :
我们内容是否要存储到索引库
哪些情况下不需要存储索引库?
比如 比较大的内容 文件 图片
3)是否索引:
哪些情况下需要创建索引 哪些情况下不需要创建索引?
如果这列需要作为一个 查询的条件,是否创建索引
分词器-ik分词器
分词(分词器):在一个内容 拆分开
什么需要情况下面:
在创建索引的时候 --可以使用分词
在搜索索引的时候 --可以使用分词
英文 通过空格来进行分词
this is my boyfirend
中文 通过ik分词器(设置停用词 和 扩展词)
操作
对文档的操作 – add
indexWriter.addDocument(doc_3); --文档新增
indexWriter.updateDocument(); --文档修改
indexWriter.deleteDocuments(); --文档删除
lucene的项目实战
凡是使用查询的地方 都可以使用lucene
比如 : 系统日志 – 记录
(1) 把数据库里面数据 写到 索引库
什么时候 把数据写到索引库?
数据是否是及时数据 :
是: 在添加数据库同时,及时添加索引库
后: 页面上设计一个 同步 按钮(把数据库的内容同步到索引库)
(2) 把索引库的数据 查询出来 展示到页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4HsAyzN-1579005929218)(笔记.assets/image-20200110112703775.png)]
(3)项目里面添加lucene实现步骤
a)创建一个模块 crm_fulltext
导入包
手动把jar到maven仓库
mvn install:install-file -Dfile=IKAnalyzer2012_V5.jar -DgroupId=org.wltea -DartifactId=IKAnalyzer -Dversion=2012_V5 -Dpackaging=jar
b)操作索引库方法
引入操作索引库的工具类(LuceneUtil(crud以及分页))
c)测试
维修模块 前端
<template><div><section><!--工具条--><el-col :span="24" class="toolbar" style="padding-bottom: 0px;"><el-form :inline="true" :model="filters"><el-form-item><el-input v-model="filters.carnum" placeholder="车牌号"></el-input></el-form-item><el-form-item><el-select v-model="filters.state" placeholder="按状态展示" @change="getRepairOrder"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" v-on:click="getRepairOrder">查询</el-button></el-form-item><el-form-item><el-button icon="el-icon-refresh" @click="clearFilter">重置</el-button></el-form-item><el-form-item><el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd">新增</el-button></el-form-item></el-form></el-col><!--列表--><el-table :data="repairOrders" highlight-current-row v-loading="listLoading" @selection-change="selsChange" style="width: 100%;" @row-dblclick="showItems"><el-table-column type="selection" width="55"></el-table-column><el-table-column prop="id" label="维修工单号" width="180" sortable></el-table-column><el-table-column prop="custormer" label="客户姓名" width="120" sortable></el-table-column><el-table-column prop="carnum" label="车牌号" width="120" sortable></el-table-column><el-table-column prop="createtime" label="创建时间" width="160" sortable></el-table-column><el-table-column prop="employee.username" label="维修人员" min-width="120" ></el-table-column><el-table-column prop="address" label="客户地址" min-width="180" ></el-table-column><el-table-column prop="state" label="状态" min-width="100"><template slot-scope="scope"><span v-if="scope.row.state==0" style="color: red">已录入</span><span v-else="" style="color: green">已结算</span></template></el-table-column><el-table-column label="操作" width="150"><template scope="scope"><el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button><el-button type="danger" size="small" @click="handleDel(scope.$index, scope.row)">删除</el-button></template></el-table-column></el-table><!--工具条--><el-col :span="24" class="toolbar"><el-button type="danger" @click="batchRemove" :disabled="this.sels.length===0">批量删除</el-button><el-pagination layout="prev, pager, next" @current-change="handleCurrentChange" :page-size="10" :total="total" style="float:right;"></el-pagination></el-col><br><!--编辑界面--><el-dialog title="编辑" :visible.sync="editFormVisible" v-model="editFormVisible" :close-on-click-modal="false"><el-form :model="editForm" label-width="80px" :rules="editFormRules" ref="editForm"><el-form-item label="客户姓名" prop="custormer"><el-input v-model="editForm.custormer" auto-complete="off"></el-input></el-form-item><el-form-item label="车牌号" prop="carnum"><el-input v-model="editForm.carnum" auto-complete="off"></el-input></el-form-item><el-form-item label="联系方式" prop="phone"><el-input v-model="editForm.phone" auto-complete="off"></el-input></el-form-item><el-form-item label="邮箱地址" prop="email"><el-input v-model="editForm.email" auto-complete="off"></el-input></el-form-item><el-form-item label="维修人员" prop="username"><el-select v-model="editForm.employee.id" placeholder="请选择"><el-optionv-for="item in employees":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item><el-form-item label="地址" prop="address"><el-input v-model="editForm.address"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="editFormVisible = false">取消</el-button><el-button type="primary" @click.native="editSubmit" :loading="editLoading">提交</el-button></div></el-dialog><!--新增界面--><el-dialog title="新增" :visible.sync="addFormVisible" v-model="addFormVisible" :close-on-click-modal="false"><el-form :model="addForm" label-width="80px" :rules="addFormRules" ref="addForm"><el-form-item label="客户姓名" prop="custormer"><el-input v-model="addForm.custormer" auto-complete="off"></el-input></el-form-item><el-form-item label="车牌号" prop="carnum"><el-input v-model="addForm.carnum" auto-complete="off"></el-input></el-form-item><el-form-item label="联系方式" prop="phone"><el-input v-model="addForm.phone" auto-complete="off" ></el-input></el-form-item><el-form-item label="邮箱地址" prop="email"><el-input v-model="addForm.email" auto-complete="off" ></el-input></el-form-item><el-form-item label="维修人员" prop="username"><el-select v-model="addForm.employee.id" placeholder="请选择"><el-optionv-for="item in employees":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item><el-form-item label="地址" prop="address"><el-input type="textarea" v-model="addForm.address"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="addFormVisible = false">取消</el-button><el-button type="primary" @click.native="addSubmit" :loading="addLoading">提交</el-button></div></el-dialog></section><section><!--明细上方工具条--><el-col :span="15" class="itemtoolbar" style="padding-bottom: 0px;"><el-form :inline="true" ><el-form-item><el-button type="primary" icon="el-icon-circle-plus-outline" @click="itemhandleAdd">新增明细单</el-button></el-form-item><el-form-item><el-button type="primary" icon="el-icon-circle-check-outline" @click="setted" style="background-color: orange">订单结算</el-button></el-form-item></el-form></el-col><el-col :span="9" class="itemtoolbar" style="padding-bottom: 0px;"><span style="font-size: 18px;color: #e64242;">维修车辆(双击选中):</span><span v-model="rep_carnum" style="font-size: 18px;color: #1d8ce0" width="50px">{{rep_carnum}}</span></el-col><!--列表--><el-table :data="repairorderitems" highlight-current-row v-loading="itemlistLoading" @selection-change="itemselsChange" style="width: 100%;"><el-table-column type="selection" width="55"></el-table-column><el-table-column prop="id" label="明细单号" width="100" sortable></el-table-column><el-table-column prop="repairOrder.id" label="维修工单号" width="100" sortable></el-table-column><el-table-column prop="employee.username" label="维修人员" width="120" ></el-table-column><el-table-column prop="autoParts.partsname" label="配件名" width="120" ></el-table-column><el-table-column prop="amt1" label="配件价格" width="150" sortable></el-table-column><el-table-column prop="amt2" label="工时费" min-width="120" sortable></el-table-column><el-table-column prop="num" label="数量" min-width="120" sortable></el-table-column><el-table-column prop="totalamt" label="总金额" min-width="180" sortable></el-table-column><el-table-column label="操作" width="150"><template scope="scope"><!--<el-button size="small" @click="itemhandleEdit(scope.$index, scope.row)">修改</el-button>--><el-button type="danger" size="small" @click="itemhandleDel(scope.$index, scope.row)">删除</el-button></template></el-table-column></el-table><!--工具条--><!--<el-col :span="24" class="toolbar"><el-button type="danger" @click="itembatchRemove" :disabled="this.itemsels.length===0">批量删除</el-button><el-pagination layout="prev, pager, next" @current-change="itemhandleCurrentChange" :page-size="10" :total="total" style="float:right;"></el-pagination></el-col>--><!--新增明细界面--><el-dialog title="新增" :visible.sync="repairorderitemFormVisible" v-model="repairorderitemFormVisible" :close-on-click-modal="false"><el-form :model="repairorderitem" label-width="80px" :rules="itemeditFormRules" ref="repairorderitem"><!--维修人员下拉框--><el-form-item label="维修人员" prop="employeeId"><el-select v-model="repairorderitem.employee.id" placeholder="请选择"><el-optionv-for="item in employees":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item><el-form-item label="配件" prop="Parts"><el-select v-model="repairorderitem.autoParts.pid" @change="Changeprice" placeholder="请选择"><el-optionv-for="item in Parts":key="item.pid":label="item.partsname":value="item.pid"></el-option></el-select></el-form-item><el-form-item label="零件单价" prop="amt1"><el-input v-model="repairorderitem.amt1" auto-complete="off" readonly></el-input></el-form-item><el-form-item label="工时费" prop="amt2"><el-input v-model="repairorderitem.amt2" auto-complete="off"></el-input></el-form-item><el-form-item label="零件数量" prop="num"><el-input v-model="repairorderitem.num" auto-complete="off"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="repairorderitemFormVisible = false">取消</el-button><el-button type="primary" @click.native="itemeditSubmit" :loading="addLoading">提交</el-button></div></el-dialog><!--结算界面--><el-dialog title="订单结算" :visible.sync="settedVisible" v-model="settedVisible" :close-on-click-modal="false"><el-form :model="settedVal" label-width="80px" :rules="setted1FormRules" ref="setted1"><el-form-item label="客户姓名" prop="custormer" ><el-input v-model="settedVal.custormer" auto-complete="off" readonly></el-input></el-form-item><el-form-item label="应付金额" prop="re_amount" ><el-input v-model="settedVal.re_amount" auto-complete="off" readonly></el-input></el-form-item><el-form-item label="实付金额" prop="pay_amount" ><el-input v-model="settedVal.pay_amount" auto-complete="off"></el-input></el-form-item><el-form-item label="地址" prop="address" ><el-input v-model="settedVal.address" auto-complete="off" readonly=""></el-input></el-form-item><el-form-item label="支付方式" prop="payType"><el-select label="支付方式" v-model="settedVal.payid.id" placeholder="请选择支付方式"><el-optionv-for="item in selectPayment":key="item.id":label="item.name":value="item.id"></el-option><!--<el-option label="现金" value="1"></el-option><el-option label="银行卡" value="2"></el-option><el-option label="微信" value="3"></el-option><el-option label="支付宝" value="4"></el-option--></el-select></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="settedVisible = false">取消</el-button><el-button type="primary" @click="settedSave">提交</el-button></div></el-dialog></section></div>
</template><script>import util from '../../common/js/util'/*//import NProgress from 'nprogress'*/import { getUserListPage, removeUser, batchRemoveUser, editUser, addUser } from '../../api/api';export default {data() {//手机验证let telCheck = (rule, value, callback) => {if (!value) {return callback(new Error('手机号不能为空'));} else {const reg = /^1[3|4|5|7|8][0-9]\d{8}$/if (reg.test(value)) {callback();} else {return callback(new Error('请输入正确的手机号'));}}};let emailCheck = (rule, value, callback) => {//验证邮箱格式if (!value) {return callback(new Error('邮箱不能为空'));} else {const reg = /^[A-Za-zd0-9]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/;if(reg.test(value)){return callback();}else{return callback(new Error('邮箱格式不正确。'));}}};/*部门验证*/let checkNum = (rule, value, callback) => {value = this.repairorderitem.num;let partsMaxNum=this.repairorderitem.partsMaxNum;if (value>partsMaxNum||value<0){return callback(new Error('该配件仓库最大数量为'+partsMaxNum+',配件数量必须是0至'+partsMaxNum));}else {callback();}};return {//状态查询options: [{value: '0',label: '已录入'}, {value: '1',label: '已结算'}],//结算弹窗settedVisible:false,//结算单数据settedVal:{mainid:{mainid:''},custormer:'',re_amount:null,pay_amount:null,payid:{id:'',name:''},returnType:{id:null},address:'',state:0,phone:'',email:''},//维修房高级查询filters: {carnum: '',custormer:'',state:''},selectPayment:[],repairOrders: [],total: 0,page: 1,listLoading: false,sels: [],//列表选中列addFormVisible: false,//新增界面是否显示addLoading: false,editFormVisible: false,//编辑界面是否显示editLoading: false,editFormRules: {custormer: [{ required: true, message: '请输入姓名', trigger: 'blur' },],carnum: [{ required: true, message: '车牌号必填!', trigger: 'blur' },],address: [{ required: true, message: '请输入还车地址', trigger: 'blur' }],phone: [{ required: true, trigger: 'blur',validator: telCheck }],email: [{ required: true, trigger: 'blur',validator: emailCheck }]},//编辑界面数据editForm: {id: 0,custormer: '',carnum: '',state:1,employee:{id:'',username:''},address: '',phone:'',email:''},//新增规则addFormRules: {custormer: [{ required: true, message: '请输入客户姓名', trigger: 'blur' }],carnum: [{ required: true, message: '车牌号必填!', trigger: 'blur' }],address: [{ required: true, message: '请输入还车地址', trigger: 'blur' }],phone: [{ required: true, trigger: 'blur',validator: telCheck }],email: [{ required: true, trigger: 'blur',validator: emailCheck }]},//新增界面数据addForm: {id: 0,custormer: '',carnum: '',employee:{id:'',username:''},address: '',phone:'',email:''},//明细栏数据//明细栏显示的车牌号,当前选中展示出来的维修单车牌号rep_carnum:'请双击选择维修单!',//明细右上角提示,明细所属的维修单号,当前选中展示出来的维修单号mainid:0,custormer:'',//初始化明细列表,默认为空repairorderitems: [],//明细分页itemtotal: 0,//初始时总共0条itempage: 1,//初始时为第一页//明细加载,默认不加载itemlistLoading: false,//明细多选时,选中行的值itemsels: [],//明细编辑界面,默认关闭repairorderitemFormVisible: false,Parts:[],employees:[],itemeditFormRules: {amt1: [{ required: true, message: '配件单价必填', trigger: 'blur' }],amt2: [{ required: true, message: '工时费必填', trigger: 'blur' }],num: [{ required: true, message: '配件数量必填', trigger: 'blur' },{ validator: checkNum, required: true, trigger: 'blur' }]},//结算框验证规则setted1FormRules: {pay_amount: [{ required: true, message: '请输入实付金额', trigger: 'blur' }],},//新增明细界面数据repairorderitem:{id: 0,repairOrder:{id:this.mainid,},employee:{id:'',username:''},autoParts:{pid:'',partsname:'',price:''},amt1: '',amt2: '',partsMaxNum:'',//可填入的最大数量num:'',//填入的配件数量totalamt:''}}},//方法methods: {formatEmployee: function (row, column) {return row.employee.username;},//清空查询刷新clearFilter() {this.filters.carnum='',this.filters.state='',this.getRepairOrder(),this.getRepairOrderItem(),this.rep_carnum='请双击选择维修单!'},//状态转换formatStatus: function (row, column) {return row.state == 1 ? '待维修':row.state == 0 ? '已结算' : '未知';},//维修单换页handleCurrentChange(val) {this.page = val;this.getRepairOrder();},//维修明细换页itemhandleCurrentChange(val) {this.page = val;this.getRepairOrderItem();},//获取订单列表getRepairOrder() {let para = {page: this.page,//name: this.filters.name,carnum: this.filters.carnum,state:this.filters.state};this.listLoading = true;//NProgress.start();this.$http.patch("/repairorder/page",para).then((res) => {this.repairOrders = res.data.rows;this.total = res.data.total;this.listLoading = false;this.getEmployees();});},//下拉配件列表对应价格Changeprice:function(index){this.$http.delete("/parts/findPrice/"+index,index).then((res) => {this.repairorderitem.amt1=res.data[0].price;this.repairorderitem.partsMaxNum=res.data[0].num;this.$forceUpdate();});},//获取订单明细列表getRepairOrderItem() {let para = {page: this.page,mainid:this.mainid};this.listLoading = true;//NProgress.start();this.$http.get("/repairorderitem/findByRepId/"+this.mainid).then(res=>{this.repairorderitems = res.data;console.debug(this.repairorderitems);//this.total = res.data.total;this.listLoading = false;this.getEmployees();this.getRepairOrder();this.getParts();});},//双击维修单一行显示明细showItems(row){/*console.debug(row);//将选中行赋值给中间变量this.repairorderitems=row;*///根据维修单号mainid查询明细this.mainid=row.id;this.custormer=row.custormer;//显示选中的车牌号this.rep_carnum=row.carnum;//获取根据维修单编号用户名this.$http.get("/repairorder/query/"+this.mainid).then(res=>{this.listLoading = false;this.state=res.data.state;});this.settedVal.mainid.mainid=this.mainid;//分页加载this.getRepairOrderItem();},//删除handleDel: function (index, row) {this.$confirm('确认删除该记录吗?', '提示', {type: 'warning'}).then(() => {this.listLoading = true;//NProgress.start();this.$http.delete("/repairorder/delete/"+row.id).then((res) => {this.listLoading = false;let {success,msg}=res.data;if(success){this.$message({message: '删除成功',type: 'success'});}else{this.$message({message: msg,type: 'error'});}this.getRepairOrder();this.getRepairOrderItem();});}).catch(() => {});},//明细单删除itemhandleDel: function (index, row) {this.$confirm('确认删除该记录吗?', '提示', {type: 'warning'}).then(() => {this.listLoading = true;//NProgress.start();this.$http.delete("/repairorderitem/delete/"+row.id).then((res) => {this.listLoading = false;let {success,msg}=res.data;if(success){this.$message({message: '删除成功',type: 'success'});}else{this.$message({message: msg,type: 'error'});}this.getRepairOrderItem();});}).catch(() => {});},//显示编辑界面handleEdit: function (index, row) {this.editFormVisible = true;//查询维修人员this.getEmployees();//回显this.editForm = Object.assign({}, row);this.$refs['editForm'].clearValidate();},//显示新增界面handleAdd: function () {this.addFormVisible = true;//清空表单this.addForm = {id: 0,custormer: '',carnum: '',state:0,employee:{id:'',username:''},address: '',phone:'',email:''};//清空验证this.$refs['addForm'].resetFields();//查询维修人员this.getEmployees();},/* //修改明细itemhandleEdit: function (index, row) {//回显this.repairorderitemFormVisible = true;//回显作用 拷贝row到新的{}对象,防止修改时,主菜单栏也改变this.repairorderitem = Object.assign({}, row);},*///显示新增明细界面itemhandleAdd: function () {//判断是否选中维修单if(this.mainid===0){this.$message({message: "请双击选择维修单!",type: 'error'});return;}this.repairorderitemFormVisible = true;//清空表单this.repairorderitem = {id: 0,repairOrder:{id:this.mainid,},employee:{id:'',username:''},autoParts:{pid:'',partsname:''},amt1: '',amt2: '',num:'',totalamt:''};},getPayment:function(){this.$http.patch("/select/payment").then((res)=>{this.selectPayment=res.data;});},getEmployees(){this.$http.patch("/employee/repair").then(res=>{console.log(res.data);//判断是否是维修员for(var i=0 ;i<res.data.length;i++){if(res.data[i].department.id==10){this.employees[i]=res.data[i]}}});},getParts(){this.$http.patch("/parts/list").then(res=>{console.debug(res.data);for(var i=0 ;i<res.data.length;i++){{this.Parts[i]=res.data[i];}}});},//编辑editSubmit: function () {//提交之前的验证工作this.$refs.editForm.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {this.editLoading = true;//NProgress.start();let para = Object.assign({}, this.editForm);this.$http.post('/repairorder/update',para).then(res=>{this.editLoading = false;//NProgress.done();this.$message({message: '提交成功',type: 'success'});this.$refs['editForm'].resetFields();this.editFormVisible = false;this.filters.carnum='';this.page=1;this.getRepairOrder();//清空明细栏this.rep_carnum='请双击选择维修单!';this.mainid=0;this.getRepairOrderItem();});});}});},//新增addSubmit: function () {//提交之前的验证工作this.$refs.addForm.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {this.addLoading = true;//NProgress.start();let para = Object.assign({}, this.addForm);console.debug(para);this.$http.put('/repairorder/save',para).then(res=>{this.addLoading = false;//NProgress.done();this.$message({message: '提交成功',type: 'success'});//关闭新增对话框this.addFormVisible = false;this.getRepairOrder();});});}});},//新增明细itemeditSubmit: function () {//提交之前的验证工作this.$refs.repairorderitem.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {this.addLoading = true;//NProgress.start();let para = Object.assign({}, this.repairorderitem);this.$http.put('/repairorderitem/save',para).then(res=>{this.addLoading = false;//NProgress.done();this.$message({message: '提交成功',type: 'success'});//重置表单this.$refs['repairorderitem'].resetFields();//关闭新增对话框this.repairorderitemFormVisible = false;this.getRepairOrderItem();});});}});},//维修单多选时,选中项变化时取值selsChange: function (sels) {this.sels = sels;},//维修明细单多选时,选中项变化时取值itemselsChange: function (itemsels) {this.sels = itemsels;},//批量删除batchRemove: function () {var ids = this.sels.map(item => item.id).toString();this.$confirm('确认删除选中记录吗?', '提示', {type: 'warning'}).then(() => {this.itemlistLoading = true;//NProgress.start();let para = { ids: ids };this.$http.post('/repairorder/delete/'+ids).then(res=>{this.listLoading = false;//NProgress.done();this.$message({message: '删除成功',type: 'success'});this.getRepairOrder();});}).catch(() => {});},//批量删除明细/*itembatchRemove: function () {this.$confirm('确认删除选中记录吗?', '提示', {type: 'warning'}).then(() => {this.itemlistLoading = true;var itempara = this.itemsels;this.$http.patch("/repairorderitem/deletes",itempara).then((res) => {this.listLoading = false;//根据前台返回的 AjaxResult,判断是否成功if(res.data.success){this.$message({message: res.data.message,type: 'success'});}else {this.$message({message: res.data.message,type: 'error'});};//刷新明细展示列表this.getRepairOrderItem();});}).catch(() => {});},*///结算弹窗的方法setted:function(index){//判断是否选中维修单 //维修单idif(this.mainid===0){this.$message({message: "请双击选择需要结算的维修单!",type: 'error'});return;}//判断是否结算if(this.state==1){this.$message({message: "该订单已结算!",type: 'error'});return;}this.getRepairOrder();//获取根据维修单编号用户名this.$http.get("/repairorder/query/"+this.mainid).then(res=>{this.listLoading = false;//顾客姓名this.settedVal.custormer=res.data.custormer;//地址this.settedVal.address=res.data.address;this.getRepairOrder();});//根据mainid查询订单明细this.$http.get("/repairorderitem/findByRepId/"+this.mainid).then(res=>{this.listLoading = false;let amountSum = 0;for(var i=0;i<res.data.length;i++){amountSum=amountSum+res.data[i].totalamt;}//计算出结算订单的总金额this.settedVal.re_amount= amountSum.toFixed();//计算出结算订单的应付金额this.settedVal.pay_amount= amountSum.toFixed();});this.settedVal.payid={id:'',name:''}this.settedVisible=true},//结算保存的方法settedSave(){this.$refs.setted1.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {//拷贝后面对象的值到新的对象,防止后面的代码改动引起模型的变化let para = Object.assign({}, this.settedVal);console.debug(para)//添加与修改走同一个路径,所以不需要判断this.$http.put("/settlementorder/save",para).then((res) => {this.$message({message: '结算成功!',type: 'success'});//重置表单this.$refs['setted1'].resetFields();//关闭对话框this.settedVisible = false;//刷新数据this.filters.carnum='';this.mainid=0;//刷新维修单this.getRepairOrder();//清空明细栏this.getRepairOrderItem();this.rep_carnum='请双击选择维修单!';});});}});}},mounted() {this.getRepairOrder();this.getRepairOrderItem();this.getEmployees();this.getParts();this.getPayment();//获取所有维修员this.$http.patch('/employee/repair').then((res) => {this.employees=res.data;});//获取所有汽车配件this.$http.patch('/parts/list').then((res) => {this.Parts=res.data;});this.$http.patch('/select/payment').then((res) => {this.Parts=res.data;});}}</script><style scoped></style>
RepairOrderController
```java
package cn.itsource.rpms.web.controller;import cn.itsource.basic.query.BaseQuery;
import cn.itsource.basic.util.AjaxResult;
import cn.itsource.basic.util.PageList;
import cn.itsource.rpms.domain.RepairOrder;
import cn.itsource.rpms.query.RepairOrderQuery;
import cn.itsource.rpms.service.IRepairOrderItemService;
import cn.itsource.rpms.service.IRepairOrderService;
import cn.itsource.rpms.util.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
@RequestMapping("/repairorder")
@CrossOrigin//跨域访问的注解支持
public class RepairOrderController {@Autowiredprivate IRepairOrderService repairOrderService;@Autowiredprivate IRepairOrderItemService repairOrderItemService;/*查询全部的数据并分页*/@RequestMapping(value = "/list",method= RequestMethod.PATCH)@ResponseBodypublic List<RepairOrder> getList(){return repairOrderService.findAll();}/*分页查询*/@RequestMapping(value = "/page",method= RequestMethod.PATCH)@ResponseBodypublic PageList<RepairOrder> page(@RequestBody RepairOrderQuery repairOrderQuery){PageList<RepairOrder> pageList = repairOrderService.findByQuery(repairOrderQuery);return pageList;}//新增@RequestMapping(value="/save",method = RequestMethod.PUT)@ResponseBody@CrossOriginpublic AjaxResult save(@RequestBody RepairOrder repairOrder){System.out.println("新增数据");System.out.println(repairOrder);repairOrder.setState(Constants.REPAIRORDERNO);repairOrderService.save(repairOrder);return new AjaxResult();}//修改@RequestMapping(value="/update",method = RequestMethod.POST)@ResponseBodypublic AjaxResult update(@RequestBody RepairOrder repairOrder){System.out.println("修改数据");System.out.println(repairOrder);repairOrderService.update(repairOrder);return new AjaxResult();}//根据id删除@RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE)@ResponseBodypublic AjaxResult delete(@PathVariable("id") Long id){System.out.println("删除数据");System.out.println("删除的id:"+id);try {//删除明细repairOrderItemService.deleteByRepId(id);//删除维修单repairOrderService.delete(id);} catch (Exception e) {e.printStackTrace();return new AjaxResult("删除失败"+e.getMessage());}return new AjaxResult();}/*** 批量删除* @param ids* @return*/@RequestMapping(value="/delete/{ids}",method = RequestMethod.POST)@ResponseBody@CrossOriginpublic AjaxResult delBatch(@PathVariable("ids") String ids){String[] idss = ids.split(",");for (String s : idss) {Long id = Long.valueOf(s);try {//删除明细repairOrderItemService.deleteByRepId(id);//删除明细单repairOrderService.delete(id);} catch (Exception e) {e.printStackTrace();return new AjaxResult(false,"删除失败:"+e.getMessage());}}return new AjaxResult(true,"删除成功");}//根据id查询@RequestMapping(value="/query/{id}",method = RequestMethod.GET)@ResponseBodypublic RepairOrder queryOne(@PathVariable("id") Long id){System.out.println("查询数据");System.out.println("查询的id:"+id);return repairOrderService.findOne(id);}}
# RepairOrderItemController```java
package cn.itsource.rpms.web.controller;import cn.itsource.basic.query.BaseQuery;
import cn.itsource.basic.util.AjaxResult;
import cn.itsource.basic.util.PageList;
import cn.itsource.rpms.domain.AutoParts;
import cn.itsource.rpms.domain.RepairOrder;
import cn.itsource.rpms.domain.RepairOrderItem;
import cn.itsource.rpms.query.RepairOrderItemQuery;
import cn.itsource.rpms.query.RepairOrderQuery;
import cn.itsource.rpms.service.IAutoPartsService;
import cn.itsource.rpms.service.IRepairOrderItemService;
import cn.itsource.rpms.service.IRepairOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
@RequestMapping("/repairorderitem")
@CrossOrigin//跨域访问的注解支持
public class RepairOrderItemController {@Autowiredprivate IRepairOrderItemService repairOrderItemService;@Autowiredprivate IAutoPartsService autoPartsService;@Autowiredprivate IRepairOrderService repairOrderService;/*查询全部的方法*/@RequestMapping(value = "/list",method= RequestMethod.PATCH)@ResponseBodypublic List<RepairOrderItem> getList(){return repairOrderItemService.findAll();}//根据订单号查询明细@RequestMapping(value = "/findByRepId/{id}",method= RequestMethod.GET)@ResponseBodypublic List<RepairOrder> findByRepId(@PathVariable("id") Long id){return repairOrderItemService.findByRepId(id);}/*分页查询*/@RequestMapping(value = "/page",method= RequestMethod.PATCH)@ResponseBodypublic PageList<RepairOrderItem> page(@RequestBody RepairOrderItemQuery repairOrderItemQuery){PageList<RepairOrderItem> pageList = repairOrderItemService.findByQuery(repairOrderItemQuery);return pageList;}//新增@RequestMapping(value="/save",method = RequestMethod.PUT)@ResponseBodypublic AjaxResult save(@RequestBody RepairOrderItem repairOrderItem){System.out.println("新增数据");System.out.println(repairOrderItem);//得到前台输入的零件数量和idInteger num = repairOrderItem.getNum();//新增维修明细单,配件的减少AutoParts oneParts = autoPartsService.findOne(repairOrderItem.getAutoParts().getPid());Integer num1 = oneParts.getNum();AutoParts parts= new AutoParts();parts.setPid(repairOrderItem.getAutoParts().getPid());parts.setNum(num1-num);parts.setPartsname(oneParts.getPartsname());parts.setPrice(oneParts.getPrice());parts.setWarnnum(oneParts.getWarnnum());parts.setContext(oneParts.getContext());autoPartsService.update(parts);repairOrderItemService.save(repairOrderItem);return new AjaxResult();}//修改@RequestMapping(value="/update",method = RequestMethod.POST)@ResponseBodypublic AjaxResult update(@RequestBody RepairOrderItem repairOrderItem){System.out.println("修改数据");System.out.println(repairOrderItem);repairOrderItemService.update(repairOrderItem);return new AjaxResult();}//根据id删除@RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE)@ResponseBodypublic AjaxResult delete(@PathVariable("id") Long id){System.out.println("删除数据");System.out.println("删除的id:"+id);//查询明细单RepairOrderItem repairOrderItem = repairOrderItemService.findOne(id);//根据明细单查询维修单RepairOrder repairOrder = repairOrderService.findOne(repairOrderItem.getRepairOrder().getId());try {//判断状态未结算if(repairOrder.getState()!=1){//得到前台输入的零件数量和idInteger num = repairOrderItem.getNum();//删除维修明细单,配件的回复AutoParts oneParts = autoPartsService.findOne(repairOrderItem.getAutoParts().getPid());Integer num1 = oneParts.getNum();AutoParts parts= new AutoParts();parts.setPid(repairOrderItem.getAutoParts().getPid());parts.setNum(num1+num);parts.setPartsname(oneParts.getPartsname());parts.setPrice(oneParts.getPrice());parts.setWarnnum(oneParts.getWarnnum());parts.setContext(oneParts.getContext());autoPartsService.update(parts);repairOrderItemService.delete(id);}else {repairOrderItemService.delete(id);}} catch (Exception e) {e.printStackTrace();return new AjaxResult("删除失败"+e.getMessage());}return new AjaxResult();}//根据id查询@RequestMapping(value="/query/{id}",method = RequestMethod.GET)@ResponseBodypublic RepairOrderItem queryOne(@PathVariable("id") Long id){System.out.println("查询数据");System.out.println("查询的id:"+id);return repairOrderItemService.findOne(id);}}
这篇关于RPMS_4s汽车维修管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!