|
|
@@ -173,33 +173,19 @@
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
- <el-col :span="8">
|
|
|
+ <el-col :span="24">
|
|
|
<!-- 检验员 teamList -->
|
|
|
<el-form-item label="检验员" prop="teamList">
|
|
|
- <div class="flex items-center gap-2">
|
|
|
-<!-- <div v-if="selectedCheckers.length > 0" class="selected-checkers flex-1">
|
|
|
- <el-tag
|
|
|
- v-for="checker in selectedCheckers"
|
|
|
- :key="checker.memberId"
|
|
|
- class="mx-1"
|
|
|
- :closable="pageType === 'detail' ? false : true"
|
|
|
- @close="removeChecker(checker.memberId)"
|
|
|
- >
|
|
|
- <span v-if="checker.isLeader" class="leader-tag">组</span>
|
|
|
- {{ checker.member?.nickname }}
|
|
|
- </el-tag>
|
|
|
- </div>
|
|
|
- <el-button type="primary" link @click="openCheckerSelect">
|
|
|
- 选择检验员
|
|
|
- </el-button>-->
|
|
|
- <el-checkbox-group v-model="formData.inspectors" style="width: 100vh;padding-left: 10px;">
|
|
|
- <el-row :gutter="20">
|
|
|
- <el-col :span="3" v-for="user in userList" :key="user.id">
|
|
|
- <el-checkbox :label="user.nickname" :value="user.id"/>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </el-checkbox-group>
|
|
|
- </div>
|
|
|
+ <CheckerSelect
|
|
|
+ ref="checkerSelectRef"
|
|
|
+ v-model="selectedCheckers"
|
|
|
+ :dept-id="userStore.getUser.deptId?.toString() || '1'"
|
|
|
+ :disabled="false"
|
|
|
+ :has-data="true"
|
|
|
+ empty-text="暂无检验员数据"
|
|
|
+ :multiple="true"
|
|
|
+ @change="handleCheckerChange"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -266,8 +252,24 @@
|
|
|
<el-row class="form-group" :gutter="24">
|
|
|
<el-col :span="24">
|
|
|
<!-- 定期检查&超年限检查 -->
|
|
|
+ <el-form-item label="检验性质" prop="checkType" label-width="120px">
|
|
|
+ <el-select disabled v-model="formData.checkType" placeholder="请选择检验性质" clearable class="!w-120px">
|
|
|
+ <el-option
|
|
|
+ v-for="(item, key) in checkStatusMap"
|
|
|
+ :key="key"
|
|
|
+ :label="item"
|
|
|
+ :value="key"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
<!-- 收费性质 feeNature -->
|
|
|
- <el-form-item label="收费性质" prop="feeNature" v-if="orderDetail?.checkType != 200">
|
|
|
+ <el-form-item prop="feeNature" >
|
|
|
+ <template #label>
|
|
|
+ <div class="flex flex-col text-right">
|
|
|
+ <span>收费性质</span>
|
|
|
+ <span>(行政事业收费)</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
<el-radio-group v-model="formData.feeNature">
|
|
|
<el-radio v-for="(item, key) in PressureFeeNatureMap" :key="key" :value="key" :label="item"/>
|
|
|
</el-radio-group>
|
|
|
@@ -283,166 +285,35 @@
|
|
|
</el-col>
|
|
|
<el-col :span="24">
|
|
|
<!-- 收费金额 actualAmount -->
|
|
|
- <el-form-item label="收费金额" prop="actualAmount" class="actualAmountFormItem">
|
|
|
- <el-input-number
|
|
|
- :controls="false" v-model="formData.actualAmount" placeholder="请输入收费金额" :precision="2"
|
|
|
- :step="0.01"/>
|
|
|
- <div style="padding-left: 8px;">大写({{numberToChinese(formData.actualAmount)}})含税</div>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="24">
|
|
|
- <!-- 年度检查 -->
|
|
|
- <el-form-item label="" prop="feeDate" label-width="30" v-if="orderDetail?.checkType == 200">
|
|
|
- <div class="feeDate_box">
|
|
|
- 甲方在本服务单签订之日起
|
|
|
- <el-input-number :controls="false" v-model="formData.feeDate" placeholder="请输入"/>
|
|
|
- 日内一次性支付。
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
+ <!-- <el-form-item label="收费金额" prop="actualAmount" class="actualAmountFormItem">
|
|
|
+ <el-input-number
|
|
|
+ :controls="false"
|
|
|
+ v-model="formData.actualAmount"
|
|
|
+ placeholder="请输入收费金额"
|
|
|
+ :min="0"
|
|
|
+ />
|
|
|
+ <div style="padding-left: 8px;">大写({{numberToChinese(formData.actualAmount)}})含税</div>
|
|
|
+ </el-form-item>-->
|
|
|
+ <div class="flex items-center gap-32 ml-40px text-14px">
|
|
|
+ <span>应收法定金额: {{ formData.shouldAmount }}</span>
|
|
|
+ <span>服务收费金额:{{ formData.serviceAmount }}</span>
|
|
|
+ <span>免征费用: {{ formData.reduceFee }}</span>
|
|
|
+ </div>
|
|
|
</el-col>
|
|
|
+ <!-- <el-col :span="24">
|
|
|
+ <!– 年度检查 –>
|
|
|
+ <el-form-item label="" prop="feeDate" label-width="30" v-if="orderDetail?.checkType == 200">
|
|
|
+ <div class="feeDate_box">
|
|
|
+ 甲方在本服务单签订之日起
|
|
|
+ <el-input-number :controls="false" v-model="formData.feeDate" placeholder="请输入" :maxlength="50"/>
|
|
|
+ 日内一次性支付。
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>-->
|
|
|
</el-row>
|
|
|
</el-form>
|
|
|
- <!-- <el-form :model="formData" :rules="formRules" ref="formRef" :disabled="pageType === 'detail'" label-width="90px" class="p-3"> -->
|
|
|
- <!-- 基本信息 -->
|
|
|
- <!-- <div class="form-group mb-2"> -->
|
|
|
- <!-- 受检单位名称 -->
|
|
|
- <!-- <div class="unit-name mb-3">
|
|
|
- <span class="label">受检单位</span>
|
|
|
- <span class="value">
|
|
|
- {{ formData.unitName }}
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- <div class="grid grid-cols-4 gap-2">
|
|
|
- <el-form-item label="区域">
|
|
|
- <el-input v-model="formData.areaDisplay" disabled class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="地址">
|
|
|
- <el-input v-model="formData.unitAddress" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="邮政编码" prop="zipCode">
|
|
|
- <el-input v-model="formData.zipCode" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="备注" class="col-span-2">
|
|
|
- <el-input v-model="formData.remark" type="textarea" :rows="2" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </div> -->
|
|
|
-
|
|
|
- <!-- 联系人信息 -->
|
|
|
- <!-- <div class="form-group mb-2">
|
|
|
- <div class="grid grid-cols-4 gap-2">
|
|
|
- <el-form-item label="单位联系人" prop="unitContact">
|
|
|
- <el-input v-model="formData.unitContact" class="!w-full" />
|
|
|
- </el-form-item> -->
|
|
|
- <!-- <el-form-item label="单位联系部门">
|
|
|
- <el-input v-model="formData.unitContactDept" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="单位联系电话" prop="unitPhone">
|
|
|
- <el-input v-model="formData.unitPhone" class="!w-full" />
|
|
|
- </el-form-item> -->
|
|
|
- <!-- <el-form-item label="联系人电话" prop="mobile">
|
|
|
- <el-input v-model="formData.mobile" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="联系人邮箱" prop="email">
|
|
|
- <el-input v-model="formData.email" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </div> -->
|
|
|
-
|
|
|
- <!-- 业务信息 -->
|
|
|
- <!-- <div class="form-group">
|
|
|
- <div class="grid grid-cols-4 gap-2">
|
|
|
- <el-form-item label="负责部门">
|
|
|
- <DeptSelect
|
|
|
- v-model="formData.deptId"
|
|
|
- disabled
|
|
|
- placeholder="请选择部门"
|
|
|
- class="!w-full"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="计划编制人">
|
|
|
- <el-input v-model="formData.operator" disabled class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="安全附件" class="col-span-2">
|
|
|
- <el-radio-group v-model="formData.isAttach">
|
|
|
- <el-radio :value="true">是</el-radio>
|
|
|
- <el-radio :value="false">否</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="报告送达方式" prop="sendType">
|
|
|
- <el-select v-model="formData.sendType" class="!w-full">
|
|
|
- <el-option v-for="(item, key) in PressureSendTypeMap" :key="key" :label="item" :value="key" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="交通工具" prop="vehicle">
|
|
|
- <el-select v-model="formData.vehicle" class="!w-full">
|
|
|
- <el-option v-for="(item, key) in PressureVehicleTypeMap" :key="key" :label="item" :value="key" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="受理方式" prop="acceptType">
|
|
|
- <el-select v-model="formData.acceptType" class="!w-full">
|
|
|
- <el-option v-for="(item, key) in PressureAcceptTypeMap" :key="key" :label="item" :value="key" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="收费类型" prop="feeType">
|
|
|
- <el-select v-model="formData.feeType" class="!w-full">
|
|
|
- <el-option v-for="(item, key) in PressureFeeTypeMap" :key="key" :label="item" :value="key" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="实收金额">
|
|
|
- <el-input-number v-model="formData.actualAmount" :precision="2" :step="0.01" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="服务费">
|
|
|
- <el-input-number v-model="formData.serviceAmount" :precision="2" :step="0.01" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="应收金额">
|
|
|
- <el-input-number v-model="formData.shouldAmount" :precision="2" :step="0.01" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="减免费用">
|
|
|
- <el-input-number v-model="formData.reduceFee" :precision="2" :step="0.01" class="!w-full" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-form> -->
|
|
|
</ContentWrap>
|
|
|
|
|
|
- <!-- 人员安排 -->
|
|
|
- <!-- <ContentWrap title="人员和时间安排">
|
|
|
- <el-form :model="formData" :disabled="pageType === 'detail'" label-width="120px" class="p-4">
|
|
|
- <div class="grid grid-cols-4 gap-6">
|
|
|
- <el-form-item label="排期时间">
|
|
|
- <el-date-picker
|
|
|
- v-model="formData.appointmentDate"
|
|
|
- type="date"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- placeholder="选择排期时间"
|
|
|
- :disabled-date="disabledDate"
|
|
|
- class="!w-full"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="检验员" class="col-span-3" prop="inspectors">
|
|
|
- <div class="flex items-center gap-2">
|
|
|
- <div v-if="selectedCheckers.length > 0" class="selected-checkers flex-1">
|
|
|
- <el-tag
|
|
|
- v-for="checker in selectedCheckers"
|
|
|
- :key="checker.memberId"
|
|
|
- class="mx-1"
|
|
|
- closable
|
|
|
- @close="removeChecker(checker.memberId)"
|
|
|
- >
|
|
|
- <span v-if="checker.isLeader" class="leader-tag">组</span>
|
|
|
- {{ checker.member?.nickname }}
|
|
|
- </el-tag>
|
|
|
- </div>
|
|
|
- <el-button type="primary" link @click="openCheckerSelect">
|
|
|
- 选择检验员
|
|
|
- </el-button>
|
|
|
- </div>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-form>
|
|
|
- </ContentWrap> -->
|
|
|
-
|
|
|
<!-- 设备清单 -->
|
|
|
<ContentWrap title="设备信息">
|
|
|
<!-- 搜索工作栏 -->
|
|
|
@@ -723,24 +594,7 @@
|
|
|
</el-row>
|
|
|
</ContentWrap>
|
|
|
|
|
|
- <!-- 检验员选择弹窗 -->
|
|
|
- <el-dialog
|
|
|
- v-model="checkerSelectVisible"
|
|
|
- title="选择检验员"
|
|
|
- append-to-body
|
|
|
- width="600px"
|
|
|
- >
|
|
|
- <CheckerSelect
|
|
|
- v-model="currentSelectedCheckerIds"
|
|
|
- @change="handleCheckerChange"
|
|
|
- />
|
|
|
- <template #footer>
|
|
|
- <div class="flex justify-end">
|
|
|
- <el-button @click="checkerSelectVisible = false">取消</el-button>
|
|
|
- <el-button type="primary" @click="confirmCheckerSelect">确定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
+
|
|
|
|
|
|
<!-- 添加设备弹窗 -->
|
|
|
<PipeAddEquipDialog
|
|
|
@@ -822,7 +676,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
import { BoilerAcceptOrderApi } from '@/api/pressure2/boileracceptorder'
|
|
|
import PipeBatchEditForm from '@/views/pressure2/planNew/components/PipeBatchEditForm.vue'
|
|
|
import { BoilerAppointmentConfirmOrderEquipmentVO, BoilerAppointmentConfirmOrderApi } from '@/api/pressure2/appointmentconfirmorder'
|
|
|
-import CheckerSelect from '@/views/pressure2/equipboilerscheduling/components/CheckerSelect.vue'
|
|
|
+import CheckerSelect, { type CheckerItem } from '@/views/pressure2/components/CheckerSelect'
|
|
|
import dayjs from 'dayjs'
|
|
|
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
|
|
import DeptSelect from '../../pressure2/planNew/components/DeptSelect.vue'
|
|
|
@@ -845,7 +699,9 @@ import {
|
|
|
} from "@/api/pressure2/pipeequipment";
|
|
|
import {PipeAcceptOrderApi} from "@/api/pressure2/pipeacceptorder";
|
|
|
import {UserQualificationsApi} from "@/api/pressure2/userQualifications";
|
|
|
+import { useUserStore } from '@/store/modules/user'
|
|
|
const route = useRoute()
|
|
|
+const userStore = useUserStore()
|
|
|
const props = defineProps({
|
|
|
visible: {
|
|
|
type: Boolean,
|
|
|
@@ -871,7 +727,7 @@ const checkTypeMap = {
|
|
|
}
|
|
|
const formData = ref<Record<string, any>>({
|
|
|
appointmentDate: '',
|
|
|
- inspectors: [] as string[],
|
|
|
+ teamList: [] as string[],
|
|
|
unitName: {
|
|
|
name: '',
|
|
|
id: ''
|
|
|
@@ -923,13 +779,13 @@ const formData = ref<Record<string, any>>({
|
|
|
|
|
|
const userList = ref<any[]>([])
|
|
|
|
|
|
-const loading = ref(false)
|
|
|
+// 检验员组件引用
|
|
|
+const checkerSelectRef = ref()
|
|
|
|
|
|
-// 检验员选择相关
|
|
|
-const checkerSelectVisible = ref(false)
|
|
|
-const selectedCheckers = ref<any[]>([])
|
|
|
-const currentSelectedCheckerIds = ref<any[]>([])
|
|
|
-const tempSelectedCheckers = ref<any[]>([])
|
|
|
+// 选中的检验员对象列表
|
|
|
+const selectedCheckers = ref<CheckerItem[]>([])
|
|
|
+
|
|
|
+const loading = ref(false)
|
|
|
|
|
|
// 记录每个区域下已选择的街道
|
|
|
const areaStreetMap = ref(new Map<number, number[]>())
|
|
|
@@ -1146,7 +1002,6 @@ const getDetail = async () => {
|
|
|
formData.value = {
|
|
|
...formData.value,
|
|
|
appointmentDate: formatArrayDate(orderDetail.value?.appointmentDate || []),
|
|
|
- inspectors: [],
|
|
|
deptName: orderDetail.value?.deptName || '',
|
|
|
equipDistrict: orderDetail.value?.equipDistrict ? Number(orderDetail.value.equipDistrict) : undefined,
|
|
|
equipDistrictName: orderDetail.value?.equipDistrictName || '',
|
|
|
@@ -1206,13 +1061,50 @@ const getDetail = async () => {
|
|
|
|
|
|
userList.value = await UserQualificationsApi.getUserPipeAll()
|
|
|
|
|
|
- // 更新检验员数据
|
|
|
- const inspectors = orderDetail.value?.userList
|
|
|
+ // 获取检验员列表
|
|
|
+ const deptId = formData.value.deptId || userStore.getUser.deptId?.toString() || '1'
|
|
|
+ await nextTick()
|
|
|
+ checkerSelectRef.value?.getCheckerList(deptId)
|
|
|
+
|
|
|
+ const teamList = orderDetail.value?.teamList?.flatMap((team: any) => {
|
|
|
+ const teamMembers: any[] = []
|
|
|
+
|
|
|
+ // 处理组长
|
|
|
+ if (team.leaders && team.leaders.length > 0) {
|
|
|
+ team.leaders.forEach((leader: any) => {
|
|
|
+ if (leader) {
|
|
|
+ teamMembers.push({
|
|
|
+ memberId: leader.id,
|
|
|
+ groupTeamId: team.groupTeamId,
|
|
|
+ isLeader: true,
|
|
|
+ member: leader
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理组员
|
|
|
+ if (team.members && team.members.length > 0) {
|
|
|
+ team.members.forEach((member: any) => {
|
|
|
+ if (member) {
|
|
|
+ teamMembers.push({
|
|
|
+ memberId: member.id,
|
|
|
+ groupTeamId: team.groupTeamId,
|
|
|
+ isLeader: false,
|
|
|
+ member: member
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ return teamMembers
|
|
|
+ }) || []
|
|
|
|
|
|
- if (inspectors.length > 0) {
|
|
|
- selectedCheckers.value = inspectors
|
|
|
- formData.value.inspectors = inspectors.map(c => c.id)
|
|
|
+ if (teamList.length > 0) {
|
|
|
+ selectedCheckers.value = teamList
|
|
|
+ formData.value.teamList = teamList
|
|
|
}
|
|
|
+
|
|
|
} catch (error) {
|
|
|
console.error('获取计划详情失败:', error)
|
|
|
ElMessage.error('获取计划详情失败')
|
|
|
@@ -1221,14 +1113,12 @@ const getDetail = async () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/** 打开检验员选择弹窗 */
|
|
|
-const openCheckerSelect = () => {
|
|
|
- checkerSelectVisible.value = true
|
|
|
- // 设置当前选中的检验员
|
|
|
- currentSelectedCheckerIds.value = selectedCheckers.value.map(c => c.groupTeamId + ':' + c.memberId)
|
|
|
- tempSelectedCheckers.value = [...selectedCheckers.value]
|
|
|
+/** 处理检验员变化 */
|
|
|
+const handleCheckerChange = (checkers: CheckerItem[]) => {
|
|
|
+ selectedCheckers.value = checkers
|
|
|
+ // 同步更新 formData.value.teamList
|
|
|
+ formData.value.teamList = checkers
|
|
|
}
|
|
|
-// 设备查询相关
|
|
|
const handleEquipQuery = async () => {
|
|
|
loading.value = true
|
|
|
try {
|
|
|
@@ -1283,24 +1173,7 @@ onMounted(async () => {
|
|
|
await handleEquipQuery()
|
|
|
})
|
|
|
|
|
|
-/** 处理检验员变化 */
|
|
|
-const handleCheckerChange = (checkers) => {
|
|
|
- tempSelectedCheckers.value = checkers
|
|
|
- currentSelectedCheckerIds.value = checkers.map(c => c.groupTeamId + ':' + c.memberId)
|
|
|
-}
|
|
|
|
|
|
-/** 确认检验员选择 */
|
|
|
-const confirmCheckerSelect = () => {
|
|
|
- selectedCheckers.value = [...tempSelectedCheckers.value]
|
|
|
- formData.value.inspectors = selectedCheckers.value.map(c => c.memberId)
|
|
|
- checkerSelectVisible.value = false
|
|
|
-}
|
|
|
-
|
|
|
-/** 移除检验员 */
|
|
|
-const removeChecker = (memberId: string) => {
|
|
|
- selectedCheckers.value = selectedCheckers.value.filter(c => c.memberId !== memberId)
|
|
|
- formData.value.inspectors = selectedCheckers.value.map(c => c.memberId)
|
|
|
-}
|
|
|
|
|
|
/** 禁用日期 */
|
|
|
const disabledDate = (time: Date) => {
|
|
|
@@ -1585,8 +1458,25 @@ const submitAcceptance = async () => {
|
|
|
serviceAmount: formData.value.serviceAmount,
|
|
|
shouldAmount: formData.value.shouldAmount,
|
|
|
reduceFee: formData.value.reduceFee,
|
|
|
- userList: formData.value.inspectors,
|
|
|
useUnitName: formData.value?.useUnitName?.name,
|
|
|
+ teamList: formData.value.teamList.reduce((acc: any[], item: any) => {
|
|
|
+ const existingGroup = acc.find(
|
|
|
+ group => group.groupTeamId === item.groupTeamId
|
|
|
+ );
|
|
|
+ if (existingGroup) {
|
|
|
+ // 避免重复添加相同的 userId,且不添加 leaderId
|
|
|
+ if (!item.isLeader && !existingGroup.userIds.includes(item.memberId)) {
|
|
|
+ existingGroup.userIds.push(item.memberId);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ acc.push({
|
|
|
+ groupTeamId: item.groupTeamId,
|
|
|
+ leaderId: item.isLeader ? item.memberId : '',
|
|
|
+ userIds: item.isLeader ? [] : [item.memberId]
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return acc;
|
|
|
+ }, [])
|
|
|
}
|
|
|
|
|
|
// 调用API提交受理单
|