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 xxxx
Long total = departmentMapper.findTotal(departmentQuery);
//总的条数
pageList.setTotal(total);
// select *from xx where limit 0, 10
List<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.companyName
from t_department d
join t_employee e on d.manager_id = e.id
join t_department p on d.parent_id = p.id
join 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 d
join t_department p on d.parent_id = p.id
order 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_role
roleMapper.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-option
v-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-upload
class="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 analyzer
Analyzer analyzer = new SimpleAnalyzer();
IndexWriterConfig conf = new IndexWriterConfig(analyzer);
//得到一个索引的写入器对象
IndexWriter indexWriter = new IndexWriter(d,conf);
//相当于 一个行数据 -- 一个对象 new Person
Document 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-option
v-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-option
v-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-option
v-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-option
v-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-option
v-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-option
v-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){
//判断是否选中维修单 //维修单id
if(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 {
@Autowired
private IRepairOrderService repairOrderService;
@Autowired
private IRepairOrderItemService repairOrderItemService;
/*查询全部的数据并分页*/
@RequestMapping(value = "/list",method= RequestMethod.PATCH)
@ResponseBody
public List<RepairOrder> getList(){
return repairOrderService.findAll();
}
/*分页查询*/
@RequestMapping(value = "/page",method= RequestMethod.PATCH)
@ResponseBody
public PageList<RepairOrder> page(@RequestBody RepairOrderQuery repairOrderQuery){
PageList<RepairOrder> pageList = repairOrderService.findByQuery(repairOrderQuery);
return pageList;
}
//新增
@RequestMapping(value="/save",method = RequestMethod.PUT)
@ResponseBody
@CrossOrigin
public 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)
@ResponseBody
public 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)
@ResponseBody
public 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
@CrossOrigin
public 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)
@ResponseBody
public 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 {
@Autowired
private IRepairOrderItemService repairOrderItemService;
@Autowired
private IAutoPartsService autoPartsService;
@Autowired
private IRepairOrderService repairOrderService;
/*查询全部的方法*/
@RequestMapping(value = "/list",method= RequestMethod.PATCH)
@ResponseBody
public List<RepairOrderItem> getList(){
return repairOrderItemService.findAll();
}
//根据订单号查询明细
@RequestMapping(value = "/findByRepId/{id}",method= RequestMethod.GET)
@ResponseBody
public List<RepairOrder> findByRepId(@PathVariable("id") Long id){
return repairOrderItemService.findByRepId(id);
}
/*分页查询*/
@RequestMapping(value = "/page",method= RequestMethod.PATCH)
@ResponseBody
public PageList<RepairOrderItem> page(@RequestBody RepairOrderItemQuery repairOrderItemQuery){
PageList<RepairOrderItem> pageList = repairOrderItemService.findByQuery(repairOrderItemQuery);
return pageList;
}
//新增
@RequestMapping(value="/save",method = RequestMethod.PUT)
@ResponseBody
public AjaxResult save(@RequestBody RepairOrderItem repairOrderItem){
System.out.println("新增数据");
System.out.println(repairOrderItem);
//得到前台输入的零件数量和id
Integer 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)
@ResponseBody
public 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)
@ResponseBody
public 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){
//得到前台输入的零件数量和id
Integer 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)
@ResponseBody
public RepairOrderItem queryOne(@PathVariable("id") Long id){
System.out.println("查询数据");
System.out.println("查询的id:"+id);
return repairOrderItemService.findOne(id);
}
}