代码更新
This commit is contained in:
parent
64e8e773f5
commit
e348783ec2
.env.development.exampleyarn.lock
src
api
components
config
views
bid_bidding_decision
bid_buy_bidding_document
custom
custom_follow
custom_service
financialManagement/Management
addexpense.vueadjustmentdetails.vuebudgetadjustment.vuebudgetdetails.vuecostbudget.vueeditcost.vueexpenseaccount.vueindex.vue
organization
permission/admin
project
project_follow_up
project_pre_sales_members
projectmanagement/list
quotation
@ -1,4 +1,4 @@
|
||||
|
||||
NODE_ENV = 'production'
|
||||
# Base API
|
||||
VITE_APP_BASE_URL='http://a.com/'
|
||||
VITE_APP_BASE_URL='https://ceshi-engineering.lihaink.cn'
|
@ -11,3 +11,30 @@ export function apiCityList(params: any) {
|
||||
export function apiAreaList(params: any) {
|
||||
return request.get({ url: "/common/area", params });
|
||||
}
|
||||
|
||||
|
||||
//获取所有人员
|
||||
export function getAdminsByAll(params: any) {
|
||||
return request.get({ url: "/auth.admin/getAdminsByAll", params });
|
||||
}
|
||||
|
||||
//获取某个部门下的所有人员
|
||||
|
||||
export function getAdminsByDept(params: any) {
|
||||
return request.get({ url: "/auth.admin/getAdminsByDept", params });
|
||||
}
|
||||
|
||||
//获取某个岗位下的所有人员
|
||||
export function getAdminsByJob(params: any) {
|
||||
return request.get({ url: "/auth.admin/getAdminsByJob", params });
|
||||
}
|
||||
|
||||
//获取所有岗位
|
||||
export function getAllJobs(params: any) {
|
||||
return request.get({ url: "/dept.jobs/getAllJobs", params });
|
||||
}
|
||||
|
||||
//获取所有部门
|
||||
export function getAllDept(params: any) {
|
||||
return request.get({ url: "/dept.dept/getAllDept", params });
|
||||
}
|
@ -26,6 +26,7 @@ export function deptDetail(params: any) {
|
||||
}
|
||||
|
||||
// 部门列表全部
|
||||
export function deptAll() {
|
||||
return request.get({ url: '/dept.dept/all' })
|
||||
export function deptAll(params: any) {
|
||||
|
||||
return request.get({ url: '/dept.dept/listToOrg' , params})
|
||||
}
|
||||
|
32
src/api/org/organization.ts
Normal file
32
src/api/org/organization.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 组织列表
|
||||
export function orgsLists(params?: any) {
|
||||
return request.get({ url: '/dept.orgs/lists', params })
|
||||
}
|
||||
|
||||
// 添加组织
|
||||
export function orgsAdd(params: any) {
|
||||
return request.post({ url: '/dept.orgs/add', params })
|
||||
}
|
||||
|
||||
// 编辑组织
|
||||
export function orgsEdit(params: any) {
|
||||
return request.post({ url: '/dept.orgs/edit', params })
|
||||
}
|
||||
|
||||
// 删除组织
|
||||
export function orgsDelete(params: any) {
|
||||
return request.post({ url: '/dept.orgs/delete', params })
|
||||
}
|
||||
|
||||
// 组织详情
|
||||
export function orgsDetail(params: any) {
|
||||
return request.get({ url: '/dept.orgs/detail', params })
|
||||
}
|
||||
|
||||
|
||||
// 所有组织
|
||||
export function getAll() {
|
||||
return request.get({ url: '/dept.orgs/getAll'})
|
||||
}
|
@ -7,7 +7,7 @@ export function jobsLists(params: any) {
|
||||
|
||||
// 岗位列表全部
|
||||
export function jobsAll(params: any) {
|
||||
return request.get({ url: '/dept.jobs/all', params })
|
||||
return request.get({ url: '/dept.jobs/listToDept', params })
|
||||
}
|
||||
|
||||
// 添加岗位
|
||||
|
71
src/components/budget/index.vue
Normal file
71
src/components/budget/index.vue
Normal file
@ -0,0 +1,71 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @cell-click="handleCurrentChange">
|
||||
<el-table-column label="序号" property="name" />
|
||||
<el-table-column label="年份 " property="custom_type" />
|
||||
<el-table-column label="一级科目" property="credit_rating" />
|
||||
<el-table-column label="二级科目" property="province_name" />
|
||||
<el-table-column label="一月" property="city_name" />
|
||||
<el-table-column label="二月" property="street_name" />
|
||||
<el-table-column label="三月" property="master_name" />
|
||||
<el-table-column label="四月" property="master_phone" />
|
||||
<el-table-column label="五月" property="master_phone" />
|
||||
<el-table-column label="六月" property="master_phone" />
|
||||
<el-table-column label="七月" property="master_phone" />
|
||||
<el-table-column label="八月" property="master_phone" />
|
||||
<el-table-column label="九月" property="master_phone" />
|
||||
<el-table-column label="十月" property="master_phone" />
|
||||
<el-table-column label="十一月" property="master_phone" />
|
||||
<el-table-column label="十二月" property="master_phone" />
|
||||
|
||||
</el-table>
|
||||
|
||||
</div>
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { usePaging } from "@/hooks/usePaging"
|
||||
import { useDictData } from "@/hooks/useDictOptions"
|
||||
import { apiCustomLists } from '@/api/custom'
|
||||
import { defineEmits } from "vue"
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: ''
|
||||
});
|
||||
|
||||
|
||||
// 选中数据
|
||||
const emits = defineEmits(["customEvent"]);
|
||||
|
||||
// 选中数据子父传递
|
||||
const handleCurrentChange = (value: any) => {
|
||||
emits("customEvent", value);
|
||||
};
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams,
|
||||
});
|
||||
|
||||
getLists();
|
||||
</script>
|
63
src/components/product/index.vue
Normal file
63
src/components/product/index.vue
Normal file
@ -0,0 +1,63 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="查询" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @cell-click="handleCurrentChange">
|
||||
<el-table-column label="序号" property="name" />
|
||||
<el-table-column label="材料大类" property="custom_type" />
|
||||
<el-table-column label="材料名称" property="credit_rating" />
|
||||
<el-table-column label="材料编码" property="province_name" />
|
||||
<el-table-column label="品牌" property="city_name" />
|
||||
<el-table-column label="单位" property="street_name" />
|
||||
<el-table-column label="参数说明" property="master_name" />
|
||||
|
||||
</el-table>
|
||||
|
||||
</div>
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { usePaging } from "@/hooks/usePaging"
|
||||
import { useDictData } from "@/hooks/useDictOptions"
|
||||
import { apiCustomLists } from '@/api/custom'
|
||||
import { defineEmits } from "vue"
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: ''
|
||||
});
|
||||
|
||||
|
||||
// 选中数据
|
||||
const emits = defineEmits(["customEvent"]);
|
||||
|
||||
// 选中数据子父传递
|
||||
const handleCurrentChange = (value: any) => {
|
||||
emits("customEvent", value);
|
||||
};
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams,
|
||||
});
|
||||
|
||||
getLists();
|
||||
</script>
|
@ -2,15 +2,8 @@
|
||||
<div>
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户" prop="custom_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.custom_name" clearable placeholder="请输入客户昵称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目类型" prop="project_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.project_type" clearable placeholder="请选择项目类型">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.project_type" :key="index" :label="item.name"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
<el-form-item label="查询" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
@ -18,61 +11,20 @@
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<div class="mt-4">
|
||||
<!-- <el-table :data="pager.lists" >
|
||||
<el-table-column label="客户名称" property="name" />
|
||||
<el-table-column label="客户属性" property="custom_type" />
|
||||
<el-table-column label="信用度" property="credit_rating" />
|
||||
<el-table-column label="省" property="province_name" />
|
||||
<el-table-column label="市" property="city_name" />
|
||||
<el-table-column label="区" property="street_name" />
|
||||
<el-table-column label="主联系人" property="master_name" />
|
||||
<el-table-column label="联系方式" property="master_phone" />
|
||||
</el-table> -->
|
||||
<el-table :data="pager.lists" @cell-click="handleCurrentChange">
|
||||
<el-table-column label="客户" prop="custom_name" show-overflow-tooltip />
|
||||
<el-table-column label="序号" property="name" />
|
||||
<el-table-column label="项目名称" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
|
||||
<el-table-column label="项目类型" prop="project_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.project_type" :value="row.project_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
|
||||
<el-table-column label="项目内容" prop="project_content">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.project_content" :value="row.project_content" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目估算" prop="project_estimation" show-overflow-tooltip />
|
||||
<el-table-column label="项目所在地" prop="project_address" show-overflow-tooltip />
|
||||
<el-table-column label="预计工期" prop="estimated_construction" show-overflow-tooltip />
|
||||
<el-table-column label="投标时间" prop="bidding_time">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.bidding_time ? timeFormat(row.bidding_time, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="招标方式" prop="bidding_method">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.bidding_method" :value="row.bidding_method" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="联系人" prop="contacts" show-overflow-tooltip />
|
||||
<el-table-column label="联系人职位" prop="position" show-overflow-tooltip />
|
||||
<el-table-column label="联系电话" prop="telephone" show-overflow-tooltip />
|
||||
<el-table-column label="联系人部门" prop="department" show-overflow-tooltip />
|
||||
<el-table-column label="负责人" prop="person" show-overflow-tooltip />
|
||||
<el-table-column label="关系度" prop="relationship">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.relationship" :value="row.relationship" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="发现时间" prop="discovery_time">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.discovery_time ? timeFormat(row.discovery_time, 'yyyy-mm-dd hh:MM:ss') : ''
|
||||
}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="项目所在地" prop="project_address" show-overflow-tooltip />
|
||||
<el-table-column label="战略意义" prop="strategic_significance">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.strategic_significance" :value="row.strategic_significance" />
|
||||
@ -88,11 +40,34 @@
|
||||
<dict-value :options="dictData.unit_nature" :value="row.unit_nature" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" prop="status" show-overflow-tooltip />
|
||||
<el-table-column label="招标方式" prop="bidding_method">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.bidding_method" :value="row.bidding_method" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="投标时间" property="master_phone" />
|
||||
<el-table-column label="预计工期" property="master_phone" />
|
||||
<el-table-column label="项目估算(万元)" property="master_phone" />
|
||||
<el-table-column label="项目估算(外币)" property="master_phone" />
|
||||
<el-table-column label="联系人" property="master_phone" />
|
||||
<el-table-column label="联系电话" property="master_phone" />
|
||||
<el-table-column label="联系人部门" property="master_phone" />
|
||||
<el-table-column label="联系人职位" property="master_phone" />
|
||||
<el-table-column label="关系度" property="master_phone" />
|
||||
<el-table-column label="发现时间" property="master_phone" />
|
||||
<el-table-column label="信息来源" prop="industry">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.information_sources" :value="row.information_sources" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="负责人" property="person" />
|
||||
<el-table-column label="项目内容" property="name" />
|
||||
<el-table-column label="竞争对手" property="master_phone" />
|
||||
</el-table>
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<div class="flex mt-4 justify-end">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
@ -114,7 +89,6 @@ const queryParams = reactive({
|
||||
});
|
||||
const { dictData } = useDictData('project_type,project_content,bidding_method,relationship,information_sources,construction_funds_sources,construction_financial_status,construction_recognition,my_construction_recognition,strategic_significance,industry,unit_nature')
|
||||
|
||||
|
||||
// 选中数据
|
||||
const emits = defineEmits(["customEvent"]);
|
||||
|
177
src/components/reviewprocess/index.vue
Normal file
177
src/components/reviewprocess/index.vue
Normal file
@ -0,0 +1,177 @@
|
||||
<template>
|
||||
<div> <el-card>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
|
||||
<el-tab-pane label="处理意见" name="first" class="demo-tabs-a">
|
||||
<div>当前步骤: 发起工单</div>
|
||||
<div>处理动作: 发起流程</div>
|
||||
<div>送审步骤: 技术处理</div>
|
||||
<div class="userlist">
|
||||
<div>指定处理人:</div>
|
||||
<div v-for="item in userlist" class="userlist-con">
|
||||
<img src="@/assets/images/no_perms.png" alt="" />
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
<el-form-item label="处理意见" prop="content">
|
||||
<el-input v-model="content" class="w-[1280px]" clearable placeholder="请输入处理意见" type="textarea" />
|
||||
</el-form-item>
|
||||
|
||||
<div class="flex user">
|
||||
<div>流程抄送:</div>
|
||||
<div>0人</div>
|
||||
<div @click="dialogVisible = true"><img src="@/assets/images/no_perms.png" alt="" /></div>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="流程日志" name="second">暂无流程日志!</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-card>
|
||||
<el-dialog v-model="dialogVisible" title="人员选择器" width="30%" :before-close="handleClose">
|
||||
<div>
|
||||
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
|
||||
<el-radio-button :label="1">全部人员</el-radio-button>
|
||||
<el-radio-button :label="2">按部门筛选</el-radio-button>
|
||||
<el-radio-button :label="3">按岗位筛选</el-radio-button>
|
||||
</el-radio-group>
|
||||
|
||||
<div v-if="isCollapse == 1" style="margin-bottom: 20px">
|
||||
<el-input v-model="content" clearable placeholder="搜索人员" />
|
||||
<div style="margin-top: 20px">
|
||||
<el-radio-group v-model="radio">
|
||||
<el-radio :label="3">
|
||||
<div class="radio-con">
|
||||
<div class="radioa">
|
||||
<img src="@/assets/images/no_perms.png" alt="" />
|
||||
</div>
|
||||
<div class="radiob">
|
||||
<div class="radiob_a">test</div>
|
||||
<div class="radiob_b">企管宝/市场部/市场员</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-radio><br />
|
||||
</el-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isCollapse == 2">
|
||||
<div v-for="item in companylist">
|
||||
<div class="lad">{{ item.name1 }}</div>
|
||||
<div class="lad">
|
||||
<div>{{ item.name2 }}</div>
|
||||
<div>{{ item.name2 }}</div>
|
||||
<div>{{ item.name2 }}</div>
|
||||
<div>{{ item.name2 }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isCollapse == 3">
|
||||
<div>11</div>
|
||||
<div>111</div>
|
||||
<div>11</div>
|
||||
<div>11</div>
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dialogVisible = false"> 已选 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
|
||||
const active = ref(0);
|
||||
|
||||
const isCollapse = ref(1);
|
||||
const props = defineProps({
|
||||
list: {
|
||||
type: Array
|
||||
}
|
||||
})
|
||||
console.log(props.list)
|
||||
// const list = reactive([])
|
||||
// list.splice(0, list.length, ...props.list)
|
||||
const activeName = ref('first')
|
||||
const content = ref('')
|
||||
const userlist = reactive([{ name: 1 }, { name: 1 }, { name: 1 }, { name: 1 }]);
|
||||
const companylist = reactive([
|
||||
{
|
||||
name1: "哈哈公司",
|
||||
name2: "2222",
|
||||
},
|
||||
{
|
||||
name1: "哈哈公司",
|
||||
name2: "2222",
|
||||
},
|
||||
{
|
||||
name1: "哈哈公司",
|
||||
name2: "2222",
|
||||
},
|
||||
]);
|
||||
const next = () => {
|
||||
if (active.value++ > 2) active.value = 0;
|
||||
};
|
||||
const dialogVisible = ref(false);
|
||||
const handleClose = (done: () => void) => {
|
||||
done();
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.app-main {
|
||||
background-color: #fff !important;
|
||||
}
|
||||
|
||||
.demo-tabs-a {
|
||||
div {
|
||||
margin: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.userlist {
|
||||
display: flex;
|
||||
|
||||
img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
text-align: center;
|
||||
|
||||
.userlist-con {
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.user {
|
||||
img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.radio-con {
|
||||
display: flex;
|
||||
width: 500px;
|
||||
|
||||
.radioa {
|
||||
img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.lad {
|
||||
padding: 10px 0;
|
||||
border-bottom: 1px solid #f7f7f7;
|
||||
|
||||
div {
|
||||
padding: 10px 0;
|
||||
}
|
||||
}
|
||||
</style>
|
70
src/components/statistics/index.vue
Normal file
70
src/components/statistics/index.vue
Normal file
@ -0,0 +1,70 @@
|
||||
<template>
|
||||
<el-card>
|
||||
<div class="flex flex-wrap">
|
||||
<div class="head-con" v-for="(item, i) in list" :key="i" @click="dianji(i)" :style="{ backgroundColor: i === num ? '#3E8EF7' : '#fff' }">
|
||||
<div :class="{ bgcolor1: i === num, title: i !== num }">
|
||||
{{ item.name }}
|
||||
</div>
|
||||
<div :class="{ bgcolor2: i === num, detail: i !== num }">
|
||||
{{ item.count }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
const props = defineProps({
|
||||
list: {
|
||||
type: Array
|
||||
}
|
||||
})
|
||||
const list = reactive([])
|
||||
console.log(props.list)
|
||||
list.splice(0, list.length, ...props.list)
|
||||
const num = ref(-1);
|
||||
const dianji = (index: any) => {
|
||||
num.value = index;
|
||||
};
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
el-card {
|
||||
border-radius: 4px 0 4px 0 !important;
|
||||
}
|
||||
|
||||
.head-con {
|
||||
margin-right: 50px;
|
||||
padding: 10px;
|
||||
cursor: pointer;
|
||||
|
||||
.title {
|
||||
margin-bottom: 6px;
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.detail {
|
||||
color: #3e8ef7;
|
||||
text-align: center;
|
||||
font-size: 17px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.bgcolor1 {
|
||||
color: #fff;
|
||||
margin-bottom: 6px;
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.bgcolor2 {
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
font-size: 17px;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
</style>
|
@ -2,7 +2,7 @@ const config = {
|
||||
terminal: 1, //终端
|
||||
title: "后台管理系统", //网站默认标题
|
||||
version: "1.6.0", //版本号
|
||||
baseUrl: `${import.meta.env.VITE_APP_BASE_URL || "http://a.com"}/`, //请求接口域名
|
||||
baseUrl: `${import.meta.env.VITE_APP_BASE_URL || "https://ceshi-engineering.lihaink.cn"}/`, //请求接口域名
|
||||
urlPrefix: "adminapi", //请求默认前缀
|
||||
timeout: 10 * 1000, //请求超时时长
|
||||
};
|
||||
|
@ -1,95 +1,105 @@
|
||||
<template>
|
||||
<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="90px" :rules="formRules">
|
||||
<el-form-item label="" prop="project_id">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目估算" prop="project_estimation">
|
||||
<el-input v-model="formData.project_estimation" clearable placeholder="请输入项目估算" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标项目资金来源" prop="bidding_project_fund_source">
|
||||
<el-radio-group v-model="formData.bidding_project_fund_source" placeholder="请选择招标项目资金来源">
|
||||
<el-radio
|
||||
v-for="(item, index) in dictData.construction_funds_sources"
|
||||
:key="index"
|
||||
:label="parseInt(item.value)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="投标时间" prop="bidding_time">
|
||||
<el-input v-model="formData.bidding_time" clearable placeholder="请输入投标时间" />
|
||||
</el-form-item>
|
||||
<el-form-item label="购买标书时间" prop="buy_bid_document_date">
|
||||
<el-input v-model="formData.buy_bid_document_date" clearable placeholder="请输入购买标书时间" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标方式" prop="bid_type">
|
||||
<el-radio-group v-model="formData.bid_type" placeholder="请选择招标方式">
|
||||
<el-radio
|
||||
v-for="(item, index) in dictData.bidding_method"
|
||||
:key="index"
|
||||
:label="parseInt(item.value)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="竞争对手" prop="competitor">
|
||||
<el-input v-model="formData.competitor" clearable placeholder="请输入竞争对手" />
|
||||
</el-form-item>
|
||||
<el-form-item label="是否需要保证金" prop="is_margin">
|
||||
<el-radio-group v-model="formData.is_margin" placeholder="请选择是否需要保证金">
|
||||
<el-radio
|
||||
v-for="(item, index) in dictData.whether_status"
|
||||
:key="index"
|
||||
:label="parseInt(item.value)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="保证金金额" prop="margin_amount">
|
||||
<el-input v-model="formData.margin_amount" clearable placeholder="请输入保证金金额" />
|
||||
</el-form-item>
|
||||
<el-form-item label="开标日期" prop="bid_opening_date">
|
||||
<el-input v-model="formData.bid_opening_date" clearable placeholder="请输入开标日期" />
|
||||
</el-form-item>
|
||||
<el-form-item label="保证金退还时间" prop="margin_amount_return_date">
|
||||
<el-input v-model="formData.margin_amount_return_date" clearable placeholder="请输入保证金退还时间" />
|
||||
</el-form-item>
|
||||
<el-form-item label="有无内部资源" prop="is_internal_resources">
|
||||
<el-radio-group v-model="formData.is_internal_resources" placeholder="请选择有无内部资源">
|
||||
<el-radio
|
||||
v-for="(item, index) in dictData.whether_status"
|
||||
:key="index"
|
||||
:label="parseInt(item.value)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目把握度" prop="project_assurance">
|
||||
<el-input v-model="formData.project_assurance" clearable placeholder="请输入项目把握度" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标项目概况" prop="bid_project_overview">
|
||||
<el-input v-model="formData.bid_project_overview" clearable placeholder="请输入招标项目概况" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目简介" prop="project_desc">
|
||||
<el-input v-model="formData.project_desc" clearable placeholder="请输入项目简介" />
|
||||
</el-form-item>
|
||||
<el-form-item label="附件" prop="annex">
|
||||
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
|
||||
</el-form-item>
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="项目名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item></el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="客户名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="项目估算" prop="project_estimation" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_estimation" clearable placeholder="请输入项目估算" />
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="招标项目资金来源" label-width="130px" prop="bidding_project_fund_source">
|
||||
<el-radio-group v-model="formData.bidding_project_fund_source" placeholder="请选择招标项目资金来源">
|
||||
<el-radio v-for="(item, index) in dictData.construction_funds_sources" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="投标时间" prop="bidding_time">
|
||||
<!-- <el-input v-model="formData.bidding_time" clearable placeholder="请输入投标时间" />
|
||||
-->
|
||||
<el-date-picker v-model="formData.bidding_time" format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="请选择投标时间" clearable></el-date-picker>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="购买标书时间" prop="buy_bid_document_date">
|
||||
<!-- <el-input v-model="formData.buy_bid_document_date" clearable placeholder="请输入购买标书时间" /> -->
|
||||
<el-date-picker v-model="formData.buy_bid_document_date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="请输入购买标书时间" clearable></el-date-picker>
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="招标方式" prop="bid_type">
|
||||
<el-radio-group v-model="formData.bid_type" placeholder="请选择招标方式">
|
||||
<el-radio v-for="(item, index) in dictData.bidding_method" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="竞争对手" prop="competitor">
|
||||
<el-input v-model="formData.competitor" clearable placeholder="请输入竞争对手" />
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="是否需要保证金" prop="is_margin">
|
||||
<el-radio-group v-model="formData.is_margin" placeholder="请选择是否需要保证金">
|
||||
<el-radio v-for="(item, index) in dictData.whether_status" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="保证金金额" prop="margin_amount">
|
||||
<el-input v-model="formData.margin_amount" clearable placeholder="请输入保证金金额" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="开标日期" prop="bid_opening_date">
|
||||
<!-- <el-input v-model="formData.bid_opening_date" clearable placeholder="请输入开标日期" />
|
||||
-->
|
||||
<el-date-picker v-model="formData.bid_opening_date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="请输入开标日期" clearable></el-date-picker>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="保证金退还时间" prop="margin_amount_return_date">
|
||||
<!-- <el-input v-model="formData.margin_amount_return_date" clearable placeholder="请输入保证金退还时间" /> -->
|
||||
<el-date-picker v-model="formData.margin_amount_return_date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="请输入保证金退还时间" clearable></el-date-picker>
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="有无内部资源" prop="is_internal_resources">
|
||||
<el-radio-group v-model="formData.is_internal_resources" placeholder="请选择有无内部资源">
|
||||
<el-radio v-for="(item, index) in dictData.whether_status" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="项目把握度" prop="project_assurance">
|
||||
<el-input v-model="formData.project_assurance" clearable placeholder="请输入项目把握度" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="招标项目概况" prop="bid_project_overview">
|
||||
<el-input v-model="formData.bid_project_overview" clearable placeholder="请输入招标项目概况" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="项目简介" prop="project_desc">
|
||||
<el-input v-model="formData.project_desc" clearable placeholder="请输入项目简介" />
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="附件" prop="field127">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-button type="primary">
|
||||
上传
|
||||
</el-button>
|
||||
</el-upload>
|
||||
|
||||
<div>
|
||||
<div v-for="(item, index) in formData.annex" style="margin-left: 5px;display: block;">
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
|
||||
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</el-form-item></el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<reviewprocess />
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
@ -97,6 +107,7 @@
|
||||
<script lang="ts" setup name="bidBiddingDecisionEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import reviewprocess from '@/components/reviewprocess/index.vue'
|
||||
import { apiBidBiddingDecisionAdd, apiBidBiddingDecisionEdit, apiBidBiddingDecisionDetail } from '@/api/bid_bidding_decision'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import type { PropType } from 'vue'
|
||||
@ -110,7 +121,28 @@ const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
import configs from "@/config"
|
||||
const base_url = configs.baseUrl + configs.urlPrefix
|
||||
import useUserStore from "@/stores/modules/user";
|
||||
const userStore = useUserStore();
|
||||
// 上传文件
|
||||
const handleAvatarSuccess_four = (
|
||||
response,
|
||||
uploadFile
|
||||
) => {
|
||||
if (response.code == 0) {
|
||||
ElMessage.error(response.msg);
|
||||
return;
|
||||
}
|
||||
formData.annex.push(
|
||||
{ uri: response.data.uri, name: response.data.name }
|
||||
|
||||
);
|
||||
};
|
||||
// 删除上传的文件
|
||||
const delFileFn = (index: number) => {
|
||||
formData.annex.splice(index, 1)
|
||||
}
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
@ -136,6 +168,7 @@ const formData = reactive({
|
||||
bid_project_overview: '',
|
||||
project_desc: '',
|
||||
annex: '',
|
||||
approve_id: ''
|
||||
})
|
||||
|
||||
|
||||
@ -153,8 +186,8 @@ const setFormData = async (data: Record<any, any>) => {
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
@ -168,9 +201,9 @@ const getDetail = async (row: Record<string, any>) => {
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
const data = { ...formData, }
|
||||
mode.value == 'edit'
|
||||
? await apiBidBiddingDecisionEdit(data)
|
||||
const data = { ...formData, }
|
||||
mode.value == 'edit'
|
||||
? await apiBidBiddingDecisionEdit(data)
|
||||
: await apiBidBiddingDecisionAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
|
@ -1,13 +1,19 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form
|
||||
class="mb-[-16px]"
|
||||
:model="queryParams"
|
||||
inline
|
||||
>
|
||||
<el-form-item label="" prop="project_id">
|
||||
<el-input class="w-[280px]" v-model="queryParams.project_id" clearable placeholder="请输入" />
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="项目" prop="invite_tenders_company_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.invite_tenders_company_name" clearable placeholder="请输入招标公司名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标项目资金来源" prop="bidding_project_fund_source">
|
||||
<el-select class="flex-1" v-model="queryParams.bidding_project_fund_source" clearable placeholder="请选择类型">
|
||||
<el-option v-for="(item, index) in dictData.construction_funds_sources" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="招标方式" prop="bid_type">
|
||||
<el-select class="flex-1" v-model="queryParams.bid_type" clearable placeholder="请选择类型">
|
||||
<el-option v-for="(item, index) in dictData.bidding_method" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
@ -22,18 +28,18 @@
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['bid.bid_bidding_decision/delete']"
|
||||
:disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)"
|
||||
>
|
||||
<el-button v-perms="['bid.bid_bidding_decision/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="项目估算" prop="project_estimation" show-overflow-tooltip />
|
||||
<el-table-column label="处理流程" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="流程步骤" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="流程编号" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="客户名称" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="项目名称" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="项目估算(万元)" prop="project_estimation" show-overflow-tooltip />
|
||||
<el-table-column label="招标项目资金来源" prop="bidding_project_fund_source">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.construction_funds_sources" :value="row.bidding_project_fund_source" />
|
||||
@ -47,11 +53,11 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="竞争对手" prop="competitor" show-overflow-tooltip />
|
||||
<el-table-column label="是否需要保证金" prop="is_margin">
|
||||
<!-- <el-table-column label="是否需要保证金" prop="is_margin">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.whether_status" :value="row.is_margin" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column> -->
|
||||
<el-table-column label="保证金金额" prop="margin_amount" show-overflow-tooltip />
|
||||
<el-table-column label="开标日期" prop="bid_opening_date" show-overflow-tooltip />
|
||||
<el-table-column label="保证金退还时间" prop="margin_amount_return_date" show-overflow-tooltip />
|
||||
@ -63,20 +69,10 @@
|
||||
<el-table-column label="项目把握度" prop="project_assurance" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['bid.bid_bidding_decision/edit']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleEdit(row)"
|
||||
>
|
||||
<el-button v-perms="['bid.bid_bidding_decision/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['bid.bid_bidding_decision/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
<el-button v-perms="['bid.bid_bidding_decision/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
@ -106,7 +102,9 @@ const showEdit = ref(false)
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
project_id: ''
|
||||
project_id: '',
|
||||
bidding_project_fund_source: '',
|
||||
bid_type: ""
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
|
@ -1,109 +1,102 @@
|
||||
<template>
|
||||
<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="90px" :rules="formRules">
|
||||
<el-form-item label="项目id" prop="project_id">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入项目id" />
|
||||
</el-form-item>
|
||||
<el-form-item label="标书编号" prop="bid_document_no">
|
||||
<el-input v-model="formData.bid_document_no" clearable placeholder="请输入标书编号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标公司名称" prop="invite_tenders_company_name">
|
||||
<el-input v-model="formData.invite_tenders_company_name" clearable placeholder="请输入招标公司名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="投标公司名称" prop="bid_company_name">
|
||||
<el-input v-model="formData.bid_company_name" clearable placeholder="请输入投标公司名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="购买人员" prop="buyer">
|
||||
<el-input v-model="formData.buyer" clearable placeholder="请输入购买人员" />
|
||||
</el-form-item>
|
||||
<el-form-item label="购买标书金额" prop="amount">
|
||||
<el-input v-model="formData.amount" clearable placeholder="请输入购买标书金额" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标项目资金来源" prop="project_fund_source">
|
||||
<el-radio-group v-model="formData.project_fund_source" placeholder="请选择招标项目资金来源">
|
||||
<el-radio
|
||||
v-for="(item, index) in dictData.construction_funds_sources"
|
||||
:key="index"
|
||||
:label="parseInt(item.value)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="投标时间" prop="bid_date">
|
||||
<el-date-picker
|
||||
class="flex-1 !flex"
|
||||
v-model="formData.bid_date"
|
||||
clearable
|
||||
type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择投标时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="购买标书时间" prop="buy_date">
|
||||
<el-date-picker
|
||||
class="flex-1 !flex"
|
||||
v-model="formData.buy_date"
|
||||
clearable
|
||||
type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="选择购买标书时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="招标方式" prop="invite_tenders_type">
|
||||
<el-checkbox-group v-model="formData.invite_tenders_type" placeholder="请选择招标方式">
|
||||
<el-checkbox
|
||||
v-for="(item, index) in dictData.bidding_method"
|
||||
:key="index"
|
||||
:label="item.value"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="投标地址" prop="bid_address">
|
||||
<el-input v-model="formData.bid_address" clearable placeholder="请输入投标地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="是否需要保证金" prop="is_margin">
|
||||
<el-radio-group v-model="formData.is_margin" placeholder="请选择是否需要保证金">
|
||||
<el-radio
|
||||
v-for="(item, index) in dictData.whether_status"
|
||||
:key="index"
|
||||
:label="parseInt(item.value)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="保证金金额" prop="margin_amount">
|
||||
<el-input v-model="formData.margin_amount" clearable placeholder="请输入保证金金额" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标项目慨况" prop="bid_project_overview">
|
||||
<el-input v-model="formData.bid_project_overview" clearable placeholder="请输入招标项目慨况" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目简介" prop="project_desc">
|
||||
<el-input v-model="formData.project_desc" clearable placeholder="请输入项目简介" />
|
||||
</el-form-item>
|
||||
<el-form-item label="附件" prop="annex">
|
||||
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
|
||||
</el-form-item>
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="130px" :rules="formRules">
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="项目名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="客户名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.project_id" clearable placeholder="请输入" />
|
||||
</el-form-item>
|
||||
</el-col><el-col :span="8">
|
||||
<el-form-item label="招标公司名称" prop="invite_tenders_company_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.invite_tenders_company_name" clearable placeholder="请输入招标公司名称" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="投标公司名称" prop="bid_company_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.bid_company_name" clearable placeholder="请输入投标公司名称" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="购买人员" prop="buyer">
|
||||
<el-input v-model="formData.buyer" clearable placeholder="请输入购买人员" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="购买标书金额" prop="amount">
|
||||
<el-input v-model="formData.amount" clearable placeholder="请输入购买标书金额" />
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="招标项目资金来源" prop="project_fund_source">
|
||||
<el-radio-group v-model="formData.project_fund_source" placeholder="请选择招标项目资金来源">
|
||||
<el-radio v-for="(item, index) in dictData.construction_funds_sources" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="投标时间" prop="bid_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.bid_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择投标时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col><el-col :span="8">
|
||||
<el-form-item label="购买标书时间" prop="buy_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.buy_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择购买标书时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col><el-col :span="24">
|
||||
<el-form-item label="招标方式" prop="invite_tenders_type">
|
||||
<el-radio-group v-model="formData.invite_tenders_type" placeholder="请选择招标方式">
|
||||
<el-radio v-for="(item, index) in dictData.bidding_method" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="投标地址" prop="bid_address">
|
||||
<el-input v-model="formData.bid_address" clearable placeholder="请输入投标地址" />
|
||||
</el-form-item></el-col><el-col :span="24">
|
||||
<el-form-item label="是否需要保证金" prop="is_margin">
|
||||
<el-radio-group v-model="formData.is_margin" placeholder="请选择是否需要保证金">
|
||||
<el-radio v-for="(item, index) in dictData.whether_status" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="保证金金额" prop="margin_amount">
|
||||
<el-input v-model="formData.margin_amount" clearable placeholder="请输入保证金金额" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="招标项目慨况" prop="bid_project_overview">
|
||||
<el-input v-model="formData.bid_project_overview" clearable placeholder="请输入招标项目慨况" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="项目简介" prop="project_desc">
|
||||
<el-input v-model="formData.project_desc" clearable placeholder="请输入项目简介" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="附件" prop="field127">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-button type="primary">
|
||||
上传
|
||||
</el-button>
|
||||
</el-upload>
|
||||
|
||||
<div>
|
||||
<div v-for="(item, index) in formannex" style="margin-left: 5px;display: block;">
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
|
||||
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<reviewprocess />
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="bidBuyBiddingDocumentEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import reviewprocess from '@/components/reviewprocess/index.vue'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiBidBuyBiddingDocumentAdd, apiBidBuyBiddingDocumentEdit, apiBidBuyBiddingDocumentDetail } from '@/api/bid_buy_bidding_document'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
@ -118,6 +111,25 @@ const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
import configs from "@/config"
|
||||
const base_url = configs.baseUrl + configs.urlPrefix
|
||||
import useUserStore from "@/stores/modules/user";
|
||||
const userStore = useUserStore();
|
||||
const formannex = reactive([])
|
||||
// 上传文件
|
||||
const handleAvatarSuccess_four = (
|
||||
response,
|
||||
uploadFile
|
||||
) => {
|
||||
if (response.code == 0) {
|
||||
ElMessage.error(response.msg);
|
||||
return;
|
||||
}
|
||||
formannex.push(
|
||||
{ uri: response.data.uri, name: response.data.name }
|
||||
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
// 弹窗标题
|
||||
@ -137,7 +149,7 @@ const formData = reactive({
|
||||
project_fund_source: '',
|
||||
bid_date: '',
|
||||
buy_date: '',
|
||||
invite_tenders_type: [],
|
||||
invite_tenders_type: '',
|
||||
bid_address: '',
|
||||
is_margin: '',
|
||||
margin_amount: '',
|
||||
@ -161,12 +173,15 @@ const setFormData = async (data: Record<any, any>) => {
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
|
||||
//@ts-ignore
|
||||
data.invite_tenders_type && (formData.invite_tenders_type = String(data.invite_tenders_type).split(","))
|
||||
formData.bid_date = timeFormat(formData.bid_date, 'yyyy-mm-dd hh:MM:ss')
|
||||
//@ts-ignore
|
||||
formData.bid_date = timeFormat(formData.bid_date,'yyyy-mm-dd hh:MM:ss')
|
||||
//@ts-ignore
|
||||
formData.buy_date = timeFormat(formData.buy_date,'yyyy-mm-dd hh:MM:ss')
|
||||
formData.buy_date = timeFormat(formData.buy_date, 'yyyy-mm-dd hh:MM:ss')
|
||||
}
|
||||
// 删除上传的文件
|
||||
const delFileFn = (index: number) => {
|
||||
formannex.splice(index, 1)
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
@ -179,10 +194,13 @@ const getDetail = async (row: Record<string, any>) => {
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
formData.annex = JSON.stringify(formannex.map(item => item.uri))
|
||||
|
||||
|
||||
await formRef.value?.validate()
|
||||
const data = { ...formData, invite_tenders_type: formData.invite_tenders_type.join(",") }
|
||||
mode.value == 'edit'
|
||||
? await apiBidBuyBiddingDocumentEdit(data)
|
||||
const data = { ...formData }
|
||||
mode.value == 'edit'
|
||||
? await apiBidBuyBiddingDocumentEdit(data)
|
||||
: await apiBidBuyBiddingDocumentAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
|
@ -1,23 +1,20 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form
|
||||
class="mb-[-16px]"
|
||||
:model="queryParams"
|
||||
inline
|
||||
>
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="项目id" prop="project_id">
|
||||
<el-input class="w-[280px]" v-model="queryParams.project_id" clearable placeholder="请输入项目id" />
|
||||
<el-input class="w-[250px]" v-model="queryParams.project_id" clearable placeholder="请输入项目id" />
|
||||
</el-form-item>
|
||||
<el-form-item label="标书编号" prop="bid_document_no">
|
||||
<el-input class="w-[280px]" v-model="queryParams.bid_document_no" clearable placeholder="请输入标书编号" />
|
||||
<el-input class="w-[250px]" v-model="queryParams.bid_document_no" clearable placeholder="请输入标书编号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="招标公司名称" prop="invite_tenders_company_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.invite_tenders_company_name" clearable placeholder="请输入招标公司名称" />
|
||||
<el-input class="w-[250px]" v-model="queryParams.invite_tenders_company_name" clearable placeholder="请输入招标公司名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="投标公司名称" prop="bid_company_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.bid_company_name" clearable placeholder="请输入投标公司名称" />
|
||||
<el-input class="w-[250px]" v-model="queryParams.bid_company_name" clearable placeholder="请输入招标公司名称" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
@ -31,68 +28,59 @@
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['bid.bid_buy_bidding_document/delete']"
|
||||
:disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)"
|
||||
>
|
||||
<el-button v-perms="['bid.bid_buy_bidding_document/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="项目id" prop="project_id" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="处理流程" prop="bid_document_no" show-overflow-tooltip />
|
||||
<el-table-column label="流程步骤" prop="bid_document_no" show-overflow-tooltip />
|
||||
<el-table-column label="流程编号" prop="bid_document_no" show-overflow-tooltip />
|
||||
<el-table-column label="客户名称" prop="bid_document_no" show-overflow-tooltip />
|
||||
<el-table-column label="项目名称" prop="bid_document_no" show-overflow-tooltip />
|
||||
<el-table-column label="标书编号" prop="bid_document_no" show-overflow-tooltip />
|
||||
<el-table-column label="招标公司名称" prop="invite_tenders_company_name" show-overflow-tooltip />
|
||||
<el-table-column label="投标公司名称" prop="bid_company_name" show-overflow-tooltip />
|
||||
<el-table-column label="招标公司名称" width="120" prop="invite_tenders_company_name" show-overflow-tooltip />
|
||||
<el-table-column label="投标公司名称" width="120" prop="bid_company_name" show-overflow-tooltip />
|
||||
<el-table-column label="购买人员" prop="buyer" show-overflow-tooltip />
|
||||
<el-table-column label="购买标书金额" prop="amount" show-overflow-tooltip />
|
||||
<el-table-column label="招标项目资金来源" prop="project_fund_source">
|
||||
<el-table-column label="购买标书金额" width="120" prop="amount" show-overflow-tooltip />
|
||||
<el-table-column label="招标项目资金来源" width="150" prop="project_fund_source">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.construction_funds_sources" :value="row.project_fund_source" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="投标时间" prop="bid_date">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.bid_date ? timeFormat(row.bid_date, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
|
||||
<span>{{ row.bid_date ? timeFormat(row.bid_date, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="购买标书时间" prop="buy_date">
|
||||
<el-table-column label="购买标书时间" prop="buy_date" width="120">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.buy_date ? timeFormat(row.buy_date, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
|
||||
<span>{{ row.buy_date ? timeFormat(row.buy_date, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="招标方式" prop="invite_tenders_type">
|
||||
<el-table-column label="招标方式" prop="invite_tenders_type" width="100">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.bidding_method" :value="row.invite_tenders_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="投标地址" prop="bid_address" show-overflow-tooltip />
|
||||
<el-table-column label="投标地址" prop="bid_address" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="是否需要保证金" prop="is_margin">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.whether_status" :value="row.is_margin" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="保证金金额" prop="margin_amount" show-overflow-tooltip />
|
||||
<el-table-column label="招标项目慨况" prop="bid_project_overview" show-overflow-tooltip />
|
||||
<el-table-column label="保证金金额" prop="margin_amount" width="100" show-overflow-tooltip />
|
||||
<!-- <el-table-column label="招标项目慨况" prop="bid_project_overview" show-overflow-tooltip />
|
||||
<el-table-column label="项目简介" prop="project_desc" show-overflow-tooltip />
|
||||
<el-table-column label="附件" prop="annex" show-overflow-tooltip />
|
||||
<el-table-column label="附件" prop="annex" show-overflow-tooltip /> -->
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['bid.bid_buy_bidding_document/edit']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleEdit(row)"
|
||||
>
|
||||
<el-button v-perms="['bid.bid_buy_bidding_document/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['bid.bid_buy_bidding_document/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
<el-button v-perms="['bid.bid_buy_bidding_document/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
|
@ -6,23 +6,21 @@
|
||||
<div class="tit">客户基本资料</div>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="客户姓名" prop="name">
|
||||
<el-input v-model="formData.name" placeholder="请输入本文行单客户姓名" clearable
|
||||
:style="{ width: '100%' }"></el-input>
|
||||
<el-form-item label="客户姓名" prop="name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.name" placeholder="请输入本文行单客户姓名" clearable :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="8">
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="flex-1" v-model="formData.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="上级公司" prop="parent_company">
|
||||
<el-input v-model="formData.parent_company" type="number" placeholder="请输入上级公司" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.parent_company" type="number" placeholder="请输入上级公司" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -35,38 +33,30 @@
|
||||
<el-col :span="16">
|
||||
<el-form-item label="信用度" prop="credit_rating">
|
||||
<el-radio-group v-model="formData.credit_rating" placeholder="请选择信用度">
|
||||
<el-radio v-for="(item, index) in dictData.credit_rating" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.credit_rating" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="省" prop="province"
|
||||
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select v-model="formData.province" clearable placeholder="请选择省"
|
||||
@change="province_change">
|
||||
<el-option v-for="(item, index) in datas.provinceOptions" :key="index"
|
||||
:label="item.province_name" :value="parseInt(item.province_code)" />
|
||||
<el-form-item label="省" prop="province" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select v-model="formData.province" clearable placeholder="请选择省" @change="province_change">
|
||||
<el-option v-for="(item, index) in datas.provinceOptions" :key="index" :label="item.province_name" :value="parseInt(item.province_code)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="市" prop="city"
|
||||
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-form-item label="市" prop="city" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select v-model="formData.city" clearable placeholder="请选择市" @change="city_change">
|
||||
<el-option v-for="(item, index) in datas.cityOptions" :key="index"
|
||||
:label="item.city_name" :value="parseInt(item.city_code)" />
|
||||
<el-option v-for="(item, index) in datas.cityOptions" :key="index" :label="item.city_name" :value="parseInt(item.city_code)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="区" prop="area"
|
||||
:rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-form-item label="区" prop="area" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select v-model="formData.area" clearable placeholder="请选择区" @change="area_change">
|
||||
<el-option v-for="(item, index) in datas.areaOptions" :key="index"
|
||||
:label="item.area_name" :value="parseInt(item.area_code)" />
|
||||
<el-option v-for="(item, index) in datas.areaOptions" :key="index" :label="item.area_name" :value="parseInt(item.area_code)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -77,8 +67,7 @@
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="notes">
|
||||
<el-input v-model="formData.notes" type="textarea" placeholder="请输入备注"
|
||||
:autosize="{ minRows: 4, maxRows: 4 }" :style="{ width: '100%' }"></el-input>
|
||||
<el-input v-model="formData.notes" type="textarea" placeholder="请输入备注" :autosize="{ minRows: 4, maxRows: 4 }" :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@ -89,44 +78,38 @@
|
||||
<div class="tit">主要负责人</div>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="姓名" prop="master_name">
|
||||
<el-input v-model="formData.master_name" placeholder="请输入姓名" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-form-item label="姓名" prop="master_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.master_name" placeholder="请输入姓名" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="职位" prop="master_position">
|
||||
<el-input v-model="formData.master_position" placeholder="请输入职位" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.master_position" placeholder="请输入职位" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="手机" prop="master_phone">
|
||||
<el-input v-model="formData.master_phone" placeholder="请输入手机" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.master_phone" placeholder="请输入手机" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="邮箱" prop="master_email">
|
||||
<el-input v-model="formData.master_email" placeholder="请输入邮箱" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.master_email" placeholder="请输入邮箱" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="电话" prop="master_telephone">
|
||||
<el-input v-model="formData.master_telephone" placeholder="请输入电话" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.master_telephone" placeholder="请输入电话" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="备注" prop="master_notes">
|
||||
<el-input v-model="formData.master_notes" placeholder="请输入备注" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.master_notes" placeholder="请输入备注" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -138,36 +121,30 @@
|
||||
<template v-for="(item, index) in formData.other_contacts" :key="index">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="姓名" prop="field120">
|
||||
<el-input :disabled="isDisabled" v-model="item.name" placeholder="请输入姓名" clearable
|
||||
:style="{ width: '100%' }"></el-input>
|
||||
<el-input :disabled="isDisabled" v-model="item.name" placeholder="请输入姓名" clearable :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="职务" prop="field121">
|
||||
<el-input :disabled="isDisabled" v-model="item.position" placeholder="请输入职务" clearable
|
||||
:style="{ width: '100%' }"></el-input>
|
||||
<el-input :disabled="isDisabled" v-model="item.position" placeholder="请输入职务" clearable :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手机" prop="field122">
|
||||
<el-input :disabled="isDisabled" v-model="item.phone" placeholder="请输入手机" clearable
|
||||
:style="{ width: '100%' }"></el-input>
|
||||
<el-input :disabled="isDisabled" v-model="item.phone" placeholder="请输入手机" clearable :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="邮箱">
|
||||
<el-input :disabled="isDisabled" v-model="item.email" placeholder="请输入邮箱" clearable
|
||||
:style="{ width: '100%' }"></el-input>
|
||||
<el-input :disabled="isDisabled" v-model="item.email" placeholder="请输入邮箱" clearable :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</template>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label prop="field126">
|
||||
<el-button type="primary" :disabled="isDisabled" size="medium"
|
||||
@click="other">添加联系人</el-button>
|
||||
<el-button v-if="formData.other_contacts.length" type="primary" :disabled="isDisabled"
|
||||
size="medium" @click="otherdelete">删除</el-button>
|
||||
<el-button type="primary" :disabled="isDisabled" size="medium" @click="other">添加联系人</el-button>
|
||||
<el-button v-if="formData.other_contacts.length" type="primary" :disabled="isDisabled" size="medium" @click="otherdelete">删除</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@ -178,43 +155,37 @@
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="开票公司" prop="company_name">
|
||||
<el-input v-model="formData.company_name" placeholder="请输入开票公司" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.company_name" placeholder="请输入开票公司" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="纳税人识别" prop="company_tin">
|
||||
<el-input v-model="formData.company_tin" placeholder="请输入纳税人识别" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.company_tin" placeholder="请输入纳税人识别" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="开户地址" prop="bank_open_address">
|
||||
<el-input v-model="formData.bank_open_address" placeholder="请输入开户地址" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.bank_open_address" placeholder="请输入开户地址" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="公司电话" prop="company_telephone">
|
||||
<el-input v-model="formData.company_telephone" placeholder="请输入公司电话" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.company_telephone" placeholder="请输入公司电话" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="开户银行" prop="bank_name">
|
||||
<el-input v-model="formData.bank_name" placeholder="请输入开户银行" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.bank_name" placeholder="请输入开户银行" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="银行账号" prop="bank_account">
|
||||
<el-input v-model="formData.bank_account" placeholder="请输入银行账号" clearable
|
||||
:style="{ width: '100%' }">
|
||||
<el-input v-model="formData.bank_account" placeholder="请输入银行账号" clearable :style="{ width: '100%' }">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -309,10 +280,13 @@ const setFormData = async (data: Record<any, any>) => {
|
||||
if (key == 'city') {
|
||||
await getAreaList()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
console.log(formData)
|
||||
formData.other_contacts = JSON.parse(formData.other_contacts)
|
||||
|
||||
console.log(formData, '2222222222')
|
||||
|
||||
|
||||
}
|
||||
@ -364,11 +338,11 @@ const getProvinceList = async () => {
|
||||
datas["provinceOptions"] = data;
|
||||
};
|
||||
const getCityList = async () => {
|
||||
const data = await apiCityList({ city: formData.province });
|
||||
const data = await apiCityList({ province_code: formData.province });
|
||||
datas["cityOptions"] = data;
|
||||
};
|
||||
const getAreaList = async () => {
|
||||
const data = await apiAreaList({ area: formData.city });
|
||||
const data = await apiAreaList({ city_code: formData.city });
|
||||
datas["areaOptions"] = data;
|
||||
|
||||
};
|
||||
|
@ -1,5 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<Statistics :list="list"></Statistics>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
@ -8,8 +9,7 @@
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name"
|
||||
:value="item.value" />
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
@ -85,9 +85,45 @@ import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
|
||||
import Statistics from '@/components/statistics/index.vue'
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div class="edit-popup">
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="60%" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
|
||||
<el-form-item label="主题" prop="name">
|
||||
<el-form-item label="主题" prop="name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.name" clearable placeholder="请输入主题" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户名称" prop="custom_name">
|
||||
@ -11,16 +11,14 @@
|
||||
<el-form-item label="联系人" prop="contacts">
|
||||
<el-input v-model="formData.contacts" clearable placeholder="请输入联系人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="日期" prop="date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
|
||||
<el-form-item label="日期" prop="date" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="类型" prop="types">
|
||||
<el-form-item label="类型" prop="types" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select class="flex-1" v-model="formData.types" clearable placeholder="请选择类型">
|
||||
<el-option v-for="(item, index) in dictData.types" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.types" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="执行人" prop="admin_id">
|
||||
@ -36,8 +34,7 @@
|
||||
<el-input v-model="formData.coordinate" clearable placeholder="请输入位置" />
|
||||
</el-form-item>
|
||||
<el-form-item label="下次回访日期" prop="next_follow_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.next_follow_date" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择下次回访日期">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.next_follow_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择下次回访日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
@ -1,5 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<Statistics :list="list"></Statistics>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="联系人" prop="contacts">
|
||||
@ -9,8 +10,7 @@
|
||||
<el-form-item label="类型" prop="types">
|
||||
<el-select class="w-[280px]" v-model="queryParams.types" clearable placeholder="请选择类型">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.types" :key="index" :label="item.name"
|
||||
:value="item.value" />
|
||||
<el-option v-for="(item, index) in dictData.types" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
@ -27,8 +27,7 @@
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['custom_follow.custom_follow/delete']" :disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)">
|
||||
<el-button v-perms="['custom_follow.custom_follow/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
@ -63,12 +62,10 @@
|
||||
<el-table-column label="状态" prop="status" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['custom_follow.custom_follow/edit']" type="primary" link
|
||||
@click="handleEdit(row)">
|
||||
<el-button v-perms="['custom_follow.custom_follow/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['custom_follow.custom_follow/delete']" type="danger" link
|
||||
@click="handleDelete(row.id)">
|
||||
<el-button v-perms="['custom_follow.custom_follow/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
@ -90,10 +87,50 @@ import { apiCustomFollowLists, apiCustomFollowDelete, apiCustomFollowDetail } fr
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
|
||||
import Statistics from '@/components/statistics/index.vue'
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "今日跟进",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "电话",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "上门",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "来访接待",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "会议",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "培训",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "商务餐饮",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "外出活动",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "其它",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
|
@ -27,30 +27,27 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input v-model="formData.phone" clearable placeholder="请输入电话" />
|
||||
<el-form-item label="联系电话" prop="phone">
|
||||
<el-input v-model="formData.phone" clearable placeholder="请输入联系电话" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="日期" prop="date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="分类" prop="classification">
|
||||
<el-select class="flex-1" v-model="formData.classification" clearable placeholder="请选择分类">
|
||||
<el-option v-for="(item, index) in dictData.classification" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.classification" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="紧急程度" prop="urgency">
|
||||
<el-radio-group v-model="formData.urgency" placeholder="请选择紧急程度">
|
||||
<el-radio v-for="(item, index) in dictData.urgency" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.urgency" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -85,9 +82,7 @@
|
||||
|
||||
<!-- <material-picker v-model="formData.annex" /> -->
|
||||
<el-form-item label="附件" prop="field127">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true"
|
||||
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
|
||||
:on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-button type="primary">
|
||||
上传
|
||||
</el-button>
|
||||
@ -95,8 +90,7 @@
|
||||
|
||||
<div>
|
||||
<div v-for="(item, index) in formData.annex" style="margin-left: 5px;display: block;">
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri"
|
||||
target="_blank">{{ item.name }}</a>
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
|
||||
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -109,7 +103,12 @@
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<reviewprocess :list="list" />
|
||||
</popup>
|
||||
|
||||
<el-dialog v-model="showDialog" title="选择项目" width="70%">
|
||||
<peojectDialog @customEvent="customEvent"></peojectDialog>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -121,8 +120,18 @@ import { timeFormat } from '@/utils/util'
|
||||
import type { PropType } from 'vue'
|
||||
import useUserStore from "@/stores/modules/user";
|
||||
import configs from "@/config"
|
||||
import reviewprocess from '@/components/reviewprocess/index.vue'
|
||||
import costDialog from '@/components/budget/index.vue'
|
||||
import peojectDialog from '@/components/ptoject/index.vue'
|
||||
const base_url = configs.baseUrl + configs.urlPrefix
|
||||
const userStore = useUserStore();
|
||||
const list = reactive([])
|
||||
const showDialog = ref(false)
|
||||
const customEvent = (e: any) => {
|
||||
showDialog.value = false;
|
||||
};
|
||||
|
||||
|
||||
// 上传文件
|
||||
const handleAvatarSuccess_four = (
|
||||
response,
|
||||
|
@ -2,7 +2,7 @@
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="项目" prop="project_id">
|
||||
<el-form-item label="项目" prop="project_id" >
|
||||
<el-input class="w-[280px]" v-model="queryParams.project_id" clearable placeholder="请输入项目id" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户" prop="custom_id">
|
||||
|
128
src/views/financialManagement/Management/addexpense.vue
Normal file
128
src/views/financialManagement/Management/addexpense.vue
Normal file
@ -0,0 +1,128 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="60%" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
|
||||
<el-form-item label="科目编码" prop="name">
|
||||
<el-input v-model="formData.name" clearable placeholder="请输入主题" />
|
||||
</el-form-item>
|
||||
<el-form-item label="一级科目" prop="custom_name">
|
||||
<el-input v-model="formData.custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
|
||||
</el-form-item>
|
||||
<el-form-item label="二级科目" prop="contacts">
|
||||
<el-input v-model="formData.contacts" clearable placeholder="请输入联系人" />
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
</popup>
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customFollowEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiCustomFollowAdd, apiCustomFollowEdit, apiCustomFollowDetail } from '@/api/custom_follow'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import type { PropType } from 'vue'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { apiCustomLists } from '@/api/custom'
|
||||
|
||||
defineProps({
|
||||
dictData: {
|
||||
type: Object as PropType<Record<string, any[]>>,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑费用科目' : '新增费用科目'
|
||||
})
|
||||
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
name: '',
|
||||
custom_id: '',
|
||||
custom_name: '',
|
||||
contacts: '',
|
||||
date: '',
|
||||
types: '',
|
||||
admin_id: '',
|
||||
description: '',
|
||||
annex: '',
|
||||
coordinate: '',
|
||||
next_follow_date: '',
|
||||
status: '',
|
||||
})
|
||||
|
||||
|
||||
// 表单验证
|
||||
const formRules = reactive<any>({
|
||||
|
||||
})
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
|
||||
})
|
||||
getLists()
|
||||
// 获取详情
|
||||
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]
|
||||
}
|
||||
}
|
||||
|
||||
//@ts-ignore
|
||||
formData.date = timeFormat(formData.date, 'yyyy-mm-dd hh:MM:ss')
|
||||
//@ts-ignore
|
||||
formData.next_follow_date = timeFormat(formData.next_follow_date, 'yyyy-mm-dd hh:MM:ss')
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await apiCustomFollowDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
const data = { ...formData, }
|
||||
mode.value == 'edit'
|
||||
? await apiCustomFollowEdit(data)
|
||||
: await apiCustomFollowAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
//打开弹窗
|
||||
const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
// 关闭回调
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
216
src/views/financialManagement/Management/adjustmentdetails.vue
Normal file
216
src/views/financialManagement/Management/adjustmentdetails.vue
Normal file
@ -0,0 +1,216 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['costbudget.costbudget/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['costbudget.costbudget/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="序号" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="预算明细ID" prop="custom_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="科目编码" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="一级科目" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="二级科目 " prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="三级科目" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="制单时间" prop="master_telephone" show-overflow-tooltip />
|
||||
<el-table-column label="年份" prop="master_phone" show-overflow-tooltip />
|
||||
<el-table-column label="总" prop="master_notes" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="1月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="2月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="3月" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="4月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="5月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="6月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="7月" show-overflow-tooltip />
|
||||
<el-table-column label="7月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="7月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="8月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="9月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="10月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="11月" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="12月" show-overflow-tooltip />
|
||||
<el-table-column label="备注" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="附件" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiCustomLists, apiCustomDelete, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './editcost.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: '',
|
||||
custom_type: '',
|
||||
phone: '',
|
||||
credit_rating: '',
|
||||
province: '',
|
||||
city: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('custom_type,credit_rating')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiCustomDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiCustomDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
213
src/views/financialManagement/Management/budgetadjustment.vue
Normal file
213
src/views/financialManagement/Management/budgetadjustment.vue
Normal file
@ -0,0 +1,213 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['costbudget.costbudget/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['costbudget.costbudget/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="序号" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="流程编号" prop="custom_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
>
|
||||
<el-table-column label="制单时间" prop="master_telephone" show-overflow-tooltip />
|
||||
<el-table-column label=" 年份" prop="master_phone" show-overflow-tooltip />
|
||||
<el-table-column label=" 总合计" prop="master_notes" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="1月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="2月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="3月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="4月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="5月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="6月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="7月合计" show-overflow-tooltip />
|
||||
<el-table-column label="7月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="7月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="8月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="9月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="10月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="11月合计" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="12月合计" show-overflow-tooltip />
|
||||
<el-table-column label=" 备注" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="附件" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiCustomLists, apiCustomDelete, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './editcost.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: '',
|
||||
custom_type: '',
|
||||
phone: '',
|
||||
credit_rating: '',
|
||||
province: '',
|
||||
city: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('custom_type,credit_rating')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiCustomDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiCustomDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
215
src/views/financialManagement/Management/budgetdetails.vue
Normal file
215
src/views/financialManagement/Management/budgetdetails.vue
Normal file
@ -0,0 +1,215 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="ID" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="部门名称" prop="custom_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
>
|
||||
<el-table-column label="年份" prop="master_telephone" show-overflow-tooltip />
|
||||
<el-table-column label="科目编码" prop="master_phone" show-overflow-tooltip />
|
||||
<el-table-column label=" 一级科目" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="二级科目" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
<el-table-column label="1月合计" show-overflow-tooltip />
|
||||
<el-table-column label="1月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="1月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="2月合计" show-overflow-tooltip />
|
||||
<el-table-column label="2月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="2月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="3月合计" show-overflow-tooltip />
|
||||
<el-table-column label="3月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="3月剩余" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="4月合计" show-overflow-tooltip />
|
||||
<el-table-column label="4月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="4月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="5月合计" show-overflow-tooltip />
|
||||
<el-table-column label="5月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="5月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="6月合计" show-overflow-tooltip />
|
||||
<el-table-column label="6月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="6月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="7月合计" show-overflow-tooltip />
|
||||
<el-table-column label="7月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="7月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="8月合计" show-overflow-tooltip />
|
||||
<el-table-column label="8月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="8月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="9月合计" show-overflow-tooltip />
|
||||
<el-table-column label="9月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="9月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="10月合计" show-overflow-tooltip />
|
||||
<el-table-column label="10月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="10月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="11月合计" show-overflow-tooltip />
|
||||
<el-table-column label="11月已发生" show-overflow-tooltip width="120" />
|
||||
<el-table-column label="11月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="12月合计" show-overflow-tooltip />
|
||||
<el-table-column label="12月已发生" show-overflow-tooltip width="120" />
|
||||
<el-table-column label="12月剩余" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiCustomLists, apiCustomDelete, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './editcost.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: '',
|
||||
custom_type: '',
|
||||
phone: '',
|
||||
credit_rating: '',
|
||||
province: '',
|
||||
city: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('custom_type,credit_rating')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiCustomDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiCustomDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
234
src/views/financialManagement/Management/costbudget.vue
Normal file
234
src/views/financialManagement/Management/costbudget.vue
Normal file
@ -0,0 +1,234 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['costbudget.costbudget/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['costbudget.costbudget/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="查看" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="客户属性" prop="custom_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="流程编号" prop="province_name" show-overflow-tooltip />
|
||||
<el-table-column label="制单时间" prop="master_position" show-overflow-tooltip />
|
||||
<el-table-column label="年份" prop="master_telephone" show-overflow-tooltip />
|
||||
<el-table-column label="总合计" prop="master_phone" show-overflow-tooltip />
|
||||
<el-table-column label="总已发生" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="负责人" show-overflow-tooltip />
|
||||
<el-table-column label="总剩余" prop="create_time" show-overflow-tooltip />
|
||||
<el-table-column label="备注" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="1月合计" show-overflow-tooltip />
|
||||
<el-table-column label="1月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="1月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="2月合计" show-overflow-tooltip />
|
||||
<el-table-column label="2月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="2月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="3月合计" show-overflow-tooltip />
|
||||
<el-table-column label="3月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="3月剩余" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="4月合计" show-overflow-tooltip />
|
||||
<el-table-column label="4月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="4月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="5月合计" show-overflow-tooltip />
|
||||
<el-table-column label="5月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="5月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="6月合计" show-overflow-tooltip />
|
||||
<el-table-column label="6月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="6月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="7月合计" show-overflow-tooltip />
|
||||
<el-table-column label="7月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="7月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="8月合计" show-overflow-tooltip />
|
||||
<el-table-column label="8月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="8月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="9月合计" show-overflow-tooltip />
|
||||
<el-table-column label="9月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="9月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="10月合计" show-overflow-tooltip />
|
||||
<el-table-column label="10月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="10月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="11月合计" show-overflow-tooltip />
|
||||
<el-table-column label="11月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="11月剩余" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="12月合计" show-overflow-tooltip />
|
||||
<el-table-column label="12月已发生" show-overflow-tooltip width="100" />
|
||||
<el-table-column label="12月剩余" show-overflow-tooltip />
|
||||
|
||||
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['costbudget.costbudget/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['costbudget.costbudget/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiCustomLists, apiCustomDelete, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './editcost.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: '',
|
||||
custom_type: '',
|
||||
phone: '',
|
||||
credit_rating: '',
|
||||
province: '',
|
||||
city: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('custom_type,credit_rating')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiCustomDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiCustomDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
406
src/views/financialManagement/Management/editcost.vue
Normal file
406
src/views/financialManagement/Management/editcost.vue
Normal file
@ -0,0 +1,406 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="90%" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules">
|
||||
<el-card class="mb-2">
|
||||
<!-- <div class="tit">客户基本资料</div> -->
|
||||
<div class="tit">
|
||||
<el-steps :active="active" finish-status="success">
|
||||
<el-step title="会计" />
|
||||
<el-step title="财务负责人" />
|
||||
<el-step title="总经理" />
|
||||
</el-steps>
|
||||
</div>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
|
||||
<el-form-item label="年份" prop="date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="year" value-format="YYYY" placeholder="选择年份">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="制单时间" prop="date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.date" clearable type="dates" vsalue-format="YYYY-MM-DD" placeholder="选择制单时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="总合计" prop="date">
|
||||
<el-input v-model="formData.notes" placeholder="请输入备注" :autosize="{ minRows: 4, maxRows: 4 }" :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="notes">
|
||||
<el-input v-model="formData.notes" type="textarea" placeholder="请输入备注" :autosize="{ minRows: 4, maxRows: 4 }" :style="{ width: '100%' }"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-card>
|
||||
|
||||
|
||||
|
||||
<el-card class="mb-2">
|
||||
<div class="tit">预算明细</div>
|
||||
<el-table :data="tableData" :summary-method="getSummaries" show-summary>
|
||||
<el-table-column label="序号">
|
||||
<template #default="{ row }">
|
||||
<el-button @click="handleAdd(row)">+</el-button>
|
||||
<el-button @click="handleDelete(row)">-</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="一级科目" prop="name1">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.name1" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="二级科目" prop="name2">
|
||||
<template #default="{ row }"> <el-input v-model="row.name2" /> </template></el-table-column>
|
||||
<el-table-column label="1月" prop="value1">
|
||||
<template #default="{ row }"> <el-input v-model="row.value1" /> </template></el-table-column>
|
||||
|
||||
<el-table-column label="2月" prop="value2">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value2" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="3月" prop="value3">
|
||||
<template #default="{ row }"> <el-input v-model="row.value3" /> </template></el-table-column>
|
||||
|
||||
<el-table-column label="4月" prop="value4">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value4" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="5月" prop="value5">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value5" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="6月" prop="value6">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value6" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="7月" prop="value7">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value7" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="8月" prop="value8">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value8" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="9月" prop="value9">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value9" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="10月" prop="value10">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value10" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="11月" prop="value11">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value11" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="12月" prop="value12">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value12" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<!-- 其他列 -->
|
||||
</el-table>
|
||||
</el-card>
|
||||
|
||||
</el-form>
|
||||
<reviewprocess :list="list" />
|
||||
</popup>
|
||||
<el-dialog v-model="showDialog" title="选择客户" width="70%">
|
||||
<costDialog @customEvent="customEvent"></costDialog>
|
||||
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customEdit">
|
||||
import {
|
||||
apiCityList,
|
||||
apiAreaList,
|
||||
apiProvinceList,
|
||||
} from "@/api/common";
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiCustomAdd, apiCustomEdit, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import reviewprocess from '@/components/reviewprocess/index.vue'
|
||||
import costDialog from '@/components/budget/index.vue'
|
||||
import type { PropType } from 'vue'
|
||||
import type { TableColumnCtx } from 'element-plus'
|
||||
defineProps({
|
||||
dictData: {
|
||||
type: Object as PropType<Record<string, any[]>>,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
interface Product {
|
||||
id: string
|
||||
name1: string
|
||||
name2: string
|
||||
value1: number
|
||||
value2: number
|
||||
value3: number
|
||||
value4: number
|
||||
value5: number
|
||||
value6: number
|
||||
value7: number
|
||||
value8: number
|
||||
value9: number
|
||||
value10: number
|
||||
value11: number
|
||||
value12: number
|
||||
}
|
||||
|
||||
interface SummaryMethodProps<T = Product> {
|
||||
columns: TableColumnCtx<T>[]
|
||||
data: T[]
|
||||
}
|
||||
// 表单数据
|
||||
const formData = reactive({
|
||||
|
||||
})
|
||||
|
||||
|
||||
const tableData = ref([
|
||||
// 表格数据
|
||||
{ name1: "xixi", name2: "xixi", value1: ' ', value2: ' ', value3: ' ', value4: ' ', value5: ' ', value6: ' ', value7: ' ', value8: ' ', value9: ' ', value10: ' ', value11: ' ', value12: ' ', },
|
||||
]);
|
||||
const getSummaries = (param: SummaryMethodProps) => {
|
||||
const { columns, data } = param
|
||||
const sums: string[] = []
|
||||
columns.map((column, index) => {
|
||||
|
||||
if (column.label == '序号') {
|
||||
sums[index] = '合计'
|
||||
return
|
||||
}
|
||||
if (column.label == '一级科目') {
|
||||
sums[index] = ''
|
||||
return
|
||||
}
|
||||
if (column.label === '二级科目') {
|
||||
sums[index] = ''
|
||||
return
|
||||
}
|
||||
// console.log(columns)
|
||||
const values = data.map((item) => Number(item[column.property]))
|
||||
console.log(values)
|
||||
if (!values.every((value) => Number.isNaN(value))) {
|
||||
|
||||
sums[index] = `${values.reduce((prev, curr) => {
|
||||
const value = Number(curr)
|
||||
if (!Number.isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)}`
|
||||
} else {
|
||||
sums[index] = 'N/A'
|
||||
}
|
||||
})
|
||||
|
||||
return sums
|
||||
}
|
||||
|
||||
// // 计算表格底部的汇总行
|
||||
// const getSummaries = () => {
|
||||
// const monthCount = 12; // 总月份数量
|
||||
// const data = tableData.value;
|
||||
// const sums = new Array(monthCount).fill(0); // 存储每个月的总和
|
||||
|
||||
// // 计算每个月的总和
|
||||
// data.forEach(item => {
|
||||
// for (let i = 1; i <= monthCount; i++) {
|
||||
// sums[i - 1] += parseFloat(item['value' + i]);
|
||||
// }
|
||||
// });
|
||||
|
||||
// // 构造合计行的数据
|
||||
// const totalData = { name: '合计', value: [] };
|
||||
// for (let i = 0; i < monthCount; i++) {
|
||||
// totalData.value.push(sums[i]);
|
||||
// }
|
||||
// console.log(totalData, '11111111')
|
||||
// return [totalData];
|
||||
// };
|
||||
const handleAdd = (row) => {
|
||||
// 在 row 后面插入一行数据
|
||||
const index = tableData.value.indexOf(row);
|
||||
tableData.value.splice(index + 1, 0, { name1: "xixi", name2: "xixi", value1: ' ', value2: ' ', value3: ' ', value4: ' ', value5: ' ', value6: ' ', value7: ' ', value8: ' ', value9: ' ', value10: ' ', value11: ' ', value12: ' ' });
|
||||
};
|
||||
|
||||
const handleDelete = (row) => {
|
||||
// 删除 row
|
||||
const index = tableData.value.indexOf(row);
|
||||
tableData.value.splice(index, 1);
|
||||
};
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const active = ref(0)
|
||||
const showDialog = ref(false)
|
||||
|
||||
const next = () => {
|
||||
if (active.value++ > 2) active.value = 0
|
||||
}
|
||||
const list = reactive([])
|
||||
const datas = reactive({
|
||||
provinceOptions: [],
|
||||
cityOptions: [],
|
||||
areaOptions: [],
|
||||
});
|
||||
|
||||
const customEvent = (e: any) => {
|
||||
formData.custom_id = e.id;
|
||||
formData.custom_name = e.name;
|
||||
showDialog.value = false;
|
||||
};
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑公司年度管理费用预算' : '新增公司年度管理费用预算'
|
||||
})
|
||||
|
||||
|
||||
|
||||
// 表单验证
|
||||
const formRules = reactive<any>({
|
||||
|
||||
})
|
||||
|
||||
|
||||
// 获取详情
|
||||
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]
|
||||
|
||||
if (key == 'province') {
|
||||
await getCityList()
|
||||
}
|
||||
if (key == 'city') {
|
||||
await getAreaList()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
formData.other_contacts = JSON.parse(formData.other_contacts)
|
||||
|
||||
console.log(formData, '2222222222')
|
||||
|
||||
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await apiCustomDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
const data = { ...formData, }
|
||||
mode.value == 'edit'
|
||||
? await apiCustomEdit(data)
|
||||
: await apiCustomAdd(data)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
//打开弹窗
|
||||
const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
// 关闭回调
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
|
||||
//获取省份
|
||||
function province_change(value: string) {
|
||||
getCityList();
|
||||
}
|
||||
function city_change(value: string) {
|
||||
getAreaList();
|
||||
}
|
||||
|
||||
// function brigade_change(value: string) {
|
||||
// formData.brigade = value
|
||||
// }
|
||||
const getProvinceList = async () => {
|
||||
const data = await apiProvinceList({});
|
||||
datas["provinceOptions"] = data;
|
||||
};
|
||||
const getCityList = async () => {
|
||||
const data = await apiCityList({ province_code: formData.province });
|
||||
datas["cityOptions"] = data;
|
||||
};
|
||||
const getAreaList = async () => {
|
||||
const data = await apiAreaList({ city_code: formData.city });
|
||||
datas["areaOptions"] = data;
|
||||
|
||||
};
|
||||
//增加其他联系人
|
||||
function other() {
|
||||
formData.other_contacts.push({
|
||||
name: "",
|
||||
position: "",
|
||||
phone: "",
|
||||
email: "",
|
||||
});
|
||||
}
|
||||
//删除其他联系人
|
||||
function otherdelete() {
|
||||
formData.other_contacts.pop({
|
||||
name: "",
|
||||
position: "",
|
||||
phone: "",
|
||||
email: "",
|
||||
});
|
||||
}
|
||||
|
||||
getProvinceList();
|
||||
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
||||
<style lang="scss">
|
||||
.tit {
|
||||
font-size: 1.2em;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
179
src/views/financialManagement/Management/expenseaccount.vue
Normal file
179
src/views/financialManagement/Management/expenseaccount.vue
Normal file
@ -0,0 +1,179 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['expense.expense/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['expense.expense/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="序号" prop="name" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="科目编码" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="一级科目" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="二级科目 " prop="master_notes" show-overflow-tooltip />
|
||||
|
||||
|
||||
|
||||
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['expense.expense/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['expense.expense/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiCustomLists, apiCustomDelete, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './addexpense.vue'
|
||||
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: '',
|
||||
custom_type: '',
|
||||
phone: '',
|
||||
credit_rating: '',
|
||||
province: '',
|
||||
city: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('custom_type,credit_rating')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiCustomDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiCustomDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
@ -1 +0,0 @@
|
||||
<!-- 管理费用 -->
|
@ -1,43 +1,22 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup
|
||||
ref="popupRef"
|
||||
:title="popupTitle"
|
||||
:async="true"
|
||||
width="550px"
|
||||
@confirm="handleSubmit"
|
||||
@close="handleClose"
|
||||
>
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
|
||||
<el-form-item label="上级部门" prop="pid" v-if="formData.pid !== 0">
|
||||
<el-tree-select
|
||||
class="flex-1"
|
||||
v-model="formData.pid"
|
||||
:data="optionsData.dept"
|
||||
clearable
|
||||
node-key="id"
|
||||
:props="{
|
||||
value: 'id',
|
||||
label: 'name'
|
||||
}"
|
||||
check-strictly
|
||||
:default-expand-all="true"
|
||||
placeholder="请选择上级部门"
|
||||
/>
|
||||
|
||||
<el-form-item label="组织" prop="org_id">
|
||||
<el-select clearable v-model="formData.org_id" placeholder="请选择组织" @change="area_change">
|
||||
<el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="部门名称" prop="name">
|
||||
<el-input
|
||||
v-model="formData.name"
|
||||
placeholder="请输入部门名称"
|
||||
:maxlength="100"
|
||||
/>
|
||||
<!-- <el-select clearable v-model="formData.name" placeholder="请选择部门" @change="area_change1">
|
||||
<el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select> -->
|
||||
<el-input class="w-[280px]" v-model="formData.name" clearable @keyup.enter="getLists" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="负责人" prop="leader">
|
||||
<el-input
|
||||
v-model="formData.leader"
|
||||
placeholder="请输入负责人姓名"
|
||||
:maxlength="30"
|
||||
/>
|
||||
<el-input v-model="formData.leader" placeholder="请输入负责人姓名" :maxlength="30" />
|
||||
</el-form-item>
|
||||
<el-form-item label="联系电话" prop="mobile">
|
||||
<el-input v-model="formData.mobile" placeholder="请输入联系电话" />
|
||||
@ -58,6 +37,7 @@
|
||||
<script lang="ts" setup>
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { deptEdit, deptAdd, deptDetail, deptAll } from '@/api/org/department'
|
||||
import { getAll } from '@/api/org/organization'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { useDictOptions } from '@/hooks/useDictOptions'
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
@ -69,14 +49,17 @@ const popupTitle = computed(() => {
|
||||
})
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
pid: '' as string | number,
|
||||
org_id: '' as string | number,
|
||||
name: '',
|
||||
leader: '',
|
||||
mobile: '',
|
||||
sort: 0,
|
||||
status: 1
|
||||
status: 1,
|
||||
sort: ''
|
||||
})
|
||||
const name = ref('')
|
||||
const orglist = reactive([])
|
||||
|
||||
const jobs = reactive([])
|
||||
const checkMobile = (rule: any, value: any, callback: any) => {
|
||||
if (!value) {
|
||||
return callback()
|
||||
@ -91,13 +74,6 @@ const checkMobile = (rule: any, value: any, callback: any) => {
|
||||
}
|
||||
}
|
||||
const formRules = {
|
||||
pid: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择上级部门',
|
||||
trigger: ['change']
|
||||
}
|
||||
],
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
@ -105,6 +81,7 @@ const formRules = {
|
||||
trigger: ['blur']
|
||||
}
|
||||
],
|
||||
|
||||
mobile: [
|
||||
{
|
||||
validator: checkMobile,
|
||||
@ -113,14 +90,36 @@ const formRules = {
|
||||
]
|
||||
}
|
||||
|
||||
const { optionsData } = useDictOptions<{
|
||||
dept: any[]
|
||||
}>({
|
||||
dept: {
|
||||
api: deptAll
|
||||
}
|
||||
})
|
||||
|
||||
const getlista = () => {
|
||||
getAll().then((res) => {
|
||||
// orglist = res.data
|
||||
|
||||
Object.assign(orglist, res)
|
||||
|
||||
})
|
||||
}
|
||||
const area_change = (e: any) => {
|
||||
formData.org_id = e
|
||||
let data = { 'org_id': e }
|
||||
// console.log(data)
|
||||
deptAll(data).then((res) => {
|
||||
// orglist = res.data
|
||||
console.log(res, '2222')
|
||||
Object.assign(jobs, res)
|
||||
|
||||
})
|
||||
}
|
||||
const area_change1 = (e: any) => {
|
||||
// formData.org_id = e
|
||||
console.log(e, jobs.find((item) => { item.id == e }))
|
||||
const name = jobs.map(obj => obj.id === e ? obj.name : null).find(value => value !== null);
|
||||
formData.name = name
|
||||
// console.log(name)
|
||||
// jobs.map((item)=>{item.id==e})
|
||||
|
||||
|
||||
}
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
mode.value == 'edit' ? await deptEdit(formData) : await deptAdd(formData)
|
||||
@ -146,16 +145,18 @@ const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await deptDetail({
|
||||
id: row.id
|
||||
})
|
||||
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
getlista()
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
getDetail,
|
||||
|
||||
})
|
||||
</script>
|
||||
|
@ -3,12 +3,7 @@
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
|
||||
<el-form-item label="部门名称" prop="name">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.name"
|
||||
clearable
|
||||
@keyup.enter="getLists"
|
||||
/>
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable @keyup.enter="getLists" />
|
||||
</el-form-item>
|
||||
<el-form-item label="部门状态" prop="status">
|
||||
<el-select class="w-[280px]" v-model="queryParams.status">
|
||||
@ -33,61 +28,37 @@
|
||||
</el-button>
|
||||
<el-button @click="handleExpand"> 展开/折叠 </el-button>
|
||||
</div>
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
class="mt-4"
|
||||
size="large"
|
||||
v-loading="loading"
|
||||
:data="lists"
|
||||
row-key="id"
|
||||
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
|
||||
>
|
||||
<el-table-column
|
||||
label="部门名称"
|
||||
prop="name"
|
||||
min-width="150"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table ref="tableRef" class="mt-4" size="large" v-loading="pager.loading" :data="pager.lists" row-key="id" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
|
||||
<el-table-column label="部门名称" prop="name" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column label="部门状态" prop="status" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag class="ml-2" :type="row.status ? '' : 'danger'">{{
|
||||
row.status_desc
|
||||
row.status == 1 ? "正常" : "禁用"
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="负责人" prop="leader" min-width="150" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="所属组织" prop="org_name" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column label="排序" prop="sort" min-width="100" />
|
||||
<el-table-column label="更新时间" prop="update_time" min-width="180" />
|
||||
<el-table-column label="更新时间" prop="create_time" min-width="180" />
|
||||
<el-table-column label="操作" width="160" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['dept.dept/add']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleAdd(row.id)"
|
||||
>
|
||||
<el-button v-perms="['dept.dept/add']" type="primary" link @click="handleAdd(row.id)">
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['dept.dept/edit']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleEdit(row)"
|
||||
>
|
||||
<el-button v-perms="['dept.dept/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="row.pid !== 0"
|
||||
v-perms="['dept.dept/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
<el-button v-if="row.pid !== 0" v-perms="['dept.dept/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
@ -95,29 +66,35 @@
|
||||
<script lang="ts" setup name="department">
|
||||
import type { ElTable, FormInstance } from 'element-plus'
|
||||
import EditPopup from './edit.vue'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { deptDelete, deptLists } from '@/api/org/department'
|
||||
import feedback from '@/utils/feedback'
|
||||
|
||||
const tableRef = shallowRef<InstanceType<typeof ElTable>>()
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
let isExpand = false
|
||||
const loading = ref(false)
|
||||
|
||||
const lists = ref<any[]>([])
|
||||
const queryParams = reactive({
|
||||
status: '',
|
||||
name: ''
|
||||
name: '',
|
||||
leader: '',
|
||||
org_name: '',
|
||||
mobile: '',
|
||||
|
||||
})
|
||||
const showEdit = ref(false)
|
||||
const getLists = async () => {
|
||||
loading.value = true
|
||||
lists.value = await deptLists(queryParams)
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
const resetParams = () => {
|
||||
formRef.value?.resetFields()
|
||||
getLists()
|
||||
}
|
||||
const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
fetchFun: deptLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// const resetParams = () => {
|
||||
// formRef.value?.resetFields()
|
||||
// getLists()
|
||||
// }
|
||||
|
||||
const handleAdd = async (id?: number) => {
|
||||
showEdit.value = true
|
||||
@ -158,7 +135,7 @@ const toggleExpand = (children: any[], unfold = true) => {
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
await getLists()
|
||||
getLists()
|
||||
nextTick(() => {
|
||||
handleExpand()
|
||||
})
|
||||
|
92
src/views/organization/organization/edit.vue
Normal file
92
src/views/organization/organization/edit.vue
Normal file
@ -0,0 +1,92 @@
|
||||
<template>
|
||||
<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="84px" :rules="formRules">
|
||||
<el-form-item label="组织名称" prop="name">
|
||||
<el-input v-model="formData.name" placeholder="请输入组织名称" clearable :maxlength="100" />
|
||||
</el-form-item>
|
||||
<el-form-item label="组织负责人" prop="master">
|
||||
<el-input v-model="formData.master" placeholder="请输入组织负责人" clearable :maxlength="100" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item label="组织状态" required prop="status">
|
||||
<el-switch v-model="formData.status" :active-value="1" :inactive-value="0" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</popup>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { orgsEdit, orgsAdd, orgsDetail } from '@/api/org/organization'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑组织' : '新增组织'
|
||||
})
|
||||
const formData = reactive({
|
||||
|
||||
name: '',
|
||||
master: '',
|
||||
status: 0
|
||||
})
|
||||
|
||||
const formRules = {
|
||||
master: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入组织负责人',
|
||||
trigger: ['blur']
|
||||
}
|
||||
],
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入组织名称',
|
||||
trigger: ['blur']
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
mode.value == 'edit' ? await orgsEdit(formData) : await orgsAdd(formData)
|
||||
popupRef.value?.close()
|
||||
emit('success')
|
||||
}
|
||||
|
||||
const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
|
||||
const setFormData = (data: Record<any, any>) => {
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await orgsDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
97
src/views/organization/organization/index.vue
Normal file
97
src/views/organization/organization/index.vue
Normal file
@ -0,0 +1,97 @@
|
||||
<template>
|
||||
<div class="post-lists">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
|
||||
<el-form-item label="组织名称">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable @keyup.enter="resetPage" />
|
||||
</el-form-item>
|
||||
<el-form-item label="组织负责人">
|
||||
<el-input class="w-[280px]" v-model="queryParams.master" clearable @keyup.enter="resetPage" />
|
||||
</el-form-item>
|
||||
<el-form-item label="组织状态">
|
||||
<el-select class="w-[280px]" v-model="queryParams.status">
|
||||
<el-option label="全部" value />
|
||||
<el-option label="正常" :value="1" />
|
||||
<el-option label="停用" :value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
<export-data class="ml-2.5" :fetch-fun="jobsLists" :params="queryParams" :page-size="pager.size" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never">
|
||||
<div>
|
||||
<el-button v-perms="['dept.jobs/add']" type="primary" @click="handleAdd()">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table class="mt-4" size="large" v-loading="pager.loading" :data="pager.lists">
|
||||
|
||||
<el-table-column label="组织名称" prop="name" min-width="100" />
|
||||
<el-table-column label="组织负责人" prop="master" min-width="100" />
|
||||
<el-table-column label="状态" prop="status" min-width="100" show-overflow-tooltip />
|
||||
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['dept.jobs/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['dept.jobs/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
<edit-popup v-if="showEdit" ref="editRef" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup name="post">
|
||||
import { orgsDelete, orgsLists } from '@/api/org/organization'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
const showEdit = ref(false)
|
||||
const queryParams = reactive({
|
||||
master: '',
|
||||
name: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
fetchFun: orgsLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
const handleEdit = async (data: any) => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.getDetail(data)
|
||||
}
|
||||
|
||||
const handleDelete = async (id: number) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await orgsDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
@ -1,24 +1,20 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup
|
||||
ref="popupRef"
|
||||
:title="popupTitle"
|
||||
:async="true"
|
||||
width="550px"
|
||||
@confirm="handleSubmit"
|
||||
@close="handleClose"
|
||||
>
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
|
||||
<el-form-item label="岗位名称" prop="name">
|
||||
<el-input
|
||||
v-model="formData.name"
|
||||
placeholder="请输入岗位名称"
|
||||
clearable
|
||||
:maxlength="100"
|
||||
/>
|
||||
<el-form-item label="组织名称" prop="name" v-if="mode == 'add'">
|
||||
<el-select clearable v-model="org_id1" placeholder="请选择部门" @change="area_change">
|
||||
<el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位编码" prop="code">
|
||||
<el-input v-model="formData.code" placeholder="请输入岗位编码" clearable />
|
||||
<el-form-item label="部门名称" prop="dept_id">
|
||||
<el-select clearable v-model="formData.dept_id" placeholder="请选择部门" @change="area_change1">
|
||||
<el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位名称" prop="name">
|
||||
|
||||
<el-input class="w-[280px]" v-model="formData.name" clearable @keyup.enter="getLists" />
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<div>
|
||||
@ -26,16 +22,9 @@
|
||||
<div class="form-tips">默认为0, 数值越大越排前</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input
|
||||
v-model="formData.remark"
|
||||
placeholder="请输入备注"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 4, maxRows: 6 }"
|
||||
maxlength="200"
|
||||
show-word-limit
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="formData.remark" placeholder="请输入备注" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" maxlength="200" show-word-limit />
|
||||
</el-form-item> -->
|
||||
<el-form-item label="岗位状态" required prop="status">
|
||||
<el-switch v-model="formData.status" :active-value="1" :inactive-value="0" />
|
||||
</el-form-item>
|
||||
@ -45,30 +34,43 @@
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { jobsEdit, jobsAdd, jobsDetail } from '@/api/org/post'
|
||||
import { jobsEdit, jobsAdd, jobsDetail, jobsAll } from '@/api/org/post'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { deptAll } from '@/api/org/department'
|
||||
import { getAll } from '@/api/org/organization'
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const orglist = reactive([])
|
||||
const org_id1 = ref('')
|
||||
const org_id2 = ref('')
|
||||
const jobs = reactive([])
|
||||
const postions = reactive([])
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑岗位' : '新增岗位'
|
||||
})
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
name: '',
|
||||
code: '',
|
||||
dept_id: '',
|
||||
sort: 0,
|
||||
remark: '',
|
||||
status: 1
|
||||
})
|
||||
|
||||
const formRules = {
|
||||
code: [
|
||||
dept_id: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入岗位编码',
|
||||
trigger: ['blur']
|
||||
message: '请选择部门',
|
||||
trigger: ['change']
|
||||
}
|
||||
],
|
||||
status: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择状态',
|
||||
trigger: ['change']
|
||||
}
|
||||
],
|
||||
name: [
|
||||
@ -79,6 +81,36 @@ const formRules = {
|
||||
}
|
||||
]
|
||||
}
|
||||
const getlista = () => {
|
||||
getAll().then((res) => {
|
||||
// orglist = res.data
|
||||
|
||||
Object.assign(orglist, res)
|
||||
|
||||
})
|
||||
}
|
||||
const area_change = (e: any) => {
|
||||
|
||||
|
||||
let data = { 'org_id': e }
|
||||
// console.log(data)
|
||||
deptAll(data).then((res) => {
|
||||
// orglist = res.data
|
||||
console.log(res, '2222')
|
||||
Object.assign(jobs, res)
|
||||
|
||||
})
|
||||
}
|
||||
const area_change1 = (e: any) => {
|
||||
|
||||
jobsAll({ dept_id: e }).then((res) => {
|
||||
|
||||
Object.assign(postions, res)
|
||||
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
const handleSubmit = async () => {
|
||||
await formRef.value?.validate()
|
||||
@ -105,16 +137,29 @@ const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await jobsDetail({
|
||||
id: row.id
|
||||
})
|
||||
setFormData(data)
|
||||
|
||||
if (mode.value != 'add') {
|
||||
deptAll({ 'org_id': data.org_id }).then((res) => {
|
||||
// orglist = res.data
|
||||
console.log(res, '2222')
|
||||
Object.assign(jobs, res)
|
||||
|
||||
setFormData(data)
|
||||
})
|
||||
} else {
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
getlista()
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
|
||||
})
|
||||
</script>
|
||||
|
@ -2,21 +2,11 @@
|
||||
<div class="post-lists">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
|
||||
<el-form-item label="岗位编码">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.code"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
<el-form-item label="部门名称">
|
||||
<el-input class="w-[280px]" v-model="queryParams.dept_name" clearable @keyup.enter="resetPage" />
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位名称">
|
||||
<el-input
|
||||
class="w-[280px]"
|
||||
v-model="queryParams.name"
|
||||
clearable
|
||||
@keyup.enter="resetPage"
|
||||
/>
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable @keyup.enter="resetPage" />
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位状态">
|
||||
<el-select class="w-[280px]" v-model="queryParams.status">
|
||||
@ -28,12 +18,7 @@
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
<export-data
|
||||
class="ml-2.5"
|
||||
:fetch-fun="jobsLists"
|
||||
:params="queryParams"
|
||||
:page-size="pager.size"
|
||||
/>
|
||||
<!-- <export-data class="ml-2.5" :fetch-fun="jobsLists" :params="queryParams" :page-size="pager.size" /> -->
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
@ -47,7 +32,7 @@
|
||||
</el-button>
|
||||
</div>
|
||||
<el-table class="mt-4" size="large" v-loading="pager.loading" :data="pager.lists">
|
||||
<el-table-column label="岗位编码" prop="code" min-width="100" />
|
||||
|
||||
<el-table-column label="岗位名称" prop="name" min-width="100" />
|
||||
<el-table-column label="排序" prop="sort" min-width="100" />
|
||||
<el-table-column label="备注" prop="remark" min-width="100" show-overflow-tooltip />
|
||||
@ -55,26 +40,16 @@
|
||||
<el-table-column label="状态" prop="status" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag class="ml-2" :type="row.status ? '' : 'danger'">
|
||||
{{ row.status_desc }}
|
||||
{{ row.status == 1 ? "正常" : "禁用" }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['dept.jobs/edit']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleEdit(row)"
|
||||
>
|
||||
<el-button v-perms="['dept.jobs/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['dept.jobs/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
<el-button v-perms="['dept.jobs/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
@ -95,7 +70,7 @@ import EditPopup from './edit.vue'
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
const showEdit = ref(false)
|
||||
const queryParams = reactive({
|
||||
code: '',
|
||||
dept_name: '',
|
||||
name: '',
|
||||
status: ''
|
||||
})
|
||||
|
@ -1,22 +1,10 @@
|
||||
<template>
|
||||
<div class="edit-popup">
|
||||
<popup
|
||||
ref="popupRef"
|
||||
:title="popupTitle"
|
||||
:async="true"
|
||||
width="550px"
|
||||
@confirm="handleSubmit"
|
||||
@close="handleClose"
|
||||
>
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="550px" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="84px" :rules="formRules">
|
||||
<!-- 账号输入框 -->
|
||||
<el-form-item label="账号" prop="account">
|
||||
<el-input
|
||||
v-model="formData.account"
|
||||
:disabled="formData.root == 1"
|
||||
placeholder="请输入账号"
|
||||
clearable
|
||||
/>
|
||||
<el-input v-model="formData.account" :disabled="formData.root == 1" placeholder="请输入账号" clearable />
|
||||
</el-form-item>
|
||||
<!-- 管理员头像 -->
|
||||
<el-form-item label="头像">
|
||||
@ -32,81 +20,40 @@
|
||||
<el-form-item label="名称" prop="name">
|
||||
<el-input v-model="formData.name" placeholder="请输入名称" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="归属部门" prop="dept_id">
|
||||
<el-tree-select
|
||||
class="flex-1"
|
||||
v-model="formData.dept_id"
|
||||
:data="optionsData.dept"
|
||||
clearable
|
||||
multiple
|
||||
node-key="id"
|
||||
:props="{
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
disabled(data: any) {
|
||||
return data.status !== 1
|
||||
}
|
||||
}"
|
||||
check-strictly
|
||||
:default-expand-all="true"
|
||||
placeholder="请选择上级部门"
|
||||
/>
|
||||
<el-form-item label="组织" prop="org_id">
|
||||
<el-select clearable v-model="formData.org_id" placeholder="请选择组织" @change="area_change">
|
||||
<el-option v-for="(item, index) in orglist" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位" prop="jobs_id">
|
||||
<el-select
|
||||
class="flex-1"
|
||||
v-model="formData.jobs_id"
|
||||
clearable
|
||||
multiple
|
||||
placeholder="请选择岗位"
|
||||
>
|
||||
<el-option
|
||||
v-for="(item, index) in optionsData.jobs"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
<el-form-item label="归属部门" prop="dept_id">
|
||||
<!-- <el-tree-select class="flex-1" v-model="formData.dept_id" :data="dept" clearable multiple node-key="id" check-strictly :default-expand-all="true" placeholder="请选择上级部门" /> -->
|
||||
|
||||
<el-select class="flex-1" v-model="formData.dept_id" clearable placeholder="请选择部门" @change="area_change1">
|
||||
<el-option v-for="(item, index) in dept" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位" prop="job_id">
|
||||
<el-select class="flex-1" v-model="formData.job_id" clearable placeholder="请选择岗位">
|
||||
<el-option v-for="(item, index) in jobs" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 角色选择框 -->
|
||||
<el-form-item label="角色" prop="role_id">
|
||||
<el-select
|
||||
v-model="formData.role_id"
|
||||
:disabled="formData.root == 1"
|
||||
class="flex-1"
|
||||
multiple
|
||||
placeholder="请选择角色"
|
||||
clearable
|
||||
>
|
||||
<el-select v-model="formData.role_id" :disabled="formData.root == 1" class="flex-1" multiple placeholder="请选择角色" clearable>
|
||||
<el-option v-if="formData.root == 1" label="系统管理员" :value="0" />
|
||||
<el-option
|
||||
v-for="(item, index) in optionsData.role"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
<el-option v-for="(item, index) in optionsData.role" :key="index" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 密码输入框 -->
|
||||
<el-form-item label="密码" prop="password">
|
||||
<el-input
|
||||
v-model="formData.password"
|
||||
show-password
|
||||
clearable
|
||||
placeholder="请输入密码"
|
||||
/>
|
||||
<el-input v-model="formData.password" show-password clearable placeholder="请输入密码" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 确认密码输入框 -->
|
||||
<el-form-item label="确认密码" prop="password_confirm">
|
||||
<el-input
|
||||
v-model="formData.password_confirm"
|
||||
show-password
|
||||
clearable
|
||||
placeholder="请输入确认密码"
|
||||
/>
|
||||
<el-input v-model="formData.password_confirm" show-password clearable placeholder="请输入确认密码" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 管理员状态 -->
|
||||
@ -117,11 +64,7 @@
|
||||
<!-- 多处登录 -->
|
||||
<el-form-item label="多处登录">
|
||||
<div>
|
||||
<el-switch
|
||||
v-model="formData.multipoint_login"
|
||||
:active-value="1"
|
||||
:inactive-value="0"
|
||||
/>
|
||||
<el-switch v-model="formData.multipoint_login" :active-value="1" :inactive-value="0" />
|
||||
<div class="form-tips">允许多人同时在线登录</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
@ -137,10 +80,12 @@ import { adminAdd, adminDetail, adminEdit } from '@/api/perms/admin'
|
||||
import { roleAll } from '@/api/perms/role'
|
||||
import { jobsAll } from '@/api/org/post'
|
||||
import { deptAll } from '@/api/org/department'
|
||||
import { getAll } from '@/api/org/organization'
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const orglist = reactive([])
|
||||
const popupTitle = computed(() => {
|
||||
return mode.value == 'edit' ? '编辑管理员' : '新增管理员'
|
||||
})
|
||||
@ -149,8 +94,9 @@ const formData = reactive({
|
||||
account: '',
|
||||
name: '',
|
||||
dept_id: [],
|
||||
jobs_id: [],
|
||||
job_id: [],
|
||||
role_id: [],
|
||||
org_id: [],
|
||||
avatar: '',
|
||||
password: '',
|
||||
password_confirm: '',
|
||||
@ -158,6 +104,9 @@ const formData = reactive({
|
||||
multipoint_login: 1,
|
||||
root: 0
|
||||
})
|
||||
|
||||
const dept = reactive([])
|
||||
const jobs = reactive([])
|
||||
const passwordConfirmValidator = (rule: object, value: string, callback: any) => {
|
||||
if (formData.password) {
|
||||
if (!value) callback(new Error('请再次输入密码'))
|
||||
@ -209,18 +158,12 @@ const formRules = reactive({
|
||||
})
|
||||
const { optionsData } = useDictOptions<{
|
||||
role: any[]
|
||||
jobs: any[]
|
||||
dept: any[]
|
||||
|
||||
}>({
|
||||
role: {
|
||||
api: roleAll
|
||||
},
|
||||
jobs: {
|
||||
api: jobsAll
|
||||
},
|
||||
dept: {
|
||||
api: deptAll
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
const handleSubmit = async () => {
|
||||
@ -234,7 +177,27 @@ const open = (type = 'add') => {
|
||||
mode.value = type
|
||||
popupRef.value?.open()
|
||||
}
|
||||
const area_change = (e: any) => {
|
||||
deptAll({ org_id: e }).then((res) => {
|
||||
// orglist = res.data
|
||||
Object.assign(dept, res)
|
||||
|
||||
})
|
||||
}
|
||||
const area_change1 = (e: any) => {
|
||||
jobsAll({ dept_id: e }).then((res) => {
|
||||
// orglist = res.data
|
||||
Object.assign(jobs, res)
|
||||
|
||||
})
|
||||
}
|
||||
const getlista = () => {
|
||||
getAll().then((res) => {
|
||||
// orglist = res.data
|
||||
Object.assign(orglist, res)
|
||||
|
||||
})
|
||||
}
|
||||
const setFormData = async (row: any) => {
|
||||
formRules.password = []
|
||||
formRules.password_confirm = [
|
||||
@ -246,18 +209,33 @@ const setFormData = async (row: any) => {
|
||||
const data = await adminDetail({
|
||||
id: row.id
|
||||
})
|
||||
if (mode.value != 'add') {
|
||||
|
||||
deptAll({ org_id: data.org_id }).then((res) => {
|
||||
// orglist = res.data
|
||||
Object.assign(dept, res)
|
||||
|
||||
})
|
||||
jobsAll({ dept_id: data.dept_id }).then((res) => {
|
||||
// orglist = res.data
|
||||
Object.assign(jobs, res)
|
||||
|
||||
})
|
||||
}
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
getlista()
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData
|
||||
|
@ -4,21 +4,19 @@
|
||||
<el-form ref="formRef" :model="formData" label-width="auto" :rules="formRules">
|
||||
<el-row :gutter="10">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="客户名称" prop="custom_name">
|
||||
<el-input v-model="formData.custom_name" @click="showDialog = true" clearable
|
||||
placeholder="请选择客户" />
|
||||
<el-form-item label="客户名称" prop="custom_name" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.custom_name" @click="showDialog = true" clearable placeholder="请选择客户" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目类型" prop="project_type">
|
||||
<el-form-item label="项目类型" prop="project_type" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select class="flex-1" v-model="formData.project_type" clearable placeholder="请选择项目类型">
|
||||
<el-option v-for="(item, index) in dictData.project_type" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.project_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目名称" prop="name">
|
||||
<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="12">
|
||||
@ -29,8 +27,7 @@
|
||||
<el-col :span="24">
|
||||
<el-form-item label="项目内容" prop="project_content">
|
||||
<el-checkbox-group v-model="formData.project_content" placeholder="请选择项目内容">
|
||||
<el-checkbox v-for="(item, index) in dictData.project_content" :key="index"
|
||||
:label="item.value">
|
||||
<el-checkbox v-for="(item, index) in dictData.project_content" :key="index" :label="item.value">
|
||||
{{ item.name }}
|
||||
</el-checkbox>
|
||||
</el-checkbox-group>
|
||||
@ -53,16 +50,14 @@
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="投标时间" prop="bidding_time">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.bidding_time" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择投标时间">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.bidding_time" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择投标时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="招标方式" prop="bidding_method">
|
||||
<el-radio-group v-model="formData.bidding_method" placeholder="请选择招标方式">
|
||||
<el-radio v-for="(item, index) in dictData.bidding_method" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.bidding_method" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -96,26 +91,22 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="关系度" prop="relationship">
|
||||
<el-radio-group v-model="formData.relationship" placeholder="请选择关系度">
|
||||
<el-radio v-for="(item, index) in dictData.relationship" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.relationship" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发现时间" prop="discovery_time">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.discovery_time" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择发现时间">
|
||||
<el-form-item label="发现时间" prop="discovery_time" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.discovery_time" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择发现时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="信息来源" prop="information_sources">
|
||||
<el-select class="flex-1" v-model="formData.information_sources" clearable
|
||||
placeholder="请选择信息来源">
|
||||
<el-option v-for="(item, index) in dictData.information_sources" :key="index"
|
||||
:label="item.name" :value="parseInt(item.value)" />
|
||||
<el-form-item label="信息来源" prop="information_sources" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-select class="flex-1" v-model="formData.information_sources" clearable placeholder="请选择信息来源">
|
||||
<el-option v-for="(item, index) in dictData.information_sources" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -127,8 +118,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目建设资金来源" prop="construction_funds_sources">
|
||||
<el-radio-group v-model="formData.construction_funds_sources" placeholder="请选择项目建设资金来源">
|
||||
<el-radio v-for="(item, index) in dictData.construction_funds_sources" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.construction_funds_sources" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -142,8 +132,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设方财务状况" prop="construction_financial_status">
|
||||
<el-radio-group v-model="formData.construction_financial_status" placeholder="请选择建设方财务状况">
|
||||
<el-radio v-for="(item, index) in dictData.construction_financial_status" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.construction_financial_status" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -152,8 +141,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设方对我方认可度" prop="construction_recognition">
|
||||
<el-radio-group v-model="formData.construction_recognition" placeholder="请选择建设方对我方认可度">
|
||||
<el-radio v-for="(item, index) in dictData.construction_recognition" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.construction_recognition" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -162,8 +150,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="我方对建设方认可度" prop="my_construction_recognition">
|
||||
<el-radio-group v-model="formData.my_construction_recognition" placeholder="请选择我方对建设方认可度">
|
||||
<el-radio v-for="(item, index) in dictData.my_construction_recognition" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.my_construction_recognition" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -172,8 +159,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="战略意义" prop="strategic_significance">
|
||||
<el-radio-group v-model="formData.strategic_significance" placeholder="请选择战略意义">
|
||||
<el-radio v-for="(item, index) in dictData.strategic_significance" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.strategic_significance" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -182,8 +168,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="所属行业" prop="industry">
|
||||
<el-radio-group v-model="formData.industry" placeholder="请选择所属行业">
|
||||
<el-radio v-for="(item, index) in dictData.industry" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.industry" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -192,8 +177,7 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item label="单位性质" prop="unit_nature">
|
||||
<el-radio-group v-model="formData.unit_nature" placeholder="请选择单位性质">
|
||||
<el-radio v-for="(item, index) in dictData.unit_nature" :key="index"
|
||||
:label="parseInt(item.value)">
|
||||
<el-radio v-for="(item, index) in dictData.unit_nature" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
@ -204,9 +188,7 @@
|
||||
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
|
||||
</el-form-item> -->
|
||||
<el-form-item label="附件" prop="field127">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true"
|
||||
:headers="{ Token: userStore.token }" :action="base_url + '/upload/file'"
|
||||
:on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-button type="primary">
|
||||
上传
|
||||
</el-button>
|
||||
@ -214,8 +196,7 @@
|
||||
|
||||
<div>
|
||||
<div v-for="(item, index) in formData.annex" style="margin-left: 5px;display: block;">
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri"
|
||||
target="_blank">{{ item.name }}</a>
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
|
||||
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -2,14 +2,60 @@
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户" prop="custom_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.custom_id" clearable placeholder="请输入客户昵称" />
|
||||
<el-form-item label="客户名称" prop="custom_name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.custom_name" clearable placeholder="请输入客户昵称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="负责人" prop="person">
|
||||
<el-input class="w-[280px]" v-model="queryParams.person" clearable placeholder="请输入负责人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目编码" prop="project_code">
|
||||
<el-input class="w-[280px]" v-model="queryParams.project_code" clearable placeholder="请输入项目编码" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入项目名称" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="项目状态" prop="status">
|
||||
<el-input class="w-[280px]" v-model="queryParams.status" clearable placeholder="请输入项目状态" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目所在地址" prop="project_address">
|
||||
<el-input class="w-[280px]" v-model="queryParams.project_address" clearable placeholder="请输入客户昵称" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="战略意义" prop="strategic_significance">
|
||||
<el-select class="w-[280px]" v-model="queryParams.strategic_significance" clearable placeholder="请选择战略意义">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.strategic_significance" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属行业" prop="industry">
|
||||
<el-select class="w-[280px]" v-model="queryParams.industry" clearable placeholder="请选择所属行业">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.industry" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="单位性质" prop="unit_nature">
|
||||
<el-select class="w-[280px]" v-model="queryParams.unit_nature" clearable placeholder="请选择单位性质">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.unit_nature" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="招标方式" prop="bidding_method">
|
||||
<el-select class="w-[280px]" v-model="queryParams.bidding_method" clearable placeholder="请选择招标方式">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.bidding_method" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="信息来源" prop="information_sources">
|
||||
<el-select class="w-[280px]" v-model="queryParams.information_sources" clearable placeholder="请选择信息来源">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.information_sources" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目类型" prop="project_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.project_type" clearable placeholder="请选择项目类型">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.project_type" :key="index" :label="item.name"
|
||||
:value="item.value" />
|
||||
<el-option v-for="(item, index) in dictData.project_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
@ -26,55 +72,36 @@
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['project.project/delete']" :disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)">
|
||||
<el-button v-perms="['project.project/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="客户" prop="custom_name" show-overflow-tooltip />
|
||||
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
|
||||
<el-table-column label="项目名称" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="项目类型" prop="project_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.project_type" :value="row.project_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目编码" prop="project_code" show-overflow-tooltip />
|
||||
<el-table-column label="项目内容" prop="project_content">
|
||||
|
||||
<!-- <el-table-column label="项目内容" prop="project_content">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.project_content" :value="row.project_content" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="项目估算" prop="project_estimation" show-overflow-tooltip />
|
||||
</el-table-column> -->
|
||||
|
||||
<el-table-column label="项目所在地" prop="project_address" show-overflow-tooltip />
|
||||
<el-table-column label="预计工期" prop="estimated_construction" show-overflow-tooltip />
|
||||
<el-table-column label="投标时间" prop="bidding_time">
|
||||
|
||||
<el-table-column label="信息来源" prop="industry">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.bidding_time ? timeFormat(row.bidding_time, 'yyyy-mm-dd hh:MM:ss') : '' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="招标方式" prop="bidding_method">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.bidding_method" :value="row.bidding_method" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="联系人" prop="contacts" show-overflow-tooltip />
|
||||
<el-table-column label="联系人职位" prop="position" show-overflow-tooltip />
|
||||
<el-table-column label="联系电话" prop="telephone" show-overflow-tooltip />
|
||||
<el-table-column label="联系人部门" prop="department" show-overflow-tooltip />
|
||||
<el-table-column label="负责人" prop="person" show-overflow-tooltip />
|
||||
<el-table-column label="关系度" prop="relationship">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.relationship" :value="row.relationship" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="发现时间" prop="discovery_time">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.discovery_time ? timeFormat(row.discovery_time, 'yyyy-mm-dd hh:MM:ss') : ''
|
||||
}}</span>
|
||||
<dict-value :options="dictData.information_sources" :value="row.information_sources" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="负责人" prop="person" show-overflow-tooltip />
|
||||
<el-table-column label="战略意义" prop="strategic_significance">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.strategic_significance" :value="row.strategic_significance" />
|
||||
@ -90,14 +117,13 @@
|
||||
<dict-value :options="dictData.unit_nature" :value="row.unit_nature" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" prop="status" show-overflow-tooltip />
|
||||
<el-table-column label="项目状态" prop="status" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['project.project/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['project.project/delete']" type="danger" link
|
||||
@click="handleDelete(row.id)">
|
||||
<el-button v-perms="['project.project/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
@ -127,34 +153,21 @@ const showEdit = ref(false)
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
custom_id: '',
|
||||
custom_name: '',
|
||||
project_type: '',
|
||||
project_code: '',
|
||||
project_content: '',
|
||||
project_estimation: '',
|
||||
name: '',
|
||||
project_address: '',
|
||||
estimated_construction: '',
|
||||
bidding_time: '',
|
||||
bidding_method: '',
|
||||
contacts: '',
|
||||
position: '',
|
||||
telephone: '',
|
||||
department: '',
|
||||
person: '',
|
||||
relationship: '',
|
||||
discovery_time: '',
|
||||
information_sources: '',
|
||||
competitor: '',
|
||||
construction_funds_sources: '',
|
||||
construction_payment_method: '',
|
||||
construction_financial_status: '',
|
||||
construction_recognition: '',
|
||||
my_construction_recognition: '',
|
||||
strategic_significance: '',
|
||||
industry: '',
|
||||
unit_nature: '',
|
||||
annex: '',
|
||||
status: ''
|
||||
status: '',
|
||||
information_sources: ''
|
||||
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
|
@ -1,9 +1,15 @@
|
||||
<template>
|
||||
<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="90px" :rules="formRules">
|
||||
<el-form-item label="项目名称" prop="project_id">
|
||||
<el-input v-model="formData.project_name" @click="showDialog = true" clearable placeholder="点击选择项目" />
|
||||
<el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
|
||||
<el-form-item label="项目名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-input v-model="project_name1" @click="showDialog = true" clearable placeholder="点击选择项目" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目编码" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-input v-model="project_name2" @click="showDialog = true" clearable placeholder="点击选择项目" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户名称" prop="project_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-input v-model="project_name3" @click="showDialog = true" clearable placeholder="点击选择项目" />
|
||||
</el-form-item>
|
||||
<el-form-item label="执行人" prop="executor">
|
||||
<el-input v-model="formData.executor" clearable placeholder="请输入执行人" />
|
||||
@ -20,54 +26,54 @@
|
||||
<el-form-item label="职位" prop="position">
|
||||
<el-input v-model="formData.position" clearable placeholder="请输入职位" />
|
||||
</el-form-item>
|
||||
<el-form-item label="跟进日期" prop="follow_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.follow_date" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择跟进日期">
|
||||
<el-form-item label="跟进日期" prop="follow_date" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.follow_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择跟进日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="跟进类型" prop="follow_type">
|
||||
<el-form-item label="跟进类型" prop="follow_type" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-select class="flex-1" v-model="formData.follow_type" clearable placeholder="请选择跟进类型">
|
||||
<el-option v-for="(item, index) in dictData.types" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.follow_type" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="主题" prop="theme">
|
||||
<el-form-item label="主题" prop="theme" :rules="[{ required: true, message: '不可为空', trigger: 'blur' }]">
|
||||
<el-input v-model="formData.theme" clearable placeholder="请输入主题" />
|
||||
</el-form-item>
|
||||
<el-form-item label="行动描述" prop="action_description">
|
||||
<el-input v-model="formData.action_description" clearable placeholder="请输入行动描述" />
|
||||
</el-form-item>
|
||||
<el-form-item label="项目把握度" prop="project_assurance">
|
||||
<el-form-item label="项目把握度" prop="project_assurance" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-select class="flex-1" v-model="formData.project_assurance" clearable placeholder="请选择项目把握度">
|
||||
<el-option v-for="(item, index) in dictData.project_assurance" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.project_assurance" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="跟进状态" prop="follow_status">
|
||||
<el-select class="flex-1" v-model="formData.follow_status" clearable placeholder="请选择跟进状态">
|
||||
<el-option v-for="(item, index) in dictData.follow_status" :key="index" :label="item.name"
|
||||
:value="parseInt(item.value)" />
|
||||
<el-option v-for="(item, index) in dictData.follow_status" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="跟进阶段" prop="follow_stage">
|
||||
<el-input v-model="formData.follow_stage" clearable placeholder="请输入跟进阶段" />
|
||||
<!-- <el-input v-model="formData.follow_stage" clearable placeholder="请输入跟进阶段" /> -->
|
||||
|
||||
<el-select class="flex-1" v-model="formData.follow_stage" clearable placeholder="请选择跟进状态">
|
||||
<el-option v-for="(item, index) in dictData.follow_stage" :key="index" :label="item.name" :value="parseInt(item.value)" />
|
||||
</el-select>
|
||||
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="notes">
|
||||
<el-input v-model="formData.notes" clearable placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
<el-form-item label="下次回访日期" prop="next_follow_up_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.next_follow_up_date" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择下次回访日期">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.next_follow_up_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择下次回访日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-dialog v-model="showDialog" title="选择客户" width="70%">
|
||||
<el-dialog v-model="showDialog" title="选择项目" width="70%">
|
||||
<projectTable @customEvent="customEvent"></projectTable>
|
||||
|
||||
</el-dialog>
|
||||
<!-- <el-form-item label="" prop="ceate_time">
|
||||
<el-input v-model="formData.ceate_time" clearable placeholder="请输入" />
|
||||
</el-form-item> -->
|
||||
|
||||
</el-form>
|
||||
</popup>
|
||||
</div>
|
||||
@ -75,7 +81,7 @@
|
||||
|
||||
<script lang="ts" setup name="projectFollowUpEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import projectTable from "@/components/tablieDialog/project.vue"
|
||||
import projectTable from "@/components/project/index.vue"
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiProjectFollowUpAdd, apiProjectFollowUpEdit, apiProjectFollowUpDetail } from '@/api/project_follow_up'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
@ -90,11 +96,17 @@ const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const project_name1 = ref('')
|
||||
const project_name2 = ref('')
|
||||
const project_name3 = ref('')
|
||||
// dialog
|
||||
const showDialog = ref(false)
|
||||
const customEvent = (e: any) => {
|
||||
|
||||
formData.project_id = e.id;
|
||||
formData.project_name = e.name;
|
||||
project_name1.value = e.name;
|
||||
project_name2.value = e.project_code;
|
||||
project_name3.value = e.custom_name;
|
||||
showDialog.value = false;
|
||||
};
|
||||
|
||||
@ -107,7 +119,6 @@ const popupTitle = computed(() => {
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
project_id: '',
|
||||
project_name: '',
|
||||
executor: '',
|
||||
contacts: '',
|
||||
contact_information: '',
|
||||
@ -123,6 +134,7 @@ const formData = reactive({
|
||||
notes: '',
|
||||
next_follow_up_date: '',
|
||||
ceate_time: '',
|
||||
file: ''
|
||||
})
|
||||
|
||||
|
||||
|
@ -44,8 +44,7 @@
|
||||
<el-form-item label="跟进类型" prop="follow_type">
|
||||
<el-select v-model="queryParams.follow_type" clearable placeholder="请选择跟进类型">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.types" :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-col>
|
||||
@ -63,8 +62,7 @@
|
||||
<el-form-item label="项目把握度" prop="project_assurance">
|
||||
<el-select v-model="queryParams.project_assurance" 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-col>
|
||||
@ -72,27 +70,28 @@
|
||||
<el-form-item label="跟进状态" prop="follow_status">
|
||||
<el-select v-model="queryParams.follow_status" 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-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="跟进阶段" prop="follow_stage">
|
||||
<el-input v-model="queryParams.follow_stage" clearable placeholder="请输入跟进阶段" />
|
||||
<el-select v-model="queryParams.follow_stage" clearable placeholder="请输入跟进阶段">
|
||||
|
||||
<el-option v-for="(item, index) in dictData.follow_stage" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
</el-col>
|
||||
|
||||
<el-col :span="10">
|
||||
<el-form-item label="跟进日期" prop="follow_date">
|
||||
<daterange-picker v-model:startTime="queryParams.start_time"
|
||||
v-model:endTime="queryParams.end_time" />
|
||||
<daterange-picker v-model:startTime="queryParams.start_time" v-model:endTime="queryParams.end_time" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="10">
|
||||
<el-form-item label="下次回访日期" prop="next_follow_up_date">
|
||||
<daterange-picker v-model:startTime="queryParams.start_time"
|
||||
v-model:endTime="queryParams.end_time" />
|
||||
<daterange-picker v-model:startTime="queryParams.start_time" v-model:endTime="queryParams.end_time" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
@ -115,8 +114,7 @@
|
||||
</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">
|
||||
@ -150,7 +148,13 @@
|
||||
<dict-value :options="dictData.follow_status" :value="row.follow_status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="跟进阶段" prop="follow_stage" show-overflow-tooltip />
|
||||
<el-table-column label="跟进阶段" prop="follow_stage">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.follow_stage" :value="row.follow_stage" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
||||
<el-table-column label="备注" prop="notes" show-overflow-tooltip />
|
||||
<el-table-column label="下次回访日期" prop="next_follow_up_date">
|
||||
<template #default="{ row }">
|
||||
@ -161,12 +165,10 @@
|
||||
<el-table-column label="" prop="ceate_time" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" 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>
|
||||
</template>
|
||||
@ -223,7 +225,7 @@ const handleSelectionChange = (val: any[]) => {
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('types,project_assurance,follow_status')
|
||||
const { dictData } = useDictData('project_assurance,follow_status,follow_type,follow_stage')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
|
@ -6,13 +6,41 @@
|
||||
<el-input v-model="formData.project_name" @click="showDialog = true" clearable placeholder="点击选择项目" />
|
||||
</el-form-item>
|
||||
<el-form-item label="技术人员" prop="technician_ids">
|
||||
<el-input v-model="formData.technician_ids" clearable placeholder="请输入技术人员" />
|
||||
<!-- <el-input v-model="technician" clearable placeholder="请输入技术人员" @click="userone('1')" /> -->
|
||||
<!-- <el-input placeholder="请输入技术人员" v-model="technician" @click="userone('1')">
|
||||
</el-input> -->
|
||||
<el-button @click="userone('1')">添加</el-button>
|
||||
|
||||
<div style=" display: block;width: 100%;margin-top: 10px;">
|
||||
|
||||
<el-tag v-for="(tag, index) in technician" :key="index" closable @close="removeTag1(index)" style="margin-right: 10px;">
|
||||
{{ tag.name }}
|
||||
</el-tag>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="商务人员" prop="business_people_ids">
|
||||
<el-input v-model="formData.business_people_ids" clearable placeholder="请输入商务人员" />
|
||||
<!-- <el-input v-model="business_people" clearable placeholder="请输入商务人员" @click="userone('2')" /> -->
|
||||
<el-button @click="userone('2')">添加</el-button>
|
||||
|
||||
<div style=" display: block;width: 100%;margin-top: 10px;">
|
||||
|
||||
<el-tag v-for="(tag, index) in business_people" :key="index" closable @close="removeTag2(index)" style="margin-right: 10px;">
|
||||
{{ tag.name }}
|
||||
</el-tag>
|
||||
</div>
|
||||
|
||||
</el-form-item>
|
||||
<el-form-item label="跨部门人员" prop="cross_departmental_personnel_ids">
|
||||
<el-input v-model="formData.cross_departmental_personnel_ids" clearable placeholder="请输入跨部门人员" />
|
||||
<!-- <el-input v-model="cross_departmental_personnel" clearable placeholder="请输入跨部门人员" @click="userone('3')" /> -->
|
||||
<el-button @click="userone('3')">添加</el-button>
|
||||
|
||||
<div style=" display: block;width: 100%;margin-top: 10px;">
|
||||
|
||||
<el-tag v-for="(tag, index) in cross_departmental_personnel" :key="index" closable @close="removeTag3(index)" style="margin-right: 10px;">
|
||||
{{ tag.name }}
|
||||
</el-tag>
|
||||
</div>
|
||||
|
||||
</el-form-item>
|
||||
<el-dialog v-model="showDialog" title="选择客户" width="70%">
|
||||
<projectTable @customEvent="customEvent"></projectTable>
|
||||
@ -20,6 +48,112 @@
|
||||
</el-dialog>
|
||||
</el-form>
|
||||
</popup>
|
||||
<el-dialog v-model="dialogVisible" title="人员选择器" width="600px" :before-close="handleClose">
|
||||
<div>
|
||||
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
|
||||
<el-radio-button :label="1">全部人员</el-radio-button>
|
||||
<el-radio-button :label="2">按部门筛选</el-radio-button>
|
||||
<el-radio-button :label="3">按岗位筛选</el-radio-button>
|
||||
</el-radio-group>
|
||||
|
||||
<div v-if="isCollapse == 1" style="margin-bottom: 20px">
|
||||
<!-- <el-input v-model="content" clearable placeholder="搜索人员" /> -->
|
||||
<div style="margin-top: 20px">
|
||||
<el-checkbox-group v-model="radiolist">
|
||||
<el-checkbox :label="item" v-for="(item, i) in uesrlist" :key="i" style="margin-bottom: 20px;">
|
||||
<div class="radio-con">
|
||||
<div class="radioa">
|
||||
<img :src="item.avatar" alt="" />
|
||||
</div>
|
||||
<div class="radiob">
|
||||
<div class="radiob_a">{{ item.name }}</div>
|
||||
<div class="radiob_b">
|
||||
<!-- {{ item.org_name }}/{{ item.dept_name }}/{{ item.job_name }} -->
|
||||
<text v-if="item.org_name.length > 0">{{ item.org_name }}</text>
|
||||
<text v-if="item.dept_name.length > 0">/{{ item.dept_name }}</text>
|
||||
<text v-if="item.job_name.length > 0">/{{ item.job_name }}</text>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-checkbox><br />
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isCollapse == 2">
|
||||
<div v-if="isshow">
|
||||
<div class="lad" v-for="(item, i) in deparmetlist" :key="i">
|
||||
<div class="lad">{{ i }}</div>
|
||||
<div class="flex " v-for="(items, k) in item" style="justify-content: space-between;" @click="deparmetclck(items)">
|
||||
<div>{{ items.name }}</div>
|
||||
<div class="Collapsebj">{{ items.admin_num }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
|
||||
|
||||
<!-- <el-input v-model="content" clearable placeholder="搜索人员" style="margin-bottom: 20px;" /> -->
|
||||
|
||||
<el-checkbox-group v-model="radiolist">
|
||||
<el-checkbox :label="item" v-for="(item, i) in deparmetlist1" :key="i" style="margin-bottom: 20px;">
|
||||
<div class="radio-con">
|
||||
<div class="radioa">
|
||||
<img :src="item.avatar" alt="" />
|
||||
</div>
|
||||
<div class="radiob">
|
||||
<div class="radiob_a">{{ item.name }}</div>
|
||||
<div class="radiob_b">
|
||||
|
||||
<text v-if="item.org_name.length > 0">{{ item.org_name }}</text>
|
||||
<text v-if="item.dept_name.length > 0">/{{ item.dept_name }}</text>
|
||||
<text v-if="item.job_name.length > 0">/{{ item.job_name }}</text>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-checkbox><br />
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="isCollapse == 3">
|
||||
<div class="lad " v-if="isshow1">
|
||||
<div class="flex " v-for="(item, j) in jobslist" :key="j" style="justify-content: space-between;" @click="gwclck(item)">
|
||||
<div>{{ item.name }}</div>
|
||||
<div class="Collapsebj">{{ item.admin_num }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<!-- <el-input v-model="content" clearable placeholder="搜索人员" style="margin-bottom: 20px;" /> -->
|
||||
<el-checkbox-group v-model="radiolist">
|
||||
<el-checkbox :label="item" v-for="(item, i) in jobslist1" :key="i" style="margin-bottom: 20px;">
|
||||
<div class="radio-con">
|
||||
<div class="radioa">
|
||||
<img :src="item.avatar" alt="" />
|
||||
</div>
|
||||
<div class="radiob">
|
||||
<div class="radiob_a">{{ item.name }}</div>
|
||||
<div class="radiob_b">
|
||||
<!-- {{ item.org_name }}/{{ item.dept_name }}/{{ item.job_name }} -->
|
||||
<text v-if="item.org_name.length > 0">{{ item.org_name }}</text>
|
||||
<text v-if="item.dept_name.length > 0">/{{ item.dept_name }}</text>
|
||||
<text v-if="item.job_name.length > 0">/{{ item.job_name }}</text>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-checkbox><br />
|
||||
</el-checkbox-group>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="userclick"> {{ radiolist.length > 0 ? '已选' : '未选' }}
|
||||
<text v-if="radiolist.length > 0">{{ radiolist.length }}</text></el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -28,18 +162,39 @@ import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import projectTable from "@/components/tablieDialog/project.vue"
|
||||
import { apiProjectPreSalesMembersAdd, apiProjectPreSalesMembersEdit, apiProjectPreSalesMembersDetail } from '@/api/project_pre_sales_members'
|
||||
import { getAdminsByAll, getAllDept, getAllJobs, getAdminsByDept, getAdminsByJob } from '@/api/common'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import type { PropType } from 'vue'
|
||||
const leixin = ref('0')
|
||||
defineProps({
|
||||
dictData: {
|
||||
type: Object as PropType<Record<string, any[]>>,
|
||||
default: () => ({})
|
||||
}
|
||||
})
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const active = ref(0);
|
||||
|
||||
const isCollapse = ref(1);
|
||||
const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const uesrlist = reactive([])
|
||||
const deparmetlist = reactive({})
|
||||
const deparmetlist1 = reactive([])
|
||||
const jobslist = reactive({})
|
||||
const jobslist1 = reactive([])
|
||||
const isshow = ref(true);
|
||||
const isshow1 = ref(true);
|
||||
const radiolist = ref([])
|
||||
const cross_departmental_personnel = ref([])
|
||||
const technician
|
||||
= ref([])
|
||||
const business_people
|
||||
= ref([])
|
||||
// dialog
|
||||
const showDialog = ref(false)
|
||||
const customEvent = (e: any) => {
|
||||
@ -47,6 +202,106 @@ const customEvent = (e: any) => {
|
||||
formData.project_name = e.name;
|
||||
showDialog.value = false;
|
||||
};
|
||||
// 获取全部人员
|
||||
const getlist = () => {
|
||||
getAdminsByAll().then((res) => {
|
||||
console.log(res)
|
||||
Object.assign(uesrlist, res)
|
||||
})
|
||||
}
|
||||
|
||||
//获取所有部门
|
||||
const deparmet = () => {
|
||||
getAllDept().then((res) => {
|
||||
console.log(res)
|
||||
Object.assign(deparmetlist, res)
|
||||
})
|
||||
}
|
||||
//获取部门下的人员
|
||||
const deparmetclck = (item: { id: any }) => {
|
||||
console.log(item)
|
||||
getAdminsByDept({ 'dept_id': item.id }).then((res) => {
|
||||
if (res.length > 0) {
|
||||
Object.assign(deparmetlist1, res)
|
||||
isshow.value = false
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
//获取岗位
|
||||
|
||||
const Jobs = () => {
|
||||
getAllJobs().then((res) => {
|
||||
console.log(res)
|
||||
Object.assign(jobslist, res)
|
||||
})
|
||||
}
|
||||
|
||||
//获取岗位下的人员
|
||||
const gwclck = (item: { id: any }) => {
|
||||
|
||||
getAdminsByJob({ 'job_id': item.id }).then((res) => {
|
||||
if (res.length > 0) {
|
||||
Object.assign(jobslist1, res)
|
||||
isshow1.value = false
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
//打开弹窗
|
||||
const userone = (e: any) => {
|
||||
leixin.value = e
|
||||
dialogVisible.value = true
|
||||
}
|
||||
//获取选择的数据
|
||||
const userclick = () => {
|
||||
if (radiolist.value.length > 0) {
|
||||
if (leixin.value === '1') {
|
||||
// 如果 leixin 的值为 1,则执行这里的代码块
|
||||
formData.technician_ids = radiolist.value.map((item) => item.id).toString()
|
||||
technician.value = radiolist.value.map((item) => item)
|
||||
console.log(technician.value)
|
||||
} else if (leixin.value === '2') {
|
||||
// 如果 leixin 的值为 2,则执行这里的代码块
|
||||
formData.business_people_ids = radiolist.value.map((item) => item.id).toString()
|
||||
business_people.value = radiolist.value.map((item) => item)
|
||||
} else {
|
||||
// 如果 leixin 的值不是 1 或 2,则执行这里的代码块
|
||||
formData.cross_departmental_personnel_ids = radiolist.value.map((item) => item.id).toString()
|
||||
cross_departmental_personnel.value = radiolist.value.map((item) => item)
|
||||
}
|
||||
|
||||
dialogVisible.value = false
|
||||
radiolist.value = []
|
||||
} else {
|
||||
feedback.msgError('请重新选择')
|
||||
}
|
||||
}
|
||||
//删除选择数据
|
||||
|
||||
const removeTag1 = (tag) => {
|
||||
technician.value.splice(tag, 1)
|
||||
if (technician.value.length > 0) {
|
||||
formData.technician_ids = technician.value.map((item) => item.id).toString()
|
||||
}
|
||||
}
|
||||
|
||||
const removeTag2 = (tag) => {
|
||||
business_people.value.splice(tag, 1)
|
||||
if (business_people.value.length > 0) {
|
||||
formData.business_people_ids = business_people.value.map((item) => item.id).toString()
|
||||
}
|
||||
}
|
||||
|
||||
const removeTag3 = (tag) => {
|
||||
cross_departmental_personnel.value.splice(tag, 1)
|
||||
if (cross_departmental_personnel.value.length > 0) {
|
||||
formData.cross_departmental_personnel_ids = cross_departmental_personnel.value.map((item) => item.id).toString()
|
||||
}
|
||||
}
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
@ -72,6 +327,9 @@ const formRules = reactive<any>({
|
||||
|
||||
// 获取详情
|
||||
const setFormData = async (data: Record<any, any>) => {
|
||||
technician.value = data.technician
|
||||
business_people.value = data.business_people
|
||||
cross_departmental_personnel.value = data.cross_departmental_personnel
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
@ -113,10 +371,83 @@ const handleClose = () => {
|
||||
}
|
||||
|
||||
|
||||
|
||||
getlist()
|
||||
deparmet()
|
||||
Jobs()
|
||||
defineExpose({
|
||||
open,
|
||||
setFormData,
|
||||
getDetail
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.userlist {
|
||||
display: flex;
|
||||
|
||||
img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
text-align: center;
|
||||
|
||||
.userlist-con {
|
||||
margin-right: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.user {
|
||||
img {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.radio-con {
|
||||
display: flex;
|
||||
width: 500px;
|
||||
|
||||
.radioa {
|
||||
img {
|
||||
margin-right: 20px;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.radiob {
|
||||
.radiob_a {
|
||||
margin-bottom: 10px;
|
||||
margin-top: 3px;
|
||||
|
||||
}
|
||||
|
||||
.radiob_b {}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.lad {
|
||||
padding: 10px 0;
|
||||
border-bottom: 1px solid #f7f7f7;
|
||||
|
||||
div {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.Collapsebj {
|
||||
background-color: #3e8ef7;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
line-height: 20px;
|
||||
text-align: center;
|
||||
border-radius: 6px;
|
||||
color: #f7f7f7;
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,11 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form
|
||||
class="mb-[-16px]"
|
||||
:model="queryParams"
|
||||
inline
|
||||
>
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="项目名称" prop="project_id">
|
||||
<el-input class="w-[280px]" v-model="queryParams.project_id" clearable placeholder="请输入项目名称" />
|
||||
</el-form-item>
|
||||
@ -31,36 +27,23 @@
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['project.project_pre_sales_members/delete']"
|
||||
:disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)"
|
||||
>
|
||||
<el-button v-perms="['project.project_pre_sales_members/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="项目名称" prop="project_id" show-overflow-tooltip />
|
||||
<el-table-column label="技术人员" prop="technician_ids" show-overflow-tooltip />
|
||||
<el-table-column label="商务人员" prop="business_people_ids" show-overflow-tooltip />
|
||||
<el-table-column label="跨部门人员" prop="cross_departmental_personnel_ids" show-overflow-tooltip />
|
||||
<el-table-column label="项目名称" prop="project_name" show-overflow-tooltip />
|
||||
<el-table-column label="技术人员" prop="technician" show-overflow-tooltip />
|
||||
<el-table-column label="商务人员" prop="business_people" show-overflow-tooltip />
|
||||
<el-table-column label="跨部门人员" prop="cross_departmental_personnel" show-overflow-tooltip />
|
||||
<el-table-column label="添加人" prop="add_people" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['project.project_pre_sales_members/edit']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleEdit(row)"
|
||||
>
|
||||
<el-button v-perms="['project.project_pre_sales_members/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['project.project_pre_sales_members/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
<el-button v-perms="['project.project_pre_sales_members/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
@ -78,7 +61,7 @@
|
||||
<script lang="ts" setup name="projectPreSalesMembersLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiProjectPreSalesMembersLists, apiProjectPreSalesMembersDelete } from '@/api/project_pre_sales_members'
|
||||
import { apiProjectPreSalesMembersLists, apiProjectPreSalesMembersDelete, apiProjectPreSalesMembersDetail } from '@/api/project_pre_sales_members'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
@ -122,10 +105,13 @@ const handleAdd = async () => {
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiProjectPreSalesMembersDetail({
|
||||
id: data.id
|
||||
})
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(data)
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
|
0
src/views/projectmanagement/list/edit.vue
Normal file
0
src/views/projectmanagement/list/edit.vue
Normal file
275
src/views/projectmanagement/list/list.vue
Normal file
275
src/views/projectmanagement/list/list.vue
Normal file
@ -0,0 +1,275 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<el-button v-perms="['custom_service.custom_service/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
</div>
|
||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
|
||||
<el-tab-pane label="我参与的项目" name="first">
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['custom.custom/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['custom.custom/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="客户名称" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="客户属性" prop="custom_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="省" prop="province_name" show-overflow-tooltip />
|
||||
<el-table-column label="职务" prop="master_position" show-overflow-tooltip />
|
||||
<el-table-column label="电话" prop="master_telephone" show-overflow-tooltip />
|
||||
<el-table-column label="手机" prop="master_phone" show-overflow-tooltip />
|
||||
<el-table-column label="备注" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="负责人" show-overflow-tooltip />
|
||||
<el-table-column label="创建时间" prop="create_time" show-overflow-tooltip />
|
||||
<el-table-column label="最后跟进" show-overflow-tooltip />
|
||||
<el-table-column label="下次回访日期" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['custom.custom/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['custom.custom/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="我创建的项目" name="second">
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<el-form class="mb-[-16px]" :model="queryParams" inline>
|
||||
<el-form-item label="客户名称" prop="name">
|
||||
<el-input class="w-[280px]" v-model="queryParams.name" clearable placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户属性" prop="custom_type">
|
||||
<el-select class="w-[280px]" v-model="queryParams.custom_type" clearable placeholder="请选择客户属性">
|
||||
<el-option label="全部" value=""></el-option>
|
||||
<el-option v-for="(item, index) in dictData.custom_type" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input class="w-[280px]" v-model="queryParams.phone" clearable placeholder="请输入电话" />
|
||||
</el-form-item>
|
||||
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="resetPage">查询</el-button>
|
||||
<el-button @click="resetParams">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<el-card class="!border-none" v-loading="pager.loading" shadow="never">
|
||||
<el-button v-perms="['custom.custom/add']" type="primary" @click="handleAdd">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['custom.custom/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
|
||||
|
||||
<el-table :data="pager.lists" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="客户名称" prop="name" show-overflow-tooltip />
|
||||
<el-table-column label="客户属性" prop="custom_type">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.custom_type" :value="row.custom_type" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="省" prop="province_name" show-overflow-tooltip />
|
||||
<el-table-column label="职务" prop="master_position" show-overflow-tooltip />
|
||||
<el-table-column label="电话" prop="master_telephone" show-overflow-tooltip />
|
||||
<el-table-column label="手机" prop="master_phone" show-overflow-tooltip />
|
||||
<el-table-column label="备注" prop="master_notes" show-overflow-tooltip />
|
||||
<el-table-column label="负责人" show-overflow-tooltip />
|
||||
<el-table-column label="创建时间" prop="create_time" show-overflow-tooltip />
|
||||
<el-table-column label="最后跟进" show-overflow-tooltip />
|
||||
<el-table-column label="下次回访日期" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['custom.custom/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['custom.custom/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</el-tab-pane>
|
||||
|
||||
</el-tabs>
|
||||
|
||||
<edit-popup v-if="showEdit" ref="editRef" :dict-data="dictData" @success="getLists" @close="showEdit = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="customLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiCustomLists, apiCustomDelete, apiCustomDetail } from '@/api/custom'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
import type { TabsPaneContext } from 'element-plus'
|
||||
|
||||
const activeName = ref('first')
|
||||
|
||||
const handleClick = (tab: TabsPaneContext, event: Event) => {
|
||||
console.log(tab, event)
|
||||
}
|
||||
const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
// 是否显示编辑框
|
||||
const showEdit = ref(false)
|
||||
const list = reactive([
|
||||
{
|
||||
name: "全部客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "私有客户",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日新增",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日分配公海客户",
|
||||
count: 1000,
|
||||
},
|
||||
|
||||
{
|
||||
name: "今日应联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日未联系",
|
||||
count: 1000,
|
||||
},
|
||||
{
|
||||
name: "今日已联系",
|
||||
count: 1000,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
// 查询条件
|
||||
const queryParams = reactive({
|
||||
name: '',
|
||||
custom_type: '',
|
||||
phone: '',
|
||||
credit_rating: '',
|
||||
province: '',
|
||||
city: '',
|
||||
status: ''
|
||||
})
|
||||
|
||||
// 选中数据
|
||||
const selectData = ref<any[]>([])
|
||||
|
||||
// 表格选择后回调事件
|
||||
const handleSelectionChange = (val: any[]) => {
|
||||
selectData.value = val.map(({ id }) => id)
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const { dictData } = useDictData('custom_type,credit_rating')
|
||||
|
||||
// 分页相关
|
||||
const { pager, getLists, resetParams, resetPage } = usePaging({
|
||||
fetchFun: apiCustomLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
// 添加
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('add')
|
||||
}
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
|
||||
let res = await apiCustomDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(res)
|
||||
}
|
||||
|
||||
// 删除
|
||||
const handleDelete = async (id: number | any[]) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await apiCustomDelete({ id })
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
@ -1,55 +1,162 @@
|
||||
<template>
|
||||
<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="90px" :rules="formRules">
|
||||
<el-form-item label="客户id" prop="customer_id">
|
||||
<el-input v-model="formData.customer_id" clearable placeholder="请输入客户id" />
|
||||
</el-form-item>
|
||||
<el-form-item label="报价日期" prop="quotation_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.quotation_date" clearable type="datetime"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择报价日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<popup ref="popupRef" :title="popupTitle" :async="true" width="80%" @confirm="handleSubmit" @close="handleClose">
|
||||
<el-form ref="formRef" :model="formData" label-width="90px" :rules="formRules" inline>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="客户" prop="customer_id" :rules="[{ required: true, message: '不可为空', trigger: 'change' }]">
|
||||
<el-input v-model="customer_name" clearable placeholder="请输入客户" readonly @click="showDialog = true" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="报价日期" prop="quotation_date">
|
||||
<el-date-picker class="flex-1 !flex" v-model="formData.quotation_date" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="选择报价日期">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="联系人" prop="contacts">
|
||||
<el-input v-model="formData.contacts" clearable placeholder="请输入联系人" />
|
||||
</el-form-item></el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="联系电话" prop="contacts_phone" :rules="[{ required: true, message: '请输入手机号码', trigger: 'blur' }, { validator: isMobileNumber, trigger: 'blur' }]">
|
||||
<el-input v-model="formData.contacts_phone" clearable placeholder="请输入联系电话" :regex="/^ 1[3 - 9]\d{ 9}$ /" @blur="handleBlur" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="制单人" prop="create_user">
|
||||
<el-input v-model="formData.create_user" clearable placeholder="请输入制单人" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="发票类型" prop="invoice_type">
|
||||
<el-radio-group v-model="formData.invoice_type" placeholder="请选择发票类型">
|
||||
<el-radio v-for="( item, index ) in dictData.invoice_type " :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col> <el-col :span="8">
|
||||
<el-form-item label="含税金额" prop="amount_including_tax">
|
||||
<el-input v-model="formData.amount_including_tax" clearable placeholder="请输入含税金额" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="运费" prop="freight">
|
||||
<el-input v-model="formData.freight" clearable placeholder="请输入运费" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="其他费用" prop="other_fee">
|
||||
<el-input v-model="formData.other_fee" clearable placeholder="请输入其他费用" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="合计金额" prop="total_amount">
|
||||
<el-input v-model="formData.total_amount" clearable placeholder="请输入合计金额" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="客户需求" prop="customer_require">
|
||||
<el-input v-model="formData.customer_require" clearable placeholder="请输入客户需求" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
|
||||
</el-form-item></el-col><el-col :span="8">
|
||||
<el-form-item label="附件" prop="field127">
|
||||
<el-upload accept=".pdf" class="upload-demo" :show-file-list="false" aria-hidden="true" :headers="{ Token: userStore.token }" :action="base_url + '/upload/file'" :on-success="handleAvatarSuccess_four" ref="upload">
|
||||
<el-button type="primary">
|
||||
上传
|
||||
</el-button>
|
||||
</el-upload>
|
||||
|
||||
<div>
|
||||
<div v-for="(item, index) in formData.annex" style="margin-left: 5px;display: block;">
|
||||
<a style="margin-left: 10px; color: #4a5dff; align-self: flex-start" :href="item.uri" target="_blank">{{ item.name }}</a>
|
||||
<span style="cursor: pointer;margin-left: 5px;" @click="delFileFn(index)">x</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div style=" display: flex;justify-content: flex-end;margin-bottom: 30px;"> <el-button @click="showDialog1 = true">选择产品</el-button></div>
|
||||
|
||||
<div style="margin-bottom: 30px;">
|
||||
<el-table :data="tableData" :summary-method="getSummaries" show-summary>
|
||||
<el-table-column label="序号">
|
||||
<template #default="{ row }">
|
||||
<el-button @click="handleAdd(row)">+</el-button>
|
||||
<el-button @click="handleDelete(row)">-</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="产品名称" prop="name1">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.name1" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="产品编码" prop="name2">
|
||||
<template #default="{ row }"> <el-input v-model="row.name2" /> </template></el-table-column>
|
||||
<el-table-column label="规格型号" prop="value1">
|
||||
<template #default="{ row }"> <el-input v-model="row.value1" /> </template></el-table-column>
|
||||
|
||||
<el-table-column label="品牌" prop="value2">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value2" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column label="参数说明" prop="value3">
|
||||
<template #default="{ row }"> <el-input v-model="row.value3" /> </template></el-table-column>
|
||||
|
||||
<el-table-column label="数量" prop="product_num">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.product_num" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="税率" prop="tax_rate">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.tax_rate" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="含税单价" prop="value6">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value6" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="不含税金额" prop="value7">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.value7" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="含税金额" prop="amount_including_tax">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.amount_including_tax" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" prop="remark">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.remark" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
|
||||
|
||||
</el-table>
|
||||
</div>
|
||||
<div>
|
||||
<reviewprocess></reviewprocess>
|
||||
</div>
|
||||
|
||||
|
||||
<el-form-item label="联系人" prop="contacts">
|
||||
<el-input v-model="formData.contacts" clearable placeholder="请输入联系人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="联系电话" prop="contacts_phone">
|
||||
<el-input v-model="formData.contacts_phone" clearable placeholder="请输入联系电话" />
|
||||
</el-form-item>
|
||||
<el-form-item label="制单人" prop="create_user">
|
||||
<el-input v-model="formData.create_user" clearable placeholder="请输入制单人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="发票类型" prop="invoice_type">
|
||||
<el-radio-group v-model="formData.invoice_type" placeholder="请选择发票类型">
|
||||
<el-radio v-for="(item, index) in dictData.invoice_type" :key="index" :label="parseInt(item.value)">
|
||||
{{ item.name }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="含税金额" prop="amount_including_tax">
|
||||
<el-input v-model="formData.amount_including_tax" clearable placeholder="请输入含税金额" />
|
||||
</el-form-item>
|
||||
<el-form-item label="运费" prop="freight">
|
||||
<el-input v-model="formData.freight" clearable placeholder="请输入运费" />
|
||||
</el-form-item>
|
||||
<el-form-item label="其他费用" prop="other_fee">
|
||||
<el-input v-model="formData.other_fee" clearable placeholder="请输入其他费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="合计金额" prop="total_amount">
|
||||
<el-input v-model="formData.total_amount" clearable placeholder="请输入合计金额" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户需求" prop="customer_require">
|
||||
<el-input v-model="formData.customer_require" clearable placeholder="请输入客户需求" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model="formData.remark" clearable placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
<el-form-item label="附件" prop="annex">
|
||||
<el-input v-model="formData.annex" clearable placeholder="请输入附件" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</popup>
|
||||
|
||||
<el-dialog v-model="showDialog" title="选择客户" width="70%">
|
||||
|
||||
<customDialog @customEvent="customEvent"></customDialog>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog v-model="showDialog1" title="选择产品" width="70%">
|
||||
|
||||
<customDialog1 @customEvent="customEvent1"></customDialog1>
|
||||
</el-dialog>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -58,6 +165,11 @@ import type { FormInstance } from 'element-plus'
|
||||
import Popup from '@/components/popup/index.vue'
|
||||
import { apiQuotationAdd, apiQuotationEdit, apiQuotationDetail } from '@/api/quotation'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import customDialog1 from '@/components/product/index.vue'
|
||||
import reviewprocess from '@/components/reviewprocess/index.vue'
|
||||
import useUserStore from "@/stores/modules/user";
|
||||
import configs from "@/config"
|
||||
const base_url = configs.baseUrl + configs.urlPrefix
|
||||
import type { PropType } from 'vue'
|
||||
defineProps({
|
||||
dictData: {
|
||||
@ -69,7 +181,29 @@ const emit = defineEmits(['success', 'close'])
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const popupRef = shallowRef<InstanceType<typeof Popup>>()
|
||||
const mode = ref('add')
|
||||
const showDialog = ref(false)
|
||||
const showDialog1 = ref(false)
|
||||
const customer_name = ref('')
|
||||
const userStore = useUserStore();
|
||||
const tableData = reactive([{}])
|
||||
// 上传文件
|
||||
const handleAvatarSuccess_four = (
|
||||
response,
|
||||
uploadFile
|
||||
) => {
|
||||
if (response.code == 0) {
|
||||
ElMessage.error(response.msg);
|
||||
return;
|
||||
}
|
||||
formData.annex.push(
|
||||
{ uri: response.data.uri, name: response.data.name }
|
||||
|
||||
);
|
||||
};
|
||||
// 删除上传的文件
|
||||
const delFileFn = (index: number) => {
|
||||
formData.annex.splice(index, 1)
|
||||
}
|
||||
|
||||
// 弹窗标题
|
||||
const popupTitle = computed(() => {
|
||||
@ -92,17 +226,40 @@ const formData = reactive({
|
||||
customer_require: '',
|
||||
remark: '',
|
||||
annex: '',
|
||||
approve_id: '',
|
||||
product: [],
|
||||
|
||||
})
|
||||
|
||||
|
||||
const customEvent = (e: any) => {
|
||||
formData.customer_id = e.id;
|
||||
customer_name.value = e.name;
|
||||
showDialog.value = false;
|
||||
};
|
||||
const customEvent1 = (e: any) => {
|
||||
// formData.customer_id = e.id;
|
||||
// customer_name.value = e.name;
|
||||
showDialog1.value = false;
|
||||
};
|
||||
// 表单验证
|
||||
const formRules = reactive<any>({
|
||||
|
||||
})
|
||||
|
||||
const handleAdd = (row: any) => {
|
||||
// 在 row 后面插入一行数据
|
||||
const index = tableData.indexOf(row);
|
||||
tableData.splice(index + 1, 0, {});
|
||||
};
|
||||
|
||||
const handleDelete = (row: any) => {
|
||||
// 删除 row
|
||||
const index = tableData.indexOf(row);
|
||||
tableData.splice(index, 1);
|
||||
};
|
||||
// 获取详情
|
||||
const setFormData = async (data: Record<any, any>) => {
|
||||
customer_name.value = data.custom.name
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
@ -114,12 +271,35 @@ const setFormData = async (data: Record<any, any>) => {
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
|
||||
const data = await apiQuotationDetail({
|
||||
id: row.id
|
||||
})
|
||||
console.log(data)
|
||||
|
||||
|
||||
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
const isMobileNumber = (rule: any, value: string | number | any[], callback: (arg0: Error | undefined) => void) => {
|
||||
if (!value) {
|
||||
return new Error("请输入电话号码");
|
||||
} else {
|
||||
const reg = /^1[3|4|5|7|8][0-9]\d{8}$/;
|
||||
const isPhone = reg.test(value);
|
||||
value = Number(value); //转换为数字
|
||||
if (typeof value === "number" && !isNaN(value)) {//判断是否为数字
|
||||
value = value.toString(); //转换成字符串
|
||||
if (value.length < 0 || value.length > 12 || !isPhone) { //判断是否为11位手机号
|
||||
callback(new Error("手机号码格式如:138xxxx8754"));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
} else {
|
||||
callback(new Error("请输入电话号码"));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 提交按钮
|
||||
const handleSubmit = async () => {
|
||||
|
@ -24,8 +24,7 @@
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button v-perms="['quotation.quotation/delete']" :disabled="!selectData.length"
|
||||
@click="handleDelete(selectData)">
|
||||
<el-button v-perms="['quotation.quotation/delete']" :disabled="!selectData.length" @click="handleDelete(selectData)">
|
||||
删除
|
||||
</el-button>
|
||||
<div class="mt-4">
|
||||
@ -50,8 +49,7 @@
|
||||
<el-button v-perms="['quotation.quotation/edit']" type="primary" link @click="handleEdit(row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-perms="['quotation.quotation/delete']" type="danger" link
|
||||
@click="handleDelete(row.id)">
|
||||
<el-button v-perms="['quotation.quotation/delete']" type="danger" link @click="handleDelete(row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
@ -69,7 +67,7 @@
|
||||
<script lang="ts" setup name="quotationLists">
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { useDictData } from '@/hooks/useDictOptions'
|
||||
import { apiQuotationLists, apiQuotationDelete } from '@/api/quotation'
|
||||
import { apiQuotationLists, apiQuotationDelete, apiQuotationDetail } from '@/api/quotation'
|
||||
import { timeFormat } from '@/utils/util'
|
||||
import feedback from '@/utils/feedback'
|
||||
import EditPopup from './edit.vue'
|
||||
@ -112,10 +110,16 @@ const handleAdd = async () => {
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (data: any) => {
|
||||
let res = await apiQuotationDetail({ id: data.id })
|
||||
showEdit.value = true
|
||||
await nextTick()
|
||||
editRef.value?.open('edit')
|
||||
editRef.value?.setFormData(data)
|
||||
editRef.value?.setFormData(res)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
// 删除
|
||||
|
Loading…
x
Reference in New Issue
Block a user