添加人员、材料、机械管理上传图片、文件功能
This commit is contained in:
		| @ -2,7 +2,7 @@ | ||||
|   <div class="login"> | ||||
|     <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> | ||||
|       <div class="title-box"> | ||||
|         <h3 class="title">RuoYi-Vue-Plus多租户管理系统</h3> | ||||
|         <h3 class="title">新能源项目管理平台</h3> | ||||
|         <lang-select /> | ||||
|       </div> | ||||
|       <el-form-item v-if="tenantEnabled" prop="tenantId"> | ||||
|  | ||||
| @ -29,7 +29,7 @@ | ||||
|         <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" /> | ||||
|       </el-form-item> | ||||
|       <el-form-item label="图片" prop="picture"> | ||||
|         <el-input v-model="form.picture" placeholder="请输入图片" /> | ||||
|         <image-upload v-model="form.picture" /> | ||||
|       </el-form-item> | ||||
|     </el-form> | ||||
|     <template #footer> | ||||
| @ -80,6 +80,7 @@ const rules = reactive({ | ||||
| }); | ||||
|  | ||||
| const formRef = ref(); | ||||
| const imageValue = ref([]); | ||||
|  | ||||
| const submitForm = () => { | ||||
|   formRef.value.validate(async (valid: boolean) => { | ||||
|  | ||||
| @ -10,9 +10,9 @@ | ||||
|       <el-table-column label="检验单位" align="center" prop="checkoutUnit" /> | ||||
|       <el-table-column label="检定日期/有效期" align="center" prop="checkoutDate" /> | ||||
|       <el-table-column label="入场时间" align="center" prop="entryTime" /> | ||||
|       <el-table-column label="图片" align="center" prop="picture"> | ||||
|       <el-table-column label="图片" align="center" prop="pictureList.url"> | ||||
|         <template #default="scope"> | ||||
|           <el-image :src="scope.row.picture" /> | ||||
|           <el-image :key="picture.id" v-for="picture in scope.row.pictureList" :src="picture.url" /> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="备注" align="center" prop="remark" /> | ||||
| @ -68,7 +68,7 @@ | ||||
|           <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="图片" prop="picture"> | ||||
|           <el-input v-model="form.picture" placeholder="请输入图片" /> | ||||
|           <image-upload v-model="form.picture" /> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|       <template #footer> | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
|             </el-form-item> | ||||
|             <el-form-item label="材料提供商" prop="companyId"> | ||||
|               <el-select v-model="queryParams.companyId" clearable placeholder="请选择材料提供商"> | ||||
|                 <el-option v-for="item in companyOptions" :key="item.id" :label="item.companyName" :value="item.id" /> | ||||
|                 <el-option v-for="item in companyOptions" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|               </el-select> | ||||
|             </el-form-item> | ||||
|             <el-form-item> | ||||
| @ -62,17 +62,7 @@ | ||||
|         <el-table-column label="材料名称" align="center" prop="materialsName" /> | ||||
|         <el-table-column label="公司名称" align="center" prop="companyVo.companyName" /> | ||||
|         <el-table-column label="规格型号" align="center" prop="typeSpecificationName" /> | ||||
|         <!--        <el-table-column label="规格型号文件路径" align="center" prop="typeSpecificationUrl" /> | ||||
|                 <el-table-column label="合格证编号名称" align="center" prop="certificateConformityName" /> | ||||
|                 <el-table-column label="合格证编号文件路径" align="center" prop="certificateConformityUrl" /> | ||||
|                 <el-table-column label="质量说明书编号" align="center" prop="qualityName" /> | ||||
|                 <el-table-column label="质量说明书文件路径" align="center" prop="qualityUrl" /> | ||||
|                 <el-table-column label="检验报告编号" align="center" prop="inspectionReportName" /> | ||||
|                 <el-table-column label="检验报告文件路径" align="center" prop="inspectionReportUrl" /> | ||||
|                 <el-table-column label="复试报告编号" align="center" prop="reexamineReportName" /> | ||||
|                 <el-table-column label="复试报告文件路径" align="center" prop="reexamineReportUrl" />--> | ||||
|         <el-table-column label="使用部位" align="center" prop="usePart" /> | ||||
|         <el-table-column label="备注" align="center" prop="remark" /> | ||||
|         <el-table-column label="计量单位" align="center" prop="weightId" /> | ||||
|         <el-table-column label="预计材料数量" align="center" prop="quantityCount" /> | ||||
|         <el-table-column label="状态" align="center" prop="status"> | ||||
| @ -80,6 +70,7 @@ | ||||
|             <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column label="备注" align="center" prop="remark" /> | ||||
|         <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220"> | ||||
|           <template #default="scope"> | ||||
|             <el-space wrap> | ||||
| @ -97,42 +88,17 @@ | ||||
|     </el-card> | ||||
|     <!-- 添加或修改材料名称对话框 --> | ||||
|     <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> | ||||
|       <el-form ref="materialsFormRef" :model="form" :rules="rules" label-width="160px"> | ||||
|       <el-form ref="materialsFormRef" :model="form" :rules="rules" label-width="120px"> | ||||
|         <el-form-item label="材料名称" prop="materialsName"> | ||||
|           <el-input v-model="form.materialsName" placeholder="请输入材料名称" /> | ||||
|         </el-form-item> | ||||
|         <!-- <el-form-item label="公司id" prop="companyId"> | ||||
|           <el-input v-model="form.companyId" placeholder="请输入公司id" /> | ||||
|         </el-form-item> --> | ||||
|         <el-form-item label="规格型号名称" prop="typeSpecificationName"> | ||||
|           <el-input v-model="form.typeSpecificationName" placeholder="请输入规格型号名称" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="规格型号文件路径" prop="typeSpecificationUrl"> | ||||
|           <el-input v-model="form.typeSpecificationUrl" placeholder="请输入规格型号文件路径" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="合格证编号名称" prop="certificateConformityName"> | ||||
|           <el-input v-model="form.certificateConformityName" placeholder="请输入合格证编号名称" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="合格证编号文件路径" prop="certificateConformityUrl"> | ||||
|           <el-input v-model="form.certificateConformityUrl" placeholder="请输入合格证编号文件路径" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="质量说明书编号" prop="qualityName"> | ||||
|           <el-input v-model="form.qualityName" placeholder="请输入质量说明书编号" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="质量说明书文件路径" prop="qualityUrl"> | ||||
|           <el-input v-model="form.qualityUrl" placeholder="请输入质量说明书文件路径" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="检验报告编号" prop="inspectionReportName"> | ||||
|           <el-input v-model="form.inspectionReportName" placeholder="请输入检验报告编号" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="检验报告文件路径" prop="inspectionReportUrl"> | ||||
|           <el-input v-model="form.inspectionReportUrl" placeholder="请输入检验报告文件路径" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="复试报告编号" prop="reexamineReportName"> | ||||
|           <el-input v-model="form.reexamineReportName" placeholder="请输入复试报告编号" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="复试报告文件路径" prop="reexamineReportUrl"> | ||||
|           <el-input v-model="form.reexamineReportUrl" placeholder="请输入复试报告文件路径" /> | ||||
|         <el-form-item label="材料供应商" prop="companyId"> | ||||
|           <el-select v-model="form.companyId" clearable placeholder="请选择材料提供商"> | ||||
|             <el-option v-for="item in companyOptions" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="使用部位" prop="usePart"> | ||||
|           <el-input v-model="form.usePart" placeholder="请输入使用部位" /> | ||||
| @ -146,6 +112,22 @@ | ||||
|         <el-form-item label="备注" prop="remark"> | ||||
|           <el-input v-model="form.remark" placeholder="请输入备注" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="材料文件" prop="fileOssIdMap"> | ||||
|           <div :key="item.value" v-for="item in materials_file_type"> | ||||
|             <h3>{{ item.label }}</h3> | ||||
|             <file-upload | ||||
|               v-model="ossIdMap[item.value]" | ||||
|               :limit="1" | ||||
|               :file-size="50" | ||||
|               :file-type="['pdf']" | ||||
|               @update:model-value=" | ||||
|                 (args) => { | ||||
|                   handleOssUpdate(args, item.value); | ||||
|                 } | ||||
|               " | ||||
|             /> | ||||
|           </div> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|       <template #footer> | ||||
|         <div class="dialog-footer"> | ||||
| @ -164,9 +146,11 @@ import { MaterialsForm, MaterialsQuery, MaterialsVO } from '@/api/materials/mate | ||||
| import { useUserStoreHook } from '@/store/modules/user'; | ||||
| import MaterialsInventoryTable from '@/views/materials/materials/component/MaterialsInventoryTable.vue'; | ||||
| import MaterialsInventoryAddDialog from '@/views/materials/materials/component/MaterialsInventoryAddDialog.vue'; | ||||
| import { listCompany } from '@/api/materials/company'; | ||||
| import { CompanyVO } from '@/api/materials/company/types'; | ||||
|  | ||||
| const { proxy } = getCurrentInstance() as ComponentInternalInstance; | ||||
| const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); | ||||
| const { sys_normal_disable, materials_file_type } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'materials_file_type')); | ||||
| // 获取用户 store | ||||
| const userStore = useUserStoreHook(); | ||||
| // 从 store 中获取项目列表和当前选中的项目 | ||||
| @ -194,15 +178,7 @@ const initFormData: MaterialsForm = { | ||||
|   companyId: undefined, | ||||
|   projectId: currentProject.value.id, | ||||
|   typeSpecificationName: undefined, | ||||
|   typeSpecificationUrl: undefined, | ||||
|   certificateConformityName: undefined, | ||||
|   certificateConformityUrl: undefined, | ||||
|   qualityName: undefined, | ||||
|   qualityUrl: undefined, | ||||
|   inspectionReportName: undefined, | ||||
|   inspectionReportUrl: undefined, | ||||
|   reexamineReportName: undefined, | ||||
|   reexamineReportUrl: undefined, | ||||
|   fileOssIdMap: undefined, | ||||
|   usePart: undefined, | ||||
|   weightId: undefined, | ||||
|   remark: undefined, | ||||
| @ -220,15 +196,7 @@ const data = reactive<PageData<MaterialsForm, MaterialsQuery>>({ | ||||
|     companyId: undefined, | ||||
|     projectId: currentProject.value.id, | ||||
|     typeSpecificationName: undefined, | ||||
|     typeSpecificationUrl: undefined, | ||||
|     certificateConformityName: undefined, | ||||
|     certificateConformityUrl: undefined, | ||||
|     qualityName: undefined, | ||||
|     qualityUrl: undefined, | ||||
|     inspectionReportName: undefined, | ||||
|     inspectionReportUrl: undefined, | ||||
|     reexamineReportName: undefined, | ||||
|     reexamineReportUrl: undefined, | ||||
|     fileOssIdMap: undefined, | ||||
|     usePart: undefined, | ||||
|     weightId: undefined, | ||||
|     quantityCount: undefined, | ||||
| @ -249,14 +217,23 @@ const getList = async () => { | ||||
|   const res = await listMaterials(queryParams.value); | ||||
|   materialsList.value = res.data.records; | ||||
|   total.value = res.data.total; | ||||
|   const companyMap = new Map(); | ||||
|   res.data.records.forEach((record: MaterialsVO) => { | ||||
|     const { id, companyName } = record.companyVo; | ||||
|     if (!companyMap.has(id)) { | ||||
|       companyMap.set(id, { id, companyName }); | ||||
|     } | ||||
|   loading.value = false; | ||||
| }; | ||||
|  | ||||
| /** 获取当前项目下的公司列表 */ | ||||
| const getCompanyList = async () => { | ||||
|   loading.value = true; | ||||
|   const companyRes = await listCompany({ | ||||
|     current: 1, | ||||
|     pageSize: 1000, | ||||
|     sortField: 'createTime', | ||||
|     sortOrder: 'descend', | ||||
|     projectId: currentProject.value.id | ||||
|   }); | ||||
|   companyOptions.value = Array.from(companyMap.values()); | ||||
|   companyOptions.value = companyRes.data.records.map((company: CompanyVO) => ({ | ||||
|     value: company.id, | ||||
|     label: company.companyName | ||||
|   })); | ||||
|   loading.value = false; | ||||
| }; | ||||
|  | ||||
| @ -319,6 +296,7 @@ const handleUpdate = async (row?: MaterialsVO) => { | ||||
|   const _id = row?.id || ids.value[0]; | ||||
|   const res = await getMaterials(_id); | ||||
|   Object.assign(form.value, res.data); | ||||
|   ossIdMap.value = res.data.fileOssMap ?? { '0': '' }; | ||||
|   dialog.visible = true; | ||||
|   dialog.title = '修改材料名称'; | ||||
| }; | ||||
| @ -329,9 +307,15 @@ const submitForm = () => { | ||||
|     if (valid) { | ||||
|       buttonLoading.value = true; | ||||
|       if (form.value.id) { | ||||
|         await updateMaterials(form.value).finally(() => (buttonLoading.value = false)); | ||||
|         await updateMaterials({ | ||||
|           ...form.value, | ||||
|           fileOssIdMap: ossIdMap.value | ||||
|         }).finally(() => (buttonLoading.value = false)); | ||||
|       } else { | ||||
|         await addMaterials(form.value).finally(() => (buttonLoading.value = false)); | ||||
|         await addMaterials({ | ||||
|           ...form.value, | ||||
|           fileOssIdMap: ossIdMap.value | ||||
|         }).finally(() => (buttonLoading.value = false)); | ||||
|       } | ||||
|       proxy?.$modal.msgSuccess('操作成功'); | ||||
|       dialog.visible = false; | ||||
| @ -367,7 +351,19 @@ const handleAddMaterialsInventory = (row?: MaterialsVO) => { | ||||
|   dialogRef.value.openDialog(); | ||||
| }; | ||||
|  | ||||
| /** 文件更新操作 */ | ||||
| const ossIdMap = ref<Record<string, string>>({}); | ||||
| const handleOssUpdate = (ossId: string, value: string) => { | ||||
|   // 判断 ossId 是否为空 | ||||
|   if (ossId === '' || ossId === null || ossId === undefined) { | ||||
|     delete ossIdMap.value[value]; // 删除 key | ||||
|   } else { | ||||
|     ossIdMap.value[value] = ossId; // 直接赋值 | ||||
|   } | ||||
| }; | ||||
|  | ||||
| onMounted(() => { | ||||
|   getList(); | ||||
|   getCompanyList(); | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| @ -113,14 +113,8 @@ | ||||
|     <!-- 添加或修改施工人员对话框 --> | ||||
|     <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> | ||||
|       <el-form ref="constructionUserFormRef" :model="form" :rules="rules" label-width="100px"> | ||||
|         <el-form-item label="微信id" prop="openid"> | ||||
|           <el-input v-model="form.openid" placeholder="请输入微信id" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="微信名称" prop="nickName"> | ||||
|           <el-input v-model="form.nickName" placeholder="请输入微信名称" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="人脸照" prop="pacePhoto"> | ||||
|           <el-input v-model="form.pacePhoto" type="textarea" placeholder="请输入内容" /> | ||||
|           <image-upload v-model="form.facePic" :limit="1" :is-show-tip="false" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="人员姓名" prop="userName"> | ||||
|           <el-input v-model="form.userName" placeholder="请输入人员姓名" /> | ||||
| @ -136,6 +130,12 @@ | ||||
|         <el-form-item label="民族" prop="nation"> | ||||
|           <el-input v-model="form.nation" placeholder="请输入民族" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="身份证正面图片" prop="sfzFrontPic"> | ||||
|           <image-upload v-model="form.sfzFrontPic" :limit="1" :is-show-tip="false" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="身份证背面图片" prop="sfzBackPic"> | ||||
|           <image-upload v-model="form.sfzBackPic" :limit="1" :is-show-tip="false" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="身份证号码" prop="sfzNumber"> | ||||
|           <el-input v-model="form.sfzNumber" placeholder="请输入身份证号码" /> | ||||
|         </el-form-item> | ||||
| @ -154,6 +154,9 @@ | ||||
|         <el-form-item label="籍贯" prop="nativePlace"> | ||||
|           <el-input v-model="form.nativePlace" placeholder="请输入籍贯" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="银行图片" prop="yhkPic"> | ||||
|           <image-upload v-model="form.yhkPic" :limit="1" :is-show-tip="false" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="银行卡号" prop="yhkNumber"> | ||||
|           <el-input v-model="form.yhkNumber" placeholder="请输入银行卡号" /> | ||||
|         </el-form-item> | ||||
| @ -168,6 +171,9 @@ | ||||
|             <el-option v-for="item in type_of_work" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="特种作业证图片" prop="specialWorkPic"> | ||||
|           <image-upload v-model="form.specialWorkPic" :limit="1" :is-show-tip="false" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="打卡" prop="clock"> | ||||
|           <el-select v-model="form.clock" clearable placeholder="请选择打卡状态"> | ||||
|             <el-option v-for="item in user_clock_type" :key="item.value" :label="item.label" :value="item.value" /> | ||||
| @ -230,7 +236,7 @@ const initFormData: ConstructionUserForm = { | ||||
|   id: undefined, | ||||
|   openid: undefined, | ||||
|   nickName: undefined, | ||||
|   pacePhoto: undefined, | ||||
|   facePic: undefined, | ||||
|   userName: undefined, | ||||
|   projectId: currentProject.value.id, | ||||
|   contractorId: undefined, | ||||
| @ -240,16 +246,20 @@ const initFormData: ConstructionUserForm = { | ||||
|   phone: undefined, | ||||
|   sex: undefined, | ||||
|   nation: undefined, | ||||
|   sfzFrontPic: undefined, | ||||
|   sfzBackPic: undefined, | ||||
|   sfzNumber: undefined, | ||||
|   sfzStart: undefined, | ||||
|   sfzEnd: undefined, | ||||
|   sfzSite: undefined, | ||||
|   sfzBirth: undefined, | ||||
|   nativePlace: undefined, | ||||
|   yhkPic: undefined, | ||||
|   yhkNumber: undefined, | ||||
|   yhkOpeningBank: undefined, | ||||
|   yhkCardholder: undefined, | ||||
|   typeOfWork: undefined, | ||||
|   specialWorkPic: undefined, | ||||
|   clock: undefined, | ||||
|   entryDate: undefined, | ||||
|   leaveDate: undefined, | ||||
| @ -265,7 +275,6 @@ const data = reactive<PageData<ConstructionUserForm, ConstructionUserQuery>>({ | ||||
|     sortOrder: 'descend', | ||||
|     openid: undefined, | ||||
|     nickName: undefined, | ||||
|     pacePhoto: undefined, | ||||
|     userName: undefined, | ||||
|     projectId: currentProject.value.id, | ||||
|     contractorId: undefined, | ||||
|  | ||||
| @ -0,0 +1,92 @@ | ||||
| <template> | ||||
|   <el-button type="primary" @click="handleUpdateFile">保存文件</el-button> | ||||
|   <el-row :gutter="20"> | ||||
|     <el-col :span="8"> | ||||
|       <el-menu :default-active="activeMenu" @select="handleMenuClick"> | ||||
|         <el-menu-item :key="item.value" v-for="item in contractor_file_type" :index="item.value"> | ||||
|           <el-space> | ||||
|             <p>{{ item.label }}</p> | ||||
|             <el-tag type="success" v-if="ossIdMap[item.value]">已上传</el-tag> | ||||
|             <el-tag type="warning" v-else>未上传</el-tag> | ||||
|           </el-space> | ||||
|         </el-menu-item> | ||||
|       </el-menu> | ||||
|     </el-col> | ||||
|     <el-col :span="16"> | ||||
|       <file-upload | ||||
|         v-model="ossIdMap[activeMenu]" | ||||
|         :limit="1" | ||||
|         :file-size="50" | ||||
|         :file-type="['pdf']" | ||||
|         @update:model-value=" | ||||
|           (args) => { | ||||
|             handleOssUpdate(args); | ||||
|           } | ||||
|         " | ||||
|       /> | ||||
|     </el-col> | ||||
|   </el-row> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts"> | ||||
| import { ref } from 'vue'; | ||||
| import { getContractor, updateContractor } from '@/api/project/contractor'; | ||||
|  | ||||
| const { proxy } = getCurrentInstance() as ComponentInternalInstance; | ||||
| const { contractor_file_type } = toRefs<any>(proxy?.useDict('contractor_file_type')); | ||||
|  | ||||
| interface Props { | ||||
|   contractorId?: string | number; | ||||
| } | ||||
|  | ||||
| const props = defineProps<Props>(); | ||||
| const loading = ref<boolean>(false); | ||||
|  | ||||
| // 当前选中的菜单项 | ||||
| const activeMenu = ref('0'); // 默认选中第一个 | ||||
| const ossIdMap = ref<Record<string, string>>({}); | ||||
| // 处理菜单点击事件 | ||||
| const handleMenuClick = (index: string) => { | ||||
|   activeMenu.value = index; | ||||
| }; | ||||
| // 获取公司详情 | ||||
| const getComponentVO = async () => { | ||||
|   loading.value = true; | ||||
|   const res = await getContractor(props.contractorId); | ||||
|   ossIdMap.value = res.data.fileMap ?? { '0': '' }; | ||||
|   loading.value = false; | ||||
| }; | ||||
|  | ||||
| const handleOssUpdate = (ossId: string) => { | ||||
|   // 判断 ossId 是否为空 | ||||
|   if (ossId === '' || ossId === null || ossId === undefined) { | ||||
|     delete ossIdMap.value[activeMenu.value]; // 删除 key | ||||
|   } else { | ||||
|     ossIdMap.value[activeMenu.value] = ossId; // 直接赋值 | ||||
|   } | ||||
|   console.log(ossIdMap.value); | ||||
| }; | ||||
|  | ||||
| const handleUpdateFile = async () => { | ||||
|   loading.value = true; | ||||
|   await updateContractor({ | ||||
|     id: props.contractorId, | ||||
|     fileMap: ossIdMap.value | ||||
|   }); | ||||
|   proxy?.$modal.msgSuccess('保存成功'); | ||||
|   loading.value = false; | ||||
| }; | ||||
|  | ||||
| watch( | ||||
|   () => props.contractorId, | ||||
|   (newId, oldId) => { | ||||
|     if (newId !== oldId) { | ||||
|       getComponentVO(); | ||||
|     } | ||||
|   } | ||||
| ); | ||||
|  | ||||
| onMounted(() => { | ||||
|   getComponentVO(); | ||||
| }); | ||||
| </script> | ||||
| @ -7,18 +7,6 @@ | ||||
|             <el-form-item label="公司名称" prop="name"> | ||||
|               <el-input v-model="queryParams.name" placeholder="请输入公司名称" clearable @keyup.enter="handleQuery" /> | ||||
|             </el-form-item> | ||||
|             <!--<el-form-item label="负责人" prop="principal"> | ||||
|               <el-input v-model="queryParams.principal" placeholder="请输入负责人" clearable @keyup.enter="handleQuery" /> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="负责人联系电话" prop="principalPhone"> | ||||
|               <el-input v-model="queryParams.principalPhone" placeholder="请输入负责人联系电话" clearable @keyup.enter="handleQuery" /> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="管理人" prop="custodian"> | ||||
|               <el-input v-model="queryParams.custodian" placeholder="请输入管理人" clearable @keyup.enter="handleQuery" /> | ||||
|             </el-form-item> | ||||
|             <el-form-item label="管理人联系电话" prop="custodianPhone"> | ||||
|               <el-input v-model="queryParams.custodianPhone" placeholder="请输入管理人联系电话" clearable @keyup.enter="handleQuery" /> | ||||
|             </el-form-item>--> | ||||
|             <el-form-item> | ||||
|               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> | ||||
|               <el-button icon="Refresh" @click="resetQuery">重置</el-button> | ||||
| @ -63,6 +51,7 @@ | ||||
|         <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | ||||
|           <template #default="scope"> | ||||
|             <el-space wrap> | ||||
|               <el-button link type="primary" icon="Plus" @click="handleContractorFile(scope.row)">文件</el-button> | ||||
|               <el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['project:contractor:edit']">修改 </el-button> | ||||
|               <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['project:contractor:remove']"> | ||||
|                 删除 | ||||
| @ -103,12 +92,16 @@ | ||||
|         </div> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|     <el-dialog title="上传文件" v-model="visible" width="800px"> | ||||
|       <contractor-file-dialog :contractor-id="currentContractorId" /> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup name="Contractor" lang="ts"> | ||||
| import { addContractor, delContractor, getContractor, listContractor, updateContractor } from '@/api/project/contractor'; | ||||
| import { ContractorForm, ContractorQuery, ContractorVO } from '@/api/project/contractor/types'; | ||||
| import ContractorFileDialog from '@/views/project/contractor/component/ContractorFileDialog.vue'; | ||||
|  | ||||
| const { proxy } = getCurrentInstance() as ComponentInternalInstance; | ||||
|  | ||||
| @ -136,6 +129,7 @@ const initFormData: ContractorForm = { | ||||
|   principalPhone: undefined, | ||||
|   custodian: undefined, | ||||
|   custodianPhone: undefined, | ||||
|   fileMap: undefined, | ||||
|   remark: undefined | ||||
| }; | ||||
| const data = reactive<PageData<ContractorForm, ContractorQuery>>({ | ||||
| @ -253,6 +247,15 @@ const handleExport = () => { | ||||
|   ); | ||||
| }; | ||||
|  | ||||
| /** 文件操作 **/ | ||||
| const visible = ref(); | ||||
| const currentContractorId = ref<number | string>(0); | ||||
| const handleContractorFile = (row?: ContractorVO) => { | ||||
|   currentContractorId.value = row.id ?? 0; | ||||
|   console.log(currentContractorId.value); | ||||
|   visible.value = true; | ||||
| }; | ||||
|  | ||||
| onMounted(() => { | ||||
|   getList(); | ||||
| }); | ||||
|  | ||||
| @ -68,11 +68,7 @@ | ||||
|         <el-table-column label="打卡范围" align="center" prop="punchRange" /> | ||||
|         <el-table-column label="设计总量" align="center" prop="designTotal" /> | ||||
|         <el-table-column label="备注" align="center" prop="remark" /> | ||||
|         <!-- <el-table-column label="安全协议书" align="center" prop="securityAgreement" /> --> | ||||
|         <!-- <el-table-column label="排序字段" align="center" prop="sort" />/ --> | ||||
|         <!-- <el-table-column label="显示隐藏" align="center" prop="showHidden" /> --> | ||||
|         <!-- <el-table-column label="是否删除" align="center" prop="isDelete" /> --> | ||||
|         <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | ||||
|         <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="260"> | ||||
|           <template #default="scope"> | ||||
|             <el-space wrap> | ||||
|               <el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['project:project:edit']">修改 </el-button> | ||||
| @ -93,9 +89,6 @@ | ||||
|         <el-form-item label="项目简称" prop="shortName"> | ||||
|           <el-input v-model="form.shortName" placeholder="请输入项目简称" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="备注" prop="remark"> | ||||
|           <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="项目地址" prop="projectSite"> | ||||
|           <el-input v-model="form.projectSite" placeholder="请输入项目地址" /> | ||||
|         </el-form-item> | ||||
| @ -120,18 +113,12 @@ | ||||
|         <el-form-item label="设计总量" prop="designTotal"> | ||||
|           <el-input v-model="form.designTotal" placeholder="请输入设计总量" /> | ||||
|         </el-form-item> | ||||
|         <!-- <el-form-item label="安全协议书" prop="securityAgreement"> | ||||
|           <el-input v-model="form.securityAgreement" placeholder="请输入安全协议书" /> | ||||
|         <el-form-item label="安全协议书" prop="securityAgreement"> | ||||
|           <file-upload v-model="form.securityAgreement" :limit="1" :file-type="['pdf']" :file-size="50" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="排序字段" prop="sort"> | ||||
|           <el-input v-model="form.sort" placeholder="请输入排序字段" /> | ||||
|         <el-form-item label="备注" prop="remark"> | ||||
|           <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="显示隐藏" prop="showHidden"> | ||||
|           <el-input v-model="form.showHidden" placeholder="请输入显示隐藏" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="是否删除" prop="isDelete"> | ||||
|           <el-input v-model="form.isDelete" placeholder="请输入是否删除" /> | ||||
|         </el-form-item> --> | ||||
|       </el-form> | ||||
|       <template #footer> | ||||
|         <div class="dialog-footer"> | ||||
|  | ||||
| @ -1,91 +1,85 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <el-dialog title="项目班组的成员" v-model="visible" @close="closeModal"> | ||||
|       <template #header> | ||||
|         {{ props.projectTeamVo.teamName }} | ||||
|       </template> | ||||
|       <el-form ref="queryFormRef" :model="queryParams" :inline="true"> | ||||
|         <el-form-item label="施工人员" prop="memberName"> | ||||
|           <el-input v-model="queryParams.memberName" placeholder="请输入施工人员" clearable @keyup.enter="handleQuery" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="岗位" prop="postId"> | ||||
|           <el-select v-model="queryParams.postId" clearable placeholder="请选择岗位"> | ||||
|             <el-option v-for="item in user_post_type" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|         <el-form-item> | ||||
|           <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> | ||||
|           <el-button icon="Refresh" @click="resetQuery">重置</el-button> | ||||
|         </el-form-item> | ||||
|       </el-form> | ||||
|       <el-row :gutter="10" class="mb8"> | ||||
|         <el-col :span="1.5"> | ||||
|           <el-button size="small" type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['project:projectTeamMember:add']"> | ||||
|             新增 | ||||
|           </el-button> | ||||
|         </el-col> | ||||
|         <el-col :span="1.5"> | ||||
|           <el-button | ||||
|             size="small" | ||||
|             type="success" | ||||
|             plain | ||||
|             icon="Edit" | ||||
|             :disabled="single" | ||||
|             @click="handleUpdate()" | ||||
|             v-hasPermi="['project:projectTeamMember:edit']" | ||||
|           > | ||||
|             修改 | ||||
|           </el-button> | ||||
|         </el-col> | ||||
|         <el-col :span="1.5"> | ||||
|           <el-button | ||||
|             size="small" | ||||
|             type="danger" | ||||
|             plain | ||||
|             icon="Delete" | ||||
|             :disabled="multiple" | ||||
|             @click="handleDelete()" | ||||
|             v-hasPermi="['project:projectTeamMember:remove']" | ||||
|           > | ||||
|             删除 | ||||
|           </el-button> | ||||
|         </el-col> | ||||
|         <el-col :span="1.5"> | ||||
|           <el-button size="small" type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['project:projectTeamMember:export']"> | ||||
|             导出 | ||||
|           </el-button> | ||||
|         </el-col> | ||||
|       </el-row> | ||||
|       <el-table v-loading="loading" :data="projectTeamMemberList" @selection-change="handleSelectionChange"> | ||||
|         <el-table-column type="selection" width="55" align="center" /> | ||||
|         <el-table-column label="序号" type="index" width="60" align="center" /> | ||||
|         <el-table-column label="施工人员" align="center" prop="memberName" /> | ||||
|         <el-table-column label="岗位" align="center" prop="postId"> | ||||
|           <template #default="scope"> | ||||
|             <dict-tag :options="user_post_type" :value="scope.row.postId" /> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|         <el-table-column label="备注" align="center" prop="remark" /> | ||||
|         <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | ||||
|           <template #default="scope"> | ||||
|             <el-space wrap> | ||||
|               <el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['project:projectTeamMember:edit']"> | ||||
|                 修改 | ||||
|               </el-button> | ||||
|               <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['project:projectTeamMember:remove']"> | ||||
|                 删除 | ||||
|               </el-button> | ||||
|             </el-space> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
|       </el-table> | ||||
|       <pagination v-show="total > 0" :total="total" v-model:page="queryParams.current" v-model:limit="queryParams.pageSize" @pagination="getList" /> | ||||
|     </el-dialog> | ||||
|     <el-form ref="queryFormRef" :model="queryParams" :inline="true"> | ||||
|       <el-form-item label="施工人员" prop="memberName"> | ||||
|         <el-input v-model="queryParams.memberName" placeholder="请输入施工人员" clearable @keyup.enter="handleQuery" /> | ||||
|       </el-form-item> | ||||
|       <el-form-item label="岗位" prop="postId"> | ||||
|         <el-select v-model="queryParams.postId" clearable placeholder="请选择岗位"> | ||||
|           <el-option v-for="item in user_post_type" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|         </el-select> | ||||
|       </el-form-item> | ||||
|       <el-form-item> | ||||
|         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> | ||||
|         <el-button icon="Refresh" @click="resetQuery">重置</el-button> | ||||
|       </el-form-item> | ||||
|     </el-form> | ||||
|     <el-row :gutter="10" class="mb8"> | ||||
|       <el-col :span="1.5"> | ||||
|         <el-button size="small" type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['project:projectTeamMember:add']"> 新增 </el-button> | ||||
|       </el-col> | ||||
|       <el-col :span="1.5"> | ||||
|         <el-button | ||||
|           size="small" | ||||
|           type="success" | ||||
|           plain | ||||
|           icon="Edit" | ||||
|           :disabled="single" | ||||
|           @click="handleUpdate()" | ||||
|           v-hasPermi="['project:projectTeamMember:edit']" | ||||
|         > | ||||
|           修改 | ||||
|         </el-button> | ||||
|       </el-col> | ||||
|       <el-col :span="1.5"> | ||||
|         <el-button | ||||
|           size="small" | ||||
|           type="danger" | ||||
|           plain | ||||
|           icon="Delete" | ||||
|           :disabled="multiple" | ||||
|           @click="handleDelete()" | ||||
|           v-hasPermi="['project:projectTeamMember:remove']" | ||||
|         > | ||||
|           删除 | ||||
|         </el-button> | ||||
|       </el-col> | ||||
|       <el-col :span="1.5"> | ||||
|         <el-button size="small" type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['project:projectTeamMember:export']"> | ||||
|           导出 | ||||
|         </el-button> | ||||
|       </el-col> | ||||
|     </el-row> | ||||
|     <el-table v-loading="loading" :data="projectTeamMemberList" @selection-change="handleSelectionChange"> | ||||
|       <el-table-column type="selection" width="55" align="center" /> | ||||
|       <el-table-column label="序号" type="index" width="60" align="center" /> | ||||
|       <el-table-column label="施工人员" align="center" prop="memberName" /> | ||||
|       <el-table-column label="岗位" align="center" prop="postId"> | ||||
|         <template #default="scope"> | ||||
|           <dict-tag :options="user_post_type" :value="scope.row.postId" /> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|       <el-table-column label="备注" align="center" prop="remark" /> | ||||
|       <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | ||||
|         <template #default="scope"> | ||||
|           <el-space wrap> | ||||
|             <el-button link type="success" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['project:projectTeamMember:edit']"> | ||||
|               修改 | ||||
|             </el-button> | ||||
|             <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['project:projectTeamMember:remove']"> | ||||
|               删除 | ||||
|             </el-button> | ||||
|           </el-space> | ||||
|         </template> | ||||
|       </el-table-column> | ||||
|     </el-table> | ||||
|     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.current" v-model:limit="queryParams.pageSize" @pagination="getList" /> | ||||
|  | ||||
|     <!-- 添加或修改项目班组下的成员对话框 --> | ||||
|     <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> | ||||
|       <el-form ref="projectTeamMemberFormRef" :model="form" :rules="rules" label-width="80px"> | ||||
|         <el-form-item label="施工人员" prop="memberId"> | ||||
|           <el-select v-model="form.memberId" clearable placeholder="请选择岗位"> | ||||
|           <el-select v-model="form.memberId" clearable placeholder="请选择人员"> | ||||
|             <el-option v-for="item in userNotInTeamOpt" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|             <pagination | ||||
|               v-show="total > 0" | ||||
| @ -141,16 +135,11 @@ interface Props { | ||||
|   projectTeamVo: ProjectTeamVO; | ||||
| } | ||||
|  | ||||
| const props = withDefaults(defineProps<Props>(), {}); | ||||
| const props = defineProps<Props>(); | ||||
| // 是否可见 | ||||
| const visible = ref(false); | ||||
| const initFormData: ProjectTeamMemberForm = { | ||||
|   id: undefined, | ||||
|   teamId: props.projectTeamVo.id, | ||||
|   projectId: currentProject.value.id, | ||||
|   memberId: undefined, | ||||
|   postId: undefined, | ||||
|   remark: undefined | ||||
|   projectId: currentProject.value.id | ||||
| }; | ||||
| const data = reactive<PageData<ProjectTeamMemberForm, ProjectTeamMemberQuery>>({ | ||||
|   form: { ...initFormData }, | ||||
| @ -159,11 +148,7 @@ const data = reactive<PageData<ProjectTeamMemberForm, ProjectTeamMemberQuery>>({ | ||||
|     pageSize: 10, | ||||
|     sortField: 'createTime', | ||||
|     sortOrder: 'descend', | ||||
|     teamId: props.projectTeamVo.id, | ||||
|     projectId: currentProject.value.id, | ||||
|     memberId: undefined, | ||||
|     postId: undefined, | ||||
|     params: {} | ||||
|     projectId: currentProject.value.id | ||||
|   }, | ||||
|   rules: { | ||||
|     id: [{ required: true, message: '主键id不能为空', trigger: 'blur' }] | ||||
| @ -187,25 +172,12 @@ const projectTeamMemberList = ref<ProjectTeamMemberVO[]>([]); | ||||
| /** 查询项目班组下的成员列表 */ | ||||
| const getList = async () => { | ||||
|   loading.value = true; | ||||
|   const res = await listProjectTeamMember(queryParams.value); | ||||
|   const res = await listProjectTeamMember({ ...queryParams.value, teamId: props.projectTeamVo.id }); | ||||
|   projectTeamMemberList.value = res.data.records; | ||||
|   total.value = res.data.total; | ||||
|   loading.value = false; | ||||
| }; | ||||
|  | ||||
| /** 查询项目下的成员列表 */ | ||||
|  | ||||
| // 打开弹窗 | ||||
| const openModal = () => { | ||||
|   visible.value = true; | ||||
|   getList(); | ||||
| }; | ||||
|  | ||||
| // 关闭弹窗 | ||||
| const closeModal = () => { | ||||
|   visible.value = false; | ||||
| }; | ||||
|  | ||||
| /** 取消按钮 */ | ||||
| const cancel = () => { | ||||
|   reset(); | ||||
| @ -284,7 +256,10 @@ const submitForm = () => { | ||||
|       if (form.value.id) { | ||||
|         await updateProjectTeamMember(form.value).finally(() => (buttonLoading.value = false)); | ||||
|       } else { | ||||
|         await addProjectTeamMember(form.value).finally(() => (buttonLoading.value = false)); | ||||
|         await addProjectTeamMember({ | ||||
|           ...form.value, | ||||
|           teamId: props.projectTeamVo.id | ||||
|         }).finally(() => (buttonLoading.value = false)); | ||||
|       } | ||||
|       proxy?.$modal.msgSuccess('操作成功'); | ||||
|       dialog.visible = false; | ||||
| @ -313,8 +288,16 @@ const handleExport = () => { | ||||
|   ); | ||||
| }; | ||||
|  | ||||
| // 暴露函数给父组件 | ||||
| defineExpose({ | ||||
|   openModal | ||||
| watch( | ||||
|   () => props.projectTeamVo, | ||||
|   (newId, oldId) => { | ||||
|     if (newId !== oldId) { | ||||
|       getList(); | ||||
|     } | ||||
|   } | ||||
| ); | ||||
|  | ||||
| onMounted(() => { | ||||
|   getList(); | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| @ -70,7 +70,9 @@ | ||||
|           <el-input v-model="form.teamName" placeholder="请输入班组名称" /> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="打卡范围" prop="isClockIn"> | ||||
|           <el-input v-model="form.isClockIn" placeholder="请输入范围内打卡" /> | ||||
|           <el-select v-model="form.isClockIn" clearable placeholder="请选择打卡范围"> | ||||
|             <el-option v-for="item in team_clock_type" :key="item.value" :label="item.label" :value="item.value" /> | ||||
|           </el-select> | ||||
|         </el-form-item> | ||||
|         <el-form-item label="备注" prop="remark"> | ||||
|           <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" /> | ||||
| @ -83,7 +85,9 @@ | ||||
|         </div> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|     <user-list-dialog ref="userListVisible" :projectTeamVo="currentRow" /> | ||||
|     <el-dialog :title="currentRow.teamName" v-model="visible"> | ||||
|       <user-list-dialog :projectTeamVo="currentRow" /> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| @ -208,12 +212,11 @@ const handleUpdate = async (row?: ProjectTeamVO) => { | ||||
|   dialog.title = '修改项目班组'; | ||||
| }; | ||||
|  | ||||
| /**  */ | ||||
| const visible = ref<boolean>(false); | ||||
| /** 班组成员操作 */ | ||||
| const handleUserList = (row?: ProjectTeamVO) => { | ||||
|   if (userListVisible.value) { | ||||
|     currentRow.value = row; | ||||
|     userListVisible.value.openModal(); | ||||
|   } | ||||
|   currentRow.value = row; | ||||
|   visible.value = true; | ||||
| }; | ||||
|  | ||||
| /** 提交按钮 */ | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
|   <div class="register"> | ||||
|     <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form"> | ||||
|       <div class="title-box"> | ||||
|         <h3 class="title">RuoYi-Vue-Plus多租户管理系统</h3> | ||||
|         <h3 class="title">新能源项目管理平台</h3> | ||||
|         <lang-select /> | ||||
|       </div> | ||||
|       <el-form-item v-if="tenantEnabled" prop="tenantId"> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user