项目管理

master
lzq 2026-01-23 15:47:56 +08:00
parent ad658e16d3
commit b986f05757
6 changed files with 225 additions and 101 deletions

View File

@ -0,0 +1,125 @@
/* eslint-disable */
// @ts-nocheck
// biome-ignore lint: disable
// oxlint-disable
// ------
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
import { GlobalComponents } from 'vue'
export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
ElAside: typeof import('element-plus/es')['ElAside']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElIconCircleClose: typeof import('@element-plus/icons-vue')['CircleClose']
ElIconPhone: typeof import('@element-plus/icons-vue')['Phone']
ElIconPicture: typeof import('@element-plus/icons-vue')['Picture']
ElIconPlus: typeof import('@element-plus/icons-vue')['Plus']
ElImage: typeof import('element-plus/es')['ElImage']
ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElMain: typeof import('element-plus/es')['ElMain']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElText: typeof import('element-plus/es')['ElText']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTransfer: typeof import('element-plus/es')['ElTransfer']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
}
export interface GlobalDirectives {
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}
// For TSX support
declare global {
const ElAside: typeof import('element-plus/es')['ElAside']
const ElAvatar: typeof import('element-plus/es')['ElAvatar']
const ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
const ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
const ElButton: typeof import('element-plus/es')['ElButton']
const ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
const ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
const ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
const ElContainer: typeof import('element-plus/es')['ElContainer']
const ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
const ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
const ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
const ElDialog: typeof import('element-plus/es')['ElDialog']
const ElDivider: typeof import('element-plus/es')['ElDivider']
const ElDropdown: typeof import('element-plus/es')['ElDropdown']
const ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
const ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
const ElEmpty: typeof import('element-plus/es')['ElEmpty']
const ElForm: typeof import('element-plus/es')['ElForm']
const ElFormItem: typeof import('element-plus/es')['ElFormItem']
const ElHeader: typeof import('element-plus/es')['ElHeader']
const ElIcon: typeof import('element-plus/es')['ElIcon']
const ElIconCircleClose: typeof import('@element-plus/icons-vue')['CircleClose']
const ElIconPhone: typeof import('@element-plus/icons-vue')['Phone']
const ElIconPicture: typeof import('@element-plus/icons-vue')['Picture']
const ElIconPlus: typeof import('@element-plus/icons-vue')['Plus']
const ElImage: typeof import('element-plus/es')['ElImage']
const ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
const ElInput: typeof import('element-plus/es')['ElInput']
const ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
const ElMain: typeof import('element-plus/es')['ElMain']
const ElOption: typeof import('element-plus/es')['ElOption']
const ElPagination: typeof import('element-plus/es')['ElPagination']
const ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
const ElRadio: typeof import('element-plus/es')['ElRadio']
const ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
const ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
const ElSelect: typeof import('element-plus/es')['ElSelect']
const ElSwitch: typeof import('element-plus/es')['ElSwitch']
const ElTable: typeof import('element-plus/es')['ElTable']
const ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
const ElTabPane: typeof import('element-plus/es')['ElTabPane']
const ElTabs: typeof import('element-plus/es')['ElTabs']
const ElTag: typeof import('element-plus/es')['ElTag']
const ElText: typeof import('element-plus/es')['ElText']
const ElTooltip: typeof import('element-plus/es')['ElTooltip']
const ElTransfer: typeof import('element-plus/es')['ElTransfer']
const ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
const ElUpload: typeof import('element-plus/es')['ElUpload']
const RouterLink: typeof import('vue-router')['RouterLink']
const RouterView: typeof import('vue-router')['RouterView']
}

View File

