feat(工单编辑): 添加移动球机申领功能

- 在WorkNote组件中添加申领按钮并绑定openApplyForMachine事件
- 新增ApplyForMachine组件用于球机申领表单
- 修改index.vue实现球机申领流程跳转
- 调整步骤导航逻辑支持子步骤
This commit is contained in:
liangbin 2026-01-19 14:32:27 +08:00
parent 9efe368f79
commit 478c5cfc1a
3 changed files with 232 additions and 31 deletions

View File

@ -0,0 +1,147 @@
<!-- 球机申领 -->
<template>
<view class="MainBox">
<view class="FormBox">
<view class="FormItem">
<view class="FormLableBox mustBox">作业地点</view>
<view class="FormValueBox">
<u-input v-model="allData.workLocation" placeholder="请输入作业地点" readonly></u-input>
</view>
</view>
<view class="FormItem">
<view class="FormLableBox mustBox">作业周期</view>
<view class="FormValueBox">
<view class="date-range-box">
<view class="date-item">
<u-input v-model="allData.startTime" placeholder="开始时间" readonly></u-input>
</view>
<view class="date-separator"></view>
<view class="date-item">
<u-input v-model="allData.endTime" placeholder="结束时间" readonly></u-input>
</view>
</view>
</view>
</view>
<view class="FormItem">
<view class="FormLableBox mustBox">申领数量</view>
<view class="FormValueBox">
<up-number-box v-model="formData.applyQuantity" @change="valChange"></up-number-box>
</view>
</view>
<view class="FormItem">
<view class="FormLableBox mustBox">安装位置</view>
<view class="FormValueBox">
<u-input v-model="formData.installationSite" placeholder="请输入安装位置"></u-input>
</view>
</view>
<view class="FormItem">
<view class="FormLableBox mustBox">联系人+联系方式</view>
<view class="FormValueBox">
<u-input v-model="formData.linkman" placeholder="请输入联系人+联系方式"></u-input>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { generateGuid } from '@/utils/index.js';
import dayjs from 'dayjs';
import { ref, defineExpose } from 'vue'
const props = defineProps({
allData: {
type: Object,
default: () => { },
},
})
const formData = ref({
applyQuantity: '', //
installationSite: '', //
linkman: '', // +
})
defineExpose({
getFormData() {
return formData.value;
}
})
</script>
<style lang="scss" scoped>
.BlueTxt {
font-size: 28rpx;
color: #2979ff;
margin: 10rpx 0;
}
.addBtn {
font-size: 30rpx;
color: #2979ff;
font-weight: bold;
}
.BorderBox {
border: 1rpx solid #e4e7ed;
padding: 20rpx;
border-radius: 10rpx;
}
.FlexBox {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
.MainBox {
padding: 20rpx;
background-color: #fff;
height: 100%;
overflow: auto;
}
.mustBox::after {
content: "*";
color: red;
font-size: 30rpx;
margin-left: 10rpx;
}
.FormBox {
// background-color: #f5f5f5;
height: 100%;
.FormItem {
padding: 20rpx;
background-color: #fff;
.FormLableBox {
font-size: 30rpx;
font-weight: bold;
margin-bottom: 20rpx;
}
.FormValueBox {
font-size: 30rpx;
margin-top: 20rpx;
}
}
}
.date-range-box {
display: flex;
align-items: center;
gap: 20rpx;
flex: 1;
.date-item {
flex: 1;
}
.date-separator {
color: #999;
font-size: 28rpx;
}
}
</style>

View File

@ -130,7 +130,7 @@
</view> </view>
</view> </view>
<view class="FormValueBox"> <view class="FormValueBox">
<u-button type="primary" :disabled="!needApplyBallMachine">申领移动球机</u-button> <u-button type="primary" :disabled="!needApplyBallMachine" @click="openApplyForMachine">申领移动球机</u-button>
</view> </view>
</view> </view>
@ -143,6 +143,18 @@ import { generateGuid } from '@/utils/index.js';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { ref, defineExpose } from 'vue' import { ref, defineExpose } from 'vue'
// props
const props = defineProps({
allData: {
type: Object,
default: () => { },
},
openApplyForMachine: {
type: Function,
default: () => { },
},
})
// //
const riskTypeList = ref([ const riskTypeList = ref([
{ {

View File

@ -8,21 +8,24 @@
<!-- 返回主页 --> <!-- 返回主页 -->
<u-icon name="home" size="24"></u-icon> <u-icon name="home" size="24"></u-icon>
</view> </view>
<view class="Title">{{stepList[currentStep - 1].Title}}</view> <view class="Title">{{ currentStep.Title }}</view>
<view class="informBox"> <view class="informBox">
<u-icon name="bell-fill" size="24"></u-icon> <u-icon name="bell-fill" size="24"></u-icon>
<view class="MsgTxt"></view> <view class="MsgTxt"></view>
</view> </view>
</view> </view>
<view class="ContentBox"> <view class="ContentBox">
<BasicsInfo ref="basicsInfoRef" :allData="allData" v-if="currentStep == 1"></BasicsInfo> <BasicsInfo ref="basicsInfoRef" :allData="allData" v-if="currentStep.id == 1"></BasicsInfo>
<GatePassInfo ref="gatePassInfoRef" :allData="allData" v-if="currentStep == 2"></GatePassInfo> <GatePassInfo ref="gatePassInfoRef" :allData="allData" v-if="currentStep.id == 2"></GatePassInfo>
<WorkNote ref="workNoteRef" :allData="allData" v-if="currentStep == 3"></WorkNote> <WorkNote ref="workNoteRef" :allData="allData" :openApplyForMachine="openApplyForMachine"
<RiskControl ref="riskControlRef" :allData="allData" v-if="currentStep == 4"></RiskControl> v-if="currentStep.id == 3"></WorkNote>
<RiskControl ref="riskControlRef" :allData="allData" v-if="currentStep.id == 4"></RiskControl>
<ApplyForMachine ref="applyForMachineRef" :allData="allData" v-if="currentStep.id == '3a'">
</ApplyForMachine>
</view> </view>
<view class="FootBox" v-for="item in stepList" :key="item.id"> <view class="FootBox">
<u-button :text="item.PrevBtnName" type="info"></u-button> <u-button :text="currentStep.PrevBtnName" type="info"></u-button>
<u-button :text="item.NextBtnName" color="#2979ff" @click="nextStep"></u-button> <u-button :text="currentStep.NextBtnName" color="#2979ff" @click="nextStep"></u-button>
</view> </view>
</view> </view>
</template> </template>
@ -32,10 +35,19 @@ import BasicsInfo from './compoents/BasicsInfo.vue'
import GatePassInfo from './compoents/GatePassInfo.vue' import GatePassInfo from './compoents/GatePassInfo.vue'
import WorkNote from './compoents/WorkNote.vue' import WorkNote from './compoents/WorkNote.vue'
import RiskControl from './compoents/RiskControl.vue' import RiskControl from './compoents/RiskControl.vue'
import ApplyForMachine from './compoents/ApplyForMachine.vue'
const currentStep = ref(1)// const currentStep = ref({
id: 1,
Title: '工单基础信息',
PrevBtnName: '返回上一页',
NextBtnName: '下一步(申请出入证)',
})//
const basicsInfoRef = ref(null); // const basicsInfoRef = ref(null); //
const gatePassInfoRef = ref(null); // const gatePassInfoRef = ref(null); //
const workNoteRef = ref(null); //
const riskControlRef = ref(null); //
const applyForMachineRef = ref(null); //
// //
const allData = ref({ const allData = ref({
@ -61,33 +73,60 @@ const stepList = ref([
id: 3, id: 3,
Title: '填写工作票', Title: '填写工作票',
PrevBtnName: '保存草稿', PrevBtnName: '保存草稿',
NextBtnName: '提交+下一步(填写风险控制卡)', NextBtnName: '提交+下一步(风险控制卡)',
}, },
{ {
id: 3, id: 4,
Title: '填写风险控制卡', Title: '填写风险控制卡',
PrevBtnName: '保存草稿', PrevBtnName: '保存草稿',
NextBtnName: '提交监理审核', NextBtnName: '提交监理审核',
}, },
{
id: '3a',
Title: '球机申领',
PrevBtnName: '取消申领',
NextBtnName: '返回申领',
},
]) ])
// //
const prevStep = () => { const prevStep = (id) => {
currentStep.value--; if (id == '3a') {
currentStep.value = stepList.value.find(item => item.id == 3);
} else {
currentStep.value = stepList.value.find(item => item.id == currentStep.value.id - 1);
}
} }
// //
const nextStep = () => { const nextStep = (id) => {
if (currentStep.value == 1) { if (currentStep.value.id == 1) {
console.log(basicsInfoRef.value.getFormData()); console.log(basicsInfoRef.value.getFormData());
allData.value.BasicsInfo = basicsInfoRef.value.getFormData(); allData.value.BasicsInfo = basicsInfoRef.value.getFormData();
} else if (currentStep.value == 2) { } else if (currentStep.value.id == 2) {
console.log(gatePassInfoRef.value.getFormData()); console.log(gatePassInfoRef.value.getFormData());
allData.value.GatePassInfo = gatePassInfoRef.value.getFormData(); allData.value.GatePassInfo = gatePassInfoRef.value.getFormData();
} } else if (currentStep.value.id == 3) {
currentStep.value++; console.log(workNoteRef.value.getFormData());
allData.value.WorkNote = workNoteRef.value.getFormData();
} else if (currentStep.value.id == '3a') {
console.log(applyForMachineRef.value.getFormData());
allData.value.ApplyForMachine = applyForMachineRef.value.getFormData();
currentStep.value = stepList.value.find(item => item.id == 3);
return;
} else if (currentStep.value.id == 4) {
console.log(riskControlRef.value.getFormData());
allData.value.RiskControl = riskControlRef.value.getFormData();
} }
currentStep.value = stepList.value.find(item => item.id == currentStep.value.id + 1);
}
//
const openApplyForMachine = (e) => {
console.log(e);
currentStep.value = stepList.value.find(item => item.id == '3a');
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -107,14 +146,17 @@ const nextStep = () => {
height: 100rpx; height: 100rpx;
padding: 20rpx; padding: 20rpx;
background-color: #fff; background-color: #fff;
.iconBox { .iconBox {
font-size: 32rpx; font-size: 32rpx;
} }
.Title { .Title {
font-size: 32rpx; font-size: 32rpx;
font-weight: bold; font-weight: bold;
color: #333; color: #333;
} }
.informBox { .informBox {
.MsgTxt { .MsgTxt {
padding: 8rpx; padding: 8rpx;