代码更新

This commit is contained in:
jia 2023-12-12 11:29:58 +08:00
parent 64e8e773f5
commit e348783ec2
47 changed files with 7084 additions and 4040 deletions

@ -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})
}

@ -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 })
}
// 添加岗位

@ -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>

@ -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"]);

@ -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>

@ -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">

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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>

@ -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()
})

@ -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>

@ -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,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)
}
//

6242
yarn.lock

File diff suppressed because it is too large Load Diff