@ -33,6 +33,11 @@
</ElFormItem> </ElFormItem>
</template> </template>
<template #simpleSearchFormItem="{searchForm}"> <template #simpleSearchFormItem="{searchForm}">
<ElFormItem>
<ElSelect v-model="searchForm.identityCategory" placeholder="身份类型">
<ElOption v-for="item in identityCategory" :key="item.val" :label="item.txt" :value="item.val"/>
</ElSelect>
</ElFormItem>
<ElFormItem> <ElFormItem>
<ElInput v-model="searchForm.nickname" placeholder="客户姓名"/> <ElInput v-model="searchForm.nickname" placeholder="客户姓名"/>
</ElFormItem> </ElFormItem>
@ -135,20 +140,20 @@ const actionColumn = reactive<ActionColumnType<CustomerTypes.TableData>>({
}, },
}, },
/* { /* {
icon: 'Delete', icon: 'Delete',
loading: false, loading: false,
type: 'danger', type: 'danger',
tooltip: '删除', tooltip: '删除',
confirm: { confirm: {
title: '是否删除当前数据', title: '是否删除当前数据',
}, },
action({row}) { action({row}) {
return CustomerApi.del([ row.id! ]) return CustomerApi.del([ row.id! ])
.then(() => { .then(() => {
ElMessage.success('删除成功') ElMessage.success('删除成功')
return true return true
}) })
}, },
}, */ }, */
], ],
}) })

View File

