Browse Source

'接口初次对接完成'

mian
hflllll 1 week ago
parent
commit
faff8acde6
4 changed files with 386 additions and 290 deletions
  1. +43
    -2
      api/modules/exhibit.js
  2. +0
    -1
      pages/index/maintain.vue
  3. +135
    -102
      subPages/home/repairSubmit.vue
  4. +208
    -185
      subPages/repair/maintainSubmit.vue

+ 43
- 2
api/modules/exhibit.js View File

@ -35,6 +35,7 @@ export default {
url: '/showpiece/addMaintenance', url: '/showpiece/addMaintenance',
method: 'POST', method: 'POST',
data, data,
showLoading: true,
needToken: true needToken: true
}) })
}, },
@ -48,5 +49,45 @@ export default {
}) })
}, },
// chakan
}
// 报修- 新增报修单
async addMalfunction(data) {
return http({
url: '/showpiece/addMalfunction',
method: 'POST',
data,
showLoading: true,
needToken: true
})
},
// 查看保修单详情
async queryMalfunctionById(data) {
return http({
url: '/showpiece/queryMalfunctionById',
method: 'GET',
data
})
},
// 修改保修单
async updateMalfunction(data) {
return http({
url: '/showpiece/updateMalfunction',
method: 'POST',
data,
showLoading: true,
needToken: true
})
},
// 新增维修记录
async addRepair(data) {
return http({
url: '/showpiece/addRepair',
method: 'POST',
data,
showLoading: true,
needToken: true
})
}
}

+ 0
- 1
pages/index/maintain.vue View File

