|
|
|
@ -0,0 +1,809 @@ |
|
|
|
<template> |
|
|
|
<view class="maintenance-submit"> |
|
|
|
<!-- 保养基本信息 --> |
|
|
|
<view class="maintenance-info"> |
|
|
|
<view class="info-header"> |
|
|
|
<view class="red-line"></view> |
|
|
|
<text class="info-title">保养项目</text> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养人 --> |
|
|
|
<view class="form-item"> |
|
|
|
<text class="label">保养人</text> |
|
|
|
<view class="input-area" > |
|
|
|
<input |
|
|
|
v-model="maintenanceName" |
|
|
|
placeholder="请填写" |
|
|
|
class="input-field" |
|
|
|
ref="maintainerInput" |
|
|
|
/> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养日期 --> |
|
|
|
<view class="form-item" @click="showDatePicker"> |
|
|
|
<text class="label">保养日期</text> |
|
|
|
<view class="select-area"> |
|
|
|
<text class="value" :class="{ placeholder: !maintenanceDate }">{{ maintenanceDate || '请选择' }}</text> |
|
|
|
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养前状态 --> |
|
|
|
<view class="form-item"> |
|
|
|
<text class="label">保养前状态</text> |
|
|
|
</view> |
|
|
|
<view class="textarea-container"> |
|
|
|
<uv-textarea |
|
|
|
v-model="stateFrontText" |
|
|
|
placeholder="请填写保养前的设备内容" |
|
|
|
:maxlength="200" |
|
|
|
:show-confirm-bar="false" |
|
|
|
height="60" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: '#f5f5f5' }" |
|
|
|
></uv-textarea> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养前图片 --> |
|
|
|
<view class="image-upload"> |
|
|
|
<view v-for="(img, index) in stateFrontImage" :key="index" class="image-item"> |
|
|
|
<image :src="img" mode="aspectFill" @click="previewImage(img, stateFrontImage)"></image> |
|
|
|
<view class="delete-btn" @click="deleteBeforeImage(index)"> |
|
|
|
<uv-icon name="close" size="12" color="#fff"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
<view class="upload-btn" @click="uploadBeforeImage"> |
|
|
|
<uv-icon name="camera" size="34" color="#C70019"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养后状态 --> |
|
|
|
<view class="form-item"> |
|
|
|
<text class="label">保养后状态</text> |
|
|
|
</view> |
|
|
|
<view class="textarea-container"> |
|
|
|
<uv-textarea |
|
|
|
v-model="stateBackText" |
|
|
|
placeholder="请填写保养后的设备内容" |
|
|
|
:maxlength="200" |
|
|
|
:show-confirm-bar="false" |
|
|
|
height="60" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: '#f5f5f5' }" |
|
|
|
></uv-textarea> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养后图片 --> |
|
|
|
<view class="image-upload"> |
|
|
|
<view v-for="(img, index) in stateBackImage" :key="index" class="image-item"> |
|
|
|
<image :src="img" mode="aspectFill" @click="previewImage(img, stateBackImage)"></image> |
|
|
|
<view class="delete-btn" @click="deleteAfterImage(index)"> |
|
|
|
<uv-icon name="close" size="12" color="#fff"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
<view class="upload-btn" @click="uploadAfterImage"> |
|
|
|
<uv-icon name="camera" size="34" color="#C70019"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 是否产生费用 --> |
|
|
|
<view class="form-item"> |
|
|
|
<text class="label">是否产生费用</text> |
|
|
|
<view class="radio-options"> |
|
|
|
<view |
|
|
|
class="radio-item" |
|
|
|
:class="{ active: isExpend === '1' }" |
|
|
|
@click="selectCost('1')" |
|
|
|
> |
|
|
|
<view class="radio-dot" :class="{ active: isExpend === '1' }"></view> |
|
|
|
<text :class="{ active: isExpend === '1' }">是</text> |
|
|
|
</view> |
|
|
|
<view |
|
|
|
class="radio-item" |
|
|
|
:class="{ active: isExpend === '0' }" |
|
|
|
@click="selectCost('0')" |
|
|
|
> |
|
|
|
<view class="radio-dot" :class="{ active: isExpend === '0' }"></view> |
|
|
|
<text :class="{ active: isExpend === '0' }">否</text> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 产生费用 --> |
|
|
|
<view class="form-item" v-if="isExpend === '1'"> |
|
|
|
<text class="label">产生费用</text> |
|
|
|
<view class="input-area" > |
|
|
|
<input |
|
|
|
v-model="amount" |
|
|
|
placeholder="请输入费用" |
|
|
|
disabled |
|
|
|
class="input-field" |
|
|
|
/> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 费用详情表格 --> |
|
|
|
<view class="cost-table" v-if="isExpend === '1'"> |
|
|
|
<view class="table-header"> |
|
|
|
<text class="header-cell">费用名称</text> |
|
|
|
<text class="header-cell">数量</text> |
|
|
|
<text class="header-cell">金额</text> |
|
|
|
<text class="header-cell"></text> |
|
|
|
</view> |
|
|
|
|
|
|
|
<view class="table-row" v-for="(item, index) in costList" :key="index"> |
|
|
|
<view class="cell-input"> |
|
|
|
<uv-input |
|
|
|
v-model="item.name" |
|
|
|
placeholder="费用名称" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: 'transparent', fontSize: '28rpx' }" |
|
|
|
></uv-input> |
|
|
|
</view> |
|
|
|
<view class="cell-input"> |
|
|
|
<uv-input |
|
|
|
v-model="item.quantity" |
|
|
|
placeholder="数量" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: 'transparent', fontSize: '28rpx' }" |
|
|
|
></uv-input> |
|
|
|
</view> |
|
|
|
<view class="cell-input"> |
|
|
|
<uv-input |
|
|
|
v-model="item.amount" |
|
|
|
placeholder="金额" |
|
|
|
type="digit" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: 'transparent', fontSize: '28rpx' }" |
|
|
|
></uv-input> |
|
|
|
</view> |
|
|
|
<view class="cell-action"> |
|
|
|
<view class="action-btn delete-btn" @click="removeCostItem(index)" v-if="costList.length > 1"> |
|
|
|
<uv-icon name="close" size="14" color="#fff"></uv-icon> |
|
|
|
</view> |
|
|
|
<view class="action-btn add-btn" @click="addCostItem" v-if="index === costList.length - 1"> |
|
|
|
<uv-icon name="plus" size="14" color="#fff"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 附件信息 --> |
|
|
|
<view class="form-item form-item-header"> |
|
|
|
<text class="label active">附件信息</text> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 保养备注 --> |
|
|
|
<view class="form-item"> |
|
|
|
<text class="label">保养备注</text> |
|
|
|
</view> |
|
|
|
<view class="textarea-container"> |
|
|
|
<uv-textarea |
|
|
|
v-model="remarkText" |
|
|
|
placeholder="请填写备注" |
|
|
|
:maxlength="200" |
|
|
|
:show-confirm-bar="false" |
|
|
|
height="60" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: '#f5f5f5' }" |
|
|
|
></uv-textarea> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 附件图片 --> |
|
|
|
<view class="image-upload"> |
|
|
|
<view v-for="(img, index) in remarkImage" :key="index" class="image-item"> |
|
|
|
<image :src="img" mode="aspectFill" @click="previewImage(img, remarkImage)"></image> |
|
|
|
<view class="delete-btn" @click="deleteAttachment(index)"> |
|
|
|
<uv-icon name="close" size="12" color="#fff"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
<view class="upload-btn" @click="uploadAttachment"> |
|
|
|
<uv-icon name="camera" size="34" color="#C70019"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 下次保养日期 --> |
|
|
|
<view class="form-item" @click="showNextDatePicker"> |
|
|
|
<text class="label">下次保养日期</text> |
|
|
|
<view class="select-area"> |
|
|
|
<text class="value" :class="{ placeholder: !nextMaintenanceDate }">{{ nextMaintenanceDate || '请选择' }}</text> |
|
|
|
<uv-icon name="arrow-down" size="18" color="#000"></uv-icon> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 备注 --> |
|
|
|
<view class="form-item"> |
|
|
|
<text class="label">备注</text> |
|
|
|
</view> |
|
|
|
<view class="textarea-container"> |
|
|
|
<uv-textarea |
|
|
|
v-model="remark" |
|
|
|
placeholder="请填写备注" |
|
|
|
:maxlength="200" |
|
|
|
:show-confirm-bar="false" |
|
|
|
height="60" |
|
|
|
border="none" |
|
|
|
:custom-style="{ backgroundColor: '#f5f5f5' }" |
|
|
|
></uv-textarea> |
|
|
|
</view> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 提交按钮 --> |
|
|
|
<view class="submit-container"> |
|
|
|
<uv-button |
|
|
|
type="primary" |
|
|
|
text="立即提交" |
|
|
|
:disabled="submiting" |
|
|
|
:custom-style="{ backgroundColor: '#C70019', borderRadius: '25px' }" |
|
|
|
@click="submitMaintenance" |
|
|
|
></uv-button> |
|
|
|
</view> |
|
|
|
|
|
|
|
<!-- 日期选择器 --> |
|
|
|
<uv-datetime-picker |
|
|
|
confirm-color="#C70019" |
|
|
|
ref="datePicker" |
|
|
|
mode="date" |
|
|
|
v-model="timeValue" |
|
|
|
@confirm="confirmDate" |
|
|
|
></uv-datetime-picker> |
|
|
|
|
|
|
|
<uv-datetime-picker |
|
|
|
confirm-color="#C70019" |
|
|
|
ref="nextDatePicker" |
|
|
|
mode="date" |
|
|
|
v-model="nextTimeValue" |
|
|
|
@confirm="confirmNextDate" |
|
|
|
></uv-datetime-picker> |
|
|
|
</view> |
|
|
|
</template> |
|
|
|
|
|
|
|
<script> |
|
|
|
export default { |
|
|
|
data() { |
|
|
|
return { |
|
|
|
id: '', |
|
|
|
timeValue: Number(new Date()), |
|
|
|
nextTimeValue: Number(new Date()), |
|
|
|
// 表单数据 |
|
|
|
maintenanceName: '', |
|
|
|
maintenanceDate: '', |
|
|
|
stateFrontText: '', |
|
|
|
stateFrontImage: [], |
|
|
|
stateBackText: '', |
|
|
|
stateBackImage: [], |
|
|
|
isExpend: '0', |
|
|
|
costList: [{ name: '', quantity: '', amount: '' }], |
|
|
|
remarkText: '', |
|
|
|
remarkImage: [], |
|
|
|
nextMaintenanceDate: '', |
|
|
|
remark: '', |
|
|
|
showpieceId: '', |
|
|
|
submiting: false |
|
|
|
} |
|
|
|
}, |
|
|
|
computed: { |
|
|
|
// 计算总金额 |
|
|
|
amount() { |
|
|
|
return this.costList.reduce((sum, item) => { |
|
|
|
return sum + (Number(item.quantity) * parseFloat(item.amount || 0)) |
|
|
|
}, 0) |
|
|
|
} |
|
|
|
}, |
|
|
|
methods: { |
|
|
|
// 显示日期选择器 |
|
|
|
showDatePicker() { |
|
|
|
this.$refs.datePicker.open() |
|
|
|
}, |
|
|
|
|
|
|
|
// 确认日期 |
|
|
|
confirmDate(e) { |
|
|
|
// uv-datetime-picker返回的是时间戳,需要转换为日期格式 |
|
|
|
this.maintenanceDate = this.$utils.formatTime(e.value) |
|
|
|
}, |
|
|
|
|
|
|
|
// 显示下次保养日期选择器 |
|
|
|
showNextDatePicker() { |
|
|
|
this.$refs.nextDatePicker.open() |
|
|
|
}, |
|
|
|
|
|
|
|
// 确认下次保养日期 |
|
|
|
confirmNextDate(e) { |
|
|
|
// uv-datetime-picker返回的是时间戳,需要转换为日期格式 |
|
|
|
this.nextMaintenanceDate = this.$utils.formatTime(e.value) |
|
|
|
}, |
|
|
|
|
|
|
|
// 选择是否产生费用 |
|
|
|
selectCost(value) { |
|
|
|
this.isExpend = value |
|
|
|
if (value === '0') { |
|
|
|
this.costList = [{ name: '', quantity: '', amount: '' }] |
|
|
|
} else if (this.costList.length === 0) { |
|
|
|
this.costList = [{ name: '', quantity: '', amount: '' }] |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 添加费用项目 |
|
|
|
addCostItem() { |
|
|
|
this.costList.push({ name: '', quantity: '', amount: '' }) |
|
|
|
}, |
|
|
|
|
|
|
|
// 删除费用项目 |
|
|
|
removeCostItem(index) { |
|
|
|
if (this.costList.length > 1) { |
|
|
|
this.costList.splice(index, 1) |
|
|
|
} else { |
|
|
|
uni.showToast({ title: '至少保留一个费用项目', icon: 'none' }) |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 上传保养前图片 |
|
|
|
async uploadBeforeImage() { |
|
|
|
try { |
|
|
|
const result = await this.$utils.chooseAndUpload() |
|
|
|
if (result && result.success) { |
|
|
|
console.log(result); |
|
|
|
|
|
|
|
this.stateFrontImage.push(result.url) |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('图片上传失败:', error) |
|
|
|
uni.showToast({ |
|
|
|
title: '图片上传失败', |
|
|
|
icon: 'error' |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 删除保养前图片 |
|
|
|
deleteBeforeImage(index) { |
|
|
|
this.stateFrontImage.splice(index, 1) |
|
|
|
}, |
|
|
|
|
|
|
|
// 上传保养后图片 |
|
|
|
async uploadAfterImage() { |
|
|
|
try { |
|
|
|
const result = await this.$utils.chooseAndUpload() |
|
|
|
if (result && result.success) { |
|
|
|
console.log(result); |
|
|
|
|
|
|
|
this.stateBackImage.push(result.url) |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('头像上传失败:', error) |
|
|
|
uni.showToast({ |
|
|
|
title: '头像上传失败', |
|
|
|
icon: 'error' |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 删除保养后图片 |
|
|
|
deleteAfterImage(index) { |
|
|
|
this.stateBackImage.splice(index, 1) |
|
|
|
}, |
|
|
|
|
|
|
|
// 上传附件 |
|
|
|
async uploadAttachment() { |
|
|
|
|
|
|
|
try { |
|
|
|
const result = await this.$utils.chooseAndUpload() |
|
|
|
if (result && result.success) { |
|
|
|
console.log(result); |
|
|
|
|
|
|
|
this.remarkImage.push(result.url) |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('头像上传失败:', error) |
|
|
|
uni.showToast({ |
|
|
|
title: '头像上传失败', |
|
|
|
icon: 'error' |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 删除附件 |
|
|
|
deleteAttachment(index) { |
|
|
|
this.remarkImage.splice(index, 1) |
|
|
|
}, |
|
|
|
|
|
|
|
// 预览图片 |
|
|
|
previewImage(url, imageList) { |
|
|
|
uni.previewImage({ |
|
|
|
urls: imageList, |
|
|
|
current: url |
|
|
|
}) |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 提交保养 |
|
|
|
async submitMaintenance() { |
|
|
|
// 表单验证 |
|
|
|
if (!this.maintenanceName.trim()) { |
|
|
|
uni.showToast({ title: '请填写保养人', icon: 'none' }) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if (!this.stateFrontText.trim()) { |
|
|
|
uni.showToast({ title: '请填写保养前状态', icon: 'none' }) |
|
|
|
return |
|
|
|
} |
|
|
|
if (!this.stateBackText.trim()) { |
|
|
|
uni.showToast({ title: '请填写保养后状态', icon: 'none' }) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
if (this.isExpend === '1' && !this.amount){ |
|
|
|
uni.showToast({ title: '请填写消费', icon: 'none' }) |
|
|
|
return |
|
|
|
} |
|
|
|
// 把costList切换成字符串并用,,;分割 |
|
|
|
// 提交数据 |
|
|
|
const formData = { |
|
|
|
maintenanceName: this.maintenanceName, |
|
|
|
maintenanceDate: this.maintenanceDate, |
|
|
|
stateFrontText: this.stateFrontText, |
|
|
|
stateFrontImage: this.stateFrontImage?.join(',') || '', |
|
|
|
stateBackText: this.stateBackText, |
|
|
|
stateBackImage: this.stateBackImage?.join(',') || '', |
|
|
|
expenseList: this.costList.map(item => { |
|
|
|
return `${item.name},${item.quantity},${item.amount}` |
|
|
|
}).join(';'), |
|
|
|
isExpend: this.isExpend, |
|
|
|
amount: this.amount, |
|
|
|
remarkText: this.remarkText, |
|
|
|
remarkImage: this.remarkImage?.join(',') || '', |
|
|
|
nextMaintenanceDate: this.nextMaintenanceDate, |
|
|
|
remark: this.remark, |
|
|
|
id: this.id |
|
|
|
} |
|
|
|
if (formData.isExpend === '0'){ |
|
|
|
delete formData.expenseList |
|
|
|
} |
|
|
|
|
|
|
|
this.submiting = true |
|
|
|
try{ |
|
|
|
|
|
|
|
const subRes = await this.$api.exhibit.updateMaintenance(formData) |
|
|
|
if(subRes.code == 200){ |
|
|
|
uni.showToast({ title: subRes.message, icon: 'success' }) |
|
|
|
// 返回上一页 |
|
|
|
setTimeout(() => { |
|
|
|
uni.navigateBack() |
|
|
|
}, 1000) |
|
|
|
}else{ |
|
|
|
uni.showToast({ title: subRes.message, icon: 'none' }) |
|
|
|
} |
|
|
|
}catch(err){ |
|
|
|
// uni.showToast({ title: err.message, icon: 'none' }) |
|
|
|
this.submiting = false |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 获取保养单详情 |
|
|
|
async queryMaintenanceById() { |
|
|
|
try { |
|
|
|
const res = await this.$api.exhibit.queryMaintenanceById({ |
|
|
|
maintenanceId: this.id |
|
|
|
}) |
|
|
|
if (res.code == 200) { |
|
|
|
const maintenanceInfo = res.result |
|
|
|
// 表单数据 |
|
|
|
this.maintenanceName = maintenanceInfo.maintenanceName || '' |
|
|
|
this.maintenanceDate = maintenanceInfo.maintenanceDate || '' |
|
|
|
this.stateFrontText = maintenanceInfo.stateFrontText || '' |
|
|
|
// 处理图片字段,去除首尾空格并分割 |
|
|
|
this.stateFrontImage = maintenanceInfo.stateFrontImage ? maintenanceInfo.stateFrontImage.trim().split(',').filter(img => img.trim()) : [] |
|
|
|
this.stateBackText = maintenanceInfo.stateBackText || '' |
|
|
|
this.stateBackImage = maintenanceInfo.stateBackImage ? maintenanceInfo.stateBackImage.trim().split(',').filter(img => img.trim()) : [] |
|
|
|
this.isExpend = maintenanceInfo.isExpend || '0' |
|
|
|
this.remarkText = maintenanceInfo.remarkText || '' |
|
|
|
this.remarkImage = maintenanceInfo.remarkImage ? maintenanceInfo.remarkImage.trim().split(',').filter(img => img.trim()) : [] |
|
|
|
this.nextMaintenanceDate = maintenanceInfo.nextMaintenanceDate || '' |
|
|
|
this.remark = maintenanceInfo.remark || '' |
|
|
|
// 处理费用列表数据 |
|
|
|
if (maintenanceInfo.isExpend === '1' && maintenanceInfo.exhibitMaintenanceExpenses && maintenanceInfo.exhibitMaintenanceExpenses.length > 0){ |
|
|
|
this.costList = maintenanceInfo.exhibitMaintenanceExpenses.map(item => { |
|
|
|
return { |
|
|
|
name: item.title || '', |
|
|
|
quantity: item.num || '', |
|
|
|
amount: item.amount || '' |
|
|
|
} |
|
|
|
}) |
|
|
|
} else { |
|
|
|
this.costList = [{ name: '', quantity: '', amount: '' }] |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
uni.showToast({ title: error.message, icon: 'none' }) |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
onLoad(options) { |
|
|
|
this.showpieceId = options.showpieceId |
|
|
|
this.id = options.id |
|
|
|
// 查看保养记录详情 |
|
|
|
this.queryMaintenanceById() |
|
|
|
}, |
|
|
|
} |
|
|
|
</script> |
|
|
|
|
|
|
|
<style lang="scss" scoped> |
|
|
|
.maintenance-submit { |
|
|
|
min-height: 100vh; |
|
|
|
background-color: #f5f5f5; |
|
|
|
padding-bottom: 200rpx; |
|
|
|
} |
|
|
|
|
|
|
|
.maintenance-info { |
|
|
|
margin: 18rpx; |
|
|
|
background: #ffffff; |
|
|
|
border-radius: 15rpx; |
|
|
|
box-shadow: 0rpx 3rpx 6rpx 0rpx rgba(0,0,0,0.16); |
|
|
|
padding: 40rpx; |
|
|
|
|
|
|
|
.info-header { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
margin-bottom: 40rpx; |
|
|
|
|
|
|
|
.red-line { |
|
|
|
width: 9rpx; |
|
|
|
height: 33rpx; |
|
|
|
background-color: $primary-color; |
|
|
|
margin-right: 7rpx; |
|
|
|
border-radius: 5rpx; |
|
|
|
} |
|
|
|
|
|
|
|
.info-title { |
|
|
|
font-size: 30rpx; |
|
|
|
font-weight: bold; |
|
|
|
color: $primary-text-color; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.form-item-header { |
|
|
|
border-bottom: none; |
|
|
|
margin-top: 20rpx; |
|
|
|
} |
|
|
|
|
|
|
|
.form-item { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: space-between; |
|
|
|
padding: 24rpx 0; |
|
|
|
border-bottom: 2rpx solid #f0f0f0; |
|
|
|
|
|
|
|
&:last-child { |
|
|
|
border-bottom: none; |
|
|
|
} |
|
|
|
|
|
|
|
.label { |
|
|
|
font-size: 30rpx; |
|
|
|
color: $primary-text-color; |
|
|
|
flex-shrink: 0; |
|
|
|
|
|
|
|
&.active { |
|
|
|
font-weight: bold; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.value { |
|
|
|
font-size: 30rpx; |
|
|
|
color: $secondary-text-color; |
|
|
|
|
|
|
|
&.placeholder { |
|
|
|
color: $secondary-text-color; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.select-area { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
gap: 16rpx; |
|
|
|
} |
|
|
|
|
|
|
|
.input-area { |
|
|
|
flex: 1; |
|
|
|
// background-color: #f5f5f5; |
|
|
|
border-radius: 8rpx; |
|
|
|
padding: 16rpx 24rpx; |
|
|
|
margin-left: 24rpx; |
|
|
|
|
|
|
|
.input-field { |
|
|
|
width: 100%; |
|
|
|
font-size: 30rpx; |
|
|
|
color: $primary-text-color; |
|
|
|
background: transparent; |
|
|
|
border: none; |
|
|
|
outline: none; |
|
|
|
text-align: right; |
|
|
|
|
|
|
|
&::placeholder { |
|
|
|
color: $secondary-text-color; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.radio-options { |
|
|
|
display: flex; |
|
|
|
gap: 60rpx; |
|
|
|
|
|
|
|
.radio-item { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
gap: 16rpx; |
|
|
|
|
|
|
|
.radio-dot { |
|
|
|
width: 32rpx; |
|
|
|
height: 32rpx; |
|
|
|
border: 4rpx solid #ddd; |
|
|
|
border-radius: 50%; |
|
|
|
position: relative; |
|
|
|
|
|
|
|
&.active { |
|
|
|
border-color: $primary-color; |
|
|
|
|
|
|
|
&::after { |
|
|
|
content: ''; |
|
|
|
position: absolute; |
|
|
|
top: 50%; |
|
|
|
left: 50%; |
|
|
|
transform: translate(-50%, -50%); |
|
|
|
width: 16rpx; |
|
|
|
height: 16rpx; |
|
|
|
background-color: $primary-color; |
|
|
|
border-radius: 50%; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
text { |
|
|
|
font-size: 30rpx; |
|
|
|
color: $secondary-text-color; |
|
|
|
|
|
|
|
&.active { |
|
|
|
color: $primary-color; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.textarea-container { |
|
|
|
border-radius: 8rpx; |
|
|
|
} |
|
|
|
|
|
|
|
.image-upload { |
|
|
|
display: flex; |
|
|
|
flex-wrap: wrap; |
|
|
|
gap: 24rpx; |
|
|
|
margin: 16rpx 0; |
|
|
|
|
|
|
|
.upload-btn { |
|
|
|
width: 160rpx; |
|
|
|
height: 160rpx; |
|
|
|
border: 2rpx dashed $primary-color; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
background-color: #fff; |
|
|
|
} |
|
|
|
|
|
|
|
.image-item { |
|
|
|
position: relative; |
|
|
|
width: 160rpx; |
|
|
|
height: 160rpx; |
|
|
|
|
|
|
|
image { |
|
|
|
width: 100%; |
|
|
|
height: 100%; |
|
|
|
border-radius: 8rpx; |
|
|
|
} |
|
|
|
|
|
|
|
.delete-btn { |
|
|
|
position: absolute; |
|
|
|
top: -12rpx; |
|
|
|
right: -12rpx; |
|
|
|
width: 40rpx; |
|
|
|
height: 40rpx; |
|
|
|
background-color: #ff4757; |
|
|
|
border-radius: 50%; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 费用表格样式 |
|
|
|
.cost-table { |
|
|
|
margin-top: 24rpx; |
|
|
|
border: 2rpx solid #f0f0f0; |
|
|
|
border-radius: 8rpx; |
|
|
|
overflow: hidden; |
|
|
|
|
|
|
|
.table-header { |
|
|
|
display: flex; |
|
|
|
background-color: #f5f5f5; |
|
|
|
padding: 16rpx 0; |
|
|
|
|
|
|
|
.header-cell { |
|
|
|
flex: 1; |
|
|
|
text-align: center; |
|
|
|
font-size: 28rpx; |
|
|
|
font-weight: bold; |
|
|
|
color: $primary-text-color; |
|
|
|
|
|
|
|
&:first-child { |
|
|
|
flex: 2; |
|
|
|
} |
|
|
|
|
|
|
|
&:last-child { |
|
|
|
width: 120rpx; |
|
|
|
flex: none; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.table-row { |
|
|
|
display: flex; |
|
|
|
border-top: 2rpx solid #f0f0f0; |
|
|
|
|
|
|
|
.cell-input { |
|
|
|
flex: 1; |
|
|
|
padding: 8rpx; |
|
|
|
border-right: 2rpx solid #f0f0f0; |
|
|
|
|
|
|
|
&:first-child { |
|
|
|
flex: 2; |
|
|
|
} |
|
|
|
|
|
|
|
&:last-child { |
|
|
|
border-right: none; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.cell-action { |
|
|
|
width: 120rpx; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
gap: 8rpx; |
|
|
|
padding: 8rpx; |
|
|
|
|
|
|
|
.action-btn { |
|
|
|
width: 36rpx; |
|
|
|
height: 36rpx; |
|
|
|
padding: 4rpx; |
|
|
|
border-radius: 50%; |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
justify-content: center; |
|
|
|
|
|
|
|
&.add-btn { |
|
|
|
background-color: #1a9c10; |
|
|
|
} |
|
|
|
|
|
|
|
&.delete-btn { |
|
|
|
background-color: $primary-color; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.submit-container { |
|
|
|
position: fixed; |
|
|
|
z-index: 999; |
|
|
|
bottom: 0; |
|
|
|
left: 0; |
|
|
|
right: 0; |
|
|
|
padding: 32rpx; |
|
|
|
background-color: #fff; |
|
|
|
border-top: 2rpx solid #f0f0f0; |
|
|
|
} |
|
|
|
</style> |