From 930cb649dceea439e0b1263926121f580ad836cf Mon Sep 17 00:00:00 2001 From: zmj <1493694146@qq.com> Date: Sat, 27 Jan 2024 11:25:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 8 +- package.json | 2 +- src/views/competitor/edit.vue | 9 +- src/views/contract/edit.vue | 6 +- src/views/customer_demand/edit.vue | 9 +- src/views/customer_demand_solution/edit.vue | 9 +- src/views/project/components/Business.vue | 86 +- src/views/project/components/Collection.vue | 4 +- src/views/project/components/a.vue | 36 - src/views/project/detail.vue | 995 +------------------- src/views/project/edit.vue | 4 +- src/views/project_follow_up/edit.vue | 31 +- src/views/project_follow_up/index.vue | 22 +- yarn.lock | 8 +- 14 files changed, 108 insertions(+), 1121 deletions(-) delete mode 100644 src/views/project/components/a.vue diff --git a/package-lock.json b/package-lock.json index 2be07c7..9bc495e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "@types/node": "^16.11.41", "@types/nprogress": "^0.2.0", "@vitejs/plugin-legacy": "^2.3.1", - "@vitejs/plugin-vue": "^3.0.0", + "@vitejs/plugin-vue": "^3.2.0", "@vitejs/plugin-vue-jsx": "^2.0.0", "@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-typescript": "^11.0.0", @@ -1342,9 +1342,9 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz", - "integrity": "sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==", + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", "dev": true, "engines": { "node": "^14.18.0 || >=16.0.0" diff --git a/package.json b/package.json index 8a921bd..cdd3a9b 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@types/node": "^16.11.41", "@types/nprogress": "^0.2.0", "@vitejs/plugin-legacy": "^2.3.1", - "@vitejs/plugin-vue": "^3.0.0", + "@vitejs/plugin-vue": "^3.2.0", "@vitejs/plugin-vue-jsx": "^2.0.0", "@vue/eslint-config-prettier": "^7.0.0", "@vue/eslint-config-typescript": "^11.0.0", diff --git a/src/views/competitor/edit.vue b/src/views/competitor/edit.vue index f651e68..0d649c1 100644 --- a/src/views/competitor/edit.vue +++ b/src/views/competitor/edit.vue @@ -2,15 +2,14 @@ <div class="edit-popup"> <popup ref="popupRef" :title="popupTitle" :async="true" width="650px" @confirm="handleSubmit" @close="handleClose"> <el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules"> - <el-form-item label="组织id" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> - <el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织id" - @change="area_change"> + <el-form-item label="组织" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> + <el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织" @change="area_change"> <el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="parseInt(item.id)" /> </el-select> </el-form-item> - <el-form-item label="部门id" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> - <el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门id"> + <el-form-item label="部门" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> + <el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门"> <el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="parseInt(item.id)" /> </el-select> diff --git a/src/views/contract/edit.vue b/src/views/contract/edit.vue index 502c08b..a4c13a5 100644 --- a/src/views/contract/edit.vue +++ b/src/views/contract/edit.vue @@ -19,12 +19,12 @@ </el-form-item> </el-col> <el-col :span="8"> - <el-form-item label="项目名称" prop="buy_bidding_document_id" @click="tanchuan" + <el-form-item label="项目名称" prop="project_id" @click="tanchuan" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> <el-input v-model="project_name" readonly clearable placeholder="请选择项目" /> </el-form-item></el-col> <el-col :span="8"> - <el-form-item label="项目编码" prop="buy_bidding_document_id" + <el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> <el-input v-model="project_code" clearable disabled placeholder="系统自动填写" /> </el-form-item></el-col> @@ -369,6 +369,7 @@ const customEvent1 = (e: any) => { }; const customEvent2 = (e: any) => { project_id.value = e.id; + formData.project_id = e.id project_name.value = e.name; project_code.value = e.project_code bidding_code.value = '' @@ -433,6 +434,7 @@ const formData = reactive({ party_a_phone: '', party_a_mobile: '', party_a_email: '', + project_id: "", party_b: '', party_b_contact_address: '', party_b_diretor: '', diff --git a/src/views/customer_demand/edit.vue b/src/views/customer_demand/edit.vue index b36a171..798d42f 100644 --- a/src/views/customer_demand/edit.vue +++ b/src/views/customer_demand/edit.vue @@ -2,15 +2,14 @@ <div class="edit-popup"> <popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose"> <el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules"> - <el-form-item label="组织id" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> - <el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织id" - @change="area_change"> + <el-form-item label="组织" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> + <el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织" @change="area_change"> <el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="parseInt(item.id)" /> </el-select> </el-form-item> - <el-form-item label="部门id" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> - <el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门id"> + <el-form-item label="部门" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> + <el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门"> <el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="parseInt(item.id)" /> </el-select> diff --git a/src/views/customer_demand_solution/edit.vue b/src/views/customer_demand_solution/edit.vue index 6e67e7a..38406de 100644 --- a/src/views/customer_demand_solution/edit.vue +++ b/src/views/customer_demand_solution/edit.vue @@ -2,15 +2,14 @@ <div class="edit-popup"> <popup ref="popupRef" :title="popupTitle" :async="true" width="650px" @confirm="handleSubmit" @close="handleClose"> <el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules"> - <el-form-item label="组织id" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> - <el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织id" - @change="area_change"> + <el-form-item label="组织" prop="org_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> + <el-select class="flex-1" v-model="formData.org_id" clearable placeholder="请选择组织" @change="area_change"> <el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="parseInt(item.id)" /> </el-select> </el-form-item> - <el-form-item label="部门id" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> - <el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门id"> + <el-form-item label="部门" prop="dept_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> + <el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门"> <el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="parseInt(item.id)" /> </el-select> diff --git a/src/views/project/components/Business.vue b/src/views/project/components/Business.vue index a39abc8..126cee7 100644 --- a/src/views/project/components/Business.vue +++ b/src/views/project/components/Business.vue @@ -1,17 +1,41 @@ <template> <div class="tit">项目跟进</div> <div> + <el-button v-perms="['project.project/add']" type="primary" @click="handleAdd" style="float: right;"> + <template #icon> + <icon name="el-icon-Plus" /> + </template> + 新增 + </el-button> <el-table :data="tableData1" stripe style="width: 100%"> - <el-table-column label="主题" prop='theme' width="180" /> - <el-table-column label="日期" prop='follow_date' width="180" /> - <el-table-column label="方案内容" prop='solution_content' /> - <el-table-column label="类型" prop='follow_type_text' /> - <el-table-column label="执行人" prop='executor' /> - <el-table-column label="阶段" prop='follow_stage_text' /> - <el-table-column label="状态" prop='follow_status_text' /> - <el-table-column label="项目把握度" prop='project_assurance_text' /> + <el-table-column label="项目名称" prop="project_name" show-overflow-tooltip /> + <el-table-column label="客户名称" prop="custom_name" show-overflow-tooltip /> + <el-table-column label="执行人" prop="executor" show-overflow-tooltip /> + <el-table-column label="日期" prop="follow_date"> + <template #default="{ row }"> + <span>{{ row.follow_date ? row.follow_date : '' }}</span> + </template> + </el-table-column> + <el-table-column label="类型" prop="follow_type_text"> + </el-table-column> + <el-table-column label="主题" prop="theme" show-overflow-tooltip /> + <el-table-column label="项目把握度" prop="project_assurance_text"> + </el-table-column> + <el-table-column label="状态" prop="follow_status_text"> + </el-table-column> + <el-table-column label="阶段" prop="follow_stage_text"> + </el-table-column> + <el-table-column label="下次回访日期" prop="next_follow_up_date"> + <template #default="{ row }"> + <span>{{ row.next_follow_up_date ? row.next_follow_up_date : + '' }}</span> + </template> + </el-table-column> </el-table> + <edit-popup v-if="showEdit" ref="editRef" @close="showEdit = false" :dict-data="dictData" @success="followUpLists" + :project="formData" /> </div> + <div style="margin: 20px 0;"> <el-pagination v-model:current-page="pager1.page_no" v-model:page-size="pager1.page_size" :page-sizes="[10, 20, 30, 40]" layout="total, sizes, prev, pager, next, jumper" :total="total" @@ -132,8 +156,6 @@ </div> </template> - - <script setup> import { ref, reactive, defineProps } from "vue" @@ -142,15 +164,21 @@ import { apiCustomerDemandLists } from '@/api/customer_demand' import { apiCustomerDemandSolutionLists } from '@/api/customer_demand_solution' import { apiProjectEstimateLists } from '@/api/project_estimate' import { apiCompetitorLists } from '@/api/competitor' - - +import EditPopup from '@/views/project_follow_up/edit.vue' +import { useDictData } from '@/hooks/useDictOptions' const props = defineProps({ - project_id: Number + project_id: Number, + formData: Object }) - - - - +const { dictData } = useDictData('project_assurance,follow_status,follow_type,follow_stage') +const showEdit = ref(false) +const editRef = ref(null) +// 添加 +const handleAdd = async () => { + showEdit.value = true + await nextTick() + editRef.value?.open('add') +} const tableData1 = ref([]) const tableData2 = ref([]) const tableData3 = ref([]) @@ -208,12 +236,6 @@ const demandList = () => { }) } -// const handleSizeChange1 = (val: number) => { -// // pager1.page_size = val -// // followUpLists() -// } - - // 解决方案列表 const solutionLists = () => { apiCustomerDemandSolutionLists(pager5).then((res) => { @@ -237,24 +259,6 @@ const competitorLists = () => { }) } -// const handleSizeChange2 = (val: number) => { -// pager2.page_size = val -// demandList() -// } -// const handleSizeChange3 = (val: number) => { -// pager3.page_size = val -// solutionLists() -// } -// const handleSizeChange4 = (val: number) => { -// pager4.page_size = val -// estimateLists() -// } -// const handleSizeChange5 = (val: number) => { -// pager5.page_size = val -// competitorLists() -// } - - followUpLists() demandList() diff --git a/src/views/project/components/Collection.vue b/src/views/project/components/Collection.vue index 73c5d49..26c6500 100644 --- a/src/views/project/components/Collection.vue +++ b/src/views/project/components/Collection.vue @@ -13,9 +13,11 @@ import { apiinvoiceapplyLists } from '@/api/InvoicingRequests' import { apireturnedLists } from '@/api/remittance' import { apireturnedrecordLists } from '@/api/recordsPayment' import { apirefundapplyLists } from '@/api/refund' +import EditPopup from '@/views/project_follow_up/edit.vue' const props = defineProps({ - project_id: Number + project_id: Number, + components: EditPopup }) const baseData = reactive({ diff --git a/src/views/project/components/a.vue b/src/views/project/components/a.vue deleted file mode 100644 index 5e08c7c..0000000 --- a/src/views/project/components/a.vue +++ /dev/null @@ -1,36 +0,0 @@ -<template> - <myTable :baseData="baseData"></myTable> -</template> - - - -<script setup> - -import { ref, reactive, defineProps } from "vue" -import myTable from "./myTable.vue" -import { subpackagdetailLists } from '@/api/project_subpackage_budget_detail' - -const props = defineProps({ - project_id: Number -}) - -const baseData = reactive({ - fetchFun: subpackagdetailLists, - tit: "竞争对手", - queryParams: { project_id: props.project_id }, - - columnList: [ - { label: '工作类型', prop: 'work_type' }, - { label: '工作内容', prop: 'work_content' }, - { label: '项目特征', prop: 'project_features' }, - { label: '单位', prop: 'unit' }, - { label: '预算工作量', prop: 'num' }, - { label: '单价', prop: 'price' }, - { label: '金额', prop: 'amount' }, - { label: '已分包量', prop: 'has_subcontract_num' }, - { label: '剩余工作量', prop: 'residue_num' }, - ] -}) - - -</script> \ No newline at end of file diff --git a/src/views/project/detail.vue b/src/views/project/detail.vue index 11a56dc..b79724e 100644 --- a/src/views/project/detail.vue +++ b/src/views/project/detail.vue @@ -9,7 +9,7 @@ </el-tab-pane> <el-tab-pane label="商机" name="demo-2"> - <Business v-if="activeName == 'demo-2'" :project_id="project_id"></Business> + <Business v-if="activeName == 'demo-2'" :formData="formData" :project_id="project_id"></Business> </el-tab-pane> <el-tab-pane label="投标" name="demo-3"> @@ -48,207 +48,6 @@ <documentation v-if="activeName == 'demo-16'" :project_id="project_id"></documentation> </el-tab-pane> - - - <!-- <el-tab-pane label="人力" name="demo-12"> - - <el-tabs v-model="active" class="demo-tabs"> - <el-tab-pane label="项目人员" name="first-1"> - <div> - <el-table :data="tableData12" stripe style="width: 100%"> - <el-table-column label="姓名" prop='name' width="180" /> - <el-table-column label="身份证号" prop='idcard' width="180" /> - <el-table-column label="手机号" prop='mobile' /> - <el-table-column label="工种" prop='work_type_text' /> - <el-table-column label="人工单价" prop='unit_price' /> - <el-table-column label="每日生活费" prop=' ' /> - <el-table-column label="期初收入" prop='opening_income' /> - <el-table-column label="日结收入" prop='daily_income' /> - <el-table-column label="完工量收入" prop='work_income' /> - <el-table-column label="总收入" prop='total_income' /> - <el-table-column label="总支出" prop='pay_out' /> - <el-table-column label="余额" prop='balance' /> - </el-table> - </div> - <div style="margin: 20px 0;"> - <el-pagination v-model:current-page="pager12.page_no" - v-model:page-size="pager12.page_size" :page-sizes="[10, 20, 30, 40]" - layout="total, sizes, prev, pager, next, jumper" :total="total11" - @size-change="handleSizeChange12" @current-change="handleCurrentChange12" /> - </div> - - </el-tab-pane> - <el-tab-pane label="劳动合同" name="first-2"> - <div> - <el-table :data="tableData13" stripe style="width: 100%"> - <el-table-column label="姓名" prop='project_name' width="180" /> - <el-table-column label="身份证号" prop='person_idcard' width="180" /> - <el-table-column label="合同状态" prop='contract_status_text' /> - <el-table-column label="合同类别" prop='contract_type_text' /> - <el-table-column label="合同名称" prop='contract_title_text' /> - <el-table-column label="合同签定日期" prop='signing_date' /> - <el-table-column label="起始时间" prop='start_date' /> - <el-table-column label="终止时间" prop='end_date' /> - - <el-table-column label="备注" prop='remark' /> - <el-table-column label="合同附件" prop="annex" show-overflow-tooltip> - <template #default="{ row }"> - <div v-if="row.annex && row.annex.length > 0"> - <div v-for="(item, i) in row.annex " :key='i'> - <el-link :href="item" target="_blank">文件{{ i + 1 }}查看</el-link> - </div> - </div> - <div v-else> - 暂无文件 - </div> - </template> - </el-table-column> - - </el-table> - </div> - <div style="margin: 20px 0;"> - <el-pagination v-model:current-page="pager13.page_no" - v-model:page-size="pager13.page_size" :page-sizes="[10, 20, 30, 40]" - layout="total, sizes, prev, pager, next, jumper" :total="total12" - @size-change="handleSizeChange13" @current-change="handleCurrentChange13" /> - </div> - </el-tab-pane> - <el-tab-pane label="保险记录" name="first-3"> - <div> - <el-table :data="tableData14" stripe style="width: 100%"> - <el-table-column label="姓名" prop='project_name' width="180" /> - <el-table-column label="身份证号" prop='person_idcard' width="180" /> - <el-table-column label="投保日期" prop='insurance_date' /> - <el-table-column label="到期日期" prop='due_date' /> - <el-table-column label="保险种类" prop='type_text' /> - <el-table-column label="保单号" prop='insurance_no' /> - <el-table-column label="投保金额(万元)" prop='insured_amount' /> - <el-table-column label="保险公司" prop='insurance_company' /> - - - </el-table> - </div> - <div style="margin: 20px 0;"> - <el-pagination v-model:current-page="pager14.page_no" - v-model:page-size="pager14.page_size" :page-sizes="[10, 20, 30, 40]" - layout="total, sizes, prev, pager, next, jumper" :total="total13" - @size-change="handleSizeChange14" @current-change="handleCurrentChange14" /> - </div> - </el-tab-pane> - <el-tab-pane label="项目考勤" name="first-4"> - - <div> - <el-table :data="tableData15" stripe style="width: 100%"> - <el-table-column label="日记工单号" prop='attendance_code' width="180" /> - <el-table-column label="日期" prop='attendance_date' width="180" /> - <el-table-column label="出勤人数" prop='competitor_contacts_phone' /> - <el-table-column label="记工数量 " prop='work_record_num_total' /> - <el-table-column label="日工资合计" prop="daily_salary_total" show-overflow-tooltip /> - <el-table-column label="日生活费合计" prop="daily_living_total" show-overflow-tooltip /> - <el-table-column label="日补贴合计" prop="daily_subsidy_total" show-overflow-tooltip /> - <el-table-column label="日其它合计" prop="daily_other_total" show-overflow-tooltip /> - <el-table-column label="日收入合计" prop="daily_income_total" show-overflow-tooltip /> - - <el-table-column label="备注" prop='remark' /> - - </el-table> - </div> - <div style="margin: 20px 0;"> - <el-pagination v-model:current-page="pager15.page_no" - v-model:page-size="pager15.page_size" :page-sizes="[10, 20, 30, 40]" - layout="total, sizes, prev, pager, next, jumper" :total="total14" - @size-change="handleSizeChange15" @current-change="handleCurrentChange15" /> - </div> - </el-tab-pane> - <el-tab-pane label="考勤明细" name="first-5"> - <div> - <el-table :data="tableData16" stripe style="width: 100%"> - <el-table-column label="日记工单号" prop='attendance_code' width="180" /> - <el-table-column label="日期" prop='attendance_date' width="180" /> - <el-table-column label="姓名" prop="person_name" show-overflow-tooltip /> - <el-table-column label="身份证号" prop="person_idcard" show-overflow-tooltip /> - <el-table-column label="工种" prop="work_type_text" show-overflow-tooltip /> - <el-table-column label="上班时间" prop="work_start_time" show-overflow-tooltip /> - <el-table-column label="下班时间" prop="work_end_time" show-overflow-tooltip /> - <el-table-column label="记工数量" prop="work_record_num" show-overflow-tooltip /> - <el-table-column label="日工资" prop="daily_salary" show-overflow-tooltip /> - <el-table-column label="日生活费" prop="daily_living" show-overflow-tooltip /> - <el-table-column label="日补贴" prop="daily_subsidy" show-overflow-tooltip /> - <el-table-column label="日其它" prop="daily_other" show-overflow-tooltip /> - <el-table-column label="日收入" prop="daily_income" show-overflow-tooltip /> - <el-table-column label="备注" prop="remark" show-overflow-tooltip /> - - </el-table> - </div> - <div style="margin: 20px 0;"> - <el-pagination v-model:current-page="pager16.page_no" - v-model:page-size="pager16.page_size" :page-sizes="[10, 20, 30, 40]" - layout="total, sizes, prev, pager, next, jumper" :total="total15" - @size-change="handleSizeChange16" @current-change="handleCurrentChange16" /> - </div> - </el-tab-pane> - <el-tab-pane label="工资付款" name="first-6"> - <div> - <el-table :data="tableData17" stripe style="width: 100%"> - <el-table-column label="工资付款单号" prop='payment_code' width="180" /> - <el-table-column label="日期" prop='apply_date' width="180" /> - <el-table-column label="姓名" prop='person_name' /> - <el-table-column label="身份证号" prop='person_idcard' /> - <el-table-column label="工种" prop='person_work_type_text' /> - <el-table-column label="总收入" prop='total_income' /> - <el-table-column label="总支出" prop='total_pay_out' /> - <el-table-column label="未发放" prop='balance' /> - <el-table-column label="本次付款金额" prop='apply_amount' /> - <el-table-column label="备注" prop='remark' /> - </el-table> - </div> - <div style="margin: 20px 0;"> - <el-pagination v-model:current-page="pager17.page_no" - v-model:page-size="pager17.page_size" :page-sizes="[10, 20, 30, 40]" - layout="total, sizes, prev, pager, next, jumper" :total="total16" - @size-change="handleSizeChange17" @current-change="handleCurrentChange17" /> - </div> - </el-tab-pane> - </el-tabs> - - - - </el-tab-pane> --> - <!-- <el-tab-pane label="计划" name="demo-6">Config</el-tab-pane> - <el-tab-pane label="材料" name="demo-7">Role</el-tab-pane> - - - <el-tab-pane label="进度" name="demo-10">Role</el-tab-pane> - <el-tab-pane label="任务" name="demo-11">Task</el-tab-pane> - - <el-tab-pane label="机具" name="demo-13">Task</el-tab-pane> - <el-tab-pane label="费用" name="demo-16">Task</el-tab-pane> - <el-tab-pane label="文档" name="demo-17">Task</el-tab-pane> - <el-tab-pane label="结算" name="demo-18">Task</el-tab-pane> --> - <!-- <el-tab-pane label="售后" name="demo-19"> - <div> - <el-table :data="tableData18" stripe style="width: 100%"> - <el-table-column label="工单编号" prop='custom_service_code' width="180" /> - <el-table-column label="合同编号" prop='contract_code' width="180" /> - <el-table-column label="投诉主题" prop='name' /> - <el-table-column label="日期" prop='date' /> - <el-table-column label="分类" prop='classification' /> - <el-table-column label="是否解决" prop='is_solve_text' /> - <el-table-column label="解决日期" prop='done_date' /> - - </el-table> - </div> - <div style="margin: 10px 0;"> - <el-pagination v-model:current-page="pager18.page_no" v-model:page-size="pager18.page_size" - :page-sizes="[10, 20, 30, 40]" layout="total, sizes, prev, pager, next, jumper" - :total="total17" @size-change="handleSizeChange18" - @current-change="handleCurrentChange18" /> - </div> - - - </el-tab-pane> - <el-tab-pane label="统计" name="demo-20">Task</el-tab-pane> --> - </el-tabs> </el-form> </popup> @@ -260,16 +59,8 @@ import type { FormInstance } from 'element-plus' import Popup from '@/components/popup/index.vue' import { apiCustomDetail } from '@/api/custom' -import { timeFormat } from '@/utils/util' import type { PropType } from 'vue' import type { TabsPaneContext } from 'element-plus' -import { apiCustomerDemandLists } from '@/api/customer_demand' -import { apiProjectFollowUpLists } from '@/api/project_follow_up' -import { apiCustomerDemandSolutionLists } from '@/api/customer_demand_solution' -import { apiProjectEstimateLists } from '@/api/project_estimate' -import { apiCompetitorLists } from '@/api/competitor' -import { apiCustomServiceLists } from '@/api/custom_service' -import { subpackagdetailLists } from '@/api/project_subpackage_budget_detail' import Overview from "./components/Overview.vue" import Business from "./components/Business.vue" import tender from "./components/tender.vue" @@ -281,12 +72,8 @@ import manpower from "./components/manpower.vue" import Collection from "./components/Collection.vue" import payment from "./components/payment.vue" import documentation from "./components/documentation.vue" -// import manpower from "./components/manpower.vue" - - -const active = ref('first-1') const activeName = ref('demo-1') const handleClick = (tab: TabsPaneContext, event: Event) => { // console.log(tab, event) @@ -300,800 +87,20 @@ defineProps({ const emit = defineEmits(['success', 'close']) const formRef = shallowRef<FormInstance>() const popupRef = shallowRef<InstanceType<typeof Popup>>() -const formDataannex = reactive([]) -const datas = reactive({ - provinceOptions: [], - cityOptions: [], - areaOptions: [], -}); - -const pager12 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager13 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager14 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - -const pager15 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager16 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - -const pager17 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager18 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - - - -const pager21 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - - -const pager22 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - - -const pager23 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - - -const pager24 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager25 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager26 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager27 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager28 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager29 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager30 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager31 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) -const pager32 = reactive({ - page_size: 10, - page_no: 1, - project_id: "" -}) - - - - -const total12 = ref(0) -const total13 = ref(0) -const total14 = ref(0) -const total15 = ref(0) -const total16 = ref(0) -const total17 = ref(0) -const total18 = ref(0) - -const total21 = ref(0) - -const total22 = ref(0) -const total23 = ref(0) - -const total24 = ref(0) - -const total25 = ref(0) -const total26 = ref(0) -const total27 = ref(0) -const total28 = ref(0) -const total29 = ref(0) -const total30 = ref(0) -const total31 = ref(0) -const total32 = ref(0) -const total33 = ref(0) - -const tableData12 = ref([]) -const tableData13 = ref([]) -const tableData15 = ref([]) -const tableData16 = ref([]) -const tableData17 = ref([]) -const tableData18 = ref([]) - - -const tableData21 = ref([]) -const tableData22 = ref([]) - -const tableData23 = ref([]) - -const tableData24 = ref([]) -const tableData25 = ref([]) - -const tableData26 = ref([]) -const tableData27 = ref([]) -const tableData28 = ref([]) -const tableData29 = ref([]) -const tableData30 = ref([]) -const tableData31 = ref([]) -const tableData32 = ref([]) // 表单数据 const formData = reactive({ }) -//条数 - -const handleSizeChange7 = (val: number) => { - - pager7.page_size = val - buydocumentLists() -} -const handleSizeChange8 = (val: number) => { - - pager8.page_size = val - examinationLists() -} -const handleSizeChange9 = (val: number) => { - - pager9.page_size = val - bidResultLists() -} -const handleSizeChange10 = (val: number) => { - - pager10.page_size = val - applyLists() -} - -const handleSizeChange11 = (val: number) => { - - pager11.page_size = val - - refundLists() -} - -const handleSizeChange12 = (val: number) => { - - pager12.page_size = val - - personnelLists() -} - -const handleSizeChange13 = (val: number) => { - - pager13.page_size = val - - laborcontractLists() -} - -const handleSizeChange14 = (val: number) => { - - pager14.page_size = val - - insurancemanagementlists() -} - - -const handleSizeChange15 = (val: number) => { - - pager15.page_size = val - - attendanceRecord() -} - -const handleSizeChange16 = (val: number) => { - - pager16.page_size = val - - attendancedetail() - -} -const handleSizeChange17 = (val: number) => { - - pager16.page_size = val - - attendancedetail() - -} - - -const handleSizeChange18 = (val: number) => { - - pager18.page_size = val - - customServiceLists() - -} -const handleSizeChange19 = (val: number) => { - - pager19.page_size = val - - contractLists() -} - -const handleSizeChange20 = (val: number) => { - - pager20.page_size = val - contcractNegotiationLists() -} -const handleSizeChange21 = (val: number) => { - - pager21.page_size = val - - customServiceLists() -} - -const handleSizeChange22 = (val: number) => { - - pager22.page_size = val - - customServiceLists() -} -const handleSizeChange23 = (val: number) => { - - pager23.page_size = val - - customServiceLists() -} - -const handleSizeChange24 = (val: number) => { - - pager24.page_size = val - - customServiceLists() -} - -const handleSizeChange25 = (val: number) => { - - pager25.page_size = val - - customServiceLists() -} - -const handleSizeChange26 = (val: number) => { - - pager26.page_size = val - - customServiceLists() -} - - -const handleSizeChange27 = (val: number) => { - - pager27.page_size = val - - customServiceLists() -} - - -const handleSizeChange28 = (val: number) => { - - pager28.page_size = val - - customServiceLists() -} - - -const handleSizeChange29 = (val: number) => { - - pager29.page_size = val - - invoiceapplyLists() -} - - - - -const handleSizeChange30 = (val: number) => { - - pager30.page_size = val - - returnedLists() -} -const handleSizeChange31 = (val: number) => { - - pager30.page_size = val - - returnedrecordLists() -} -const handleSizeChange32 = (val: number) => { - - pager30.page_size = val - refundapplyLists() -} - - - -//分页 - -// const handleCurrentChange6 = (val: number) => { -// pager6.page_no = val -// console.log(`current page: ${val}`) -// decisionLists() -// } -// const handleCurrentChange7 = (val: number) => { -// pager7.page_no = val -// console.log(`current page: ${val}`) -// buydocumentLists() -// } -// const handleCurrentChange8 = (val: number) => { -// pager8.page_no = val -// console.log(`current page: ${val}`) -// examinationLists() -// } -// const handleCurrentChange9 = (val: number) => { -// pager9.page_no = val -// console.log(`current page: ${val}`) -// bidResultLists() -// } -// const handleCurrentChange10 = (val: number) => { -// pager10.page_no = val -// console.log(`current page: ${val}`) -// applyLists() -// } -// const handleCurrentChange11 = (val: number) => { -// pager11.page_no = val -// console.log(`current page: ${val}`) - -// refundLists() -// } - -const handleCurrentChange12 = (val: number) => { - pager12.page_no = val - console.log(`current page: ${val}`) - personnelLists() -} -const handleCurrentChange13 = (val: number) => { - pager13.page_no = val - console.log(`current page: ${val}`) - - laborcontractLists() -} - -const handleCurrentChange14 = (val: number) => { - pager14.page_no = val - console.log(`current page: ${val}`) - - insurancemanagementlists() -} - -const handleCurrentChange15 = (val: number) => { - pager15.page_no = val - console.log(`current page: ${val}`) - - attendanceRecord() -} -const handleCurrentChange16 = (val: number) => { - pager16.page_no = val - console.log(`current page: ${val}`) - - attendancedetail() -} - -const handleCurrentChange17 = (val: number) => { - pager17.page_no = val - console.log(`current page: ${val}`) - - salarypaymentLists() - -} - -const handleCurrentChange18 = (val: number) => { - pager18.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - -const handleCurrentChange19 = (val: number) => { - pager19.page_no = val - console.log(`current page: ${val}`) - - contractLists() -} - - -const handleCurrentChange20 = (val: number) => { - pager20.page_no = val - console.log(`current page: ${val}`) - - contcractNegotiationLists() -} - -const handleCurrentChange21 = (val: number) => { - pager21.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - - -const handleCurrentChange22 = (val: number) => { - pager22.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - - -const handleCurrentChange23 = (val: number) => { - pager23.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - -const handleCurrentChange24 = (val: number) => { - pager24.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - - -const handleCurrentChange25 = (val: number) => { - pager25.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} -const handleCurrentChange26 = (val: number) => { - pager26.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - - -const handleCurrentChange27 = (val: number) => { - pager27.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - - -const handleCurrentChange28 = (val: number) => { - pager28.page_no = val - console.log(`current page: ${val}`) - - customServiceLists() -} - -const handleCurrentChange29 = (val: number) => { - pager29.page_no = val - console.log(`current page: ${val}`) - invoiceapplyLists() -} - - -const handleCurrentChange30 = (val: number) => { - pager30.page_no = val - console.log(`current page: ${val}`) - - returnedLists() -} - - -const handleCurrentChange31 = (val: number) => { - pager31.page_no = val - console.log(`current page: ${val}`) - - returnedrecordLists() -} -const handleCurrentChange32 = (val: number) => { - pager32.page_no = val - console.log(`current page: ${val}`) - - refundapplyLists() -} - - - - - - - - - - - - - - - - - - - - - - -//获取项目人员列表 - -const personnelLists = () => { - projectpersonnelLists(pager12).then((res) => { - tableData12.value = res.lists - total11.value = res.count - }) -} - - -//获取保险管理列表 - -const insurancemanagementlists = () => { - insurancemanagementLists(pager14).then((res) => { - tableData14.value = res.lists - total13.value = res.count - }) -} -//获取考勤记录列表 - -const attendanceRecord = () => { - attendanceRecordLists(pager15).then((res) => { - tableData15.value = res.lists - total14.value = res.count - }) -} - -//获取考勤明细列表 - -const attendancedetail = () => { - attendancedetailLists(pager16).then((res) => { - tableData16.value = res.lists - total15.value = res.count - }) -} -//获取工资付款列表 - -const salarypaymentLists = () => { - projectsalaryDetailLists(pager17).then((res) => { - tableData17.value = res.lists - total16.value = res.count - }) -} - -//售后信息 -const customServiceLists = () => { - apiCustomServiceLists(pager18).then((res) => { - tableData18.value = res.lists - total17.value = res.count - }) -} - - -//获取分包预算列表 -const subpackagList = () => { - subpackagdetailLists(pager21).then((res) => { - tableData21.value = res.lists - total20.value = res.count - }) -} - -// 获取收票记录列表 -const financereceiptLists = () => { - apifinancereceiptLists(pager22).then((res) => { - tableData22.value = res.lists - total21.value = res.count - }) -} - -// 获取付款计划列表 -const planLists = () => { - paymentplanLists(pager23).then((res) => { - tableData23.value = res.lists - total22.value = res.count - }) -} - -//获取付款记录 -const payapplyLists = () => { - paymentapplyLists(pager24).then((res) => { - tableData24.value = res.lists - total22.value = res.count - }) -} - - -//获取退款记录 -const financerefundLists = () => { - apiFinancerefundLists(pager25).then((res) => { - tableData25.value = res.lists - total24.value = res.count - }) -} - -//获取采购合同 - -const procurementContractLists = () => { - apiProcurementContractLists(pager26).then((res) => { - tableData26.value = res.lists - total25.value = res.count - }) -} -//获取分包合同 -const subcontractingContractLists = () => { - apiSubcontractingContractLists(pager27).then((res) => { - tableData27.value = res.lists - total26.value = res.count - }) -} - -//获取分包合同洽商 -const negotiationLists = () => { - apinegotiationLists(pager28).then((res) => { - tableData28.value = res.lists - total27.value = res.count - }) -} - -//获取开票申请 -const invoiceapplyLists = () => { - apiinvoiceapplyLists(pager29).then((res) => { - tableData29.value = res.lists - total28.value = res.count - }) -} - -//获取回款计划 -const returnedLists = () => { - apireturnedLists(pager30).then((res) => { - tableData30.value = res.lists - total29.value = res.count - }) -} - -//获取回款记录 -const returnedrecordLists = () => { - apireturnedrecordLists(pager31).then((res) => { - tableData31.value = res.lists - total30.value = res.count - }) -} - -//获取退款申请 -const refundapplyLists = () => { - apirefundapplyLists(pager32).then((res) => { - tableData32.value = res.lists - total31.value = res.count - }) -} - const project_id = ref(0) // 获取详情 const setFormData = async (data: Record<any, any>) => { - - - - // for (const key in formData) { - // if (data[key] != null && data[key] != undefined) { - // //@ts-ignore - // formData[key] = data[key] - - // } - - // } project_id.value = data.id - - // pager11.project_id = data.id - // pager11.project_id = data.id - // pager12.project_id = data.id - // pager13.project_id = data.id - // pager14.project_id = data.id - // pager15.project_id = data.id - // pager16.project_id = data.id - // pager17.project_id = data.id - // pager18.project_id = data.id - // pager19.project_id = data.id - // pager20.project_id = data.id - // pager21.project_id = data.id - // pager22.project_id = data.id - // pager23.project_id = data.id - // pager24.project_id = data.id - // pager20.project_id = data.id - // pager25.project_id = data.id - // pager26.project_id = data.id - // pager27.project_id = data.id - // pager28.project_id = data.id - // pager29.project_id = data.id - // pager30.project_id = data.id - // pager31.project_id = data.id - // pager32.project_id = data.id Object.assign(formData, data) - - // if (data.annex && data.annex.length > 0) { - // const arry1 = data.annex.map((item: any, index: any) => { - // return { - // name: `文件${index + 1}`, - // uri: item - // }; - // }); - // Object.assign(formDataannex, arry1) - // } - // followUpLists() - // demandList() - // // competitorLists() - // solutionLists() - // estimateLists() - // decisionLists() - // buydocumentLists() - // examinationLists() - // bidResultLists() - // applyLists() - // refundLists() - // personnelLists() - // laborcontractLists() - // insurancemanagementlists() - // attendanceRecord() - // attendancedetail() - // salarypaymentLists() - // customServiceLists() - // contractLists() - // contcractNegotiationLists() - // subpackagList() - // financereceiptLists() - // planLists() - // payapplyLists() - // financerefundLists() - // procurementContractLists() - // subcontractingContractLists() - // negotiationLists() - // invoiceapplyLists() - // returnedLists() - // returnedrecordLists() - // refundapplyLists() } const getDetail = async (row: Record<string, any>) => { diff --git a/src/views/project/edit.vue b/src/views/project/edit.vue index b109fe9..edaedbf 100644 --- a/src/views/project/edit.vue +++ b/src/views/project/edit.vue @@ -28,13 +28,13 @@ </el-select> </el-form-item> </el-col> - <el-col :span="8"> <el-form-item label="项目名称" prop="name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]"> <el-input v-model="formData.name" clearable placeholder="请输入项目名称" /> </el-form-item> - </el-col> <el-col :span="8"> + </el-col> + <el-col :span="8"> <el-form-item label="项目编码" prop="project_code"> <el-input v-model="formData.project_code" clearable disabled placeholder="系统自动生成" /> </el-form-item> diff --git a/src/views/project_follow_up/edit.vue b/src/views/project_follow_up/edit.vue index b94fd6d..975e722 100644 --- a/src/views/project_follow_up/edit.vue +++ b/src/views/project_follow_up/edit.vue @@ -7,7 +7,7 @@ <el-form-item label="项目名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]"> <el-input v-model="project_name" readonly @click="showDialog = true" clearable - placeholder="点击选择项目" /> + placeholder="点击选择项目" :disabled="project" /> </el-form-item> </el-col> <el-col :span="8"> @@ -108,7 +108,6 @@ import type { FormInstance } from 'element-plus' import projectTable from "@/components/project/index.vue" import Popup from '@/components/popup/index.vue' -import feedback from '@/utils/feedback' import { apiProjectFollowUpAdd, apiProjectFollowUpEdit, apiProjectFollowUpDetail } from '@/api/project_follow_up' import type { PropType } from 'vue' @@ -120,14 +119,13 @@ const handleAvatarSuccess_four = (response: any) => { }; // 删除上传的文件 const delFileFn = (index: number) => { formData.annex.splice(index, 1) } -// <annexUpload :annex="formData.annex" @handleAvatarSuccess="handleAvatarSuccess_four" -// @delFile="delFileFn" /> -defineProps({ +const props = defineProps({ dictData: { type: Object as PropType<Record<string, any[]>>, default: () => ({}) - } + }, + project: Object }) const emit = defineEmits(['success', 'close']) const formRef = shallowRef<FormInstance>() @@ -139,13 +137,8 @@ const custom_name = ref('') const formDataannex = reactive([]) // dialog const showDialog = ref(false) -const customEvent = (e: any) => { - formData.project_id = e.id; - project_name.value = e.name; - project_code.value = e.project_code; - custom_name.value = e.custom_name; - showDialog.value = false; -}; + + // 弹窗标题 const popupTitle = computed(() => { @@ -174,6 +167,18 @@ const formData = reactive({ annex: [] }) +const customEvent = (e: any) => { + formData.project_id = e.id; + project_name.value = e.name; + project_code.value = e.project_code; + custom_name.value = e.custom_name; + showDialog.value = false; +}; + + +if (props.project) { + customEvent(props.project) +} // 表单验证 const formRules = reactive<any>({ diff --git a/src/views/project_follow_up/index.vue b/src/views/project_follow_up/index.vue index 26d1c22..3867583 100644 --- a/src/views/project_follow_up/index.vue +++ b/src/views/project_follow_up/index.vue @@ -9,28 +9,32 @@ <el-form-item label="跟进类型" prop="follow_type"> <el-select v-model="queryParams.follow_type" class="w-[280px]" clearable placeholder="请选择跟进类型"> <el-option label="全部" value=""></el-option> - <el-option v-for="(item, index) in dictData.follow_type" :key="index" :label="item.name" :value="item.value" /> + <el-option v-for="(item, index) in dictData.follow_type" :key="index" :label="item.name" + :value="item.value" /> </el-select> </el-form-item> <el-form-item label="项目把握度" prop="project_assurance"> <el-select v-model="queryParams.project_assurance" class="w-[280px]" clearable placeholder="请选择项目把握度"> - <el-option v-for="(item, index) in dictData.project_assurance" :key="index" :label="item.name" :value="item.value" /> + <el-option v-for="(item, index) in dictData.project_assurance" :key="index" :label="item.name" + :value="item.value" /> </el-select> </el-form-item> <el-form-item label="跟进状态" prop="follow_status"> <el-select v-model="queryParams.follow_status" class="w-[280px]" clearable placeholder="请选择跟进状态"> - <el-option v-for="(item, index) in dictData.follow_status" :key="index" :label="item.name" :value="item.value" /> + <el-option v-for="(item, index) in dictData.follow_status" :key="index" :label="item.name" + :value="item.value" /> </el-select> </el-form-item> <el-form-item label="跟进阶段" prop="follow_stage"> <el-select v-model="queryParams.follow_stage" class="w-[280px]" clearable placeholder="请输入跟进阶段"> - <el-option v-for="(item, index) in dictData.follow_stage" :key="index" :label="item.name" :value="item.value" /> + <el-option v-for="(item, index) in dictData.follow_stage" :key="index" :label="item.name" + :value="item.value" /> </el-select> </el-form-item> @@ -75,7 +79,8 @@ </template> 新增 </el-button> - <el-button v-perms="['project.project_follow_up/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)"> + <el-button v-perms="['project.project_follow_up/delete']" :disabled="!selectData.length" + @click="handleDelete(selectData)"> 删除 </el-button> <div class="mt-4"> @@ -121,13 +126,14 @@ '' }}</span> </template> </el-table-column> - <el-table-column label="" prop="ceate_time" show-overflow-tooltip /> <el-table-column label="操作" width="160" fixed="right"> <template #default="{ row }"> - <el-button v-perms="['project.project_follow_up/edit']" type="primary" link @click="handleEdit(row)"> + <el-button v-perms="['project.project_follow_up/edit']" type="primary" link + @click="handleEdit(row)"> 编辑 </el-button> - <el-button v-perms="['project.project_follow_up/delete']" type="danger" link @click="handleDelete(row.id)"> + <el-button v-perms="['project.project_follow_up/delete']" type="danger" link + @click="handleDelete(row.id)"> 删除 </el-button> <el-button v-perms="['project.project_follow_up/detail']" link @click="handledetail(row)"> diff --git a/yarn.lock b/yarn.lock index 256b09c..63881bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -646,10 +646,10 @@ "@babel/plugin-transform-typescript" "^7.18.8" "@vue/babel-plugin-jsx" "^1.1.1" -"@vitejs/plugin-vue@^3.0.0": - "integrity" "sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==" - "resolved" "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz" - "version" "3.0.1" +"@vitejs/plugin-vue@^3.2.0": + "integrity" "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==" + "resolved" "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz" + "version" "3.2.0" "@volar/code-gen@0.38.9": "integrity" "sha512-n6LClucfA+37rQeskvh9vDoZV1VvCVNy++MAPKj2dT4FT+Fbmty/SDQqnsEBtdEe6E3OQctFvA/IcKsx3Mns0A=="