|
@@ -43,8 +43,18 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="结算方式" prop="payment" >
|
|
|
+ <!-- <el-form-item label="结算方式" prop="payment" >
|
|
|
<el-input v-model="formData.payment" placeholder="请输入结算方式" disabled/>
|
|
|
+ </el-form-item> -->
|
|
|
+ <el-form-item :label="t('project.payment')" prop="payment">
|
|
|
+ <el-select v-model="formData.payment" placeholder="请选择" disabled>
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_SETTLEMENT)"
|
|
|
+ :key="dict.id"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
@@ -121,16 +131,42 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
- <el-table-column prop="wellType" label="井型/井别">
|
|
|
+ <!-- 修改井型/井别列 -->
|
|
|
+ <el-table-column prop="wellType" label="井型">
|
|
|
<template #default="{ row }">
|
|
|
- <span v-if="!row.editing">{{ row.wellType }}</span>
|
|
|
+ <span v-if="!row.editing">{{ getWellTypeLabel(row.wellType) }}</span>
|
|
|
<div v-else>
|
|
|
- <el-input v-model="row.editData.wellType" class="edit-input" placeholder="请输入井型/井别" />
|
|
|
+ <el-select v-model="row.editData.wellType" placeholder="请选择井型" clearable>
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_TYPE)"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
<div v-if="row.errors.wellType" class="error-message">{{ row.errors.wellType }}</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
+ <!-- 新增井别列 -->
|
|
|
+ <el-table-column prop="wellCategory" label="井别">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="!row.editing">{{ getWellCategoryLabel(row.wellCategory) }}</span>
|
|
|
+ <div v-else>
|
|
|
+ <el-select v-model="row.editData.wellCategory" placeholder="请选择井别" clearable>
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_CATEGORY)"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ <div v-if="row.errors.wellCategory" class="error-message">{{ row.errors.wellCategory }}</div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
<el-table-column prop="location" label="施工地点" >
|
|
|
<template #default="{ row }">
|
|
|
<span v-if="!row.editing">{{ row.location }}</span>
|
|
@@ -141,11 +177,18 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
|
|
|
- <el-table-column prop="technique" label="施工工艺" >
|
|
|
+ <el-table-column prop="technique" label="施工工艺">
|
|
|
<template #default="{ row }">
|
|
|
- <span v-if="!row.editing">{{ row.technique }}</span>
|
|
|
+ <span v-if="!row.editing">{{ getTechniqueLabel(row.technique) }}</span>
|
|
|
<div v-else>
|
|
|
- <el-input v-model="row.editData.technique" class="edit-input" placeholder="请输入施工工艺" />
|
|
|
+ <el-select v-model="row.editData.technique" placeholder="请选择施工工艺" clearable>
|
|
|
+ <el-option
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_TECHNOLOGY)"
|
|
|
+ :key="dict.value"
|
|
|
+ :label="dict.label"
|
|
|
+ :value="dict.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
<div v-if="row.errors.technique" class="error-message">{{ row.errors.technique }}</div>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -186,6 +229,7 @@
|
|
|
placeholder="请选择施工队伍"
|
|
|
clearable
|
|
|
/>
|
|
|
+ <div v-if="row.errors.deptIds" class="error-message">{{ row.errors.deptIds }}</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
@@ -208,10 +252,7 @@
|
|
|
>
|
|
|
选择设备
|
|
|
</el-button>
|
|
|
- <!--
|
|
|
- <span v-if="row.editData.deviceCodes" style="margin-left: 8px;">
|
|
|
- {{ row.editData.deviceCodes }}
|
|
|
- </span> -->
|
|
|
+ <div v-if="row.errors.deviceIds" class="error-message">{{ row.errors.deviceIds }}</div>
|
|
|
</div>
|
|
|
</el-tooltip>
|
|
|
</template>
|
|
@@ -235,10 +276,7 @@
|
|
|
>
|
|
|
选择责任人
|
|
|
</el-button>
|
|
|
- <!--
|
|
|
- <span v-if="row.editData.responsiblePersonNames" style="margin-left: 8px;">
|
|
|
- {{ row.editData.responsiblePersonNames }}
|
|
|
- </span> -->
|
|
|
+ <div v-if="row.errors.responsiblePerson" class="error-message">{{ row.errors.responsiblePerson }}</div>
|
|
|
</div>
|
|
|
</el-tooltip>
|
|
|
</template>
|
|
@@ -376,6 +414,7 @@ import {companyLevelChildrenDepts} from "@/api/system/dept";
|
|
|
import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
|
|
|
import * as UserApi from "@/api/system/user";
|
|
|
import {UserVO} from "@/api/system/user";
|
|
|
+import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
|
|
|
|
|
|
const { query, params, name } = useRoute() // 查询参数
|
|
|
const id = params.id
|
|
@@ -548,6 +587,7 @@ const tableData = ref([
|
|
|
deptId:'',
|
|
|
wellName: '',
|
|
|
wellType: '',
|
|
|
+ wellCategory: '',
|
|
|
location: '',
|
|
|
technique: '',
|
|
|
workloadDesign: '',
|
|
@@ -712,6 +752,27 @@ const handleDeviceDialogClose = () => {
|
|
|
deviceDialogVisible.value = false;
|
|
|
};
|
|
|
|
|
|
+// 获取井型标签的方法
|
|
|
+const getWellTypeLabel = (value) => {
|
|
|
+ const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_TYPE)
|
|
|
+ const option = options.find(opt => opt.value === value)
|
|
|
+ return option ? option.label : value
|
|
|
+}
|
|
|
+
|
|
|
+// 获取井别标签的方法
|
|
|
+const getWellCategoryLabel = (value) => {
|
|
|
+ const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_WELL_CATEGORY)
|
|
|
+ const option = options.find(opt => opt.value === value)
|
|
|
+ return option ? option.label : value
|
|
|
+}
|
|
|
+
|
|
|
+// 获取施工工艺标签的方法
|
|
|
+const getTechniqueLabel = (value) => {
|
|
|
+ const options = getStrDictOptions(DICT_TYPE.PMS_PROJECT_TECHNOLOGY)
|
|
|
+ const option = options.find(opt => opt.value === value)
|
|
|
+ return option ? option.label : value
|
|
|
+}
|
|
|
+
|
|
|
/** 打开弹窗 */
|
|
|
const open = async () => {
|
|
|
resetForm()
|
|
@@ -821,11 +882,52 @@ const autoSelectContract = async (projectId: string) => {
|
|
|
});
|
|
|
} */
|
|
|
|
|
|
+/** 校验所有行数据 */
|
|
|
+const validateAllRows = (): boolean => {
|
|
|
+ // 新增检查:判断任务列表是否为空
|
|
|
+ if (!tableData.value || tableData.value.length === 0) {
|
|
|
+ ElMessage.error('没有任务数据,无法保存');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ let allValid = true;
|
|
|
+
|
|
|
+ tableData.value.forEach(row => {
|
|
|
+ // 对每一行进行校验
|
|
|
+ const rowValid = validateRow(row);
|
|
|
+ if (!rowValid) {
|
|
|
+ allValid = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果是编辑中的行,需要额外检查编辑数据
|
|
|
+ if (row.editing) {
|
|
|
+ if (!row.editData.wellName || row.editData.wellName.trim() === '') {
|
|
|
+ row.errors.wellName = '井号不能为空';
|
|
|
+ allValid = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!row.editData.wellType || row.editData.wellType.trim() === '') {
|
|
|
+ row.errors.wellType = '井型不能为空';
|
|
|
+ allValid = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return allValid;
|
|
|
+};
|
|
|
+
|
|
|
/** 提交表单 */
|
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
|
const submitForm = async () => {
|
|
|
// 校验表单
|
|
|
await formRef.value.validate()
|
|
|
+
|
|
|
+ // 校验所有行数据
|
|
|
+ if (!validateAllRows()) {
|
|
|
+ // ElMessage.error('请检查表格中的数据,部分必填项未填写或格式不正确');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
// 提交请求
|
|
|
formLoading.value = true
|
|
|
try {
|
|
@@ -944,6 +1046,7 @@ const addNewRow = () => {
|
|
|
editData: {
|
|
|
wellName: '',
|
|
|
wellType: '',
|
|
|
+ wellCategory: '',
|
|
|
location: '',
|
|
|
technique: '',
|
|
|
workloadDesign: '',
|
|
@@ -970,6 +1073,7 @@ const editRow = (row) => {
|
|
|
id: row.id,
|
|
|
wellName: row.wellName,
|
|
|
wellType: row.wellType,
|
|
|
+ wellCategory: row.wellCategory,
|
|
|
location: row.location,
|
|
|
technique: row.technique,
|
|
|
workloadDesign: row.workloadDesign,
|
|
@@ -1001,6 +1105,35 @@ const validateRow = (row) => {
|
|
|
valid = false;
|
|
|
}
|
|
|
|
|
|
+ // 施工地点
|
|
|
+ if (!row.editData.location || row.editData.location.trim() === '') {
|
|
|
+ row.errors.location = '施工地点不能为空';
|
|
|
+ valid = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!row.editData.technique || row.editData.technique.trim() === '') {
|
|
|
+ row.errors.technique = '施工工艺不能为空';
|
|
|
+ valid = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 施工队伍 (deptIds 是数组)
|
|
|
+ if (!row.editData.deptIds || row.editData.deptIds.length === 0) {
|
|
|
+ row.errors.deptIds = '施工队伍不能为空';
|
|
|
+ valid = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 施工设备 (deviceIds 是数组)
|
|
|
+ if (!row.editData.deviceIds || row.editData.deviceIds.length === 0) {
|
|
|
+ row.errors.deviceIds = '施工设备不能为空';
|
|
|
+ valid = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 责任人 (responsiblePerson 是数组)
|
|
|
+ if (!row.editData.responsiblePerson || row.editData.responsiblePerson.length === 0) {
|
|
|
+ row.errors.responsiblePerson = '责任人不能为空';
|
|
|
+ valid = false;
|
|
|
+ }
|
|
|
+
|
|
|
return valid;
|
|
|
};
|
|
|
|
|
@@ -1023,6 +1156,7 @@ const saveRow = (row) => {
|
|
|
row.id = row.editData.id;
|
|
|
row.wellName = row.editData.wellName;
|
|
|
row.wellType = row.editData.wellType;
|
|
|
+ row.wellCategory = row.editData.wellCategory;
|
|
|
row.location = row.editData.location;
|
|
|
row.technique = row.editData.technique;
|
|
|
row.workloadDesign = row.editData.workloadDesign;
|
|
@@ -1096,6 +1230,7 @@ const cancelEdit = (row) => {
|
|
|
row.id = row.originalData.id;
|
|
|
row.wellName = row.originalData.wellName;
|
|
|
row.wellType = row.originalData.wellType;
|
|
|
+ row.wellCategory = row.originalData.wellCategory;
|
|
|
row.location = row.originalData.location;
|
|
|
row.technique = row.originalData.technique;
|
|
|
row.workloadDesign = row.originalData.workloadDesign;
|