RPMS_4s汽车维修管理

Saas

什么是Saas

SaaS是Software-as-a-service(软件即服务)。SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统

在这里插入图片描述

Saas模式:

在这里插入图片描述

Saas 模式下面的数据安全问题

​ 方案一: 可一个租户都单独的数据库 – 安全性最高

在这里插入图片描述

方案二: 共享数据库 ,独立schema(oracle比较明显)(用户 方案 – 表)
在这里插入图片描述

方案三: 共享数据库 ,共享表 . – 目前

在这里插入图片描述

saas的权限设计

以前权限设计的模式:

在这里插入图片描述

扫描二维码关注公众号,回复: 9088726 查看本文章

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);

    }

}

发布了14 篇原创文章 · 获赞 5 · 访问量 688

猜你喜欢

转载自blog.csdn.net/weixin_46091684/article/details/103979802
今日推荐