| admin/src/api/Inspection/device.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/api/workorder/ywWorkorder.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/api/ywProblem.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/project/components/houseDetails.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/project/housingList.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/workorder/components/OperaYwWorkorderWindow.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/workorder/components/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/workorder/components/handleProblem.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/workorder/components/problemReportingDetails.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| admin/src/views/workorder/problemReporting.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
admin/src/api/Inspection/device.js
@@ -42,3 +42,13 @@ } }) } // 设备状态统计 export function getDeviceStatus (data) { return request.post('/visitsAdmin/cloudService/business/ywDevice/getDeviceStatus', data) } // 设备数量分类统计 export function getDeviceCateData (data) { return request.post('/visitsAdmin/cloudService/business/ywDevice/getDeviceCateData', data) } admin/src/api/workorder/ywWorkorder.js
@@ -32,6 +32,11 @@ return request.post('/visitsAdmin/cloudService/business/ywWorkorder/updateById', data) } // 获取工单数量信息 export function getDataVO (data) { return request.post('/visitsAdmin/cloudService/business/ywWorkorder/getDataVO', data) } // 删除 export function deleteById (id) { return request.get(`/visitsAdmin/cloudService/business/ywWorkorder/delete/${id}`) admin/src/api/ywProblem.js
@@ -13,11 +13,26 @@ } // 根据ID修改 export function editProblem (data) { return request.post('/visitsAdmin/cloudService/business/ywProblem/editProblem', data) } // 根据ID修改 export function updateById (data) { return request.post('/visitsAdmin/cloudService/business/ywProblem/updateById', data) } // 根据ID查询 export function getById (id) { return request.get(`/visitsAdmin/cloudService/business/ywProblem/${id}`) } // 删除 export function deleteById (id) { return request.get(`/visitsAdmin/cloudService/business/ywProblem/delete/${id}`) } // 根据工单查询 export function getByWorkorderId (workorderId) { return request.get(`/visitsAdmin/cloudService/business/ywProblem/getByWorkorderId?workorderId=${workorderId}`) } admin/src/views/project/components/houseDetails.vue
@@ -1,11 +1,16 @@ <template> <GlobalWindow title="楼宇详情" :title="title" :showConfirm="false" :visible.sync="visible" width="800px"> width="100%"> <div class="right"> <div class="right_head">项目名称</div> <div class="right_head"> <span>{{info.roomNum}}</span> <el-tag type="success" v-if="info.leaseStatus === 0">待租赁</el-tag> <el-tag type="success" v-if="info.leaseStatus === 1">已租赁</el-tag> <el-tag type="success" v-if="info.leaseStatus === 2">未开启租赁</el-tag> </div> <div class="right_cate"> <el-tabs v-model="activeName" @tab-click="handleClick"> <el-tab-pane label="房源信息" name="houseinfo"> @@ -17,39 +22,40 @@ <div class="xm_info"> <div class="xm_info_row" style="width: 25%;"> <span>所属项目</span> <span>XXXXXXXXXX</span> <span>{{info.projectName}}</span> </div> <div class="xm_info_row" style="width: 25%;"> <span>楼宇</span> <span>综合楼</span> <span>{{info.buildingName}}</span> </div> <div class="xm_info_row" style="width: 25%;"> <span>楼层</span> <span>1</span> <span>{{info.floorName}}</span> </div> <div class="xm_info_row" style="width: 25%;"> <span>房号</span> <span>101活动室</span> <span>{{info.roomNum}}</span> </div> <div class="xm_info_row" style="width: 25%; margin-top: 15px;"> <span>房间编号</span> <span>101</span> <span>{{info.code}}</span> </div> <div class="xm_info_row" style="width: 25%; margin-top: 15px;"> <span>是否招商</span> <span>否</span> <span v-if="info.isInvestment === 0">否</span> <span v-if="info.isInvestment === 1">是</span> </div> <div class="xm_info_row" style="width: 25%; margin-top: 15px;"> <span>建筑面积</span> <span>50㎡</span> <span>{{info.area}}㎡</span> </div> <div class="xm_info_row" style="width: 25%; margin-top: 15px;"> <span>计租面积</span> <span>50㎡</span> <span>{{info.rentArea}}㎡</span> </div> <div class="xm_info_row" style="width: 25%; margin-top: 15px;"> <span>计费面积</span> <span>45㎡</span> <span>{{info.feeArea}}㎡</span> </div> </div> </el-card> @@ -62,37 +68,51 @@ <span>当前在租合同</span> </div> <div class="xm_table"> <el-input v-model="input" style="width: 300px; margin-bottom: 15px;" placeholder="请输入合同编号"></el-input> <div style="width: 100%; display: flex; align-items: center; margin-bottom: 15px;"> <el-input v-model="form.code" style="width: 300px;" placeholder="请输入合同编号"></el-input> <el-button type="primary" style="margin-left: 15px;" @click="getTenantContract()">搜索</el-button> </div> <el-table :data="tableData" border v-loading="loading" style="width: 100%"> <el-table-column prop="date" label="合同编号"> <template slot-scope="{row}"> <el-button type="text" @click="$refs.ContractDetailRef.open('合同详情', row.id)" v-if="row.status === 1">{{row.code}}</el-button> <el-button type="text" v-else>{{row.code}}</el-button> </template> </el-table-column> <el-table-column prop="name" prop="renterName" label="客户名称"> </el-table-column> <el-table-column prop="address" prop="startDate" label="开始日期"> </el-table-column> <el-table-column prop="address" prop="endDate" label="结束日期"> </el-table-column> <el-table-column prop="address" label="租赁单价"> <template slot-scope="{row}"> <div style="display: flex; align-items: center;"> <span>{{row.zlFirstPrice || row.wyFirstPrice}}</span> <span>{{row.zlFirstCircleStr || row.wyFirstCircleStr}}</span> </div> </template> </el-table-column> <el-table-column prop="address" label="租赁面积(㎡)"> <template slot-scope="{row}"> {{row.totalArea}}㎡ </template> </el-table-column> <el-table-column prop="address" prop="signDate" label="签订日"> </el-table-column> <el-table-column @@ -100,8 +120,14 @@ label="合同来源"> </el-table-column> <el-table-column prop="address" label="合同状态"> <template slot-scope="{row}"> <span class="primaryColor" v-if="row.status === 0">待执行</span> <span class="green" v-if="row.status === 1">正常执行中</span> <span class="gary" v-if="row.status === 2">已到期</span> <span class="gary" v-if="row.status === 3">退租结算中</span> <span class="gary" v-if="row.status === 4">已退租</span> </template> </el-table-column> </el-table> <div class="xm_table_f"> @@ -125,73 +151,82 @@ <div class="xm_one1"> <div class="xm_one_row"> <span>待指派数量</span> <span>15</span> <span>{{numObj.waitAssignAmount || 0}}</span> </div> <div class="xm_one_row"> <span>待处理数量</span> <span>15</span> <span>{{numObj.waitDealAmount || 0}}</span> </div> <div class="xm_one_row"> <span>本月工单数</span> <span>15</span> <span>{{numObj.monthAmount || 0}}</span> </div> <div class="xm_one_row"> <span>累计工单数</span> <span>15</span> <span>{{numObj.amount || 0}}</span> </div> </div> </el-card> <el-card style="margin-top: 20px;"> <div class="xm_table"> <div class="xm_table_search"> <el-select v-model="value" style="width: 300px; margin-right: 15px;" placeholder="位置类型"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> <div> <el-cascader style="width: 150px; margin-right: 15px;" v-model="form.areaIds" @change="changeSel" placeholder="请选择工单分类" clearable :options="cateList" :props="{ label: 'name', value: 'id', children: 'childCategoryList' }" /> <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="工单状态"> <el-option label="启用" :value="0"></el-option> <el-option label="禁用" :value="1"></el-option> </el-select> <el-select v-model="value" style="width: 300px;" placeholder="工单分类"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> <el-button type="primary" @click="getFetchList">查询</el-button> <el-button @click="clear">清空</el-button> </div> <el-button type="primary" @click="$refs.operaYwWorkorderWindow.open('新建工单')">新增工单</el-button> </div> <el-table :data="tableData" border v-loading="loading" style="width: 100%"> <el-table-column prop="date" prop="categoryName" label="工单分类"> </el-table-column> <el-table-column prop="name" label="报修区域"> <template v-slot="scope"> <span>{{ scope.row.buildingName }} / {{ scope.row.areaType == 0 ? scope.row.roomNum : scope.row.floorName }}</span> </template> </el-table-column> <el-table-column prop="address" prop="creatorName" label="上报人"> </el-table-column> <el-table-column prop="address" prop="createDate" label="上报时间"> </el-table-column> <el-table-column prop="address" prop="dealUserName" label="处理人"> </el-table-column> <el-table-column prop="address" label="工单状态"> <template slot-scope="{row}"> <span v-if="row.dealStatus === 0">待指派</span> <span v-if="row.dealStatus === 1">已指派</span> <span v-if="row.dealStatus === 2">已处理</span> </template> </el-table-column> <el-table-column prop="address" label="操作"> <template slot-scope="{row}"> <el-button type="text" @click="handleDetail(row)">查看详情</el-button> </template> </el-table-column> </el-table> <div class="xm_table_f"> @@ -223,51 +258,53 @@ <div class="xm_table"> <div class="xm_table_search"> <div class="xm_table_search_left"> <el-input v-model="input" placeholder="请输入设备名称/编码" style="width: 200px; margin-right: 15px;"></el-input> <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="设备状态"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> <el-input v-model="form.name" placeholder="请输入设备名称/编码" style="width: 200px; margin-right: 15px;"></el-input> <el-select v-model="form.status" style="width: 150px; margin-right: 15px;" placeholder="设备状态"> <el-option label="正常" :value="0"></el-option> <el-option label="损坏" :value="1"></el-option> <el-option label="报废" :value="2"></el-option> </el-select> <el-button type="primary">查询</el-button> <el-button>清空</el-button> <el-button type="primary" @click="getDevicePage">查询</el-button> <el-button @click="clear">清空</el-button> </div> <el-button type="primary">新增</el-button> <el-button type="primary" @click="handleEdit">新增</el-button> </div> <el-table :data="tableData" border v-loading="loading" style="width: 100%"> <el-table-column prop="date" label="工单分类"> prop="code" label="设备编码"> </el-table-column> <el-table-column prop="name" label="报修区域"> label="设备名称"> </el-table-column> <el-table-column prop="address" label="上报人"> prop="categoryName" label="设备分类"> </el-table-column> <el-table-column prop="address" label="上报时间"> prop="modelNo" label="设备型号"> </el-table-column> <el-table-column prop="address" label="处理人"> prop="realName" label="设备管理员"> </el-table-column> <el-table-column prop="address" label="工单状态"> prop="supplier" label="设备供应商"> </el-table-column> <el-table-column prop="address" label="操作"> label="设备状态"> <template slot-scope="{row}"> <span v-if="row.status === 0">正常</span> <span v-if="row.status === 1">损坏</span> <span v-if="row.status === 2">报废</span> </template> </el-table-column> </el-table> <div class="xm_table_f"> @@ -294,7 +331,7 @@ <div class="xm_table"> <div class="xm_table_search"> <div class="xm_table_search_left"> <el-input v-model="input" placeholder="请输入资产名称/编码" style="width: 200px; margin-right: 15px;"></el-input> <el-input v-model="form.code" placeholder="请输入资产名称/编码" style="width: 200px; margin-right: 15px;"></el-input> <el-select v-model="value" style="width: 200px; margin-right: 15px;" placeholder="资产分类"> <el-option v-for="item in options" @@ -303,17 +340,18 @@ :value="item.value"> </el-option> </el-select> <el-button type="primary">查询</el-button> <el-button>清空</el-button> <el-button type="primary" @click="getPropertyLists">查询</el-button> <el-button @click="clear">清空</el-button> </div> <el-button type="primary">新增</el-button> <el-button type="primary" @click="$refs.newMaterial.open('新建物料')">新增</el-button> </div> <el-table :data="tableData" border v-loading="loading" style="width: 100%"> <el-table-column prop="date" prop="code" label="资产编码"> </el-table-column> <el-table-column @@ -321,24 +359,26 @@ label="资产名称"> </el-table-column> <el-table-column prop="address" prop="qrcode" label="条码"> </el-table-column> <el-table-column prop="address" prop="brand" label="品牌"> </el-table-column> <el-table-column prop="address" prop="attr" label="规格型号"> </el-table-column> <el-table-column prop="address" prop="unitName" label="单位"> </el-table-column> <el-table-column prop="address" label="库存数量"> <template v-slot="scope"> <span>{{ scope.row.maxStock }} ~ {{ scope.row.minStock }}</span> </template> </el-table-column> </el-table> <div class="xm_table_f"> @@ -359,34 +399,222 @@ </el-tabs> </div> </div> <!-- 合同详情 --> <ContractDetail ref="ContractDetailRef" /> <!-- 工单详情 --> <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" /> <!-- 新建工单 --> <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" @success="getFetchList" /> <!-- 新建设备 --> <Edit v-if="showEdit1" ref="EditRef" @success="getDevicePage" @close="showEdit1 = false" /> <!-- 新建资产 --> <newMaterial ref="newMaterial" @success="getPropertyLists" /> </GlobalWindow> </template> <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import newMaterial from '../../stock/components/newMaterial' import * as echarts from 'echarts'; import { detailById } from '@/api/project/ywRoom' import { fetchList as TenantContract } from '@/api/contract' import { getDataVO, fetchList } from '@/api/workorder/ywWorkorder' import ContractDetail from '../../contract/components/contractDetail' import { fetchList as getCateList } from '@/api/business/category.js' import { fetchList as getPropertyList } from '@/api/ywMaterial' import { getDeviceStatus, getDeviceCateData, fetchList as devicePage } from '@/api/Inspection/device' import Detail from '../../workorder/components/detail' import OperaYwWorkorderWindow from '../../workorder/components/OperaYwWorkorderWindow' import Edit from '../../operation/components/deviceEdit' export default { name: "houseDetails", extends: BaseOpera, components: { GlobalWindow }, components: { GlobalWindow, ContractDetail, Detail, OperaYwWorkorderWindow, Edit, newMaterial }, data() { return { info: {}, houseId: '', propsName: '', activeName: 'houseinfo', total: 0, pageTotal: 10, page: 1, tableData: [] numObj: {}, tableData: [], loading: false, form: { code: '', areaIds: [], cateId: '', status: '', name: '' }, cateList: [], categaryList: [], deviceList: [], showDetail: false, showEdit1: false } }, methods: { open (title, target) { open (title, id) { this.title = title this.houseId = id detailById(id) .then(res => { this.info = res this.visible = true }) }, handleEdit(row) { this.showEdit1 = true this.$nextTick(() => { this.$refs.EditRef.isShowModal = true }) }, handleDetail(row) { this.showDetail = true this.$nextTick(() => { this.$refs.DetailRef.visible = true this.$refs.DetailRef.id = row.id this.$refs.DetailRef.getDetail() }) }, // 获取设备状态 getDevice() { getDeviceStatus({ roomId: this.houseId }) .then(res => { this.$nextTick(() => { this.deviceList = [ { value: res.workAmount || 0, name: '正常' }, { value: res.exceptionAmount || 0, name: '异常' }, { value: res.errAmount || 0, name: '报废' } ] this.reand() }) }) }, // 设备数量分布统计 getDeviceCateDatas() { getDeviceCateData({ roomId: this.houseId }).then(res => { this.categaryList = res this.$nextTick(() => { this.reand1() }) }) }, // 获取设备分页 getDevicePage() { this.loading = true devicePage({ capacity: this.pageTotal, page: this.page, model: { roomId: this.houseId, status: this.form.status, name: this.form.name } }).then(res => { this.tableData = res.records this.total = res.total }).finally(() => { this.loading = false }) }, // 获取资产列表 getPropertyLists() { this.loading = true getPropertyList({ capacity: this.pageTotal, page: this.page, model: { roomId: this.houseId, name: this.form.name } }).then(res => { this.tableData = res.records this.total = res.total }).finally(() => { this.loading = false }) }, getCate() { getCateList({ model: { type: 3 }, capacity: 1000, page: 1, }).then(res => { this.cateList = res.records || [] }) }, changeSel(e) { if (e && e.length == 2) { this.$set(this.form, 'cateId', e[1]) } else { this.$set(this.form, 'cateId', '') } }, clear() { this.page = 1 this.form.status = '' this.form.areaIds = [] this.form.cateId = '' this.form.name = '' if (this.propsName === 'project') { this.getTenantContract() } else if (this.propsName === 'second') { this.getFetchList() } else if (this.propsName === 'third') { this.getDevicePage() } else if (this.propsName === 'fourth') { this.getPropertyLists() } }, // 获取工单数 getDataVOs() { getDataVO({ queryId: this.houseId, queryType: 3 }).then(res => { this.numObj = res }) }, // 获取工单列表 getFetchList() { this.loading = true fetchList({ capacity: 10, page: 1, model: { roomId: this.houseId, status: this.form.status, cateId: this.form.cateId } }).then(res => { this.tableData = res.records this.total = res.total }).finally(() => { this.loading = false }) }, // 获取合同分页 getTenantContract() { this.loading = true TenantContract({ capacity: this.pageTotal, page: this.page, model: { roomIds: [this.houseId], code: this.form.code } }).then(res => { this.tableData = res.records this.total = res.total }).finally(() => { this.loading = false }) }, reand() { @@ -394,38 +622,29 @@ var myChart = echarts.init(chartDom); var option; option = { title: { text: '设备状态' }, tooltip: { trigger: 'item' }, legend: { top: '5%', left: 'center' left: 'right', top: 'middle', width: '80' }, series: [ { name: 'Access From', name: '设备状态', type: 'pie', radius: ['40%', '80%'], avoidLabelOverlap: false, label: { show: false, position: 'center' }, emphasis: { label: { show: true, fontSize: 40, fontWeight: 'bold' } position: 'center', fontWeight: 'bold', fontSize: 22 }, labelLine: { show: false }, data: [ { value: 1048, name: '正常' }, { value: 735, name: '异常' }, { value: 580, name: '报废' } ] data: this.deviceList } ] }; @@ -435,7 +654,6 @@ var chartDom = document.getElementById('chat2'); var myChart = echarts.init(chartDom); var option; // There should not be negative values in rawData const rawData = [ [100, 302, 301, 334, 390, 330, 320], [320, 132, 101, 134, 90, 230, 210], @@ -451,12 +669,6 @@ } totalData.push(sum); } const grid = { left: 100, right: 100, top: 50, bottom: 50 }; const series = [ 'Direct', 'Mail Ad', @@ -469,41 +681,103 @@ type: 'bar', stack: 'total', barWidth: '60%', label: { show: true, formatter: (params) => Math.round(params.value * 1000) / 10 + '%' }, data: rawData[sid].map((d, did) => totalData[did] <= 0 ? 0 : d / totalData[did] ) }; }); let seriesArr = this.categaryList.map(item => { return { name: item.cateName, type: 'bar', stack: 'total', barWidth: '60%', data: item.ywDeviceCateDataVOList.map((child) => child.deviceAmount ) } }) let xAxisData = this.categaryList.map(item => item.cateName) console.log(series) console.log(seriesArr) console.log(xAxisData) option = { legend: { selectedMode: false title: { text: '设备数量分类统计' }, grid, grid: { left: 50, right: 50, top: 50, bottom: 50 }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } }, yAxis: { type: 'value' }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] data: xAxisData }, series series: seriesArr }; option && myChart.setOption(option); }, handleClick(tab, event) { console.log(tab, event); handleClick(tab) { this.page = 1 this.pageTotal = 10 this.tableData = [] this.total = 0 this.form.code = '' this.form.areaIds = [] this.form.cateId = '' this.form.status = '' this.form.name = '' this.propsName = tab._props.name if (tab._props.name === 'project') { this.getTenantContract() } else if (tab._props.name === 'second') { this.getDataVOs() this.getCate() this.getFetchList() } else if (tab._props.name === 'third') { this.getDevice() this.getDeviceCateDatas() this.getDevicePage() } else if (this.propsName === 'fourth') { this.getPropertyLists() } }, handleCurrentChange(page) { this.page = page if (this.propsName === 'project') { this.getTenantContract() } else if (this.propsName === 'second') { this.getFetchList() } else if (tab._props.name === 'third') { this.getDevicePage() } else if (this.propsName === 'fourth') { this.getPropertyLists() } }, handleSizeChange(pageTotal) { this.pageTotal = pageTotal }, if (this.propsName === 'project') { this.getTenantContract() } else if (this.propsName === 'second') { this.getFetchList() } else if (tab._props.name === 'third') { this.getDevicePage() } else if (this.propsName === 'fourth') { this.getPropertyLists() } } } } </script> @@ -517,10 +791,13 @@ width: 100%; padding: 20px; box-sizing: border-box; span { font-size: 16px; font-weight: bold; color: black; background: #ffffff; margin-right: 10px; } } .right_cate { width: 100%; admin/src/views/project/housingList.vue
@@ -54,7 +54,7 @@ <el-table-column v-if="containPermissions(['business:ywroom:update', 'business:ywroom:delete'])" label="操作" min-width="140" fixed="right"> <template slot-scope="{row}"> <el-button type="text" @click="$refs.houseDetails.open('房源详情')">查看详情</el-button> <el-button type="text" @click="$refs.houseDetails.open('房源详情', row.id)">查看详情</el-button> <el-button type="text" @click="editClick(row)" icon="el-icon-edit" v-permissions="['business:ywroom:update']">编辑</el-button> <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -3,32 +3,48 @@ @confirm="confirm"> <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="位置类型" prop="areaType"> <el-select v-model="form.areaType"> <el-option label="室内维修" value="0"></el-option> <el-option label="公共维修" value="1"></el-option> </el-select> </el-form-item> <el-form-item label="选择项目" prop="projectId"> <el-select v-model="form.projectId" clearable filterable @change="getBuild"> <el-option v-for="item in projectList" :label="item.name" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="选择楼宇" prop="buildingId"> <el-select v-model="form.buildingId" clearable filterable @change="changeBuild"> <el-option v-for="item in buildList" :label="item.name" :value="item.id" /> <el-select v-model="form.areaType" @change="changeType"> <el-option label="室内维修" :value="0"></el-option> <el-option label="公共维修" :value="1"></el-option> </el-select> </el-form-item> <el-form-item v-if="form.areaType == 1" label="选择楼层" prop="floorId"> <el-select v-model="form.floorId"> <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" /> </el-select> <el-form-item label="报修区域" prop="rooms"> <el-cascader v-model="form.rooms" :disabled="![0,1].includes(form.areaType)" ref="cascader" @change="getHouseVal" placeholder="请选择报修区域" :options="form.areaType === 0 ? houseList : houseList1" :props="{ label: 'name', value: 'id', children: 'projectDataVOList' }" /> </el-form-item> <el-form-item v-if="form.areaType == 0" label="选择房间" prop="roomId"> <el-select v-model="form.roomId" clearable filterable> <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" /> </el-select> </el-form-item> <!-- <el-form-item label="选择项目" prop="projectId">--> <!-- <el-select v-model="form.projectId" clearable filterable @change="getBuild">--> <!-- <el-option v-for="item in projectList" :label="item.name" :value="item.id" />--> <!-- </el-select>--> <!-- </el-form-item>--> <!-- <el-form-item label="选择楼宇" prop="buildingId">--> <!-- <el-select v-model="form.buildingId" clearable filterable @change="changeBuild">--> <!-- <el-option v-for="item in buildList" :label="item.name" :value="item.id" />--> <!-- </el-select>--> <!-- </el-form-item>--> <!-- <el-form-item v-if="form.areaType == 1" label="选择楼层" prop="floorId">--> <!-- <el-select v-model="form.floorId">--> <!-- <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />--> <!-- </el-select>--> <!-- </el-form-item>--> <!-- <el-form-item v-if="form.areaType == 0" label="选择房间" prop="roomId">--> <!-- <el-select v-model="form.roomId" clearable filterable>--> <!-- <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" />--> <!-- </el-select>--> <!-- </el-form-item>--> <el-form-item label="工单分类" prop="cateId"> <el-cascader v-model="form.areaIds" @change="changeSel" placeholder="请选择分类" clearable :options="cateList" :props="{ @@ -63,8 +79,6 @@ <el-input type="textarea" :rows="4" v-model="form.content" placeholder="请输入" :maxlength="300" v-trim /> </el-form-item> </el-form> <!-- --> </GlobalWindow> </template> @@ -72,7 +86,7 @@ import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import { Loading, Message } from 'element-ui' import { getProjectList } from '@/api/project/ywProject' import { getProjectList, tree } from '@/api/project/ywProject' import { getBuildList } from '@/api/project/ywBuilding' import { getRoomList } from '@/api/project/ywRoom' import { getFloorList } from '@/api/project/yeFloor' @@ -87,6 +101,9 @@ // 表单数据 form: { id: null, rooms: [], editDate: '', floor: '', title: '', @@ -102,7 +119,7 @@ userId: '', submitDate: '', cateId: '', areaType: '0', areaType: 0, code: '', dealStatus: '', dispatchUserId: '', @@ -113,6 +130,8 @@ dealInfo: '', dealType: '' }, houseList: [], houseList1: [], loadingInstance: null, // 验证规则 rules, @@ -140,6 +159,7 @@ this.visible = true this.getProject() this.getCate() this.getHouseTree() // 新建 if (target == null) { this.form = { @@ -159,7 +179,7 @@ userId: '', submitDate: '', cateId: '', areaType: '0', areaType: 0, code: '', dealStatus: '', dispatchUserId: '', @@ -186,6 +206,65 @@ } }) }, changeType(e) { this.form.rooms = [] this.form.projectId = '' this.form.buildingId = '' this.form.levelList = '' this.form.roomId = '' }, getHouseVal(e) { if (this.form.areaType === 0) { this.form.projectId = e[0] this.form.buildingId = e[1] this.form.floorId = e[2] this.form.roomId = e[3] } else { this.form.projectId = e[0] this.form.buildingId = e[1] this.form.floorId = e[2] } }, getHouseTree() { tree({}).then(res => { let arr1 = JSON.parse(JSON.stringify(res)) let arr2 = JSON.parse(JSON.stringify(res)) this.addParamToArray(arr1) this.addParamToArray1(arr2) this.houseList = arr1 this.houseList1 = arr2 }) }, addParamToArray(arr) { for (let i = 0; i < arr.length; i++) { const currentItem = arr[i].projectDataVOList if (currentItem && currentItem.length >= 0) { currentItem.forEach(item => { if (item.lv === 3) { delete item.projectDataVOList } }) } if (currentItem && currentItem.length > 0) { this.addParamToArray(currentItem) } } }, addParamToArray1(arr) { for (let i = 0; i < arr.length; i++) { const currentItem = arr[i].projectDataVOList if (currentItem && currentItem.length >= 0) { currentItem.forEach(item => { if (item.lv === 2) { delete item.projectDataVOList } }) } if (currentItem && currentItem.length > 0) { this.addParamToArray1(currentItem) } } }, close() { this.visible = false this.$emit('close') admin/src/views/workorder/components/detail.vue
@@ -11,7 +11,7 @@ <div class="status gray" v-if="info.dealStatus == 2">已处理</div> </div> </div> <el-button>查看问题上报</el-button> <el-button v-if="info.origin === 1" @click="openWT">查看问题上报</el-button> </div> <div class="main_content"> <div class="list"> @@ -26,6 +26,11 @@ <div class="item"> <div class="la">工单分类</div> <div class="val">{{ info.categoryName }}</div> </div> <div class="item"> <div class="la">来源</div> <div class="val" v-if="info.origin === 0">自建</div> <div class="val" v-if="info.origin === 1">问题转工单</div> </div> <div class="item"> <div class="la">上报人</div> @@ -167,19 +172,24 @@ </template> </el-form> </div> <!-- 问题上报详情 --> <problemReportingDetails ref="problemReportingDetails" /> </GlobalWindow> </template> <script> import GlobalWindow from '@/components/common/GlobalWindow' import BaseOpera from '@/components/base/BaseOpera' import problemReportingDetails from './problemReportingDetails' import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder' import { getByWorkorderId } from '@/api/ywProblem' import { getUserList } from '@/api/system/user' import { Message, Loading } from 'element-ui' import dayjs from 'dayjs' export default { components: { GlobalWindow GlobalWindow, problemReportingDetails }, extends: BaseOpera, data() { @@ -212,6 +222,13 @@ this.getStaff() }, methods: { openWT() { getByWorkorderId(this.id) .then(res => { console.log(res) this.$refs.problemReportingDetails.open('问题上报详情', res) }) }, confirm() { this.$refs['form'].validate((valid) => { if (valid) { admin/src/views/workorder/components/handleProblem.vue
@@ -43,30 +43,36 @@ </div> </div> <el-form :model="form" :rules="rules" ref="form" label-width="100px" class="demo-ruleForm"> <el-form-item label="处理方式" prop="dealType"> <el-radio-group v-model="form.dealType"> <el-radio :label="0">转工单</el-radio> <el-radio :label="1">关闭问题</el-radio> <el-form-item label="处理方式" prop="dealStatus"> <el-radio-group v-model="form.dealStatus"> <el-radio :label="1">转工单</el-radio> <el-radio :label="2">关闭问题</el-radio> </el-radio-group> </el-form-item> <template> <div style="display: flex; align-items: center;" v-if="form.dealType === 0"> <template v-if="form.dealStatus === 1"> <div style="width: 100%; display: flex; align-items: center;"> <el-form-item label="位置类型" prop="workOrderAreaType"> <el-select v-model="form.workOrderAreaType" placeholder="请选择位置类型"> <el-select v-model="form.workOrderAreaType" @change="changeType" placeholder="请选择位置类型"> <el-option label="室内维修" :value="0"></el-option> <el-option label="公共区域" :value="1"></el-option> </el-select> </el-form-item> <el-form-item label="报修区域" prop="rooms"> <el-cascader v-model="form.rooms" ref="cascader" @change="getHouseVal" placeholder="请选择报修区域" :options="houseList" <el-cascader v-model="form.rooms" :disabled="![0,1].includes(form.workOrderAreaType)" ref="cascader" @change="getHouseVal" placeholder="请选择报修区域" :options="form.workOrderAreaType === 0 ? houseList : houseList1" :props="{ label: 'name', value: 'id', children: 'projectDataVOList' }"></el-cascader> }" /> </el-form-item> </div> <div style="display: flex; align-items: center;"> <div style="width: 100%; display: flex; align-items: center;"> <el-form-item label="工单分类" prop="workOrderCateId"> <el-cascader v-model="form.workOrderCateId" @change="changeSel" placeholder="请选择分类" clearable :options="cateList" :props="{ @@ -75,8 +81,13 @@ children: 'childCategoryList' }"></el-cascader> </el-form-item> <el-form-item label="上门时间" prop="workOrderGetDate"> <el-date-picker v-model="form.workOrderGetDate" type="date" value-format="yyyy-MM-dd" placeholder="选择上门时间"></el-date-picker> <el-form-item label="上门时间" prop="workOrderGetDate" v-if="form.workOrderAreaType === 0"> <el-date-picker v-model="form.workOrderGetDate" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择上门时间"> </el-date-picker> </el-form-item> </div> <el-form-item label="描述" prop="dealInfo"> @@ -99,11 +110,11 @@ </el-upload> </el-form-item> </template> <el-form-item label="关闭说明" v-if="form.dealType === 1"> <el-form-item label="关闭说明" prop="dealInfo" v-if="form.dealStatus === 2"> <el-input type="textarea" :rows="5" maxlength="300" placeholder="请输入关闭问题" v-model="form.dealInfo"> </el-input> @@ -118,6 +129,7 @@ import GlobalWindow from '@/components/common/GlobalWindow' import { fetchList as getCateList } from '@/api/business/category.js' import { tree } from '@/api/project/ywProject' import { editProblem } from '@/api/ywProblem' export default { name: "handleProblem", extends: BaseOpera, @@ -128,7 +140,7 @@ cateList: [], base: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch', form: { dealType: 0, dealStatus: 1, workOrderAreaType: '', workOrderCateId: '', workOrderGetDate: '', @@ -142,8 +154,9 @@ workOrderRoomId: '' }, houseList: [], houseList1: [], rules: { dealType: [ dealStatus: [ { required: true, message: '请选择', trigger: 'blur' } ], workOrderAreaType: [ @@ -161,11 +174,6 @@ } } }, created() { this.config({ api: '/ywProblem' }) }, methods: { open (title, target) { this.title = title @@ -175,13 +183,32 @@ this.visible = true }, getHouseVal(e) { if (this.form.workOrderAreaType === 0) { this.form.workOrderProjectId = e[0] this.form.workOrderBuildId = e[1] this.form.workOrderFloorId = e[2] this.form.workOrderRoomId = e[3] } else { this.form.workOrderProjectId = e[0] this.form.workOrderBuildId = e[1] this.form.workOrderFloorId = e[2] } }, changeType(e) { this.form.rooms = [] this.form.workOrderProjectId = '' this.form.workOrderBuildId = '' this.form.workOrderFloorId = '' this.form.workOrderRoomId = '' }, getHouseTree() { tree({}).then(res => { this.addParamToArray(res) this.houseList = res let arr1 = JSON.parse(JSON.stringify(res)) let arr2 = JSON.parse(JSON.stringify(res)) this.addParamToArray(arr1) this.addParamToArray1(arr2) this.houseList = arr1 this.houseList1 = arr2 }) }, addParamToArray(arr) { @@ -196,6 +223,21 @@ } if (currentItem && currentItem.length > 0) { this.addParamToArray(currentItem) } } }, addParamToArray1(arr) { for (let i = 0; i < arr.length; i++) { const currentItem = arr[i].projectDataVOList if (currentItem && currentItem.length >= 0) { currentItem.forEach(item => { if (item.lv === 2) { delete item.projectDataVOList } }) } if (currentItem && currentItem.length > 0) { this.addParamToArray1(currentItem) } } }, @@ -219,6 +261,26 @@ this.cateList = res.records || [] }) }, confirm() { this.$refs.form.validate((valid) => { if (!valid) { return } this.isWorking = true editProblem({ ...this.form, id: this.info.id }) .then(() => { this.visible = false this.$tip.apiSuccess('操作成功') this.$emit('success') }) .finally(() => { this.isWorking = false }) }) } } } </script> @@ -229,30 +291,6 @@ width: 100%; display: flex; flex-direction: column; .wt_head { width: 100%; padding: 20px 0; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; .wt_head_title { display: flex; align-items: center; font-size: 16px; color: black; margin-right: 10px; .title { font-weight: 500; font-size: 18px; color: $primary-color; display: flex; align-items: center; } } .wt_content { width: 100%; @@ -297,6 +335,30 @@ } } } .wt_head { width: 100%; padding: 20px 0; box-sizing: border-box; display: flex; align-items: center; justify-content: space-between; .wt_head_title { display: flex; align-items: center; font-size: 16px; color: black; margin-right: 10px; .title { font-weight: 500; font-size: 18px; color: $primary-color; display: flex; align-items: center; } } } } </style> admin/src/views/workorder/components/problemReportingDetails.vue
@@ -35,7 +35,7 @@ <div class="wt_content_row_list" v-if="form.fileList && form.fileList.length >= 0"> <div class="wt_content_row_list_img" v-for="(item, index) in form.fileList" :key="index"> <el-image style="width: 100px; height: 100px" style="width: 80px; height: 80px" :src="item.fileurlFull" :preview-src-list="form.fileList.map(item => item.fileurlFull)"> </el-image> @@ -72,6 +72,7 @@ import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import Detail from './detail' import { getById } from '@/api/ywProblem' export default { name: "problemReportingDetails", extends: BaseOpera, @@ -86,8 +87,11 @@ open (title, target) { this.title = title this.form = target console.log(this.form) getById(target.id) .then(res => { this.form = res this.visible = true }) }, handleDetail() { this.showDetail = true admin/src/views/workorder/problemReporting.vue
@@ -40,9 +40,9 @@ <el-table-column prop="submitDate" label="上报时间" min-width="80px"></el-table-column> <el-table-column label="处理状态" min-width="70px"> <template slot-scope="{row}"> <span v-if="row.dealStatus == 0">待指派</span> <span v-if="row.dealStatus == 1">已指派</span> <span v-if="row.dealStatus == 2">已处理</span> <span v-if="row.dealStatus === 0">待处理</span> <span v-if="row.dealStatus === 1">已转工单</span> <span v-if="row.dealStatus === 2">已关闭</span> </template>` </el-table-column> <el-table-column prop="dealUserName" label="处理人" min-width="80px"></el-table-column> @@ -52,7 +52,7 @@ width="130" fixed="right"> <template slot-scope="{row}"> <el-button type="text" @click="$refs.handleProblem.open('问题上报', row)">处理</el-button> <el-button type="text" v-if="row.dealStatus === 0" @click="$refs.handleProblem.open('问题上报', row)">处理</el-button> <el-button type="text" @click="$refs.problemReportingDetails.open('问题上报详情', row)">查看详情</el-button> </template> </el-table-column>