|
@@ -1,247 +1,272 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <ContentWrap v-loading="formLoading">
|
|
|
|
|
|
|
+ <div class="project-form-page">
|
|
|
|
|
+ <ContentWrap class="page-header">
|
|
|
|
|
+ <div class="page-header__main">
|
|
|
|
|
+ <div class="page-header__icon">
|
|
|
|
|
+ <Icon :icon="formType === 'create' ? 'ep:document-add' : 'ep:edit-pen'" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <h2 class="page-header__title">
|
|
|
|
|
+ {{ formType === 'create' ? '新增项目信息' : '编辑项目信息' }}
|
|
|
|
|
+ </h2>
|
|
|
|
|
+ <p class="page-header__subtitle">维护客户、合同、归属部门及项目配置信息</p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <el-button size="default" @click="close">
|
|
|
|
|
+ <Icon icon="ep:arrow-left" class="mr-5px" />返回
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </ContentWrap>
|
|
|
|
|
+
|
|
|
<el-form
|
|
<el-form
|
|
|
ref="formRef"
|
|
ref="formRef"
|
|
|
|
|
+ v-loading="formLoading"
|
|
|
:model="formData"
|
|
:model="formData"
|
|
|
:rules="formRules"
|
|
:rules="formRules"
|
|
|
- label-width="120px"
|
|
|
|
|
- v-loading="formLoading"
|
|
|
|
|
- >
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="客户名称" prop="manufacturerId">
|
|
|
|
|
- <el-select
|
|
|
|
|
- clearable
|
|
|
|
|
- @clear="zzClear"
|
|
|
|
|
- v-model="formData.manufactureName"
|
|
|
|
|
- :placeholder="t('deviceForm.mfgHolder')"
|
|
|
|
|
- @click="openCustomerZz"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item :label="t('project.payment')" prop="payment">
|
|
|
|
|
- <el-select v-model="formData.payment" placeholder="请选择" clearable>
|
|
|
|
|
- <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>
|
|
|
|
|
-
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="合同名称" prop="contractName">
|
|
|
|
|
- <el-input v-model="formData.contractName" placeholder="请输入合同名称" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="合同编号" prop="contractCode">
|
|
|
|
|
- <el-input v-model="formData.contractCode" placeholder="请输入合同编号" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="开始时间" prop="startTime">
|
|
|
|
|
- <el-date-picker
|
|
|
|
|
- style="width: 150%"
|
|
|
|
|
- v-model="formData.startTime"
|
|
|
|
|
- type="date"
|
|
|
|
|
- value-format="x"
|
|
|
|
|
- placeholder="选择开始时间"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="完成时间" prop="endTime">
|
|
|
|
|
- <el-date-picker
|
|
|
|
|
- style="width: 150%"
|
|
|
|
|
- v-model="formData.endTime"
|
|
|
|
|
- type="date"
|
|
|
|
|
- value-format="x"
|
|
|
|
|
- placeholder="选择完成时间"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
-
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item :label="t('iotDevice.company')" prop="deptId">
|
|
|
|
|
- <el-tree-select
|
|
|
|
|
- :disabled="isDeptDisabled"
|
|
|
|
|
- v-model="formData.deptId"
|
|
|
|
|
- :data="deptList"
|
|
|
|
|
- :props="defaultProps"
|
|
|
|
|
- check-strictly
|
|
|
|
|
- node-key="id"
|
|
|
|
|
- filterable
|
|
|
|
|
- placeholder="请选择所属公司"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="项目部" prop="projectDeptId">
|
|
|
|
|
- <el-select
|
|
|
|
|
- v-model="formData.projectDeptId"
|
|
|
|
|
- :options="deptOptions"
|
|
|
|
|
- filterable
|
|
|
|
|
- placeholder="请选择项目部"
|
|
|
|
|
- clearable
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
-
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="责任人" prop="responsiblePerson">
|
|
|
|
|
|
|
+ label-width="108px"
|
|
|
|
|
+ size="default"
|
|
|
|
|
+ class="project-form">
|
|
|
|
|
+ <ContentWrap class="project-form-card">
|
|
|
|
|
+ <div class="form-card-header">
|
|
|
|
|
+ <span class="form-card-icon form-card-icon--blue">
|
|
|
|
|
+ <Icon icon="ep:document" />
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <h3>合同信息</h3>
|
|
|
|
|
+ <p>客户、合同及项目周期信息</p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-card-body">
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="客户名称" prop="manufacturerId">
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="formData.manufactureName"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ :placeholder="t('deviceForm.mfgHolder')"
|
|
|
|
|
+ @clear="zzClear"
|
|
|
|
|
+ @click="openCustomerZz" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item :label="t('project.payment')" prop="payment">
|
|
|
|
|
+ <el-select v-model="formData.payment" placeholder="请选择" clearable>
|
|
|
|
|
+ <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-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="合同名称" prop="contractName">
|
|
|
|
|
+ <el-input v-model="formData.contractName" placeholder="请输入合同名称" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="合同编号" prop="contractCode">
|
|
|
|
|
+ <el-input v-model="formData.contractCode" placeholder="请输入合同编号" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="开始时间" prop="startTime">
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="formData.startTime"
|
|
|
|
|
+ type="date"
|
|
|
|
|
+ value-format="x"
|
|
|
|
|
+ placeholder="选择开始时间" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="完成时间" prop="endTime">
|
|
|
|
|
+ <el-date-picker
|
|
|
|
|
+ v-model="formData.endTime"
|
|
|
|
|
+ type="date"
|
|
|
|
|
+ value-format="x"
|
|
|
|
|
+ placeholder="选择完成时间" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </ContentWrap>
|
|
|
|
|
+
|
|
|
|
|
+ <ContentWrap class="project-form-card">
|
|
|
|
|
+ <div class="form-card-header">
|
|
|
|
|
+ <span class="form-card-icon form-card-icon--green">
|
|
|
|
|
+ <Icon icon="ep:setting" />
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <h3>项目配置</h3>
|
|
|
|
|
+ <p>归属部门、责任人与项目属性</p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="form-card-body">
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item :label="t('iotDevice.company')" prop="deptId">
|
|
|
|
|
+ <el-tree-select
|
|
|
|
|
+ v-model="formData.deptId"
|
|
|
|
|
+ :disabled="isDeptDisabled"
|
|
|
|
|
+ :data="deptList"
|
|
|
|
|
+ :props="defaultProps"
|
|
|
|
|
+ check-strictly
|
|
|
|
|
+ node-key="id"
|
|
|
|
|
+ filterable
|
|
|
|
|
+ placeholder="请选择所属公司" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="项目部" prop="projectDeptId">
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="formData.projectDeptId"
|
|
|
|
|
+ :options="deptOptions"
|
|
|
|
|
+ :loading="deptLoading"
|
|
|
|
|
+ filterable
|
|
|
|
|
+ placeholder="请选择项目部"
|
|
|
|
|
+ clearable />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="责任人" prop="responsiblePerson">
|
|
|
|
|
+ <div class="responsible-person-control">
|
|
|
|
|
+ <el-tooltip
|
|
|
|
|
+ v-if="selectedUserNames"
|
|
|
|
|
+ effect="dark"
|
|
|
|
|
+ placement="top"
|
|
|
|
|
+ :content="getFullSelectedUserNames()">
|
|
|
|
|
+ <span class="user-names">{{ selectedUserNames }}</span>
|
|
|
|
|
+ </el-tooltip>
|
|
|
|
|
+ <span v-else class="user-names user-names--empty">暂未选择责任人</span>
|
|
|
|
|
+ <el-button
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ plain
|
|
|
|
|
+ size="default"
|
|
|
|
|
+ :disabled="!formData.deptId"
|
|
|
|
|
+ @click="openUserDialog">
|
|
|
|
|
+ <Icon icon="ep:user" class="mr-5px" />选择
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-if="!formData.deptId" class="el-form-item__error">请先选择所属公司</div>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item :label="t('project.overseaFlag')" prop="overseas">
|
|
|
|
|
+ <el-select v-model="formData.overseas" placeholder="请选择" clearable>
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="dict in getIntDictOptions(DICT_TYPE.PMS_PROJECT_OVERSEA_FLAG)"
|
|
|
|
|
+ :key="dict.id"
|
|
|
|
|
+ :label="dict.label"
|
|
|
|
|
+ :value="dict.value" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item :label="t('project.overseaArea')" prop="overseasArea">
|
|
|
|
|
+ <el-select v-model="formData.overseasArea" placeholder="请选择" clearable>
|
|
|
|
|
+ <el-option
|
|
|
|
|
+ v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_AREA)"
|
|
|
|
|
+ :key="dict.id"
|
|
|
|
|
+ :label="dict.label"
|
|
|
|
|
+ :value="dict.value" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item :label="t('project.workArea')" prop="location">
|
|
|
|
|
+ <el-autocomplete
|
|
|
|
|
+ ref="workAreaAutocomplete"
|
|
|
|
|
+ v-model="formData.location"
|
|
|
|
|
+ :fetch-suggestions="querySearch"
|
|
|
|
|
+ :trigger-on-focus="true"
|
|
|
|
|
+ :disabled="!workAreaOptions.length"
|
|
|
|
|
+ placeholder="请输入施工区域"
|
|
|
|
|
+ popper-class="work-area-autocomplete"
|
|
|
|
|
+ @focus="handleWorkAreaFocus"
|
|
|
|
|
+ @select="handleSelect">
|
|
|
|
|
+ <template #prefix>
|
|
|
|
|
+ <el-icon v-if="loadingWorkAreaOptions" class="is-loading">
|
|
|
|
|
+ <Loading />
|
|
|
|
|
+ </el-icon>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-autocomplete>
|
|
|
|
|
+ <div v-if="!workAreaOptions.length" class="el-form-item__error">
|
|
|
|
|
+ 暂无可用施工区域选项,请手动输入
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :xs="24" :md="12">
|
|
|
|
|
+ <el-form-item label="虚拟项目" prop="contractSubject">
|
|
|
|
|
+ <el-switch
|
|
|
|
|
+ v-model="formData.contractSubject"
|
|
|
|
|
+ active-value="Y"
|
|
|
|
|
+ inactive-value="N"
|
|
|
|
|
+ active-text="是"
|
|
|
|
|
+ inactive-text="否" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="24">
|
|
|
|
|
+ <el-form-item label="备注" prop="remark">
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="formData.remark"
|
|
|
|
|
+ placeholder="请输入备注"
|
|
|
|
|
+ type="textarea"
|
|
|
|
|
+ :rows="3" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </ContentWrap>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+
|
|
|
|
|
+ <CustomerList ref="customerZzFormRef" @choose="customerZzChoose" />
|
|
|
|
|
+
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ v-model="userDialogVisible"
|
|
|
|
|
+ width="920px"
|
|
|
|
|
+ :before-close="handleUserDialogClose"
|
|
|
|
|
+ class="user-select-dialog">
|
|
|
|
|
+ <template #header>
|
|
|
|
|
+ <div class="dialog-title">
|
|
|
|
|
+ <div class="dialog-title__icon"><Icon icon="ep:user" /></div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="dialog-title__text">选择责任人</div>
|
|
|
|
|
+ <div class="dialog-title__subtitle">从当前公司人员中选择项目责任人</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <div class="transfer-container">
|
|
|
|
|
+ <el-transfer
|
|
|
|
|
+ v-model="selectedUserIds"
|
|
|
|
|
+ :data="userList"
|
|
|
|
|
+ :titles="['可选人员', '已选人员']"
|
|
|
|
|
+ :props="{ key: 'id', label: 'nickname' }"
|
|
|
|
|
+ filterable
|
|
|
|
|
+ class="transfer-component">
|
|
|
|
|
+ <template #default="{ option }">
|
|
|
<el-tooltip
|
|
<el-tooltip
|
|
|
- v-if="selectedUserNames"
|
|
|
|
|
effect="dark"
|
|
effect="dark"
|
|
|
placement="top"
|
|
placement="top"
|
|
|
- :content="getFullSelectedUserNames()"
|
|
|
|
|
- >
|
|
|
|
|
- <span class="user-names">
|
|
|
|
|
- {{ selectedUserNames }}
|
|
|
|
|
|
|
+ :content="`${option.nickname} - ${option.deptName || '未分配部门'}`">
|
|
|
|
|
+ <span class="transfer-option-text">
|
|
|
|
|
+ {{ option.nickname }} - {{ option.deptName || '未分配部门' }}
|
|
|
</span>
|
|
</span>
|
|
|
</el-tooltip>
|
|
</el-tooltip>
|
|
|
- <el-button
|
|
|
|
|
- type="primary"
|
|
|
|
|
- size="small"
|
|
|
|
|
- @click="openUserDialog"
|
|
|
|
|
- style="margin-left: 10px"
|
|
|
|
|
- :disabled="!formData.deptId"
|
|
|
|
|
- >
|
|
|
|
|
- 选择责任人
|
|
|
|
|
- </el-button>
|
|
|
|
|
- <div v-if="!formData.deptId" class="el-form-item__error">请先选择所属公司</div>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item :label="t('project.overseaFlag')" prop="overseas">
|
|
|
|
|
- <el-select v-model="formData.overseas" placeholder="请选择" clearable>
|
|
|
|
|
- <el-option
|
|
|
|
|
- v-for="dict in getIntDictOptions(DICT_TYPE.PMS_PROJECT_OVERSEA_FLAG)"
|
|
|
|
|
- :key="dict.id"
|
|
|
|
|
- :label="dict.label"
|
|
|
|
|
- :value="dict.value"
|
|
|
|
|
- />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
-
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item :label="t('project.overseaArea')" prop="overseasArea">
|
|
|
|
|
- <el-select v-model="formData.overseasArea" placeholder="请选择" clearable>
|
|
|
|
|
- <el-option
|
|
|
|
|
- v-for="dict in getStrDictOptions(DICT_TYPE.PMS_PROJECT_AREA)"
|
|
|
|
|
- :key="dict.id"
|
|
|
|
|
- :label="dict.label"
|
|
|
|
|
- :value="dict.value"
|
|
|
|
|
- />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item :label="t('project.workArea')" prop="location">
|
|
|
|
|
- <el-autocomplete
|
|
|
|
|
- ref="workAreaAutocomplete"
|
|
|
|
|
- v-model="formData.location"
|
|
|
|
|
- :fetch-suggestions="querySearch"
|
|
|
|
|
- :trigger-on-focus="true"
|
|
|
|
|
- placeholder="请输入施工区域"
|
|
|
|
|
- @focus="handleWorkAreaFocus"
|
|
|
|
|
- @select="handleSelect"
|
|
|
|
|
- :disabled="!workAreaOptions.length"
|
|
|
|
|
- popper-class="work-area-autocomplete"
|
|
|
|
|
- >
|
|
|
|
|
- <template #prefix>
|
|
|
|
|
- <el-icon v-if="loadingWorkAreaOptions" class="is-loading">
|
|
|
|
|
- <Loading />
|
|
|
|
|
- </el-icon>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-autocomplete>
|
|
|
|
|
- <div v-if="!workAreaOptions.length" class="el-form-item__error">
|
|
|
|
|
- 暂无可用施工区域选项,请手动输入
|
|
|
|
|
- </div>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- <el-row>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="虚拟项目" prop="contractSubject">
|
|
|
|
|
- <el-switch
|
|
|
|
|
- v-model="formData.contractSubject"
|
|
|
|
|
- active-value="Y"
|
|
|
|
|
- inactive-value="N"
|
|
|
|
|
- active-text="是"
|
|
|
|
|
- inactive-text="否"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- <el-col :span="12">
|
|
|
|
|
- <el-form-item label="备注" prop="remark">
|
|
|
|
|
- <el-input v-model="formData.remark" placeholder="请输入备注" type="textarea" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-col>
|
|
|
|
|
- </el-row>
|
|
|
|
|
- </el-form>
|
|
|
|
|
- </ContentWrap>
|
|
|
|
|
-
|
|
|
|
|
- <CustomerList ref="customerZzFormRef" @choose="customerZzChoose" />
|
|
|
|
|
-
|
|
|
|
|
- <!-- 责任人选择对话框 -->
|
|
|
|
|
- <el-dialog
|
|
|
|
|
- v-model="userDialogVisible"
|
|
|
|
|
- title="选择责任人"
|
|
|
|
|
- width="1000px"
|
|
|
|
|
- :before-close="handleUserDialogClose"
|
|
|
|
|
- class="user-select-dialog"
|
|
|
|
|
- >
|
|
|
|
|
- <div class="transfer-container">
|
|
|
|
|
- <el-transfer
|
|
|
|
|
- v-model="selectedUserIds"
|
|
|
|
|
- :data="userList"
|
|
|
|
|
- :titles="['可选人员', '已选人员']"
|
|
|
|
|
- :props="{ key: 'id', label: 'nickname' }"
|
|
|
|
|
- filterable
|
|
|
|
|
- class="transfer-component"
|
|
|
|
|
- >
|
|
|
|
|
- <template #default="{ option }">
|
|
|
|
|
- <el-tooltip
|
|
|
|
|
- effect="dark"
|
|
|
|
|
- placement="top"
|
|
|
|
|
- :content="`${option.nickname} - ${option.deptName || '未分配部门'}`"
|
|
|
|
|
- >
|
|
|
|
|
- <span class="transfer-option-text">
|
|
|
|
|
- {{ option.nickname }} - {{ option.deptName || '未分配部门' }}
|
|
|
|
|
- </span>
|
|
|
|
|
- </el-tooltip>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-transfer>
|
|
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-transfer>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <template #footer>
|
|
|
|
|
+ <el-button size="default" @click="handleUserDialogClose">取消</el-button>
|
|
|
|
|
+ <el-button size="default" type="primary" @click="confirmUserSelection">确定</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="form-actions">
|
|
|
|
|
+ <el-button size="default" type="primary" :loading="formLoading" @click="submitForm">
|
|
|
|
|
+ <Icon icon="ep:check" class="mr-5px" />保存
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-button size="default" @click="close">取消</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
- <template #footer>
|
|
|
|
|
- <span class="dialog-footer">
|
|
|
|
|
- <el-button @click="handleUserDialogClose">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="confirmUserSelection">确定</el-button>
|
|
|
|
|
- </span>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-dialog>
|
|
|
|
|
-
|
|
|
|
|
- <ContentWrap>
|
|
|
|
|
- <el-form style="float: right">
|
|
|
|
|
- <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
|
|
|
|
- <el-button @click="close">取 消</el-button>
|
|
|
|
|
- </el-form>
|
|
|
|
|
- </ContentWrap>
|
|
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import { IotProjectInfoApi, IotProjectInfoVO } from '@/api/pms/iotprojectinfo'
|
|
import { IotProjectInfoApi, IotProjectInfoVO } from '@/api/pms/iotprojectinfo'
|
|
@@ -916,59 +941,298 @@ const handleSelect = (item: any) => {
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
|
|
+.project-form-page {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+ min-height: calc(
|
|
|
|
|
+ 100vh - 20px - var(--top-tool-height) - var(--tags-view-height) - var(--app-footer-height)
|
|
|
|
|
+ );
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.page-header {
|
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.page-header :deep(.el-card__body) {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ min-height: 64px;
|
|
|
|
|
+ padding: 12px 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.page-header__main,
|
|
|
|
|
+.dialog-title {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.page-header__icon,
|
|
|
|
|
+.dialog-title__icon {
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ width: 38px;
|
|
|
|
|
+ height: 38px;
|
|
|
|
|
+ margin-right: 12px;
|
|
|
|
|
+ color: var(--el-color-primary);
|
|
|
|
|
+ background: var(--el-color-primary-light-9);
|
|
|
|
|
+ border: 1px solid var(--el-color-primary-light-7);
|
|
|
|
|
+ border-radius: 6px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.page-header__title {
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ line-height: 24px;
|
|
|
|
|
+ letter-spacing: 0;
|
|
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.page-header__subtitle,
|
|
|
|
|
+.dialog-title__subtitle {
|
|
|
|
|
+ margin: 2px 0 0;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ line-height: 18px;
|
|
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.project-form {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.project-form-card {
|
|
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.project-form-card :deep(.el-card__body) {
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+ min-height: 64px;
|
|
|
|
|
+ padding: 14px 18px;
|
|
|
|
|
+ background: linear-gradient(90deg, #f7faff 0%, var(--el-bg-color) 78%);
|
|
|
|
|
+ border-bottom: 1px solid var(--el-border-color-lighter);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-header h3 {
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ font-size: 15px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ line-height: 22px;
|
|
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-header p {
|
|
|
|
|
+ margin: 2px 0 0;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ line-height: 18px;
|
|
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-icon {
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ width: 36px;
|
|
|
|
|
+ height: 36px;
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ border-radius: 9px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-icon--blue {
|
|
|
|
|
+ color: #3478f6;
|
|
|
|
|
+ background: #eaf2ff;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-icon--green {
|
|
|
|
|
+ color: #20a36a;
|
|
|
|
|
+ background: #e7f8f0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-card-body {
|
|
|
|
|
+ padding: 18px 20px 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.project-form :deep(.el-select),
|
|
|
|
|
+.project-form :deep(.el-tree-select),
|
|
|
|
|
+.project-form :deep(.el-date-editor),
|
|
|
|
|
+.project-form :deep(.el-autocomplete) {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.project-form :deep(.el-form-item) {
|
|
|
|
|
+ margin-bottom: 18px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.project-form :deep(.el-form-item__label) {
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.responsible-person-control {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 10px;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.user-names {
|
|
.user-names {
|
|
|
- display: inline-block;
|
|
|
|
|
- max-height: 32px;
|
|
|
|
|
- min-width: 200px;
|
|
|
|
|
- padding: 0 10px;
|
|
|
|
|
- background-color: #f5f7fa;
|
|
|
|
|
- border: 1px solid #dcdfe6;
|
|
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ height: 32px;
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+ padding: 0 11px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ line-height: 30px;
|
|
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+ border: 1px solid var(--el-border-color);
|
|
|
border-radius: 4px;
|
|
border-radius: 4px;
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.user-names--empty {
|
|
|
|
|
+ color: var(--el-text-color-placeholder);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-actions {
|
|
|
|
|
+ position: sticky;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ z-index: 10;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: row-reverse;
|
|
|
|
|
+ gap: 10px;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ min-height: 58px;
|
|
|
|
|
+ padding: 10px 16px;
|
|
|
|
|
+ background: var(--el-bg-color);
|
|
|
|
|
+ border-top: 1px solid var(--el-border-color-lighter);
|
|
|
|
|
+ box-shadow: 0 -4px 12px rgb(0 0 0 / 4%);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.form-actions :deep(.el-button) {
|
|
|
|
|
+ margin-left: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.dialog-title__text {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ line-height: 24px;
|
|
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.user-select-dialog :deep(.el-dialog__header) {
|
|
|
|
|
+ padding: 16px 20px;
|
|
|
|
|
+ margin-right: 0;
|
|
|
|
|
+ border-bottom: 1px solid var(--el-border-color-lighter);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.user-select-dialog :deep(.el-dialog__body) {
|
|
|
|
|
+ padding: 18px 20px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.user-select-dialog :deep(.el-dialog__footer) {
|
|
|
|
|
+ padding: 12px 20px;
|
|
|
|
|
+ border-top: 1px solid var(--el-border-color-lighter);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.transfer-container {
|
|
.transfer-container {
|
|
|
- padding: 0;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
|
|
+ width: 100%;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 3. 直接调整 el-transfer 左右窗口的宽度 */
|
|
|
|
|
:deep(.el-transfer-panel) {
|
|
:deep(.el-transfer-panel) {
|
|
|
- width: 40% !important; /* 强制设置左右面板宽度,确保两侧面板对等 */
|
|
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ width: auto;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.transfer-component {
|
|
.transfer-component {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
- min-width: 600px;
|
|
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.transfer-component :deep(.el-transfer__buttons) {
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
|
+ padding: 0 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
:deep(.el-transfer-panel__item) {
|
|
:deep(.el-transfer-panel__item) {
|
|
|
- display: flex !important;
|
|
|
|
|
- height: 32px !important;
|
|
|
|
|
- padding: 0 8px !important;
|
|
|
|
|
- margin: 0 !important;
|
|
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ height: 32px;
|
|
|
|
|
+ padding: 0 8px;
|
|
|
|
|
+ margin: 0;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
|
- line-height: 32px !important;
|
|
|
|
|
|
|
+ line-height: 32px;
|
|
|
text-overflow: ellipsis;
|
|
text-overflow: ellipsis;
|
|
|
white-space: nowrap;
|
|
white-space: nowrap;
|
|
|
- align-items: center !important;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.transfer-option-text {
|
|
.transfer-option-text {
|
|
|
display: inline-block;
|
|
display: inline-block;
|
|
|
max-width: 100%;
|
|
max-width: 100%;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
:deep(.el-transfer-panel__list) {
|
|
:deep(.el-transfer-panel__list) {
|
|
|
- width: 100% !important; /* 使面板内部内容宽度占满 */
|
|
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+:global(.work-area-autocomplete .el-autocomplete-suggestion__list) {
|
|
|
|
|
+ max-height: 300px;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* 添加全局样式,用于自定义下拉框 */
|
|
|
|
|
-.work-area-autocomplete .el-autocomplete-suggestion__list {
|
|
|
|
|
- max-height: 300px; /* 设置最大高度 */
|
|
|
|
|
- overflow-y: auto; /* 添加垂直滚动条 */
|
|
|
|
|
|
|
+:global(.work-area-autocomplete .el-autocomplete-suggestion__wrap) {
|
|
|
|
|
+ max-height: 300px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.work-area-autocomplete .el-autocomplete-suggestion__wrap {
|
|
|
|
|
- max-height: 300px; /* 设置最大高度 */
|
|
|
|
|
|
|
+@media (width <= 768px) {
|
|
|
|
|
+ .page-header :deep(.el-card__body) {
|
|
|
|
|
+ align-items: flex-start;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .page-header__subtitle {
|
|
|
|
|
+ display: none;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .form-card-body {
|
|
|
|
|
+ padding-right: 12px;
|
|
|
|
|
+ padding-left: 12px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .user-select-dialog :deep(.el-dialog) {
|
|
|
|
|
+ width: calc(100% - 24px) !important;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .transfer-component {
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .transfer-component :deep(.el-transfer-panel) {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .transfer-component :deep(.el-transfer__buttons) {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ padding: 12px 0;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|