|
@@ -1,21 +1,17 @@
|
|
|
<template>
|
|
|
<div class="oa-sys-list-view">
|
|
|
<div class="searchBox">
|
|
|
- <div class="form">
|
|
|
- <span class="formSpan">年份:</span>
|
|
|
- <el-input v-model="queryParams.xmbh" placeholder="请输入项目编号" style="width: 160px" />
|
|
|
- </div>
|
|
|
<div class="form">
|
|
|
<span class="formSpan">项目名称:</span>
|
|
|
<el-input v-model="queryParams.xmmc" placeholder="请输入项目名称" style="width: 210px" />
|
|
|
</div>
|
|
|
<div class="form">
|
|
|
<span class="formSpan">项目部门:</span>
|
|
|
- <DeptTree v-model="queryParams['deptId']" placeholder="请选择部门" />
|
|
|
+ <DeptTree v-model="queryParams['xmbmId']" placeholder="请选择部门" />
|
|
|
</div>
|
|
|
<div class="form">
|
|
|
<span class="formSpan">跟踪人员:</span>
|
|
|
- <UserOrgTree v-model="queryParams['xmjlId']" :all="true" placeholder="请选择项目经理" />
|
|
|
+ <UserOrgTree v-model="queryParams['gzryId']" :all="true" placeholder="请选择项目经理" />
|
|
|
</div>
|
|
|
<div class="from">
|
|
|
<div class="btnBox">
|
|
@@ -23,7 +19,7 @@
|
|
|
<img src="@/assets/imgs/OA/search.png" class="mr-8px" alt="" />
|
|
|
查询</el-button
|
|
|
>
|
|
|
- <el-button type="primary" @click="addHandle">
|
|
|
+ <el-button type="primary" @click="addOrEditHandle()">
|
|
|
<img src="@/assets/imgs/OA/open.png" class="mr-8px" alt="" />
|
|
|
新增</el-button
|
|
|
>
|
|
@@ -59,32 +55,42 @@
|
|
|
:show-overflow-tooltip="true"
|
|
|
prop="xmmc"
|
|
|
label="项目名称"
|
|
|
- :min-width="250"
|
|
|
+ :min-width="220"
|
|
|
/>
|
|
|
- <el-table-column prop="lxsj" label="跟踪人员" width="140" />
|
|
|
+ <el-table-column prop="gzry" label="跟踪人员" width="140" />
|
|
|
<el-table-column
|
|
|
- prop="zrbm"
|
|
|
+ prop="ygje"
|
|
|
label="预估金额(万元)"
|
|
|
:show-overflow-tooltip="true"
|
|
|
width="200"
|
|
|
/>
|
|
|
- <el-table-column prop="xmjl" label="甲方" width="120" />
|
|
|
- <el-table-column prop="xmjl" label="甲方对接人" width="120" />
|
|
|
- <el-table-column prop="xmjl" label="项目归属部门" width="120" />
|
|
|
- <el-table-column prop="xmjl" label="行政区" width="120" />
|
|
|
- <el-table-column prop="xmzt" label="项目状态" width="120">
|
|
|
+ <el-table-column prop="jf" label="甲方" width="120" />
|
|
|
+ <el-table-column prop="jfdjr" label="甲方对接人" width="120" />
|
|
|
+ <el-table-column prop="xmbm" label="项目归属部门" width="120" />
|
|
|
+ <el-table-column prop="xzqdm" label="行政区" width="120" />
|
|
|
+ <el-table-column prop="zt" label="状态" width="120">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ ztMap[scope.row.zt] }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="xmjl" label="开关" width="120">
|
|
|
<template #default="scope">
|
|
|
- {{ getDictLabel(DICT_TYPE.PROJECT_STATUS, scope.row.xmzt) }}
|
|
|
+ <el-switch
|
|
|
+ v-model="scope.row.status"
|
|
|
+ :active-value="0"
|
|
|
+ @change="switchChange(scope.row)"
|
|
|
+ :inactive-value="1"
|
|
|
+ />
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="xmjl" label="开关" width="120" />
|
|
|
|
|
|
<el-table-column label="操作" width="80" fixed="right">
|
|
|
<template #default="scope">
|
|
|
- <div class="operateBtn" @click="operateClick(scope.row)">
|
|
|
- <span>查看</span>
|
|
|
- </div>
|
|
|
- <div class="operateBtn" @click="operateClick(scope.row)">
|
|
|
+ <div
|
|
|
+ class="operateBtn"
|
|
|
+ @click="addOrEditHandle(scope.row)"
|
|
|
+ v-if="scope.row.gzryId === user.user.id"
|
|
|
+ >
|
|
|
<span>编辑</span>
|
|
|
</div>
|
|
|
</template>
|
|
@@ -102,7 +108,7 @@
|
|
|
/>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <el-dialog v-model="dialogVisible" title="项目跟踪填报" width="660px" align-center>
|
|
|
+ <el-dialog v-model="dialogVisible" :title="dialogTitle" width="660px" align-center>
|
|
|
<el-form
|
|
|
ref="ruleFormRef"
|
|
|
style="width: 600px"
|
|
@@ -112,157 +118,196 @@
|
|
|
status-icon
|
|
|
>
|
|
|
<el-form-item label="项目名称" prop="name">
|
|
|
- <el-input v-model="ruleForm.name" />
|
|
|
+ <el-input v-model="formData.xmmc" />
|
|
|
</el-form-item>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="跟踪人员" prop="region">
|
|
|
- <el-select v-model="ruleForm.region" placeholder="Activity zone">
|
|
|
- <el-option label="Zone one" value="shanghai" />
|
|
|
- <el-option label="Zone two" value="beijing" />
|
|
|
- </el-select>
|
|
|
+ <UserOrgTree
|
|
|
+ v-model="formData.gzryId"
|
|
|
+ :all="true"
|
|
|
+ placeholder="请选择跟踪人员"
|
|
|
+ @node-click="(item) => treeNodeClick(item, 'gzry')"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="甲方" prop="name">
|
|
|
- <el-input v-model="ruleForm.name" />
|
|
|
+ <el-input v-model="formData.jf" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="预估金额(万元)" prop="name">
|
|
|
- <el-input v-model="ruleForm.name" />
|
|
|
+ <el-input v-model="formData.ygje" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="甲方对接人" prop="name">
|
|
|
- <el-input v-model="ruleForm.name" />
|
|
|
+ <el-input v-model="formData.jfdjr" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="项目归属部门" prop="region">
|
|
|
- <el-select v-model="ruleForm.region" placeholder="Activity zone">
|
|
|
- <el-option label="Zone one" value="shanghai" />
|
|
|
- <el-option label="Zone two" value="beijing" />
|
|
|
- </el-select>
|
|
|
+ <DeptTree
|
|
|
+ v-model="formData.xmbmId"
|
|
|
+ @node-click="(item) => treeNodeClick(item, 'xmbm')"
|
|
|
+ placeholder="请选择部门"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="行政区" prop="region">
|
|
|
- <el-select v-model="ruleForm.region" placeholder="Activity zone">
|
|
|
- <el-option label="Zone one" value="shanghai" />
|
|
|
- <el-option label="Zone two" value="beijing" />
|
|
|
- </el-select>
|
|
|
+ <DistrictTree
|
|
|
+ class="form-item-disable-style"
|
|
|
+ v-model="formData.xzqdm"
|
|
|
+ @node-click="(item) => treeNodeClick(item, 'xzqmc')"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="状态" prop="region">
|
|
|
- <el-select v-model="ruleForm.region" placeholder="Activity zone">
|
|
|
- <el-option label="Zone one" value="shanghai" />
|
|
|
- <el-option label="Zone two" value="beijing" />
|
|
|
+ <el-select v-model="formData.zt" placeholder="请选择状态" style="width: 100%">
|
|
|
+ <el-option label="谋划" value="0" />
|
|
|
+ <el-option label="待上会" value="1" />
|
|
|
+ <el-option label="待招标" value="2" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="谁可见" prop="region">
|
|
|
- <el-select v-model="ruleForm.region" placeholder="Activity zone">
|
|
|
- <el-option label="Zone one" value="shanghai" />
|
|
|
- <el-option label="Zone two" value="beijing" />
|
|
|
- </el-select>
|
|
|
+ <UserOrgTree
|
|
|
+ v-model="formData.visibleUserIds"
|
|
|
+ :all="true"
|
|
|
+ placeholder="请选择跟谁可见"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
<el-form-item label="备注" prop="desc">
|
|
|
- <el-input v-model="ruleForm.desc" type="textarea" />
|
|
|
+ <el-input v-model="formData.bz" type="textarea" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<div class="dialog-footer">
|
|
|
<el-button @click="dialogVisible = false">关闭</el-button>
|
|
|
- <el-button type="primary" @click="onSaveHandle"> 保存 </el-button>
|
|
|
+ <el-button type="primary" @click="saveProjectTracking"> 保存 </el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
|
-import { useRouter } from 'vue-router'
|
|
|
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
|
|
|
-import { useMixins, infoList } from './common'
|
|
|
+import { IFormType, useMixins, infoList, user } from './common'
|
|
|
import request from '@/config/axios'
|
|
|
import { getAssetURL } from '@/utils/auth'
|
|
|
import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
|
|
|
import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
|
|
|
+import DistrictTree from '@/views/OaSystem/components/DistrictTree/index.vue'
|
|
|
|
|
|
-defineOptions({ name: 'ProjectBook' })
|
|
|
-const router = useRouter()
|
|
|
+defineOptions({ name: 'ProjectTrack' })
|
|
|
+
|
|
|
+const ztMap = {
|
|
|
+ '0': '谋划',
|
|
|
+ '1': '待上会',
|
|
|
+ '2': '待招标'
|
|
|
+}
|
|
|
const tableRef: any = ref(null)
|
|
|
const tableHeight: any = ref(0)
|
|
|
-const { queryParams, setSearchParams } = useMixins()
|
|
|
+const { queryParams, formData, initFormData } = useMixins()
|
|
|
|
|
|
const handleCurrentChange = (pageNo: number) => {
|
|
|
queryParams.pageNo = pageNo
|
|
|
- queryProjectListAjax()
|
|
|
+ queryProjectTrackByPage()
|
|
|
}
|
|
|
-interface IFormType {}
|
|
|
-const ruleForm = ref<IFormType>({
|
|
|
- name: ''
|
|
|
-})
|
|
|
/**
|
|
|
- * 操作:查看、编辑
|
|
|
+ * 项目跟踪:新增、编辑
|
|
|
*/
|
|
|
+const dialogTitle = ref<string>('项目跟踪填报')
|
|
|
const dialogVisible = ref<boolean>(false)
|
|
|
-//type 0 查看 1 编辑
|
|
|
-const operateClick = (row: any, type: number = 0) => {
|
|
|
+const addOrEditHandle = (row?: IFormType) => {
|
|
|
dialogVisible.value = true
|
|
|
+ if (!row) {
|
|
|
+ initFormData()
|
|
|
+ dialogTitle.value = '项目跟踪填报'
|
|
|
+ } else {
|
|
|
+ dialogTitle.value = '项目跟踪编辑'
|
|
|
+ queryProjectTrackByDetail(row['id']).then((result) => {
|
|
|
+ initFormData(result as any)
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
-/**
|
|
|
- * 新建项目跟踪
|
|
|
- */
|
|
|
-const addHandle = () => {
|
|
|
- dialogVisible.value = true
|
|
|
+const treeNodeClick = (item, type: string) => {
|
|
|
+ if (!item) return
|
|
|
+ formData.value[type] = item['label'] || item['name']
|
|
|
+}
|
|
|
+const saveProjectTracking = async (): Promise<void> => {
|
|
|
+ const urlApi = `/projectTracking/save`
|
|
|
+ const sendData = {
|
|
|
+ ...formData.value
|
|
|
+ }
|
|
|
+ const result = await request.post({ url: urlApi, data: sendData }, '/business')
|
|
|
+ if (result) {
|
|
|
+ searchHandle()
|
|
|
+ dialogVisible.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+const switchChange = (item) => {
|
|
|
+ console.log(item.status)
|
|
|
+ updateStatus({
|
|
|
+ id: item['id'],
|
|
|
+ status: item['status']
|
|
|
+ })
|
|
|
+}
|
|
|
+const updateStatus = async (data: { id: string; status: string }): Promise<void> => {
|
|
|
+ const urlApi = `/update-status`
|
|
|
+ return await request.put({ url: urlApi, data: data }, '/business')
|
|
|
}
|
|
|
const tableData = ref<Array<any>>([])
|
|
|
const total = ref<number>()
|
|
|
const searchHandle: () => void = () => {
|
|
|
- queryProjectCalculate()
|
|
|
- queryProjectListAjax()
|
|
|
+ queryParams.pageNo = 1
|
|
|
+ queryProjectTrackingSummary()
|
|
|
+ queryProjectTrackByPage()
|
|
|
}
|
|
|
-const queryProjectListAjax = async (): Promise<void> => {
|
|
|
- const urlApi = `/project/page`
|
|
|
- setSearchParams()
|
|
|
+const queryProjectTrackByPage = async (): Promise<void> => {
|
|
|
+ const urlApi = `/projectTracking/page`
|
|
|
const sendData = {
|
|
|
- ...queryParams,
|
|
|
- pageSize: 15
|
|
|
+ ...queryParams
|
|
|
}
|
|
|
const result = await request.get({ url: urlApi, params: sendData }, '/business')
|
|
|
- tableData.value = result['records']
|
|
|
+ tableData.value = result['list']
|
|
|
total.value = result['total']
|
|
|
}
|
|
|
-queryProjectListAjax()
|
|
|
+const queryProjectTrackByDetail = async (id: string): Promise<void> => {
|
|
|
+ const urlApi = `/projectTracking/getById`
|
|
|
+ const sendData = {
|
|
|
+ id
|
|
|
+ }
|
|
|
+ return await request.get({ url: urlApi, params: sendData }, '/business')
|
|
|
+}
|
|
|
+queryProjectTrackByPage()
|
|
|
|
|
|
/**
|
|
|
- * 获取项目台账金额计算
|
|
|
+ * 项目金额、项目个数汇总
|
|
|
*/
|
|
|
-const queryProjectCalculate = async (): Promise<void> => {
|
|
|
- const urlApi = `/project/calculate`
|
|
|
- setSearchParams()
|
|
|
+const queryProjectTrackingSummary = async (): Promise<void> => {
|
|
|
+ const urlApi = `/projectTracking/summary`
|
|
|
const sendData = {
|
|
|
...queryParams
|
|
|
}
|
|
|
const result = await request.get({ url: urlApi, params: sendData }, '/business')
|
|
|
- if (result) {
|
|
|
- infoList[0]['num'] = result.output ?? 0
|
|
|
- infoList[1]['num'] = result.cost ?? 0
|
|
|
- }
|
|
|
+ infoList[0]['num'] = result ? result.amount ?? 0 : 0
|
|
|
+ infoList[1]['num'] = result ? result.nums ?? 0 : 0
|
|
|
}
|
|
|
-queryProjectCalculate()
|
|
|
-const onSaveHandle = () => {}
|
|
|
+queryProjectTrackingSummary()
|
|
|
onMounted(() => {
|
|
|
tableHeight.value = tableRef.value.clientHeight
|
|
|
})
|