@ -116,7 +116,6 @@ export default {
mixinListApi: 'exhibit.queryMalfunctionList', mixinListApi: 'exhibit.queryMalfunctionList',
urgencyColumns: [ urgencyColumns: [
[ [
'一般', '一般',
'紧急', '紧急',
'非常紧急' '非常紧急'


+ 135
- 102
subPages/home/repairSubmit.vue View File

@ -11,16 +11,19 @@
</view> </view>
<!-- 报修日期 --> <!-- 报修日期 -->
<view class="form-item">
<view class="form-item" @click="showDatePicker">
<text class="label">报修日期</text> <text class="label">报修日期</text>
<text class="value">{{ repairDate }}</text>
<view class="select-area">
<text class="value" :class="{ placeholder: !malfunctionDate }">{{ malfunctionDate || '请选择' }}</text>
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon>
</view>
</view> </view>
<!-- 故障紧急程度 --> <!-- 故障紧急程度 -->
<view class="form-item " @click="showUrgencyPicker"> <view class="form-item " @click="showUrgencyPicker">
<text class="label">故障紧急程度</text> <text class="label">故障紧急程度</text>
<view class="select-area"> <view class="select-area">
<text class="value" :class="{ placeholder: !urgencyLevel }">{{ urgencyLevel || '请选择' }}</text>
<text class="value" :class="{ placeholder: !urgency }">{{ urgency.label || '请选择' }}</text>
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon> <uv-icon name="arrow-down" size="18" color="#000"></uv-icon>
</view> </view>
</view> </view>
@ -34,7 +37,7 @@
<view class="form-item" @click="showFaultPicker"> <view class="form-item" @click="showFaultPicker">
<text class="label">故障情况</text> <text class="label">故障情况</text>
<view class="select-area"> <view class="select-area">
<text class="value" :class="{ placeholder: !faultSituation }">{{ faultSituation || '请选择' }}</text>
<text class="value" :class="{ placeholder: !malfunctionStatus }">{{ malfunctionStatus.label || '请选择' }}</text>
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon> <uv-icon name="arrow-down" size="18" color="#000"></uv-icon>
</view> </view>
</view> </view>
@ -45,7 +48,7 @@
</view> </view>
<view class="textarea-container"> <view class="textarea-container">
<uv-textarea <uv-textarea
v-model="faultDescription"
v-model="malfunctionDesc"
placeholder="请对故障情况进行描述" placeholder="请对故障情况进行描述"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -60,7 +63,7 @@
<text class="label">故障图片</text> <text class="label">故障图片</text>
</view> </view>
<view class="image-upload"> <view class="image-upload">
<view v-for="(img, index) in imageList" :key="index" class="image-item">
<view v-for="(img, index) in malfunctionImage" :key="index" class="image-item">
<image :src="img" mode="aspectFill" @click="previewImage(img)"></image> <image :src="img" mode="aspectFill" @click="previewImage(img)"></image>
<view class="delete-btn" @click="deleteImage(index)"> <view class="delete-btn" @click="deleteImage(index)">
<uv-icon name="close" size="12" color="#fff"></uv-icon> <uv-icon name="close" size="12" color="#fff"></uv-icon>
@ -72,10 +75,10 @@
</view> </view>
<!-- 故障首次发生时间 --> <!-- 故障首次发生时间 -->
<view class="form-item" @click="showTimePicker">
<view class="form-item" @click="showFirstOccurTimePicker">
<text class="label">故障首次发生时间</text> <text class="label">故障首次发生时间</text>
<view class="select-area"> <view class="select-area">
<text class="value" :class="{ placeholder: !firstOccurTime }">{{ firstOccurTime || '请选择' }}</text>
<text class="value" :class="{ placeholder: !firstDate }">{{ firstDate || '请选择' }}</text>
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon> <uv-icon name="arrow-down" size="18" color="#000"></uv-icon>
</view> </view>
</view> </view>
@ -103,7 +106,7 @@
</view> --> </view> -->
<view class="textarea-container"> <view class="textarea-container">
<uv-textarea <uv-textarea
v-model="faultCondition"
v-model="reason"
placeholder="请填写说明故障发生频率的触发条件" placeholder="请填写说明故障发生频率的触发条件"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -117,7 +120,7 @@
<view class="form-item" @click="showImpactPicker"> <view class="form-item" @click="showImpactPicker">
<text class="label">是否影响使用</text> <text class="label">是否影响使用</text>
<view class="select-area"> <view class="select-area">
<text class="value" :class="{ placeholder: !impactUsage }">{{ impactUsage || '请选择' }}</text>
<text class="value" :class="{ placeholder: !isAffectUse }">{{ isAffectUse.label || '请选择' }}</text>
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon> <uv-icon name="arrow-down" size="18" color="#000"></uv-icon>
</view> </view>
</view> </view>
@ -132,7 +135,7 @@
</view> </view>
<view class="textarea-container"> <view class="textarea-container">
<uv-textarea <uv-textarea
v-model="temporaryMeasures"
v-model="malfunctionName"
placeholder="如有采取临时措施请填写措施说明" placeholder="如有采取临时措施请填写措施说明"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -148,25 +151,25 @@
<view class="radio-options"> <view class="radio-options">
<view <view
class="radio-item" class="radio-item"
:class="{ active: hasTakenMeasures === true }"
@click="selectMeasures(true)"
:class="{ active: isMeasure === '1' }"
@click="selectMeasures('1')"
> >
<view class="radio-dot" :class="{ active: hasTakenMeasures === true }"></view>
<text :class="{ active: hasTakenMeasures === true }"></text>
<view class="radio-dot" :class="{ active: isMeasure === '1' }"></view>
<text :class="{ active: isMeasure === '1' }"></text>
</view> </view>
<view <view
class="radio-item" class="radio-item"
:class="{ active: hasTakenMeasures === false }"
@click="selectMeasures(false)"
:class="{ active: isMeasure === '0' }"
@click="selectMeasures('0')"
> >
<view class="radio-dot" :class="{ active: hasTakenMeasures === false }"></view>
<text :class="{ active: hasTakenMeasures === false }"></text>
<view class="radio-dot" :class="{ active: isMeasure === '0' }"></view>
<text :class="{ active: isMeasure === '0' }"></text>
</view> </view>
</view> </view>
</view> </view>
<view class="textarea-container"> <view class="textarea-container">
<uv-textarea <uv-textarea
v-model="temporaryMeasures"
v-model="malfunctionName"
placeholder="如有采取临时措施请填写措施说明" placeholder="如有采取临时措施请填写措施说明"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -182,19 +185,19 @@
<view class="radio-options"> <view class="radio-options">
<view <view
class="radio-item" class="radio-item"
:class="{ active: impactExperience === true }"
@click="selectExperience(true)"
:class="{ active: isAffectExperience === '1' }"
@click="selectExperience('1')"
> >
<view class="radio-dot" :class="{ active: impactExperience === true }"></view>
<text :class="{ active: impactExperience === true }"></text>
<view class="radio-dot" :class="{ active: isAffectExperience === '1' }"></view>
<text :class="{ active: isAffectExperience === '1' }"></text>
</view> </view>
<view <view
class="radio-item" class="radio-item"
:class="{ active: impactExperience === false }"
@click="selectExperience(false)"
:class="{ active: isAffectExperience === '0' }"
@click="selectExperience('0')"
> >
<view class="radio-dot" :class="{ active: impactExperience === false }"></view>
<text :class="{ active: impactExperience === false }"></text>
<view class="radio-dot" :class="{ active: isAffectExperience === '0' }"></view>
<text :class="{ active: isAffectExperience === '0' }"></text>
</view> </view>
</view> </view>
</view> </view>
@ -231,6 +234,7 @@
confirm-color="#C70019" confirm-color="#C70019"
ref="urgencyPicker" ref="urgencyPicker"
:columns="urgencyColumns" :columns="urgencyColumns"
keyName="label"
@confirm="confirmUrgency" @confirm="confirmUrgency"
@cancel="cancelUrgency" @cancel="cancelUrgency"
></uv-picker> ></uv-picker>
@ -243,21 +247,31 @@
@cancel="cancelFault" @cancel="cancelFault"
></uv-picker> ></uv-picker>
<uv-picker
confirm-color="#C70019"
ref="timePicker"
:columns="timeColumns"
@confirm="confirmTime"
@cancel="cancelTime"
></uv-picker>
<!-- 故障首次发生时间选择器 -->
<uv-datetime-picker
ref="firstOccurTimePicker"
mode="date"
confirm-color="#C70019"
@confirm="confirmFirstOccurTime"
></uv-datetime-picker>
<uv-picker <uv-picker
confirm-color="#C70019" confirm-color="#C70019"
ref="impactPicker" ref="impactPicker"
:columns="impactColumns" :columns="impactColumns"
@confirm="confirmImpact" @confirm="confirmImpact"
@cancel="cancelImpact" @cancel="cancelImpact"
keyName="label"
></uv-picker> ></uv-picker>
<!-- 日期选择器 -->
<uv-datetime-picker
confirm-color="#C70019"
ref="datePicker"
mode="date"
@confirm="confirmDate"
></uv-datetime-picker>
</view> </view>
</template> </template>
@ -266,41 +280,56 @@ export default {
data() { data() {
return { return {
// //
repairDate: '2025/03/31',
urgencyLevel: '',
faultSituation: '',
faultDescription: '',
imageList: [],
firstOccurTime: '',
frequency: '',
faultCondition: '',
impactUsage: '',
temporaryMeasures: '',
hasTakenMeasures: null,
impactExperience: null,
malfunctionDate: '',
urgency: '',
malfunctionStatus: '',
malfunctionDesc: '',
malfunctionImage: [],
firstDate: '',
frequency: '1',
reason: '',
isAffectUse: '0',
malfunctionName: '',
isMeasure: '0',
isAffectExperience: '0',
remark: '', remark: '',
//
// showUrgency: false,
// showFault: false,
// showTime: false,
// showImpact: false,
showpieceId: '',
// //
frequencyOptions: [ frequencyOptions: [
{ label: '持续性问题', value: 'continuous' },
{ label: '间歇性问题', value: 'intermittent' }
{ label: '持续性问题', value: '0' },
{ label: '间歇性问题', value: '1' }
], ],
// //
urgencyColumns: [['一般', '紧急', '非常紧急']],
urgencyColumns: [
[
{ label: '一般', value: '0' },
{ label: '紧急', value: '1'}
]
],
faultColumns: [['硬件故障', '软件故障', '网络故障', '其他']], faultColumns: [['硬件故障', '软件故障', '网络故障', '其他']],
timeColumns: [['今天', '昨天', '一周内', '一个月内', '更早']],
impactColumns: [['是', '否']]
impactColumns: [[
{ label: '是', value: '1' },
{ label: '否', value: '0' }
]],
} }
}, },
methods: { methods: {
//
showDatePicker() {
this.$refs.datePicker.open()
},
//
confirmDate(e) {
const date = new Date(e.value)
this.malfunctionDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`
},
// //
showUrgencyPicker() { showUrgencyPicker() {
this.$refs.urgencyPicker.open() this.$refs.urgencyPicker.open()
@ -308,7 +337,7 @@ export default {
// //
confirmUrgency(e) { confirmUrgency(e) {
this.urgencyLevel = e.value[0]
this.urgency = e.value[0]
}, },
// //
@ -323,7 +352,7 @@ export default {
// //
confirmFault(e) { confirmFault(e) {
this.faultSituation = e.value[0]
this.malfunctionStatus = e.value[0]
}, },
// //
@ -331,19 +360,15 @@ export default {
// //
}, },
//
showTimePicker() {
this.$refs.timePicker.open()
},
//
confirmTime(e) {
this.firstOccurTime = e.value[0]
//
showFirstOccurTimePicker() {
this.$refs.firstOccurTimePicker.open()
}, },
//
cancelTime() {
//
//
confirmFirstOccurTime(e) {
const date = new Date(e.value)
this.firstDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`
}, },
// 使 // 使
@ -353,7 +378,7 @@ export default {
// 使 // 使
confirmImpact(e) { confirmImpact(e) {
this.impactUsage = e.value[0]
this.isAffectUse = e.value[0]
}, },
// 使 // 使
@ -368,12 +393,12 @@ export default {
// //
selectMeasures(value) { selectMeasures(value) {
this.hasTakenMeasures = value
this.isMeasure = value
}, },
// //
selectExperience(value) { selectExperience(value) {
this.impactExperience = value
this.isAffectExperience = value
}, },
// //
@ -383,7 +408,7 @@ export default {
if (result && result.success) { if (result && result.success) {
console.log(result); console.log(result);
this.imageList.push(result.url)
this.malfunctionImage.push(result.url)
} }
} catch (error) { } catch (error) {
console.error('头像上传失败:', error) console.error('头像上传失败:', error)
@ -396,58 +421,66 @@ export default {
// //
deleteImage(index) { deleteImage(index) {
this.imageList.splice(index, 1)
this.malfunctionImage.splice(index, 1)
}, },
// //
previewImage(url) { previewImage(url) {
uni.previewImage({ uni.previewImage({
urls: this.imageList,
urls: this.malfunctionImage,
current: url current: url
}) })
}, },
// //
submitRepair() {
async submitRepair() {
// //
if (!this.urgencyLevel) {
if (!this.urgency) {
uni.showToast({ title: '请选择故障紧急程度', icon: 'none' }) uni.showToast({ title: '请选择故障紧急程度', icon: 'none' })
return return
} }
if (!this.faultSituation) {
uni.showToast({ title: '请选择故障情况', icon: 'none' })
return
}
if (!this.faultDescription.trim()) {
// if (!this.malfunctionStatus) {
// uni.showToast({ title: '', icon: 'none' })
// return
// }
if (!this.malfunctionDesc.trim()) {
uni.showToast({ title: '请填写故障情况描述', icon: 'none' }) uni.showToast({ title: '请填写故障情况描述', icon: 'none' })
return return
} }
// //
const formData = { const formData = {
repairDate: this.repairDate,
urgencyLevel: this.urgencyLevel,
faultSituation: this.faultSituation,
faultDescription: this.faultDescription,
imageList: this.imageList,
firstOccurTime: this.firstOccurTime,
showpieceId: this.showpieceId,
malfunctionDate: this.malfunctionDate,
urgency: this.urgency.value,
malfunctionStatus: this.malfunctionStatus.id,
malfunctionDesc: this.malfunctionDesc,
malfunctionImage: this.malfunctionImage.join(','),
firstDate: this.firstDate,
frequency: this.frequency, frequency: this.frequency,
faultCondition: this.faultCondition,
impactUsage: this.impactUsage,
temporaryMeasures: this.temporaryMeasures,
hasTakenMeasures: this.hasTakenMeasures,
impactExperience: this.impactExperience,
reason: this.reason,
isAffectUse: this.isAffectUse.value,
malfunctionName: this.malfunctionName,
isMeasure: this.isMeasure,
isAffectExperience: this.isAffectExperience,
remark: this.remark remark: this.remark
} }
console.log('提交数据:', formData)
uni.showToast({ title: '提交成功', icon: 'success' })
//
setTimeout(() => {
uni.navigateBack()
}, 1500)
// console.log(':', formData)
// uni.showToast({ title: '', icon: 'success' })
const subRes = await this.$api.exhibit.addMalfunction(formData)
if (subRes.code === 200) {
uni.showToast({ title: subRes.message})
setTimeout(() => {
uni.navigateBack()
}, 1000)
}else{
uni.showToast({ title: subRes.message, icon: 'none' })
}
} }
},
onLoad(args) {
this.showpieceId = args.id
} }
} }
</script> </script>


+ 208
- 185
subPages/repair/maintainSubmit.vue View File

@ -12,7 +12,7 @@
</view> </view>
<!-- 修改状态按钮 --> <!-- 修改状态按钮 -->
<button class="status-btn" :class="{ active: statusType === 'modify' }" @click="statusType = 'modify'">
<button class="status-btn" :class="{ active: statusType === 'modify' }" @click="modifyStatus">
<text class="status-text">修改状态</text> <text class="status-text">修改状态</text>
</button> </button>
</view> </view>
@ -27,13 +27,13 @@
<!-- 报修日期 --> <!-- 报修日期 -->
<view class="form-item"> <view class="form-item">
<text class="label">报修日期</text> <text class="label">报修日期</text>
<text class="value">{{ repairData.repairDate }}</text>
<text class="value">{{ repairData.malfunctionDate }}</text>
</view> </view>
<!-- 故障紧急程度 --> <!-- 故障紧急程度 -->
<view class="form-item"> <view class="form-item">
<text class="label">故障紧急程度</text> <text class="label">故障紧急程度</text>
<text class="value">{{ repairData.urgencyLevel }}</text>
<text class="value">{{ repairData.urgency === '1' ? '紧急' : '一般' }}</text>
</view> </view>
<!-- 故障情况描述 --> <!-- 故障情况描述 -->
@ -43,9 +43,8 @@
<!-- 故障情况描述文本区域 --> <!-- 故障情况描述文本区域 -->
<view class="content-text"> <view class="content-text">
<!-- <text>{{ repairData.faultDescription }}</text> -->
<uv-textarea <uv-textarea
v-model="repairData.faultDescription"
v-model="repairData.malfunctionDesc"
placeholder="展品故障描述" placeholder="展品故障描述"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -65,30 +64,30 @@
<view class="image-container" v-if="!isCollapsed"> <view class="image-container" v-if="!isCollapsed">
<image <image
class="uploaded-image" class="uploaded-image"
v-for="(img, index) in repairData.imageList"
v-for="(img, index) in getImageList(repairData.malfunctionImage)"
:key="index" :key="index"
:src="img"
:src="img.trim()"
mode="aspectFill" mode="aspectFill"
@click="previewImage(img)"
@click="previewImage(img.trim())"
></image> ></image>
</view> </view>
<!-- 故障首次发生时间 --> <!-- 故障首次发生时间 -->
<view class="form-item" v-if="!isCollapsed"> <view class="form-item" v-if="!isCollapsed">
<text class="label">故障首次发生时间</text> <text class="label">故障首次发生时间</text>
<text class="value">{{ repairData.firstOccurTime }}</text>
<text class="value">{{ repairData.firstDate }}</text>
</view> </view>
<!-- 发生频率 --> <!-- 发生频率 -->
<view class="form-item" v-if="!isCollapsed"> <view class="form-item" v-if="!isCollapsed">
<text class="label">发生频率</text> <text class="label">发生频率</text>
<text class="value red-text">{{ repairData.frequency }}</text>
<text class="value red-text">{{ repairData.frequency === '1' ? '间歇性问题' : '持续性问题' }}</text>
</view> </view>
<!-- 故障发生频率的触发条件 --> <!-- 故障发生频率的触发条件 -->
<view class="content-text" v-if="!isCollapsed"> <view class="content-text" v-if="!isCollapsed">
<uv-textarea <uv-textarea
v-model="repairData.faultCondition"
v-model="repairData.reason"
placeholder="故障发生频率的触发条件" placeholder="故障发生频率的触发条件"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -99,28 +98,24 @@
:custom-style="{ backgroundColor: '#f5f5f5' }" :custom-style="{ backgroundColor: '#f5f5f5' }"
></uv-textarea> ></uv-textarea>
</view> </view>
<!-- <view class="content-text" v-if="!isCollapsed">
<text>{{ repairData.faultCondition }}</text>
</view> -->
<!-- 是否影响使用 --> <!-- 是否影响使用 -->
<view class="form-item" v-if="!isCollapsed"> <view class="form-item" v-if="!isCollapsed">
<text class="label">是否影响使用</text> <text class="label">是否影响使用</text>
<text class="value red-text">{{ repairData.impactUsage }}</text>
<text class="value red-text">{{ repairData.isAffectUse === '1' ? '是' : '否' }}</text>
</view> </view>
<!-- 是否采取临时措施 --> <!-- 是否采取临时措施 -->
<view class="form-item" v-if="!isCollapsed"> <view class="form-item" v-if="!isCollapsed">
<text class="label">是否采取临时措施</text> <text class="label">是否采取临时措施</text>
<text class="value red-text">{{ repairData.hasTakenMeasures ? '是' : '否' }}</text>
<text class="value red-text">{{ repairData.isTakeMeasure === '1' ? '是' : '否' }}</text>
</view> </view>
<!-- 如有采取临时措施请填写措施说明 --> <!-- 如有采取临时措施请填写措施说明 -->
<view class="content-text" v-if="!isCollapsed"> <view class="content-text" v-if="!isCollapsed">
<!-- <text>{{ repairData.faultDescription }}</text> -->
<uv-textarea <uv-textarea
v-model="repairData.temporaryMeasures"
v-model="repairData.measureDesc"
placeholder="如果有采取临时措施请填写措施说明" placeholder="如果有采取临时措施请填写措施说明"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
@ -132,14 +127,10 @@
></uv-textarea> ></uv-textarea>
</view> </view>
<!-- <view class="content-text" v-if="!isCollapsed && repairData.hasTakenMeasures">
<text>{{ repairData.temporaryMeasures }}</text>
</view> -->
<!-- 是否影响体验 --> <!-- 是否影响体验 -->
<view class="form-item" v-if="!isCollapsed"> <view class="form-item" v-if="!isCollapsed">
<text class="label">是否影响体验</text> <text class="label">是否影响体验</text>
<text class="value red-text">{{ repairData.impactExperience ? '是' : '否' }}</text>
<text class="value red-text">{{ repairData.isAffectUsage === '1' ? '是' : '否' }}</text>
</view> </view>
<view class="form-item" v-if="!isCollapsed"> <view class="form-item" v-if="!isCollapsed">
@ -147,7 +138,7 @@
</view> </view>
<!-- 备注 --> <!-- 备注 -->
<view class="content-text" v-if="!isCollapsed"> <view class="content-text" v-if="!isCollapsed">
<!-- <text>{{ repairData.faultDescription }}</text> -->
<uv-textarea <uv-textarea
v-model="repairData.remark" v-model="repairData.remark"
placeholder="备注" placeholder="备注"
@ -161,7 +152,7 @@
></uv-textarea> ></uv-textarea>
</view> </view>
<!-- 查看全部/收起按钮 --> <!-- 查看全部/收起按钮 -->
<view class="collapse-btn" @click="toggleCollapse"> <view class="collapse-btn" @click="toggleCollapse">
@ -182,7 +173,7 @@
<text class="label">维修人</text> <text class="label">维修人</text>
<view class="input-area" > <view class="input-area" >
<input <input
v-model="processData.repairPerson"
v-model="processData.repairName"
placeholder="请填写" placeholder="请填写"
class="input-field" class="input-field"
ref="maintainerInput" ref="maintainerInput"
@ -195,7 +186,7 @@
<text class="label">联系方式</text> <text class="label">联系方式</text>
<view class="input-area" > <view class="input-area" >
<input <input
v-model="processData.contactPhone"
v-model="processData.phone"
placeholder="请填写" placeholder="请填写"
class="input-field" class="input-field"
ref="maintainerInput" ref="maintainerInput"
@ -218,13 +209,12 @@
</view> </view>
<view class="textarea-container"> <view class="textarea-container">
<uv-textarea <uv-textarea
v-model="processData.processContent"
v-model="processData.content"
placeholder="请输入处理内容" placeholder="请输入处理内容"
:maxlength="200" :maxlength="200"
:show-confirm-bar="false" :show-confirm-bar="false"
height="60" height="60"
border="none" border="none"
disabled
:textStyle="{ color: '#000' }" :textStyle="{ color: '#000' }"
:custom-style="{ backgroundColor: '#f5f5f5' }" :custom-style="{ backgroundColor: '#f5f5f5' }"
></uv-textarea> ></uv-textarea>
@ -235,8 +225,8 @@
<text class="label">上传图片</text> <text class="label">上传图片</text>
</view> </view>
<view class="image-upload"> <view class="image-upload">
<view v-for="(img, index) in processData.imageList" :key="index" class="image-item">
<image :src="img" mode="aspectFill" @click="previewImage(img)"></image>
<view v-for="(img, index) in getImageList(processData.image)" :key="index" class="image-item">
<image :src="img.trim()" mode="aspectFill" @click="previewImage(img.trim())"></image>
<view class="delete-btn" @click="deleteImage(index)"> <view class="delete-btn" @click="deleteImage(index)">
<uv-icon name="close" size="12" color="#fff"></uv-icon> <uv-icon name="close" size="12" color="#fff"></uv-icon>
</view> </view>
@ -252,30 +242,31 @@
<view class="radio-options"> <view class="radio-options">
<view <view
class="radio-item" class="radio-item"
:class="{ active: processData.hasCost === true }"
@click="selectCost(true)"
:class="{ active: processData.isExpend === '1' }"
@click="selectCost('1')"
> >
<view class="radio-dot" :class="{ active: processData.hasCost === true }"></view>
<text :class="{ active: processData.hasCost === true }"></text>
<view class="radio-dot" :class="{ active: processData.isExpend === '1' }"></view>
<text :class="{ active: processData.isExpend === '1' }"></text>
</view> </view>
<view <view
class="radio-item" class="radio-item"
:class="{ active: processData.hasCost === false }"
@click="selectCost(false)"
:class="{ active: processData.isExpend === '0' }"
@click="selectCost('0')"
> >
<view class="radio-dot" :class="{ active: processData.hasCost === false }"></view>
<text :class="{ active: processData.hasCost === false }"></text>
<view class="radio-dot" :class="{ active: processData.isExpend === '0' }"></view>
<text :class="{ active: processData.isExpend === '0' }"></text>
</view> </view>
</view> </view>
</view> </view>
<!-- 产生费用 --> <!-- 产生费用 -->
<view class="form-item" v-if="processData.hasCost">
<view class="form-item" v-if="processData.isExpend === '1'">
<text class="label">产生费用</text> <text class="label">产生费用</text>
<view class="input-area" > <view class="input-area" >
<input <input
v-model="processData.totalCost"
v-model="amount"
placeholder="请输入费用" placeholder="请输入费用"
disabled
class="input-field" class="input-field"
ref="maintainerInput" ref="maintainerInput"
/> />
@ -283,7 +274,7 @@
</view> </view>
<!-- 费用详情表格 --> <!-- 费用详情表格 -->
<view class="cost-table" v-if="processData.hasCost">
<view class="cost-table" v-if="processData.isExpend === '1'">
<view class="table-header"> <view class="table-header">
<text class="header-cell">费用名称</text> <text class="header-cell">费用名称</text>
<text class="header-cell">数量</text> <text class="header-cell">数量</text>
@ -333,19 +324,19 @@
<view class="radio-options"> <view class="radio-options">
<view <view
class="radio-item" class="radio-item"
:class="{ active: processData.isResolved === true }"
@click="selectResolved(true)"
:class="{ active: processData.isFix === '1' }"
@click="selectResolved('1')"
> >
<view class="radio-dot" :class="{ active: processData.isResolved === true }"></view>
<text :class="{ active: processData.isResolved === true }"></text>
<view class="radio-dot" :class="{ active: processData.isFix === '1' }"></view>
<text :class="{ active: processData.isFix === '1' }"></text>
</view> </view>
<view <view
class="radio-item" class="radio-item"
:class="{ active: processData.isResolved === false }"
@click="selectResolved(false)"
:class="{ active: processData.isFix === '0' }"
@click="selectResolved('0')"
> >
<view class="radio-dot" :class="{ active: processData.isResolved === false }"></view>
<text :class="{ active: processData.isResolved === false }"></text>
<view class="radio-dot" :class="{ active: processData.isFix === '0' }"></view>
<text :class="{ active: processData.isFix === '0' }"></text>
</view> </view>
</view> </view>
</view> </view>
@ -378,13 +369,12 @@
</view> </view>
<!-- 日期选择器 --> <!-- 日期选择器 -->
<uv-picker
<uv-datetime-picker
confirm-color="#C70019" confirm-color="#C70019"
ref="datePicker" ref="datePicker"
:columns="dateColumns"
mode="date"
@confirm="confirmDate" @confirm="confirmDate"
@cancel="cancelDate"
></uv-picker>
></uv-datetime-picker>
</view> </view>
</template> </template>
@ -395,52 +385,165 @@ export default {
statusType: 'modify', statusType: 'modify',
selectedStatus: '故障中', selectedStatus: '故障中',
isCollapsed: true, isCollapsed: true,
id: '',
//
statusMap: {
'故障中': '0',
'维修中': '1',
'已解决': '2'
},
// //
repairData: { repairData: {
repairDate: '2025/03/31',
urgencyLevel: '一般',
faultDescription: '展品故障情况',
imageList: [
'/static/商城_商品2.png',
'/static/商城_商品2.png'
],
firstOccurTime: '2025/03/31',
frequency: '持续性问题',
faultCondition: '故障发生频率的触发条件说明',
impactUsage: '是',
hasTakenMeasures: true,
temporaryMeasures: '已采取临时措施说明',
impactExperience: true,
remark: '备注信息'
malfunctionDate: '2025-08-28', // malfunctionDate
urgency: '0', // urgency 0-1-2-
malfunctionDesc: '故障描述', // malfunctionDesc
malfunctionImage: '', // malfunctionImage
firstDate: '2025-08-27', // firstDate
frequency: '0', // frequency 0-1-
reason: '发生频率触发条件', // reason
isAffectUse: '0', // isAffectUse 0-1-
isMeasure: '0', // isMeasure 0-1-
measureDesc: '措施说明', // measureDesc
isAffectExperience: '0', // isAffectExperience 0-1-
remark: '备注' // remark
}, },
// //
processData: { processData: {
repairPerson: '',
contactPhone: '',
repairName: '',
phone: '',
repairDate: '', repairDate: '',
processContent: '',
imageList: [],
hasCost: null,
totalCost: '',
content: '',
image: '',
isExpend: '0',
costDetails: [ costDetails: [
{ name: '', quantity: '', amount: '' } { name: '', quantity: '', amount: '' }
], ],
isResolved: null,
isFix: '0',
remark: '' remark: ''
}, },
//
dateColumns: []
} }
}, },
onLoad() {
this.initDatePicker()
computed: {
//
amount() {
return this.processData.costDetails.reduce((sum, item) => {
return sum + (Number(item.quantity) * Number(item.amount))
}, 0)
}
},
async onShow(){
await this.getRepairDetail()
},
onLoad(args){
this.id = args.id
}, },
methods: { methods: {
//
async modifyStatus(){
const res = await this.$api.exhibit.updateMalfunction({
id: this.id,
status: this.statusMap[this.selectedStatus]
})
if (res.code === 200) {
uni.showToast({
title: '修改成功',
icon: 'success'
})
}
},
//
async getRepairDetail() {
const queryRes = await this.$api.exhibit.queryMalfunctionById({
malfunctionId: this.id
})
if (queryRes.code === 200) {
this.repairData = queryRes.result
}
},
//
async startRepair() {
//
if (!this.processData.repairName) {
uni.showToast({
title: '请输入维修人',
icon: 'none'
})
return
}
if (!this.processData.phone) {
uni.showToast({
title: '请输入联系方式',
icon: 'none'
})
return
}
if (!this.processData.repairDate) {
uni.showToast({
title: '请选择维修日期',
icon: 'none'
})
return
}
if (!this.processData.content) {
uni.showToast({
title: '请输入处理内容',
icon: 'none'
})
return
}
if (this.processData.isFix === null) {
uni.showToast({
title: '请选择问题是否解决',
icon: 'none'
})
return
}
if (this.processData.isExpend === '1') {
// 0
if (!this.amount) {
uni.showToast({
title: '请添加费用明细',
icon: 'none'
})
return
}
}
const tempData = {...this.processData}
const tempDataList = [...this.processData.costDetails]
const submitRes = await this.$api.exhibit.addRepair({
id: this.id,
...tempData,
amount: this.amount,
expenseList: tempDataList.map(item => `${item.name},${item.quantity},${item.amount}`).join(';')
})
if (submitRes.code === 200) {
uni.showToast({
title: submitRes.message,
icon: 'none'
})
}else {
uni.showToast({
title: submitRes.message,
icon: 'none'
})
}
},
//
getImageList(imageStr) {
if (!imageStr || typeof imageStr !== 'string') {
return []
}
return imageStr.split(',').filter(img => img && img.trim())
},
// //
toggleCollapse() { toggleCollapse() {
this.isCollapsed = !this.isCollapsed this.isCollapsed = !this.isCollapsed
@ -461,38 +564,11 @@ export default {
// //
confirmDate(e) { confirmDate(e) {
const { indexs, value } = e
this.processData.repairDate = value.join('/')
},
//
cancelDate() {
//
},
//
initDatePicker() {
const currentYear = new Date().getFullYear()
const years = []
const months = []
const days = []
//
for (let i = currentYear - 10; i <= currentYear + 10; i++) {
years.push(i + '年')
}
//
for (let i = 1; i <= 12; i++) {
months.push(i.toString().padStart(2, '0') + '月')
}
//
for (let i = 1; i <= 31; i++) {
days.push(i.toString().padStart(2, '0') + '日')
}
this.dateColumns = [years, months, days]
const date = new Date(e.value)
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
this.processData.repairDate = `${year}-${month}-${day}`
}, },
// //
@ -502,7 +578,12 @@ export default {
if (result && result.success) { if (result && result.success) {
console.log(result); console.log(result);
this.processData.imageList.push(result.url)
// URL
if (this.processData.image) {
this.processData.image += ',' + result.url
} else {
this.processData.image = result.url
}
} }
} catch (error) { } catch (error) {
console.error('图片上传失败:', error) console.error('图片上传失败:', error)
@ -515,14 +596,16 @@ export default {
// //
deleteImage(index) { deleteImage(index) {
this.processData.imageList.splice(index, 1)
const imageList = this.getImageList(this.processData.image)
imageList.splice(index, 1)
this.processData.image = imageList.join(',')
}, },
// //
selectCost(value) { selectCost(value) {
this.processData.hasCost = value
this.processData.isExpend = value
if (!value) { if (!value) {
this.processData.totalCost = ''
this.processData.amount = 0
this.processData.costDetails = [{ name: '', quantity: '', amount: '' }] this.processData.costDetails = [{ name: '', quantity: '', amount: '' }]
} }
}, },
@ -539,81 +622,21 @@ export default {
// //
selectResolved(value) { selectResolved(value) {
this.processData.isResolved = value
this.processData.isFix = value
}, },
// //
showStatusPicker() { showStatusPicker() {
uni.showActionSheet({ uni.showActionSheet({
itemList: ['故障中', '维修中', '已完成', '暂停维修'],
itemList: ['故障中', '维修中', '已解决'],
success: (res) => { success: (res) => {
const statusList = ['故障中', '维修中', '已完成', '暂停维修']
const statusList = ['故障中', '维修中', '已解决']
this.selectedStatus = statusList[res.tapIndex] this.selectedStatus = statusList[res.tapIndex]
} }
}) })
}, },
//
startRepair() {
//
if (!this.processData.repairPerson) {
uni.showToast({
title: '请输入维修人',
icon: 'none'
})
return
}
if (!this.processData.contactPhone) {
uni.showToast({
title: '请输入联系方式',
icon: 'none'
})
return
}
if (!this.processData.repairDate) {
uni.showToast({
title: '请选择维修日期',
icon: 'none'
})
return
}
if (!this.processData.processContent) {
uni.showToast({
title: '请输入处理内容',
icon: 'none'
})
return
}
if (this.processData.isResolved === null) {
uni.showToast({
title: '请选择问题是否解决',
icon: 'none'
})
return
}
//
uni.showLoading({
title: '提交中...'
})
//
setTimeout(() => {
uni.hideLoading()
uni.showToast({
title: '提交成功',
icon: 'success'
})
setTimeout(() => {
uni.navigateBack()
}, 1500)
}, 2000)
}
} }
} }
</script> </script>


Loading…
Cancel
Save