修改工单维保

This commit is contained in:
龙运模 2025-01-09 16:28:14 +08:00
parent 533d3a8918
commit 4f1510d67a
18 changed files with 385 additions and 53 deletions

View File

@ -38,6 +38,14 @@ export default {
return await http.post(this.url,params);
}
},
field:{
url: `${config.API_URL}/spare.parts.warning.field.list`,
name: "预警管理自定义检索",
post: async function (params) {
return await http.post(this.url, params);
},
}
}
};

View File

@ -224,6 +224,13 @@ export default {
post: async function (params) {
return await http.post(this.url,params);
}
},
wbCompanyField:{
url: `${config.API_URL}/wb.company.field.list`,
name: "维保厂商下拉",
post: async function (params) {
return await http.post(this.url,params);
}
}
},
plan:{

View File

@ -240,8 +240,29 @@ export default {
post: async function (data) {
return await http.post(this.url, data);
},
},
regionalConstList:{
url:`${config.API_URL}/regional.address.const.list`,
name:"区域信息对照下拉列表",
post:async function (data) {
return await http.post(this.url, data);
},
},
import:{
url: `${config.API_URL}/regional.address.batch.import`,
name: "区域地址导入",
post: async function (params) {
return await http.post(this.url,params,{'Content-Type': 'multipart/form-data'});
}
},
template:{
url: `${config.API_URL}/area.address.import.template`,
name: "区域地址导入模版",
post: async function (params) {
return await http.get(this.url,params,{responseType: 'arraybuffer'});
}
},
},
spare:{
list:{
url: `${config.API_URL}/spare.parts.failure.rate.list`,

View File

@ -0,0 +1,15 @@
<template>
<svg t="1736316901795" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7222" width="200" height="200">
<path d="M788.087372 125.660073l147.771382 72.31774c33.150964 19.83938 54.334302 55.934252 56.126246 95.741008l-0.95997 445.554077a114.55642 114.55642 0 0 1-57.150214 95.165026l-385.26796 182.3943c-23.67926 9.5997-50.046436 9.5997-73.789694 0l-384.691978-182.3943a113.148464 113.148464 0 0 1-57.150214-95.165026L32.015 293.782819c1.407956-39.742758 22.3993-75.965626 55.614262-95.741008L473.857192 8.031749c24.31924-10.687666 51.83838-10.687666 76.221618 0l156.47511 76.989594-466.801412 243.1924V485.136839l81.533452 39.806757V368.852473l466.801412-243.1924z m47.9985 618.860661l59.006156-154.23518v-0.447986c7.167776-17.023468 6.71979-30.271054-0.447986-36.286866l-63.35802-101.116841a22.015312 22.015312 0 0 0-29.183088-5.823818l-122.300178 53.11834c-11.967626 7.487766-21.75932 18.111434-28.351114 30.911035l-59.006156 154.23518c-7.03978 16.95947-7.03978 30.783038 0.447986 36.670854l63.35802 101.052842a22.015312 22.015312 0 0 0 29.183088 5.887816l122.300178-53.182338c11.967626-7.423768 21.75932-18.111434 28.351114-30.847036z m-48.382488-74.621668c-24.063248 36.990844-63.102028 53.11834-87.101278 36.15887-24.063248-16.95947-24.127246-60.670104 0-97.59695 23.99925-36.990844 63.03803-53.11834 87.03728-36.15887 24.127246 16.95947 24.127246 60.670104 0.063998 97.59695z" p-id="7223"></path>
</svg>
</template>
<script>
export default {
name: "PartsMag"
}
</script>
<style scoped>
</style>

View File

@ -57,6 +57,7 @@ export { default as OrderQuery } from './OrderQuery.vue'
export { default as ComponentQuery } from './ComponentQuery.vue'
export { default as TermQuery } from './TermQuery.vue'
export { default as Feedback } from './Feedback.vue'
export { default as PartsMag } from './PartsMag.vue'
export { default as File7z } from './file/7z.vue'
export { default as FileBmp } from './file/Bmp.vue'

View File

@ -111,7 +111,7 @@ export default {
},
methods:{
getWsResult(res){
if(res.data && (res.data.type == 4 || res.data.type == 5 || res.data.type == 10 || res.data.type == 17 || res.data.type == 18 || res.data.type == 27 || res.data.type == 28 || res.data.type == 31 || res.data.type == 42)){
if(res.data && (res.data.type == 4 || res.data.type == 5 || res.data.type == 10 || res.data.type == 17 || res.data.type == 18 || res.data.type == 27 || res.data.type == 28 || res.data.type == 31 || res.data.type == 42 || res.data.type == 44)){
if(this.type == res.data.type){
this.importInfo = res.data;
this.progressShow = true;

View File

@ -8,6 +8,15 @@
-->
<template>
<!-- [optional] seconds (0 - 59)-->
<!-- | minute (0 - 59)-->
<!-- | | hour (0 - 23)-->
<!-- | | | day of month (1 - 31)-->
<!-- | | | | month (1 - 12) OR jan,feb,mar,apr ...-->
<!-- | | | | | day of week (0 - 6, sunday=0) OR sun,mon ...-->
<!-- | | | | | |-->
<!-- * * * * * * command-->
<div class="scTable" :style="{'height':_height}" ref="scTableMain" v-loading="loading">
<div class="scTable-table" :class="hidePagination && hideDo?'bottomNoBorder':''" :style="{'height':_table_height}">
<el-table v-bind="$attrs" :header-cell-style="{'background': '#F5F7FA','color':'#606266'}" :data="tableData" :row-key="rowKey" :key="toggleIndex" ref="scTable" :height="height=='auto'?null:'100%'" :size="config.size" :border="config.config.border" :stripe="config.config.stripe" :summary-method="remoteSummary?remoteSummaryMethod:summaryMethod" @sort-change="sortChange" @filter-change="filterChange" @header-dragend="headerDragend">

View File

@ -34,6 +34,7 @@ export default {
columnSettingSave: function (tableName, column ,params, otherParams) {
column.forEach((item,index)=>{
item.sort = index+1;
delete item.data
})
return new Promise((resolve) => {
if(!params.url || params.url==''){
@ -88,6 +89,7 @@ export default {
columnSettingReset: function (tableName, column ,params) {
column.forEach((item,index)=>{
item.sort = index+1;
delete item.data
})
return new Promise((resolve) => {
if(!params.url || params.url==''){

View File

@ -3,9 +3,9 @@
<el-alert title="无子集菜单" center type="info" :closable="false"></el-alert>
</div>
<template v-for="navMenu in navMenus" v-bind:key="navMenu">
<el-menu-item :class="{'nav-top-menu':['warehouse','bom','advanced'].indexOf(navMenu.name)!=-1}" v-if="!hasChildren(navMenu)" :index="navMenu.path">
<el-menu-item :class="{'nav-top-menu':['warehouse','bom','parts','advanced'].indexOf(navMenu.name)!=-1}" v-if="!hasChildren(navMenu)" :index="navMenu.path">
<a v-if="navMenu.meta && navMenu.meta.type=='link'" :href="navMenu.path" target="_blank" @click.stop='()=>{}'></a>
<el-icon v-if="navMenu.meta && navMenu.meta.icon && ['warehouse','bom','advanced'].indexOf(navMenu.name)!=-1" ><component :is="navMenu.meta.icon || 'el-icon-menu'"/></el-icon>
<el-icon v-if="navMenu.meta && navMenu.meta.icon && ['warehouse','bom','parts','advanced'].indexOf(navMenu.name)!=-1" ><component :is="navMenu.meta.icon || 'el-icon-menu'"/></el-icon>
<template #title>
<span>{{navMenu.meta.title}}</span>
<span v-if="navMenu.meta.tag" class="menu-tag">{{navMenu.meta.tag>99?'99+':navMenu.meta.tag}}</span>

View File

@ -257,7 +257,7 @@
//
eventBus.$on('sockBack', this.getWsResult);
// this.$socketApi.getSock(this.getWsResult);
this.$socketApi.getSock(this.getWsResult);
}
},
mounted() {

View File

@ -37,7 +37,7 @@
--el-order-color-3:#0DA525;
--el-order-color-4:#FFB103;
--el-order-color-5:#E81B1B;
--el-order-color-100:#57C23A;
--el-order-color-100:#E81B1B;
}
.el-table{

View File

@ -18,12 +18,15 @@
<div class="searchItem searchBtn" v-if="searchHeaderShow">
<el-button :size="size" :icon="searchShow?'el-icon-ArrowUpBold':'el-icon-ArrowDownBold'" @click="searchShowClick">{{searchShow?'收起':'更多'}}</el-button>
<el-button :size="size" type="primary" icon="el-icon-search" @click="upSearch">查询</el-button>
<el-button :size="size" type="info" icon="el-icon-RefreshRight">重置</el-button>
<el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button>
</div>
</div>
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" @selection-change="selectionChange" @columnBack="columnBack" border stripe :size="size">
<el-table-column type="selection" align="center" width="40"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #region_name="scope">
<span v-if="scope.row.region_info">{{scope.row.region_info.region_name}}</span>
</template>
<el-table-column label="操作" fixed="right" align="center" width="150">
<template #default="scope">
<el-dropdown>
@ -107,9 +110,23 @@ export default {
this.list.column = val;
},
async filterClick(item) {
let {params} = item;
let {data, params} = item;
let filterParams = Object.assign(this.params,params);
this.filterMap.data = filterParams;
let searchParams = this.$TOOL.objCopy(this.params);
searchParams.field = ""
if (typeof data.prop === 'string') {
searchParams.field = data.prop;
} else {
searchParams.field = data.prop[0];
}
if (data.search_type == 'select' || data.search_type == 'checkbox') {
if(data.prop === "region_name"){
await this.getRegionName(data, searchParams);
}else{
await this.getField(data,searchParams);
}
}
},
filterParams(params){
let filterParams = Object.assign(this.params,params);
@ -129,9 +146,55 @@ export default {
this.filterMap.data = params;
},
async getSelectData(item) {
let {params} = item;
this.params = params;
this.filterMap.data = params;
let {data, params} = item;
this.params = params; //
this.filterMap.data = params; //
let searchParams = this.$TOOL.objCopy(params);
searchParams.field = ""
if (typeof data.prop === 'string') {
searchParams.field = data.prop;
} else {
searchParams.field = data.prop[0];
}
if (data.search_type == 'select' || data.search_type == 'checkbox') {
if(data.prop === "region_name"){
await this.getRegionName(data, searchParams);
}else{
await this.getField(data,searchParams)
}
}
},
async getField(data,searchParams) {
const res = await this.$API.early.earlyWarn.field.post(searchParams);
if (res.code == 200) {
if (res.data && res.data.length > 0) {
res.data.forEach(item => {
item.label = item[data.prop];
item.value = item[data.prop];
})
}
this.list.column.forEach(item => {
if (item.prop == data.prop) {
item.data = res.data;
}
})
}
},
async getRegionName(data,searchParams) {
const res = await this.$API.setup.regional.regionalConstList.post(searchParams);
if(res.code == 200){
if (res.data && res.data.length > 0) {
res.data.forEach(item => {
item.label = item[data.prop];
item.value = item[data.prop];
})
}
this.list.column.forEach(item => {
if (item.prop == data.prop) {
item.data = res.data;
}
})
}
},
/** 表格检索结束 */
@ -190,7 +253,13 @@ export default {
upSearch(){
this.$refs.table.upData(this.params);
},
reset(){
this.params = {};
this.filterMap.data = {};
this.$refs.scSearch.reload();
eventBus.$emit('reset-popovers');
this.$refs.table.reload();
},
//
handleSaveSuccess(data, mode){
if(mode=='add'){

View File

@ -0,0 +1,92 @@
<template>
<el-dialog :title="titleMap[mode]" v-model="visible" :width="450" destroy-on-close @closed="$emit('closed')">
<el-form :model="form" :rules="rules" ref="dialogForm" label-width="60px">
<el-form-item label="厂商" prop="company_id">
<el-select style="width: 100%;" v-model="form.company_id" placeholder="请选择厂商" clearable>
<el-option v-for="(item,index) in setMap.companyList" :key="index" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible=false" > </el-button>
<el-button type="primary" :loading="isSave" @click="submit()"> </el-button>
</template>
</el-dialog>
</template>
<script>
export default {
name: "manufacturer",
emits: ['success', 'closed'],
data() {
return {
mode: "show",
titleMap: {
show: '维保厂商',
review:'维保厂商',
},
visible: false,
isSave: false,
setMap:{
companyList:[]
},
//
form: {
company_id: "",
},
//
rules: {
company_id: [
{required: true, message: '请选择厂商'}
],
},
}
},
mounted() {
},
methods: {
//
open(mode='show'){
this.mode = mode;
this.visible = true;
this.getDataCompany();
return this
},
async getDataCompany() {
let params = {
field:"name",
name:{
operator:"like",
value:""
}
}
const res = await this.$API.orders.order.maintenance.wbCompanyField.post(params);
if (res.code == 200) {
this.setMap.companyList = res.data;
}
},
//
submit(){
this.$refs.dialogForm.validate(async (valid) => {
if (valid) {
this.isSave = true;
this.$emit('success', this.form, this.mode);
}
})
},
hideVisible(){
this.isSave = false;
this.visible = false;
},
//
async setData() {
}
}
}
</script>
<style scoped>
</style>

View File

@ -11,7 +11,7 @@
<div v-auth="'maintenanceOrderImport'" @click="importTemplate">下载导入模版</div>
</template>
</scImport>
<el-button type="primary" v-auth="'maintenanceOrderSubmit'" plain :size="size" :disabled="selection.length!=1" @click="save_maintenance">提交维保</el-button>
<el-button type="primary" v-auth="'maintenanceOrderSubmit'" plain :size="size" :disabled="selection.length==0" @click="save_maintenance">提交维保</el-button>
<el-button type="success" v-auth="'maintenanceOrderApproval'" :size="size" icon="sc-icon-OrderReview" :disabled="selection.length==0" @click="batch_review">批量审核</el-button>
<el-button type="danger" v-auth="'maintenanceOrderDelete'" plain :size="size" icon="el-icon-Delete" :disabled="selection.length==0" @click="batch_del"></el-button>
</div>
@ -84,15 +84,19 @@
</scTable>
</el-main>
</el-container>
<manufacturer-dialog v-if="dialog.companyWf" ref="companyWfDialog" @success="handleWfSuccess" @closed="dialog.companyWf=false"></manufacturer-dialog>
</template>
<script>
import {eventBus} from "@/utils/eventBus";
import flow from "./components/flow"
import manufacturerDialog from "@/views/order/orderList/components/manufacturer"
export default {
name:"orderList",
components: {
flow
flow,
manufacturerDialog
},
data() {
return {
@ -106,6 +110,7 @@ export default {
dialog: {
save: false,
show: false,
companyWf:false
},
setMap:{
statusList:[],
@ -335,19 +340,50 @@ export default {
if(res.code == 200){
this.$refs.table.refresh();
}
}).catch(async () => {
}).catch(() => {
this.dialog.companyWf = true;
this.$nextTick(() => {
this.$refs.companyWfDialog.open('review');
})
})
},
async reviewSave(data) {
let params = {
order_ids: this.selection.map(em => em.id),
status: true,
is_verify_erp_inventory:false,
maintenance_vendor:data.company_id
}
const res = await this.$API.orders.order.maintenance.review.post(params);
if (res.code == 200) {
this.$refs.companyWfDialog.hideVisible();
this.$refs.table.refresh();
}
},
save_maintenance() {
// eventBus.$emit('tagClose','/order/submit-order',{id:this.selection.map(em => em.id)[0]});
this.dialog.companyWf = true;
this.$nextTick(() => {
this.$refs.companyWfDialog.open('show');
})
},
async save_maintenance() {
eventBus.$emit('tagClose','/order/submit-order',{id:this.selection.map(em => em.id)[0]});
async handleWfSuccess(data, mode) {
if (mode === 'show') {
const params = {
order_ids: this.selection.map(em => em.id),
maintenance_vendor: data.company_id,
is_verify_erp_inventory: false,
// component_info: []
};
const res = await this.$API.orders.order.maintenance.submit.post(params);
if (res.code == 200) {
this.$refs.companyWfDialog.hideVisible();
this.$refs.table.refresh();
}
}else if(mode === 'review'){
await this.reviewSave(data);
}
},
//
async table_submit(row){

View File

@ -37,18 +37,24 @@
</el-scrollbar>
</el-main>
</el-container>
<manufacturer-dialog v-if="dialog.companyWf" ref="companyWfDialog" @success="handleWfSuccess" @closed="dialog.companyWf=false"></manufacturer-dialog>
</template>
<script>
import detailView from "@/views/order/orderList/detailView";
import manufacturerDialog from "@/views/order/orderList/components/manufacturer"
export default {
name: "",
components:{
detailView
detailView,
manufacturerDialog
},
data(){
return{
size:'small',
dialog: {
companyWf:false
},
loading:false,
confirmLoading:false,
cancelLoading:false,
@ -108,6 +114,21 @@ export default {
}
return obj;
},
async handleWfSuccess(data, mode) {
if (mode === 'review') {
let params = {
order_ids: [this.params.order_id],
status: true,
opinion: this.opinion,
maintenance_vendor: data.company_id
}
const res = await this.$API.orders.order.maintenance.review.post(params);
if (res.code == 200) {
this.$refs.companyWfDialog.hideVisible();
await this.getData();
}
}
},
async save(type) {
let params = {
order_ids: [this.params.order_id],
@ -117,13 +138,18 @@ export default {
if (type == 1) {
delete params.opinion
this.confirmLoading = true;
this.dialog.companyWf = true;
this.$nextTick(() => {
this.saveLoading = false;
this.$refs.companyWfDialog.open('review');
})
}else{
this.cancelLoading = true;
}
const res = await this.$API.orders.order.maintenance.review.post(params);
if (res.code == 200) {
await this.getData();
}
}
this.confirmLoading = false;
this.cancelLoading = false;
}

View File

@ -47,16 +47,19 @@
</el-container>
<info-save-dialog ref="saveDialog" v-if="dialog.save" @success="handleSaveSuccess" @closed="dialog.save=false"></info-save-dialog>
<manufacturer-dialog v-if="dialog.companyWf" ref="companyWfDialog" @success="handleWfSuccess" @closed="dialog.companyWf=false"></manufacturer-dialog>
</template>
<script>
import detailView from "@/views/order/orderList/detailView";
import infoSaveDialog from "@/views/order/components/infoSave";
import manufacturerDialog from "@/views/order/orderList/components/manufacturer"
export default {
name: "",
components:{
detailView,
infoSaveDialog
infoSaveDialog,
manufacturerDialog
},
data(){
return{
@ -74,6 +77,7 @@ export default {
dialog: {
save: false,
companyWf:false
},
}
},
@ -125,18 +129,28 @@ export default {
}
return obj;
},
async save() {
async handleWfSuccess(data, mode) {
if (mode === 'show') {
const params = {
order_ids: [this.params.order_id],
maintenance_vendor:data.company_id,
is_verify_erp_inventory: this.info.is_verify_erp_inventory,
component_info:this.info.component_info.filter(em=>!em.id)
component_info: this.info.component_info.filter(em => !em.id),
};
this.saveLoading = true;
const res = await this.$API.orders.order.maintenance.submit.post(params);
if (res.code == 200) {
this.$refs.companyWfDialog.hideVisible();
await this.getData();
}
}
},
save() {
this.saveLoading = true;
this.dialog.companyWf = true;
this.$nextTick(() => {
this.saveLoading = false;
this.$refs.companyWfDialog.open('show');
})
},
async getStatusList() {
const res = await this.$API.orders.order.maintenance.status.post();

View File

@ -2,9 +2,7 @@
<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px">
<el-form-item label="区域名称" prop="region_name">
<el-select v-model="form.region_name" placeholder="请输入区域位置" clearable>
<el-option v-for="(item,index) in setMap.regionList" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-input v-model="form.region_name" placeholder="请输入区域位置" clearable></el-input>
</el-form-item>
<el-form-item label="机房代码" prop="room_code">
<el-input v-model="form.room_code" placeholder="请输入机房代码" clearable></el-input>
@ -66,7 +64,7 @@ export default {
}
},
mounted() {
this.getRoom();
},
methods: {
//
@ -100,7 +98,6 @@ export default {
},
setData(data){
Object.assign(this.form, data);
// console.log(this.form,788)
}
}
}

View File

@ -4,6 +4,14 @@
<el-header>
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增</el-button>
<scImport ref="scImport" :size="size" type="44" :httpDisabled="httpDisabled" title="批量导区域地址配置" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header>
<el-button type="primary" :size="size" plain @click="importFile" style="margin-right: 12px;">批量导入</el-button>
</template>
<template #download>
<div @click="importTemplate">下载导入模版</div>
</template>
</scImport>
<el-button plain type="danger" :disabled="selection.length==0?true:false" :size="size" icon="el-icon-Delete" @click="all_delete"></el-button>
</div>
<div class="right-panel">
@ -13,11 +21,6 @@
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" stripe border :size="size" highlightCurrentRow :hideDo="true" @selection-change="selectionChange">
<el-table-column type="selection" align="center" width="40"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #region_name="scope">
<span v-for="(item,index) in setMap.regionList" :key="index">
<span v-if="item.value == scope.row.region_name">{{item.label}}</span>
</span>
</template>
<template #data_source="scope">
<span v-for="(item,index) in setMap.sourceList" :key="index">
<span v-if="item.value === scope.row.data_source">{{item.label}}</span>
@ -58,6 +61,7 @@ export default {
sourceList:[],
regionList:[],
},
httpDisabled:false,
list:{
apiObj: this.$API.setup.regional.list,
column:[]
@ -77,7 +81,6 @@ export default {
},
mounted() {
this.getRegion();
this.getRoom();
},
methods:{
async getRegion() {
@ -102,6 +105,38 @@ export default {
handleSuccess(){
this.$refs.table.refresh()
},
//
importFile(){
this.$nextTick(()=>{
this.$refs.scImport.importFile();
})
},
async importTemplate() {
const res = await this.$API.setup.regional.template.post();
const blob = new Blob([res]);
const text = new Date().getTime();
const eLink = document.createElement('a');
eLink.download = "区域地址模版_"+text+'.xlsx';
eLink.style.display = 'none';
eLink.href = URL.createObjectURL(blob);
document.body.appendChild(eLink);
eLink.click();
URL.revokeObjectURL(eLink.href);
document.body.removeChild(eLink);
},
async importUpload(params) {
this.httpDisabled = true;
const res = await this.$API.setup.regional.import.post(params);
if(res.code == 200){
this.$message.success('上传成功,开始导入数据');
}
},
importSuccess(){
this.httpDisabled = false;
this.$refs.table.refresh()
},
//
selectionChange(selection){
this.selection = selection;