|
@@ -1,6 +1,7 @@
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
import {
|
|
import {
|
|
|
WebtopoProjectApi,
|
|
WebtopoProjectApi,
|
|
|
|
|
+ type WebtopoProjectCopyReqVO,
|
|
|
type WebtopoProjectCreateReqVO,
|
|
type WebtopoProjectCreateReqVO,
|
|
|
type WebtopoProjectPageReqVO,
|
|
type WebtopoProjectPageReqVO,
|
|
|
type WebtopoProjectUpdateReqVO,
|
|
type WebtopoProjectUpdateReqVO,
|
|
@@ -32,7 +33,7 @@ const initQuery: WebtopoProjectPageReqVO = {
|
|
|
|
|
|
|
|
const query = ref<WebtopoProjectPageReqVO>({ ...initQuery })
|
|
const query = ref<WebtopoProjectPageReqVO>({ ...initQuery })
|
|
|
|
|
|
|
|
-type FormMode = 'create' | 'config'
|
|
|
|
|
|
|
+type FormMode = 'create' | 'config' | 'copy'
|
|
|
type ProjectForm = Partial<WebtopoProjectUpdateReqVO>
|
|
type ProjectForm = Partial<WebtopoProjectUpdateReqVO>
|
|
|
|
|
|
|
|
interface DeviceOption {
|
|
interface DeviceOption {
|
|
@@ -157,6 +158,21 @@ async function openConfig(row: WebtopoProjectVO) {
|
|
|
formRef.value?.clearValidate()
|
|
formRef.value?.clearValidate()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+async function openCopy(row: WebtopoProjectVO) {
|
|
|
|
|
+ formMode.value = 'copy'
|
|
|
|
|
+ createForm.value = {
|
|
|
|
|
+ id: row.id,
|
|
|
|
|
+ projectName: `${row.projectName || ''}副本`,
|
|
|
|
|
+ linkedDeviceIds: getLinkedDeviceIds(row),
|
|
|
|
|
+ remark: row.remark
|
|
|
|
|
+ }
|
|
|
|
|
+ deviceOptions.value = []
|
|
|
|
|
+ createVisible.value = true
|
|
|
|
|
+ await loadDeviceOptions(deptId)
|
|
|
|
|
+ await nextTick()
|
|
|
|
|
+ formRef.value?.clearValidate()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function handleCreateClose() {
|
|
function handleCreateClose() {
|
|
|
createVisible.value = false
|
|
createVisible.value = false
|
|
|
}
|
|
}
|
|
@@ -204,12 +220,37 @@ async function submitConfig() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+async function submitCopy() {
|
|
|
|
|
+ if (!formRef.value || !createForm.value.id || deviceLoading.value) return
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ createLoading.value = true
|
|
|
|
|
+ await formRef.value.validate()
|
|
|
|
|
+ const data: WebtopoProjectCopyReqVO = {
|
|
|
|
|
+ id: createForm.value.id,
|
|
|
|
|
+ projectName: createForm.value.projectName!,
|
|
|
|
|
+ remark: createForm.value.remark
|
|
|
|
|
+ }
|
|
|
|
|
+ await WebtopoProjectApi.copyWebtopoProject(data)
|
|
|
|
|
+ ElMessage.success('复制成功')
|
|
|
|
|
+ handleCreateClose()
|
|
|
|
|
+ loadList()
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ createLoading.value = false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
function submitForm() {
|
|
function submitForm() {
|
|
|
if (formMode.value === 'config') {
|
|
if (formMode.value === 'config') {
|
|
|
submitConfig()
|
|
submitConfig()
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (formMode.value === 'copy') {
|
|
|
|
|
+ submitCopy()
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
submitCreate()
|
|
submitCreate()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -237,6 +278,24 @@ function handleConfig(row: WebtopoProjectVO) {
|
|
|
openConfig(row)
|
|
openConfig(row)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+function handleCopy(row: WebtopoProjectVO) {
|
|
|
|
|
+ openCopy(row)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function getDialogTitle() {
|
|
|
|
|
+ if (formMode.value === 'config') {
|
|
|
|
|
+ return '配置关联设备'
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (formMode.value === 'copy') {
|
|
|
|
|
+ return '复制组态项目'
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return '新建组态项目'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const isDeviceSelectDisabled = computed(() => deviceLoading.value || formMode.value === 'copy')
|
|
|
|
|
+
|
|
|
watch(
|
|
watch(
|
|
|
[() => query.value.deptId, () => query.value.projectName],
|
|
[() => query.value.deptId, () => query.value.projectName],
|
|
|
() => {
|
|
() => {
|
|
@@ -370,6 +429,9 @@ watch(
|
|
|
<el-button size="small" type="primary" link @click="handlePreview(item)">
|
|
<el-button size="small" type="primary" link @click="handlePreview(item)">
|
|
|
<Icon icon="ep:view" class="mr-4px" /> 预览
|
|
<Icon icon="ep:view" class="mr-4px" /> 预览
|
|
|
</el-button>
|
|
</el-button>
|
|
|
|
|
+ <el-button size="small" type="primary" link @click="handleCopy(item)">
|
|
|
|
|
+ <Icon icon="ep:copy-document" class="mr-4px" /> 复制
|
|
|
|
|
+ </el-button>
|
|
|
<el-button size="small" type="primary" link @click="handleConfig(item)">
|
|
<el-button size="small" type="primary" link @click="handleConfig(item)">
|
|
|
<Icon icon="ep:setting" class="mr-4px" /> 配置
|
|
<Icon icon="ep:setting" class="mr-4px" /> 配置
|
|
|
</el-button>
|
|
</el-button>
|
|
@@ -399,7 +461,7 @@ watch(
|
|
|
|
|
|
|
|
<el-dialog
|
|
<el-dialog
|
|
|
v-model="createVisible"
|
|
v-model="createVisible"
|
|
|
- :title="formMode === 'config' ? '配置关联设备' : '新建组态项目'"
|
|
|
|
|
|
|
+ :title="getDialogTitle()"
|
|
|
width="560px"
|
|
width="560px"
|
|
|
:close-on-click-modal="false"
|
|
:close-on-click-modal="false"
|
|
|
destroy-on-close>
|
|
destroy-on-close>
|
|
@@ -426,7 +488,7 @@ watch(
|
|
|
collapse-tags-tooltip
|
|
collapse-tags-tooltip
|
|
|
:max-collapse-tags="3"
|
|
:max-collapse-tags="3"
|
|
|
:loading="deviceLoading"
|
|
:loading="deviceLoading"
|
|
|
- :disabled="deviceLoading"
|
|
|
|
|
|
|
+ :disabled="isDeviceSelectDisabled"
|
|
|
class="w-full"
|
|
class="w-full"
|
|
|
:placeholder="deviceLoading ? '设备选项加载中...' : '请选择绑定设备'">
|
|
:placeholder="deviceLoading ? '设备选项加载中...' : '请选择绑定设备'">
|
|
|
<el-option
|
|
<el-option
|