@ -2,6 +2,18 @@
<FormPage <FormPage
ref="formPage" ref="formPage"
:action-column="actionColumn" :action-column="actionColumn"
:formStyle=" {
border: false,
colCount: 3,
vgap: '20px',
hgap: '20px',
}"
:left-tools="leftTools"
:search-form-props="{
labelPosition: 'left',
labelWidth: '100px',
inline: true,
}"
:paging="paging"> :paging="paging">
<template #searchFormItem="{ searchForm }"> <template #searchFormItem="{ searchForm }">
<ElFormItem label="项目名称"> <ElFormItem label="项目名称">
@ -9,20 +21,21 @@
v-model="searchForm.projectName" v-model="searchForm.projectName"
placeholder="项目名称"/> placeholder="项目名称"/>
</ElFormItem> </ElFormItem>
<ElFormItem label="区县"> <ElFormItem label="客户名称">
<ElInput <ElInput
v-model="searchForm.areaName" v-model="searchForm.fringeName"
placeholder="区县"/> placeholder="客户名称"/>
</ElFormItem> </ElFormItem>
<ElFormItem label="乡镇街道"> <ElFormItem label="运输方名称">
<ElInput <ElInput
v-model="searchForm.townName" v-model="searchForm.transName"
placeholder="乡镇街道"/> placeholder="运输方名称"/>
</ElFormItem> </ElFormItem>
<ElFormItem label="详细地址"> <ElFormItem label="合同有效期">
<ElInput <ADtPicker v-model="searchForm.contractTimes" :change-handler="research"/>
v-model="searchForm.address" </ElFormItem>
placeholder="详细地址"/> <ElFormItem label="创建时间">
<ADtPicker v-model="searchForm.createTimes" :change-handler="research"/>
</ElFormItem> </ElFormItem>
</template> </template>
<template #simpleSearchFormItem="{ searchForm }"> <template #simpleSearchFormItem="{ searchForm }">
@ -31,22 +44,34 @@
v-model="searchForm.projectName" v-model="searchForm.projectName"
placeholder="项目名称"/> placeholder="项目名称"/>
</ElFormItem> </ElFormItem>
<ElFormItem>
<ElInput
v-model="searchForm.fringeName"
placeholder="客户名称"/>
</ElFormItem>
<ElFormItem>
<ElInput
v-model="searchForm.transName"
placeholder="运输方名称"/>
</ElFormItem>
</template> </template>
<template #columns> <template #columns>
<ElTableColumn label="项目名称" prop="projectName"/> <ElTableColumn label="项目名称" prop="projectName"/>
<!-- <ElTableColumn label="合同图片" prop="contractPicture"/> --> <ElTableColumn label="运输方联系人" prop="transCustomerName" width="140px"/>
<ElTableColumn label="运输方企业" prop="transOrgInfo.orgName"/> <ElTableColumn label="运输方联系电话" prop="transCustomerPhone" width="140px"/>
<ElTableColumn label="产废方/购买方企业" prop="fringeOrgInfo.orgName"/> <ElTableColumn label="运输企业名称" prop="transOrgName" width="140px"/>
<!-- <ElTableColumn label="市" prop="cityName"/> --> <ElTableColumn label="客户名称" prop="fringeCustomerName" width="140px"/>
<ElTableColumn label="区县" prop="areaName"/> <ElTableColumn label="客户联系电话" prop="fringeCustomerPhone" width="140px"/>
<ElTableColumn label="乡镇街道" prop="townName"/> <ElTableColumn label="客户企业名称" prop="fringeOrgName" width="140px"/>
<ElTableColumn label="详细地址" prop="address"/> <!-- <ElTableColumn label="详细地址" prop="address" width="240" show-overflow-tooltip/> -->
<ElTableColumn label="合同有效期" prop="contractStartDate"/> <ElTableColumn label="合同有效期" prop="contractStartDate" width="210">
<ElTableColumn label="合同有效期" prop="contractEndDate"/> <template #default="{ row }">
<ElTableColumn label="创建时间" prop="createTime"/> {{ row.contractStartDate + ' 至 ' + row.contractEndDate ?? '--' }}
<ElTableColumn label="修改时间" prop="modifyTime"/> </template>
</ElTableColumn>
<ElTableColumn label="创建时间" prop="createTime" width="170"/>
</template> </template>
<ProjectForm ref="projectForm" @edit-succ="research"/> <ProjectForm ref="projectForm" :research="research"/>
<ProjectDetail ref="projectDetail" @edit-succ="research"/> <ProjectDetail ref="projectDetail" @edit-succ="research"/>
</FormPage> </FormPage>
</template> </template>
@ -56,11 +81,16 @@ import ProjectApi from '@/pages/cst/project/project-api.ts'
import ProjectDetail from '@/pages/cst/project/ProjectDetail.vue' import ProjectDetail from '@/pages/cst/project/ProjectDetail.vue'
import ProjectForm from '@/pages/cst/project/ProjectForm.vue' import ProjectForm from '@/pages/cst/project/ProjectForm.vue'
import FormPage from '@/components/page/FormPage.vue' import FormPage from '@/components/page/FormPage.vue'
import type { ActionColumnType } from '@/components/page/a-page-type.ts' import type {
ActionColumnType,
ToolType,
} from '@/components/page/a-page-type.ts'
import type { ComponentExposed } from 'vue-component-type-helpers' import type { ComponentExposed } from 'vue-component-type-helpers'
import ADtPicker from '@/components/a-dt-picker/ADtPicker.vue'
const formPageIns = useTemplateRef<ComponentExposed<typeof FormPage>>('formPage') const formPageIns = useTemplateRef<ComponentExposed<typeof FormPage>>('formPage')
const projectDetailIns = useTemplateRef<InstanceType<typeof ProjectDetail>>('projectDetail') const projectDetailIns = useTemplateRef<InstanceType<typeof ProjectDetail>>('projectDetail')
const projectFormIns = useTemplateRef<InstanceType<typeof ProjectDetail>>('projectForm')
const actionColumn = reactive<ActionColumnType<ProjectTypes.SearchProjectResult>>({ const actionColumn = reactive<ActionColumnType<ProjectTypes.SearchProjectResult>>({
tableActions: [ tableActions: [
@ -73,6 +103,15 @@ const actionColumn = reactive<ActionColumnType<ProjectTypes.SearchProjectResult>
}, },
], ],
}) })
const leftTools: ToolType[] = [
{
icon: 'Plus',
label: '新建',
action() {
projectFormIns.value?.open()
},
},
]
function research() { function research() {
formPageIns.value?.doSearch() formPageIns.value?.doSearch()

View File

@ -3,57 +3,16 @@ export {}
declare global { declare global {
namespace ProjectTypes { namespace ProjectTypes {
interface SearchProjectParam extends G.PageParam { interface SearchProjectParam extends G.PageParam {
// Id
id?: string;
// 项目名称 // 项目名称
projectName?: string; projectName?: string
orgName?: string; fringeName?: string
// 合同图片 transName?: string
contractPicture?: string; contractTimes?: [ string | undefined, string | undefined ]
// 运输方客户 Id contractStartDate?: string
transCustomerId?: string; contractEndDate?: string
// 运输方企业 Id createTimes?: [ string | undefined, string | undefined ]
transOrgId?: string; createTimeStart?: string
// 产废方/购买方客户 Id createTimeEnd?: string
fringeCustomerId?: string;
// 产废方/购买方企业 Id
fringeOrgId?: string;
// 省;代码
province?: string;
// 市;代码
city?: string;
// 区县;代码
area?: string;
// 乡镇街道;代码
town?: string;
// 省;名称
provinceName?: string;
// 市;名称
cityName?: string;
// 区县;名称
areaName?: string;
// 乡镇街道;名称
townName?: string;
// 详细地址
address?: string;
// 经度
lng?: number;
// 纬度
lat?: number;
// 合同有效期
contractStartDate?: string;
// 合同有效期
contractEndDate?: string;
// 创建人 Id sys_user.id
creatorId?: string;
// 修改人 Id sys_user.id
modifierId?: string;
// 创建时间
createTime?: string;
// 修改时间
modifyTime?: string;
// 是否删除; 0-->未删除、1-->已删除
deleted?: boolean;
} }
interface SearchProjectResult { interface SearchProjectResult {
@ -65,12 +24,18 @@ declare global {
contractPicture?: string contractPicture?: string
// 运输方客户 Id // 运输方客户 Id
transCustomerId?: string transCustomerId?: string
transCustomerName?: string
transCustomerPhone?: string
// 运输方企业 Id // 运输方企业 Id
transOrgId?: string transOrgId?: string
transOrgName?: string
// 产废方/购买方客户 Id // 产废方/购买方客户 Id
fringeCustomerId?: string fringeCustomerId?: string
fringeCustomerName?: string
fringeCustomerPhone?: string
// 产废方/购买方企业 Id // 产废方/购买方企业 Id
fringeOrgId?: string fringeOrgId?: string
fringeOrgName?: string
// 省;代码 // 省;代码
province?: string province?: string
// 市;代码 // 市;代码
@ -97,16 +62,8 @@ declare global {
contractStartDate?: string contractStartDate?: string
// 合同有效期 // 合同有效期
contractEndDate?: string contractEndDate?: string
// 创建人 Id sys_user.id
creatorId?: string
// 修改人 Id sys_user.id
modifierId?: string
// 创建时间 // 创建时间
createTime?: string createTime?: string
// 修改时间
modifyTime?: string
// 是否删除; 0-->未删除、1-->已删除
deleted?: boolean
} }
interface AddProjectParam { interface AddProjectParam {

View File

@ -9,9 +9,7 @@ declare global {
categoryName?: string categoryName?: string
// 创建时间范围 // 创建时间范围
createTimes?: [ string | undefined, string | undefined ] createTimes?: [ string | undefined, string | undefined ]
// 修改时间
createTimeStart?: string createTimeStart?: string
// 是否删除; 0-->未删除、1-->已删除
createTimeEnd?: string createTimeEnd?: string
} }

View File

@ -50,10 +50,7 @@ const actionColumn = reactive<ActionColumnType<RoleTypes.SearchRoleResult>>({
tableActions: [ tableActions: [
{ {
tooltip: '资源', tooltip: '资源',
icon: 'Edit', icon: 'ScaleToOriginal',
show({row}) {
return row.id != '1'
},
action({row}: { row: RoleTypes.SearchRoleResult }) { action({row}: { row: RoleTypes.SearchRoleResult }) {
bindResIns.value?.open(row.id!) bindResIns.value?.open(row.id!)
}, },
@ -61,6 +58,9 @@ const actionColumn = reactive<ActionColumnType<RoleTypes.SearchRoleResult>>({
{ {
tooltip: '编辑', tooltip: '编辑',
icon: 'Edit', icon: 'Edit',
show({row}) {
return row.id != '1'
},
action({row}: { row: RoleTypes.SearchRoleResult }) { action({row}: { row: RoleTypes.SearchRoleResult }) {
if (row.id == '1') { if (row.id == '1') {
ElMessage.error('不能操作管理员') ElMessage.error('不能操作管理员')