|
|
@@ -149,26 +149,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
|
|
|
- @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>
|
|
|
+ <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>
|
|
|
@@ -418,25 +411,6 @@
|
|
|
</el-col>
|
|
|
</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>
|
|
|
-
|
|
|
<!-- 添加设备弹窗 -->
|
|
|
<AddEquipDialog
|
|
|
v-model:visible="addEquipVisible"
|
|
|
@@ -510,10 +484,10 @@
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { ref, onMounted, computed, watch } from 'vue'
|
|
|
+import { ref, onMounted, computed, watch, nextTick } from 'vue'
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
import { BoilerTaskOrderApi } from '@/api/pressure2/boilertaskorder'
|
|
|
-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 '../equipboilerscheduling/components/DeptSelect.vue'
|
|
|
@@ -534,17 +508,18 @@ import { useTagsViewStore } from '@/store/modules/tagsView'
|
|
|
import {getUnitContacts, getUnitNewList} from "@/api/laboratory/unit";
|
|
|
import {numberToChinese} from "@/utils/formatter";
|
|
|
import {Icon} from "@/components/Icon";
|
|
|
-import BatchEditForm from "@/views/pressure/plan/components/batchEditForm.vue";
|
|
|
+import {useUserStoreWithOut} from "@/store/modules/user";
|
|
|
|
|
|
const route = useRoute()
|
|
|
const orderDetail = ref()
|
|
|
const tagsViewStore = useTagsViewStore()
|
|
|
+const userStore = useUserStoreWithOut()
|
|
|
const checkTypeMap = PressureBoilerCheckTypeMap
|
|
|
const useInputUseUnitName = ref(false)
|
|
|
const useInputUnitName = ref(false)
|
|
|
const formData = ref({
|
|
|
checkDate: '',
|
|
|
- inspectors: [] as string[],
|
|
|
+ teamItemList: [] as string[],
|
|
|
unitName: {
|
|
|
name: '',
|
|
|
id: '',
|
|
|
@@ -606,11 +581,11 @@ const boilerTypeOptions = getStrDictOptions(DICT_TYPE.SYSTEM_EQUIP_BOILER_TYPE)
|
|
|
|
|
|
const loading = ref(false)
|
|
|
|
|
|
-// 检验员选择相关
|
|
|
-const checkerSelectVisible = ref(false)
|
|
|
+// 检验员组件引用
|
|
|
+const checkerSelectRef = ref()
|
|
|
+
|
|
|
+// 选中的检验员对象列表
|
|
|
const selectedCheckers = ref<any[]>([])
|
|
|
-const currentSelectedCheckerIds = ref<any[]>([])
|
|
|
-const tempSelectedCheckers = ref<any[]>([])
|
|
|
|
|
|
// 记录每个区域下已选择的街道
|
|
|
const areaStreetMap = ref(new Map<number, number[]>())
|
|
|
@@ -715,7 +690,7 @@ const getDetail = async () => {
|
|
|
formData.value = {
|
|
|
...formData.value,
|
|
|
checkDate: formatArrayDate(orderDetail.value?.checkDate || []),
|
|
|
- inspectors: [],
|
|
|
+ teamItemList: [],
|
|
|
unitName: {
|
|
|
name: orderDetail.value?.unitName || '',
|
|
|
id: ''
|
|
|
@@ -767,7 +742,7 @@ const getDetail = async () => {
|
|
|
|
|
|
|
|
|
// 更新检验员数据
|
|
|
- const inspectors = orderDetail.value?.teamItemList?.flatMap((team: any) => {
|
|
|
+ const teamItemList = orderDetail.value?.teamItemList?.flatMap((team: any) => {
|
|
|
const teamMembers: any[] = []
|
|
|
|
|
|
// 处理组长
|
|
|
@@ -800,10 +775,17 @@ const getDetail = async () => {
|
|
|
|
|
|
return teamMembers
|
|
|
}) || []
|
|
|
- console.log(inspectors)
|
|
|
- if (inspectors.length > 0) {
|
|
|
- selectedCheckers.value = inspectors
|
|
|
- formData.value.inspectors = inspectors.map(c => c.memberId)
|
|
|
+
|
|
|
+ if (teamItemList.length > 0) {
|
|
|
+ selectedCheckers.value = teamItemList
|
|
|
+ formData.value.teamItemList = teamItemList
|
|
|
+ }
|
|
|
+
|
|
|
+ // 加载检验员列表(默认当前登录人的部门)
|
|
|
+ const deptId = userStore.getUser.deptId?.toString()
|
|
|
+ if (deptId) {
|
|
|
+ await nextTick()
|
|
|
+ checkerSelectRef.value?.getCheckerList(deptId)
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('获取任务单详情失败:', error)
|
|
|
@@ -813,14 +795,14 @@ 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) => {
|
|
|
+ console.log('检验员变化:', checkers)
|
|
|
+ // 这里可以根据需要进行额外处理
|
|
|
+ selectedCheckers.value = checkers
|
|
|
+ // 同步更新 formData.value.teamItemList
|
|
|
+ formData.value.teamItemList = checkers
|
|
|
}
|
|
|
-// 设备查询相关
|
|
|
const handleEquipQuery = async () => {
|
|
|
loading.value = true
|
|
|
try {
|
|
|
@@ -864,25 +846,6 @@ 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) => {
|
|
|
// 禁用过去的日期
|
|
|
@@ -1153,36 +1116,6 @@ const submitAcceptance = async (reason: string) => {
|
|
|
try {
|
|
|
loading.value = true
|
|
|
|
|
|
- // Start with a deep copy of the original orderDetail to ensure all fields are present
|
|
|
- //const submitData = JSON.parse(JSON.stringify(orderDetail.value || {}));
|
|
|
-
|
|
|
- // // Define fields that are directly updatable from formData
|
|
|
- // const formEditableFields = [
|
|
|
- // 'checkDate', 'unitContact', 'unitEmail', 'unitPhone',
|
|
|
- // 'zipCode', 'remark', 'email', 'isAttach',
|
|
|
- // 'sendType', 'vehicle', 'payType', 'acceptType',
|
|
|
- // 'payAmount', 'serviceAmount', 'shouldAmount', 'reduceFee',
|
|
|
- // 'useUnitName', 'useUnitSocialCreditCode', 'useUnitAddress',
|
|
|
- // 'useUnitZipcode', 'useUnitContact', 'useUnitPhone',
|
|
|
- // 'socialCreditCode', 'recipient', 'recipientPhone', 'recipientEmail',
|
|
|
- // 'deptPhone', 'checkDate', 'manager', 'acceptor',
|
|
|
- // 'feeNature', 'actualAmount', 'feeDate', 'isPay',
|
|
|
- // 'payerContactName', 'payerContact', 'payerMail'
|
|
|
- // ];
|
|
|
- //
|
|
|
- // // Update submitData with values from formData for editable fields
|
|
|
- // formEditableFields.forEach(field => {
|
|
|
- // if (formData.value.hasOwnProperty(field)) {
|
|
|
- // submitData[field] = formData.value[field];
|
|
|
- // }
|
|
|
- // });
|
|
|
- //
|
|
|
- // submitData.unitName = formData.value.unitName.name;
|
|
|
- // submitData.useUnitName = formData.value.useUnitName.name;
|
|
|
- //
|
|
|
- // // 更新orderItems,从可能修改的equipList
|
|
|
- // submitData.orderItems = equipList.value;
|
|
|
-
|
|
|
// 组装提交数据
|
|
|
const submitData = {
|
|
|
id: orderDetail.value?.id,
|
|
|
@@ -1212,22 +1145,40 @@ const submitAcceptance = async (reason: string) => {
|
|
|
shouldAmount: formData.value.shouldAmount,
|
|
|
reduceFee: formData.value.reduceFee,
|
|
|
deptPhone: formData.value?.deptPhone,
|
|
|
- teamList: selectedCheckers.value.reduce((acc, checker) => {
|
|
|
- const existingTeam = acc.find(team => team.groupTeamId === checker.groupTeamId)
|
|
|
- if (existingTeam) {
|
|
|
- if (checker.isLeader) {
|
|
|
- existingTeam.leaderId = checker.memberId
|
|
|
- } else {
|
|
|
- existingTeam.userIds.push(checker.memberId)
|
|
|
+ // teamList: selectedCheckers.value.reduce((acc, checker) => {
|
|
|
+ // const existingTeam = acc.find(team => team.groupTeamId === checker.groupTeamId)
|
|
|
+ // if (existingTeam) {
|
|
|
+ // if (checker.isLeader) {
|
|
|
+ // existingTeam.leaderId = checker.memberId
|
|
|
+ // } else {
|
|
|
+ // existingTeam.userIds.push(checker.memberId)
|
|
|
+ // }
|
|
|
+ // } else {
|
|
|
+ // acc.push({
|
|
|
+ // groupTeamId: checker.groupTeamId,
|
|
|
+ // leaderId: checker.isLeader ? checker.memberId : '',
|
|
|
+ // userIds: checker.isLeader ? [] : [checker.memberId]
|
|
|
+ // })
|
|
|
+ // }
|
|
|
+ // return acc
|
|
|
+ // }, []),
|
|
|
+ teamItemList: formData.value.teamItemList.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: checker.groupTeamId,
|
|
|
- leaderId: checker.isLeader ? checker.memberId : '',
|
|
|
- userIds: checker.isLeader ? [] : [checker.memberId]
|
|
|
- })
|
|
|
+ groupTeamId: item.groupTeamId,
|
|
|
+ leaderId: item.isLeader ? item.memberId : '',
|
|
|
+ userIds: item.isLeader ? [] : [item.memberId]
|
|
|
+ });
|
|
|
}
|
|
|
- return acc
|
|
|
+ return acc;
|
|
|
}, []),
|
|
|
useUnitName: formData.value?.useUnitName?.name,
|
|
|
orderItems: equipList.value
|