feat(oa/crm): 添加礼品管理模块

- 新增礼品申请编辑页面,包含基本信息、礼品明细、审批信息等功能
- 实现礼品申请的增删改查操作,支持批量发放礼品功能
- 添加礼品申请明细、礼品信息、礼品发放记录等相关API接口
- 集成审批流程功能,支持工作流条件分支判断和审批记录查看
- 实现库存不足异常处理和用户友好的提示机制
dev
zangch@mesnac.com 5 months ago
parent 148c349760
commit 75af8f63c7

@ -0,0 +1,65 @@
/**
*
*/
export interface CrmCustomerInfoVO {
customerId: number;
customerName: string;
mnemonicName?: string;
industryId?: number;
customerType?: number;
customerStatus?: number;
customerLevel?: number;
customerSource?: number;
ownerId?: number;
ownerName?: string;
detailedAddress?: string;
customerScale?: number;
parentCustomerId?: number;
customerRelationship?: string;
legalRepresentative?: string;
businessLicenseNumber?: string;
taxNumber?: string;
bankAccountOpening?: string;
bankNumber?: string;
ossId?: string;
remark?: string;
activeFlag?: string;
ourCompanyFlag?: string;
}
export interface CrmCustomerInfoQuery {
pageNum?: number;
pageSize?: number;
customerName?: string;
mnemonicName?: string;
customerType?: number;
customerStatus?: number;
customerLevel?: number;
activeFlag?: string;
ourCompanyFlag?: string;
}
export interface CrmCustomerInfoForm {
customerId?: number;
customerName?: string;
mnemonicName?: string;
industryId?: number;
customerType?: number;
customerStatus?: number;
customerLevel?: number;
customerSource?: number;
ownerId?: number;
detailedAddress?: string;
customerScale?: number;
parentCustomerId?: number;
customerRelationship?: string;
legalRepresentative?: string;
businessLicenseNumber?: string;
taxNumber?: string;
bankAccountOpening?: string;
bankNumber?: string;
ossId?: string;
remark?: string;
activeFlag?: string;
ourCompanyFlag?: string;
}

@ -0,0 +1,100 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { CrmGiftApplyForm, CrmGiftApplyQuery, CrmGiftApplyVO } from '@/api/oa/crm/crmGiftApply/types';
/**
*
* @param query
* @returns {*}
*/
export const listCrmGiftApply = (query?: CrmGiftApplyQuery): AxiosPromise<CrmGiftApplyVO[]> => {
return request({
url: '/oa/crm/crmGiftApply/list',
method: 'get',
params: query
});
};
/**
*
* @param giftApplyId
*/
export const getCrmGiftApply = (giftApplyId: string | number): AxiosPromise<CrmGiftApplyVO> => {
return request({
url: '/oa/crm/crmGiftApply/' + giftApplyId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addCrmGiftApply = (data: CrmGiftApplyForm) => {
return request({
url: '/oa/crm/crmGiftApply',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateCrmGiftApply = (data: CrmGiftApplyForm) => {
return request({
url: '/oa/crm/crmGiftApply',
method: 'put',
data: data
});
};
/**
*
* @param giftApplyId
*/
export const delCrmGiftApply = (giftApplyId: string | number | Array<string | number>) => {
return request({
url: '/oa/crm/crmGiftApply/' + giftApplyId,
method: 'delete'
});
};
/**
*
* @param query
* @returns {*}
*/
export function getCrmGiftApplyList(query) {
return request({
url: '/oa/crm/crmGiftApply/getCrmGiftApplyList',
method: 'get',
params: query
});
}
/**
*
* @param data
*/
export const giftApplySubmitAndFlowStart = (data: CrmGiftApplyForm): AxiosPromise<CrmGiftApplyVO> => {
return request({
url: '/oa/crm/crmGiftApply/submitAndFlowStart',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const batchIssueGifts = (data: CrmGiftApplyForm) => {
return request({
url: '/oa/crm/crmGiftApply/batchIssue',
method: 'post',
data: data
});
};

@ -0,0 +1,319 @@
import { CrmGiftApplyDetailVO } from '@/api/oa/crm/crmGiftApplyDetail/types';
export interface CrmGiftApplyVO {
/**
* ID
*/
giftApplyId: string | number;
/**
*
*/
applicationCode: string;
/**
* ID
*/
applicantId: string | number;
/**
*
*/
applicantName: string;
/**
* ID
*/
applicantDeptId: string | number;
/**
*
*/
applicantDeptName: string;
/**
*
*/
applicationDate: string;
/**
* ID
*/
customerUnitId: string | number;
/**
*
*/
customerUnitName: string;
/**
*
*/
guestName: string;
/**
*
*/
peopleCount: number;
/**
*
*/
applicationReason: string;
/**
* ID
*/
recipientId: string | number;
/**
*
*/
recipientName: string;
/**
*
*/
recipientDate: string;
/**
*
*/
totalAmount: number;
/**
* (1 2 3 4)
*/
applicationStatus: string;
/**
*
*/
flowStatus: string;
/**
*
*/
remark: string;
/**
*
*/
detailList?: CrmGiftApplyDetailVO[];
}
// CrmGiftApplyDetailVO 从 crmGiftApplyDetail/types.ts 导入,避免重复定义
export type { CrmGiftApplyDetailVO };
export interface CrmGiftApplyForm extends BaseEntity {
/**
* ID
*/
giftApplyId?: string | number;
/**
*
*/
applicationCode?: string;
/**
* ID
*/
applicantId?: string | number;
/**
*
*/
applicantName?: string;
/**
* ID
*/
applicantDeptId?: string | number;
/**
*
*/
applicantDeptName?: string;
/**
*
*/
applicationDate?: string;
/**
* ID
*/
customerUnitId?: string | number;
/**
*
*/
customerUnitName?: string;
/**
*
*/
guestName?: string;
/**
*
*/
peopleCount?: number;
/**
*
*/
applicationReason?: string;
/**
* ID
*/
recipientId?: string | number;
/**
*
*/
recipientName?: string;
/**
*
*/
recipientDate?: string;
/**
*
*/
totalAmount?: number;
/**
* (1 2 3 4)
*/
applicationStatus?: string;
/**
*
*/
flowStatus?: string;
/**
*
*/
remark?: string;
// ==================== 流程相关字段 ====================
/**
*
*/
flowCode?: string;
/**
*
*/
variables?: any;
/**
*
*/
bizExt?: any;
// ==================== 子表数据 ====================
/**
*
*/
detailList?: CrmGiftApplyDetailVO[];
}
export interface CrmGiftApplyQuery extends PageQuery {
/**
*
*/
applicationCode?: string;
/**
* ID
*/
applicantId?: string | number;
/**
*
*/
applicantName?: string;
/**
* ID
*/
applicantDeptId?: string | number;
/**
*
*/
applicantDeptName?: string;
/**
*
*/
applicationDate?: string;
/**
* ID
*/
customerUnitId?: string | number;
/**
*
*/
customerUnitName?: string;
/**
*
*/
guestName?: string;
/**
*
*/
peopleCount?: number;
/**
*
*/
applicationReason?: string;
/**
* ID
*/
recipientId?: string | number;
/**
*
*/
recipientName?: string;
/**
*
*/
recipientDate?: string;
/**
*
*/
totalAmount?: number;
/**
* (1 2 3 4)
*/
applicationStatus?: string;
/**
*
*/
flowStatus?: string;
/**
*
*/
params?: any;
}

@ -0,0 +1,76 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { CrmGiftApplyDetailForm, CrmGiftApplyDetailQuery, CrmGiftApplyDetailVO } from '@/api/oa/crm/crmGiftApplyDetail/types';
/**
*
* @param query
* @returns {*}
*/
export const listCrmGiftApplyDetail = (query?: CrmGiftApplyDetailQuery): AxiosPromise<CrmGiftApplyDetailVO[]> => {
return request({
url: '/oa/crm/crmGiftApplyDetail/list',
method: 'get',
params: query
});
};
/**
*
* @param detailId
*/
export const getCrmGiftApplyDetail = (detailId: string | number): AxiosPromise<CrmGiftApplyDetailVO> => {
return request({
url: '/oa/crm/crmGiftApplyDetail/' + detailId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addCrmGiftApplyDetail = (data: CrmGiftApplyDetailForm) => {
return request({
url: '/oa/crm/crmGiftApplyDetail',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateCrmGiftApplyDetail = (data: CrmGiftApplyDetailForm) => {
return request({
url: '/oa/crm/crmGiftApplyDetail',
method: 'put',
data: data
});
};
/**
*
* @param detailId
*/
export const delCrmGiftApplyDetail = (detailId: string | number | Array<string | number>) => {
return request({
url: '/oa/crm/crmGiftApplyDetail/' + detailId,
method: 'delete'
});
};
/**
*
* @param query
* @returns {*}
*/
export function getCrmGiftApplyDetailList(query) {
return request({
url: '/oa/crm/crmGiftApplyDetail/getCrmGiftApplyDetailList',
method: 'get',
params: query
});
}

@ -0,0 +1,186 @@
export interface CrmGiftApplyDetailVO {
/**
* ID
*/
detailId: string | number;
/**
* ID
*/
applicationId: string | number;
/**
* ID
*/
giftId: string | number;
/**
*
*/
giftCode: string;
/**
*
*/
giftName: string;
/**
*
*/
specification: string;
/**
* ()
*/
unitPrice: number;
/**
*
*/
inventoryQuantity: number;
/**
*
*/
applicationQuantity: number;
/**
*
*/
giftAmount: number;
/**
*
*/
sortOrder: number;
/**
*
*/
remark: string;
}
export interface CrmGiftApplyDetailForm extends BaseEntity {
/**
* ID
*/
detailId?: string | number;
/**
* ID
*/
applicationId?: string | number;
/**
* ID
*/
giftId?: string | number;
/**
*
*/
giftCode?: string;
/**
*
*/
giftName?: string;
/**
*
*/
specification?: string;
/**
* ()
*/
unitPrice?: number;
/**
*
*/
inventoryQuantity?: number;
/**
*
*/
applicationQuantity?: number;
/**
*
*/
giftAmount?: number;
/**
*
*/
sortOrder?: number;
/**
*
*/
remark?: string;
}
export interface CrmGiftApplyDetailQuery extends PageQuery {
/**
* ID
*/
applicationId?: string | number;
/**
* ID
*/
giftId?: string | number;
/**
*
*/
giftCode?: string;
/**
*
*/
giftName?: string;
/**
*
*/
specification?: string;
/**
* ()
*/
unitPrice?: number;
/**
*
*/
inventoryQuantity?: number;
/**
*
*/
applicationQuantity?: number;
/**
*
*/
giftAmount?: number;
/**
*
*/
sortOrder?: number;
/**
*
*/
params?: any;
}

@ -0,0 +1,76 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { CrmGiftInfoForm, CrmGiftInfoQuery, CrmGiftInfoVO } from '@/api/oa/crm/crmGiftInfo/types';
/**
*
* @param query
* @returns {*}
*/
export const listCrmGiftInfo = (query?: CrmGiftInfoQuery): AxiosPromise<CrmGiftInfoVO[]> => {
return request({
url: '/oa/crm/crmGiftInfo/list',
method: 'get',
params: query
});
};
/**
*
* @param giftId
*/
export const getCrmGiftInfo = (giftId: string | number): AxiosPromise<CrmGiftInfoVO> => {
return request({
url: '/oa/crm/crmGiftInfo/' + giftId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addCrmGiftInfo = (data: CrmGiftInfoForm) => {
return request({
url: '/oa/crm/crmGiftInfo',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateCrmGiftInfo = (data: CrmGiftInfoForm) => {
return request({
url: '/oa/crm/crmGiftInfo',
method: 'put',
data: data
});
};
/**
*
* @param giftId
*/
export const delCrmGiftInfo = (giftId: string | number | Array<string | number>) => {
return request({
url: '/oa/crm/crmGiftInfo/' + giftId,
method: 'delete'
});
};
/**
*
* @param query
* @returns {*}
*/
export function getCrmGiftInfoList(query) {
return request({
url: '/oa/crm/crmGiftInfo/getCrmGiftInfoList',
method: 'get',
params: query
});
}

@ -0,0 +1,126 @@
export interface CrmGiftInfoVO {
/**
* ID
*/
giftId: string | number;
/**
*
*/
giftCode: string;
/**
*
*/
giftName: string;
/**
*
*/
specification: string;
/**
* ()
*/
unitPrice: number;
/**
* ID
*/
unitId: string | number;
/**
*
*/
inventoryQuantity: number;
/**
*
*/
remark: string;
}
export interface CrmGiftInfoForm extends BaseEntity {
/**
* ID
*/
giftId?: string | number;
/**
*
*/
giftCode?: string;
/**
*
*/
giftName?: string;
/**
*
*/
specification?: string;
/**
* ()
*/
unitPrice?: number;
/**
* ID
*/
unitId?: string | number;
/**
*
*/
inventoryQuantity?: number;
/**
*
*/
remark?: string;
}
export interface CrmGiftInfoQuery extends PageQuery {
/**
*
*/
giftCode?: string;
/**
*
*/
giftName?: string;
/**
*
*/
specification?: string;
/**
* ()
*/
unitPrice?: number;
/**
* ID
*/
unitId?: string | number;
/**
*
*/
inventoryQuantity?: number;
/**
*
*/
params?: any;
}

@ -0,0 +1,76 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { CrmGiftIssueRecordForm, CrmGiftIssueRecordQuery, CrmGiftIssueRecordVO } from '@/api/oa/crm/crmGiftIssueRecord/types';
/**
*
* @param query
* @returns {*}
*/
export const listCrmGiftIssueRecord = (query?: CrmGiftIssueRecordQuery): AxiosPromise<CrmGiftIssueRecordVO[]> => {
return request({
url: '/oa/crm/crmGiftIssueRecord/list',
method: 'get',
params: query
});
};
/**
*
* @param issueRecordId
*/
export const getCrmGiftIssueRecord = (issueRecordId: string | number): AxiosPromise<CrmGiftIssueRecordVO> => {
return request({
url: '/oa/crm/crmGiftIssueRecord/' + issueRecordId,
method: 'get'
});
};
/**
*
* @param data
*/
export const addCrmGiftIssueRecord = (data: CrmGiftIssueRecordForm) => {
return request({
url: '/oa/crm/crmGiftIssueRecord',
method: 'post',
data: data
});
};
/**
*
* @param data
*/
export const updateCrmGiftIssueRecord = (data: CrmGiftIssueRecordForm) => {
return request({
url: '/oa/crm/crmGiftIssueRecord',
method: 'put',
data: data
});
};
/**
*
* @param issueRecordId
*/
export const delCrmGiftIssueRecord = (issueRecordId: string | number | Array<string | number>) => {
return request({
url: '/oa/crm/crmGiftIssueRecord/' + issueRecordId,
method: 'delete'
});
};
/**
*
* @param query
* @returns {*}
*/
export function getCrmGiftIssueRecordList(query) {
return request({
url: '/oa/crm/crmGiftIssueRecord/getCrmGiftIssueRecordList',
method: 'get',
params: query
});
}

@ -0,0 +1,291 @@
export interface CrmGiftIssueRecordVO {
/**
* ID
*/
issueRecordId: string | number;
/**
* ID
*/
applicationId: string | number;
/**
*
*/
applicationCode: string;
/**
* ID
*/
detailId: string | number;
/**
* ID
*/
giftId: string | number;
/**
*
*/
giftCode: string;
/**
*
*/
giftName: string;
/**
*
*/
specification: string;
/**
*
*/
issueQuantity: number;
/**
*
*/
issueDate: string;
/**
* ID
*/
recipientId: string | number;
/**
*
*/
recipientName: string;
/**
* ID
*/
issueBy: number;
/**
*
*/
issueByName: string;
/**
* ID
*/
issueDeptId: string | number;
/**
*
*/
issueDeptName: string;
/**
*
*/
beforeInventory: number;
/**
*
*/
afterInventory: number;
/**
*
*/
remark: string;
}
export interface CrmGiftIssueRecordForm extends BaseEntity {
/**
* ID
*/
issueRecordId?: string | number;
/**
* ID
*/
applicationId?: string | number;
/**
*
*/
applicationCode?: string;
/**
* ID
*/
detailId?: string | number;
/**
* ID
*/
giftId?: string | number;
/**
*
*/
giftCode?: string;
/**
*
*/
giftName?: string;
/**
*
*/
specification?: string;
/**
*
*/
issueQuantity?: number;
/**
*
*/
issueDate?: string;
/**
* ID
*/
recipientId?: string | number;
/**
*
*/
recipientName?: string;
/**
* ID
*/
issueBy?: number;
/**
*
*/
issueByName?: string;
/**
* ID
*/
issueDeptId?: string | number;
/**
*
*/
issueDeptName?: string;
/**
*
*/
beforeInventory?: number;
/**
*
*/
afterInventory?: number;
/**
*
*/
remark?: string;
}
export interface CrmGiftIssueRecordQuery extends PageQuery {
/**
* ID
*/
applicationId?: string | number;
/**
*
*/
applicationCode?: string;
/**
* ID
*/
detailId?: string | number;
/**
* ID
*/
giftId?: string | number;
/**
*
*/
giftCode?: string;
/**
*
*/
giftName?: string;
/**
*
*/
specification?: string;
/**
*
*/
issueQuantity?: number;
/**
*
*/
issueDate?: string;
/**
* ID
*/
recipientId?: string | number;
/**
*
*/
recipientName?: string;
/**
* ID
*/
issueBy?: number;
/**
*
*/
issueByName?: string;
/**
* ID
*/
issueDeptId?: string | number;
/**
*
*/
issueDeptName?: string;
/**
*
*/
beforeInventory?: number;
/**
*
*/
afterInventory?: number;
/**
*
*/
params?: any;
}

@ -0,0 +1,574 @@
<template>
<div class="p-2">
<el-card shadow="never">
<!-- 审批按钮组件 -->
<approvalButton
@submitForm="submitForm"
@approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading"
:id="form.giftApplyId"
:status="form.flowStatus"
:pageType="routeParams.type"
:mode="false"
/>
</el-card>
<el-card shadow="never" style="margin-top: 10px">
<el-form
ref="formRef"
:model="form"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
:rules="rules"
label-width="120px"
>
<!-- 基本信息 -->
<el-divider content-position="left">基本信息</el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="申请编号" prop="applicationCode">
<el-input v-model="form.applicationCode" placeholder="系统自动生成" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请日期" prop="applicationDate">
<el-date-picker v-model="form.applicationDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择申请日期" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请人" prop="applicantName">
<el-input v-model="form.applicantName" placeholder="申请人" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="申请部门" prop="applicantDeptName">
<el-input v-model="form.applicantDeptName" placeholder="申请部门" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户名称" prop="customerUnitId">
<el-select v-model="form.customerUnitId" placeholder="请选择客户" filterable @change="handleCustomerChange" style="width: 100%">
<el-option v-for="customer in customerList" :key="customer.customerId" :label="customer.customerName" :value="customer.customerId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客人姓名" prop="guestName">
<el-input v-model="form.guestName" placeholder="请输入客人姓名" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="人数" prop="peopleCount">
<el-input-number v-model="form.peopleCount" :min="1" placeholder="请输入人数" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="领用人" prop="recipientName">
<el-input v-model="form.recipientName" placeholder="请输入领用人姓名" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="申请事由" prop="applicationReason">
<el-input v-model="form.applicationReason" type="textarea" :rows="3" placeholder="请输入申请事由" />
</el-form-item>
</el-col>
</el-row>
<!-- 礼品明细 -->
<el-divider content-position="left">礼品明细</el-divider>
<el-row :gutter="10" class="mb8" v-if="routeParams.type !== 'view' && routeParams.type !== 'approval'">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAddDetail"></el-button>
</el-col>
</el-row>
<el-table :data="form.detailList" border style="width: 100%">
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="礼品" min-width="200" align="center">
<template #default="scope">
<el-select
v-model="scope.row.giftId"
placeholder="请选择礼品"
filterable
@change="(val) => handleGiftChange(val, scope.$index)"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
style="width: 100%"
>
<el-option v-for="gift in giftList" :key="gift.giftId" :label="`${gift.giftCode} - ${gift.giftName}`" :value="gift.giftId" />
</el-select>
</template>
</el-table-column>
<el-table-column label="规格型号" prop="specification" min-width="120" align="center" />
<el-table-column label="单价(元)" prop="unitPrice" width="100" align="center">
<template #default="scope">
{{ scope.row.unitPrice ? '¥' + scope.row.unitPrice : '-' }}
</template>
</el-table-column>
<el-table-column label="库存数量" prop="inventoryQuantity" width="100" align="center" />
<el-table-column label="申请数量" width="120" align="center">
<template #default="scope">
<el-input-number
v-model="scope.row.applicationQuantity"
:min="1"
:max="scope.row.inventoryQuantity || 999999"
size="small"
@change="calculateAmount(scope.$index)"
:disabled="routeParams.type === 'view' || routeParams.type === 'approval'"
/>
</template>
</el-table-column>
<el-table-column label="金额(元)" width="120" align="center">
<template #default="scope">
{{ scope.row.giftAmount ? '¥' + scope.row.giftAmount : '-' }}
</template>
</el-table-column>
<el-table-column label="备注" min-width="150" align="center">
<template #default="scope">
<el-input v-model="scope.row.remark" placeholder="备注" :disabled="routeParams.type === 'view' || routeParams.type === 'approval'" />
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" fixed="right" v-if="routeParams.type !== 'view' && routeParams.type !== 'approval'">
<template #default="scope">
<el-button link type="danger" icon="Delete" @click="handleDeleteDetail(scope.$index)"></el-button>
</template>
</el-table-column>
</el-table>
<!-- 合计金额 -->
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="24" style="text-align: right">
<span style="font-size: 16px; font-weight: bold">申请总金额¥{{ form.totalAmount || 0 }}</span>
</el-col>
</el-row>
<!-- 审批信息仅非市场部用户显示 -->
<template v-if="showApproverSelector && !isFormDisabled">
<el-divider content-position="left">审批信息</el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="下一步审批人" prop="variables.approverId">
<el-select
v-model="form.variables.approverId"
placeholder="请选择或搜索审批人"
filterable
clearable
style="width: 100%"
@change="handleApproverSelectChange"
>
<el-option
v-for="user in userList"
:key="user.userId"
:label="`${user.nickName} (${user.deptName || '未知部门'})`"
:value="user.userId"
/>
</el-select>
<div style="font-size: 12px; color: #909399; margin-top: 4px">请选择部门/科室负责人作为第一级审批人</div>
</el-form-item>
</el-col>
</el-row>
</template>
<!-- 备注 -->
<el-divider content-position="left">其他信息</el-divider>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" :rows="2" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<!-- 审批弹窗 -->
<SubmitVerify ref="submitVerifyRef" @submitCallback="submitCallback" />
<!-- 审批记录 -->
<ApprovalRecord ref="approvalRecordRef" />
</div>
</template>
<script setup name="CrmGiftApplyEdit" lang="ts">
import { addCrmGiftApply, getCrmGiftApply, giftApplySubmitAndFlowStart, updateCrmGiftApply } from '@/api/oa/crm/crmGiftApply';
import { CrmGiftApplyForm } from '@/api/oa/crm/crmGiftApply/types';
import { getCrmGiftInfoList } from '@/api/oa/crm/crmGiftInfo';
import { CrmGiftInfoVO } from '@/api/oa/crm/crmGiftInfo/types';
import { getCrmCustomerInfoList } from '@/api/oa/crm/crmCustomerInfo';
import { CrmCustomerInfoVO } from '@/api/oa/crm/crmCustomerInfo/types';
import { getInfo } from '@/api/login';
import { listUser } from '@/api/system/user';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import approvalButton from '@/components/Process/approvalButton.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute();
const router = useRouter();
// P0-1 CRMGIFT
const FLOW_CODE = 'CRMGIFT';
// queryprojectInfo
const routeParams = ref<any>({});
const currentId = ref<string | undefined>('');
//
const formRef = ref<ElFormInstance>();
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
//
const buttonLoading = ref(false);
const giftList = ref<CrmGiftInfoVO[]>([]);
const customerList = ref<CrmCustomerInfoVO[]>([]);
const userList = ref<any[]>([]); //
// ID
const MARKETING_DEPT_ID = 106;
//
const initFormData: CrmGiftApplyForm = {
giftApplyId: undefined,
applicationCode: undefined,
applicantId: undefined,
applicantName: undefined,
applicantDeptId: undefined,
applicantDeptName: undefined,
applicationDate: undefined,
customerUnitId: undefined,
customerUnitName: undefined,
guestName: undefined,
peopleCount: 1,
applicationReason: undefined,
recipientId: undefined,
recipientName: undefined,
recipientDate: undefined,
totalAmount: 0,
applicationStatus: undefined,
flowStatus: undefined,
remark: undefined,
detailList: [],
variables: {} as any // approverId
};
const form = ref<CrmGiftApplyForm>({ ...initFormData });
//
const rules = reactive({
applicationCode: [], //
applicationDate: [{ required: true, message: '申请日期不能为空', trigger: 'change' }],
applicantId: [{ required: true, message: '申请人不能为空', trigger: 'blur' }],
customerUnitId: [{ required: true, message: '客户不能为空', trigger: 'change' }],
'variables.approverId': [
{
validator: (rule: any, value: any, callback: any) => {
//
if (showApproverSelector.value && !value) {
callback(new Error('请选择下一步审批人'));
} else {
callback();
}
},
trigger: 'change'
}
]
});
//
const showApproverSelector = computed(() => {
return form.value.applicantDeptId !== undefined && form.value.applicantDeptId !== MARKETING_DEPT_ID;
});
//
const isFormDisabled = computed(() => {
return routeParams.value.type === 'view' || routeParams.value.type === 'approval';
});
/** 加载客户列表 */
const loadCustomerList = async () => {
try {
const res = await getCrmCustomerInfoList({ activeFlag: '1' });
customerList.value = res.data || [];
} catch (error) {
console.error('加载客户列表失败:', error);
}
};
/** 加载礼品列表 */
const loadGiftList = async () => {
try {
const res = await getCrmGiftInfoList({});
giftList.value = res.data || [];
} catch (error) {
console.error('加载礼品列表失败:', error);
}
};
/** 加载表单数据 */
const loadFormData = async (id: string | number) => {
try {
proxy?.$modal.loading('正在加载数据...');
const res = await getCrmGiftApply(id);
Object.assign(form.value, res.data);
if (!form.value.detailList) {
form.value.detailList = [];
}
} catch (error) {
console.error('加载数据失败:', error);
proxy?.$modal.msgError('加载数据失败');
} finally {
proxy?.$modal.closeLoading();
}
};
/** 加载用户列表(用于审批人选择) */
const loadUserList = async () => {
try {
const res = await listUser({ pageNum: 1, pageSize: 1000 });
userList.value = res.rows || [];
} catch (error) {
console.error('加载用户列表失败:', error);
}
};
/** 初始化当前用户信息 */
const initUserInfo = async () => {
try {
const res = await getInfo();
const user = res.data.user;
form.value.applicantId = user.userId;
form.value.applicantName = user.nickName;
form.value.applicantDeptId = user.deptId;
form.value.applicantDeptName = user.dept?.deptName;
//
form.value.recipientId = user.userId;
form.value.recipientName = user.nickName;
// variables
if (!form.value.variables) {
form.value.variables = {};
}
} catch (error) {
console.error('获取用户信息失败:', error);
}
};
/** 审批人选择变更 */
const handleApproverSelectChange = (approverId: number | string) => {
const user = userList.value.find((u: any) => u.userId === approverId);
if (user) {
form.value.variables = {
...form.value.variables,
approverName: user.nickName
};
}
};
/** 客户选择变更 */
const handleCustomerChange = (customerId: number | string) => {
const customer = customerList.value.find((c) => c.customerId === customerId);
if (customer) {
form.value.customerUnitName = customer.customerName;
}
};
/** 礼品选择变更 */
const handleGiftChange = (giftId: string | number, index: number) => {
const gift = giftList.value.find((g) => g.giftId === giftId);
if (gift && form.value.detailList) {
const detail = form.value.detailList[index];
detail.giftCode = gift.giftCode;
detail.giftName = gift.giftName;
detail.specification = gift.specification;
detail.unitPrice = gift.unitPrice;
detail.inventoryQuantity = gift.inventoryQuantity;
detail.applicationQuantity = 1;
calculateAmount(index);
}
};
/** 计算金额 */
const calculateAmount = (index: number) => {
if (form.value.detailList) {
const detail = form.value.detailList[index];
if (detail.unitPrice && detail.applicationQuantity) {
detail.giftAmount = Number((detail.unitPrice * detail.applicationQuantity).toFixed(2));
}
calculateTotalAmount();
}
};
/** 计算总金额 */
const calculateTotalAmount = () => {
if (form.value.detailList) {
form.value.totalAmount = form.value.detailList.reduce((sum, item) => sum + (item.giftAmount || 0), 0);
}
};
/** 添加礼品明细 */
const handleAddDetail = () => {
if (!form.value.detailList) {
form.value.detailList = [];
}
form.value.detailList.push({
giftId: undefined,
giftCode: undefined,
giftName: undefined,
specification: undefined,
unitPrice: undefined,
inventoryQuantity: undefined,
applicationQuantity: 1,
giftAmount: undefined,
remark: undefined
});
};
/** 删除礼品明细 */
const handleDeleteDetail = (index: number) => {
if (form.value.detailList) {
form.value.detailList.splice(index, 1);
calculateTotalAmount();
}
};
/** 提交表单 */
const submitForm = async (status: string) => {
try {
await formRef.value?.validate();
// P0-1: - 稿
if (form.value.giftApplyId && form.value.applicationStatus !== '1') {
proxy?.$modal.msgWarning('只有草稿状态的礼品申请才能修改');
return;
}
//
if (!form.value.detailList || form.value.detailList.length === 0) {
proxy?.$modal.msgWarning('请至少添加一条礼品明细');
return;
}
for (const detail of form.value.detailList) {
if (!detail.giftId) {
proxy?.$modal.msgWarning('请选择礼品');
return;
}
if (!detail.applicationQuantity || detail.applicationQuantity <= 0) {
proxy?.$modal.msgWarning('申请数量必须大于0');
return;
}
}
buttonLoading.value = true;
if (status === 'draft') {
//
form.value.applicationStatus = '1';
form.value.flowStatus = 'draft';
if (form.value.giftApplyId) {
await updateCrmGiftApply(form.value);
} else {
const res = await addCrmGiftApply(form.value);
form.value.giftApplyId = res.data?.giftApplyId;
//
if (res.data?.applicationCode) {
form.value.applicationCode = res.data.applicationCode;
}
}
proxy?.$modal.msgSuccess('暂存成功');
} else {
//
form.value.flowCode = FLOW_CODE;
// P0-2: deptId deptName
// approverId
form.value.variables = {
...form.value.variables, // approverId approverName
giftApplyId: form.value.giftApplyId,
applicationCode: form.value.applicationCode,
applicantId: form.value.applicantId,
applicantName: form.value.applicantName,
deptId: form.value.applicantDeptId,
deptName: form.value.applicantDeptName,
totalAmount: form.value.totalAmount,
customerUnitName: form.value.customerUnitName
};
// P2-2: businessTitle
form.value.bizExt = {
businessTitle: `礼品申请审批 - ${form.value.applicantName} - ${form.value.customerUnitName}`,
businessCode: form.value.applicationCode,
businessId: String(form.value.giftApplyId)
};
try {
await giftApplySubmitAndFlowStart(form.value);
proxy?.$modal.msgSuccess('提交成功');
} catch (submitError: any) {
//
if (submitError?.message && submitError.message.includes('库存不足')) {
// HTML便
const formattedMsg = submitError.message.replace(/\n/g, '<br/>');
await proxy?.$alert(formattedMsg, '库存不足提示', {
type: 'warning',
dangerouslyUseHTMLString: true,
confirmButtonText: '我知道了'
});
return; //
}
throw submitError; //
}
}
//
proxy?.$tab.closePage();
router.go(-1);
} catch (error: any) {
console.error('提交失败:', error);
if (error?.message) {
proxy?.$modal.msgError(error.message);
}
} finally {
buttonLoading.value = false;
}
};
/** 审批弹窗 */
const approvalVerifyOpen = async () => {
await submitVerifyRef.value?.openDialog(routeParams.value.taskId);
};
/** 审批记录 */
const handleApprovalRecord = () => {
approvalRecordRef.value?.init(form.value.giftApplyId);
};
/** 审批回调 */
const submitCallback = async () => {
await proxy?.$tab.closePage(route);
router.go(-1);
};
onMounted(async () => {
// query
routeParams.value = route.query;
currentId.value = (route.query.id as string) || undefined;
//
await loadUserList();
//
await initUserInfo();
//
await Promise.all([loadCustomerList(), loadGiftList()]);
// ID
if (currentId.value) {
await loadFormData(currentId.value);
} else {
//
form.value = { ...initFormData } as any;
calculateTotalAmount();
}
});
</script>
<style scoped>
.el-divider--horizontal {
margin: 20px 0 15px 0;
}
</style>

@ -0,0 +1,282 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
<el-form-item label="申请编号" prop="applicationCode">
<el-input v-model="queryParams.applicationCode" placeholder="请输入申请编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="申请人" prop="applicantName">
<el-input v-model="queryParams.applicantName" placeholder="请输入申请人姓名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="客户名称" prop="customerUnitName">
<el-input v-model="queryParams.customerUnitName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="申请状态" prop="applicationStatus">
<el-select v-model="queryParams.applicationStatus" placeholder="请选择" clearable>
<el-option v-for="dict in gift_apply_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['oa/crm:crmGiftApply:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['oa/crm:crmGiftApply:export']"></el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="crmGiftApplyList" @selection-change="handleSelectionChange">
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="申请编号" align="center" prop="applicationCode" min-width="140" v-if="columns[0].visible" />
<el-table-column label="申请人" align="center" prop="applicantName" min-width="100" v-if="columns[1].visible" />
<el-table-column label="申请部门" align="center" prop="applicantDeptName" min-width="120" v-if="columns[2].visible" />
<el-table-column label="申请日期" align="center" prop="applicationDate" width="120" v-if="columns[3].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.applicationDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="客户名称" align="center" prop="customerUnitName" min-width="150" show-overflow-tooltip v-if="columns[4].visible" />
<el-table-column label="客人姓名" align="center" prop="guestName" min-width="100" v-if="columns[5].visible" />
<el-table-column label="人数" align="center" prop="peopleCount" width="80" v-if="columns[6].visible" />
<el-table-column label="申请总金额" align="center" prop="totalAmount" min-width="110" v-if="columns[7].visible">
<template #default="scope">
<span>{{ scope.row.totalAmount ? '¥' + scope.row.totalAmount : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="申请状态" align="center" prop="applicationStatus" width="100" v-if="columns[8].visible">
<template #default="scope">
<dict-tag :options="gift_apply_status" :value="scope.row.applicationStatus" />
</template>
</el-table-column>
<el-table-column label="流程状态" align="center" prop="flowStatus" width="100" v-if="columns[9].visible">
<template #default="scope">
<dict-tag :options="wf_business_status" :value="scope.row.flowStatus" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="160" v-if="columns[10].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="220" class-name="small-padding fixed-width">
<template #default="scope">
<!-- 查看非草稿状态 -->
<el-tooltip content="查看" placement="top" v-if="scope.row.applicationStatus !== '1'">
<el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['oa/crm:crmGiftApply:query']"></el-button>
</el-tooltip>
<!-- 修改仅草稿状态 -->
<el-tooltip content="修改" placement="top" v-if="scope.row.applicationStatus === '1'">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['oa/crm:crmGiftApply:edit']"></el-button>
</el-tooltip>
<!-- 删除仅草稿状态 -->
<el-tooltip content="删除" placement="top" v-if="scope.row.applicationStatus === '1'">
<el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['oa/crm:crmGiftApply:remove']"></el-button>
</el-tooltip>
<!-- 发放记录仅已审批状态且已发放审批通过自动发放 -->
<el-tooltip content="发放记录" placement="top" v-if="scope.row.applicationStatus === '3' && scope.row.recipientDate">
<el-button
link
type="success"
icon="Tickets"
@click="handleIssueRecord(scope.row)"
v-hasPermi="['oa/crm:crmGiftApply:query']"
></el-button>
</el-tooltip>
<!-- 审批记录审批中或已完成 -->
<el-tooltip content="审批记录" placement="top" v-if="scope.row.applicationStatus === '2' || scope.row.applicationStatus === '3'">
<el-button
link
type="primary"
icon="Tickets"
@click="handleApprovalRecord(scope.row)"
v-hasPermi="['oa/crm:crmGiftApply:query']"
></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 审批记录组件 -->
<ApprovalRecord ref="approvalRecordRef" />
<!-- 发放记录弹窗 -->
<el-dialog title="发放记录" v-model="issueRecordDialogVisible" width="800px" append-to-body>
<el-table :data="issueRecordList" border max-height="400">
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="礼品名称" prop="giftName" min-width="120" align="center" />
<el-table-column label="规格型号" prop="specification" min-width="100" align="center" />
<el-table-column label="发放数量" prop="issueQuantity" width="90" align="center" />
<el-table-column label="发放前库存" prop="beforeInventory" width="100" align="center" />
<el-table-column label="发放后库存" prop="afterInventory" width="100" align="center" />
<el-table-column label="发放时间" prop="issueDate" width="160" align="center">
<template #default="scope">
<span>{{ parseTime(scope.row.issueDate, '{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column label="领用人" prop="recipientName" width="100" align="center" />
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button @click="issueRecordDialogVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="CrmGiftApply" lang="ts">
import { delCrmGiftApply, listCrmGiftApply } from '@/api/oa/crm/crmGiftApply';
import { listCrmGiftIssueRecord } from '@/api/oa/crm/crmGiftIssueRecord';
import { CrmGiftApplyQuery, CrmGiftApplyVO } from '@/api/oa/crm/crmGiftApply/types';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const router = useRouter();
const route = useRoute();
const { gift_apply_status, wf_business_status } = toRefs<any>(proxy?.useDict('gift_apply_status', 'wf_business_status'));
//
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const crmGiftApplyList = ref<CrmGiftApplyVO[]>([]);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const total = ref(0);
//
const issueRecordDialogVisible = ref(false);
const issueRecordList = ref<any[]>([]);
const queryFormRef = ref<ElFormInstance>();
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `申请编号`, visible: true },
{ key: 1, label: `申请人`, visible: true },
{ key: 2, label: `申请部门`, visible: true },
{ key: 3, label: `申请日期`, visible: true },
{ key: 4, label: `客户名称`, visible: true },
{ key: 5, label: `客人姓名`, visible: true },
{ key: 6, label: `人数`, visible: true },
{ key: 7, label: `申请总金额`, visible: true },
{ key: 8, label: `申请状态`, visible: true },
{ key: 9, label: `流程状态`, visible: true },
{ key: 10, label: `创建时间`, visible: true }
]);
const queryParams = reactive<CrmGiftApplyQuery>({
pageNum: 1,
pageSize: 10,
applicationCode: undefined,
applicantName: undefined,
customerUnitName: undefined,
applicationStatus: undefined
});
/** 查询礼品申请列表 */
const getList = async () => {
loading.value = true;
const res = await listCrmGiftApply(queryParams);
crmGiftApplyList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: CrmGiftApplyVO[]) => {
ids.value = selection.map((item) => item.giftApplyId);
};
/** 新增按钮操作 - 跳转到编辑页query模式与projectInfo一致 */
const handleAdd = () => {
proxy?.$tab.closePage(route);
router.push({ path: '/gift/crmGiftApply/edit', query: { type: 'add' } });
};
/** 修改按钮操作 - 跳转到编辑页 */
const handleUpdate = (row: CrmGiftApplyVO) => {
proxy?.$tab.closePage(route);
router.push({ path: '/gift/crmGiftApply/edit', query: { id: row.giftApplyId, type: 'update' } });
};
/** 查看按钮操作 - 跳转到查看页 */
const handleView = (row: CrmGiftApplyVO) => {
proxy?.$tab.closePage(route);
router.push({ path: '/gift/crmGiftApply/edit', query: { id: row.giftApplyId, type: 'view' } });
};
/** 审批记录 */
const handleApprovalRecord = (row: CrmGiftApplyVO) => {
approvalRecordRef.value?.init(row.giftApplyId);
};
/** 删除按钮操作 */
const handleDelete = async (row?: CrmGiftApplyVO) => {
const _giftApplyIds = row?.giftApplyId || ids.value;
await proxy?.$modal.confirm('是否确认删除礼品申请编号为"' + _giftApplyIds + '"的数据项?').finally(() => (loading.value = false));
await delCrmGiftApply(_giftApplyIds);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'oa/crm/crmGiftApply/export',
{
...queryParams.value
},
`crmGiftApply_${new Date().getTime()}.xlsx`
);
};
/** ⚭ 发放记录按钮操作 */
const handleIssueRecord = async (row: CrmGiftApplyVO) => {
try {
proxy?.$modal.loading('正在加载发放记录...');
const res = await listCrmGiftIssueRecord({ applicationId: row.giftApplyId, pageNum: 1, pageSize: 100 });
issueRecordList.value = res.rows || [];
issueRecordDialogVisible.value = true;
} catch (error) {
console.error('加载发放记录失败:', error);
proxy?.$modal.msgError('加载发放记录失败');
} finally {
proxy?.$modal.closeLoading();
}
};
onMounted(() => {
getList();
});
</script>

@ -0,0 +1,346 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
<el-form-item label="申请单ID" prop="applicationId">
<el-input v-model="queryParams.applicationId" placeholder="请输入申请单ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="礼品ID" prop="giftId">
<el-input v-model="queryParams.giftId" placeholder="请输入礼品ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="礼品编码" prop="giftCode">
<el-input v-model="queryParams.giftCode" placeholder="请输入礼品编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="礼品名称" prop="giftName">
<el-input v-model="queryParams.giftName" placeholder="请输入礼品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="规格型号" prop="specification">
<el-input v-model="queryParams.specification" placeholder="请输入规格型号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="单价(含税)" prop="unitPrice">
<el-input v-model="queryParams.unitPrice" placeholder="请输入单价(含税)" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="库存数量" prop="inventoryQuantity">
<el-input v-model="queryParams.inventoryQuantity" placeholder="请输入库存数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="申请数量" prop="applicationQuantity">
<el-input v-model="queryParams.applicationQuantity" placeholder="请输入申请数量" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="礼品金额" prop="giftAmount">
<el-input v-model="queryParams.giftAmount" placeholder="请输入礼品金额" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="排序号" prop="sortOrder">
<el-input v-model="queryParams.sortOrder" placeholder="请输入排序号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['oa/crm:crmGiftApplyDetail:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['oa/crm:crmGiftApplyDetail:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete()"
v-hasPermi="['oa/crm:crmGiftApplyDetail:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['oa/crm:crmGiftApplyDetail:export']"></el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="crmGiftApplyDetailList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="礼品申请明细ID" align="center" prop="detailId" v-if="columns[0].visible" />
<el-table-column label="申请单ID" align="center" prop="applicationId" v-if="columns[2].visible" />
<el-table-column label="礼品ID" align="center" prop="giftId" v-if="columns[3].visible" />
<el-table-column label="礼品编码" align="center" prop="giftCode" v-if="columns[4].visible" />
<el-table-column label="礼品名称" align="center" prop="giftName" v-if="columns[5].visible" />
<el-table-column label="规格型号" align="center" prop="specification" v-if="columns[6].visible" />
<el-table-column label="单价(含税)" align="center" prop="unitPrice" v-if="columns[7].visible" />
<el-table-column label="库存数量" align="center" prop="inventoryQuantity" v-if="columns[8].visible" />
<el-table-column label="申请数量" align="center" prop="applicationQuantity" v-if="columns[9].visible" />
<el-table-column label="礼品金额" align="center" prop="giftAmount" v-if="columns[10].visible" />
<el-table-column label="排序号" align="center" prop="sortOrder" v-if="columns[11].visible" />
<el-table-column label="备注" align="center" prop="remark" v-if="columns[12].visible" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['oa/crm:crmGiftApplyDetail:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button
link
type="primary"
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['oa/crm:crmGiftApplyDetail:remove']"
></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改礼品申请明细对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="crmGiftApplyDetailFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="申请单ID" prop="applicationId">
<el-input v-model="form.applicationId" placeholder="请输入申请单ID" />
</el-form-item>
<el-form-item label="礼品ID" prop="giftId">
<el-input v-model="form.giftId" placeholder="请输入礼品ID" />
</el-form-item>
<el-form-item label="礼品编码" prop="giftCode">
<el-input v-model="form.giftCode" placeholder="请输入礼品编码" />
</el-form-item>
<el-form-item label="礼品名称" prop="giftName">
<el-input v-model="form.giftName" placeholder="请输入礼品名称" />
</el-form-item>
<el-form-item label="规格型号" prop="specification">
<el-input v-model="form.specification" placeholder="请输入规格型号" />
</el-form-item>
<el-form-item label="单价(含税)" prop="unitPrice">
<el-input v-model="form.unitPrice" placeholder="请输入单价(含税)" />
</el-form-item>
<el-form-item label="库存数量" prop="inventoryQuantity">
<el-input v-model="form.inventoryQuantity" placeholder="请输入库存数量" />
</el-form-item>
<el-form-item label="申请数量" prop="applicationQuantity">
<el-input v-model="form.applicationQuantity" placeholder="请输入申请数量" />
</el-form-item>
<el-form-item label="礼品金额" prop="giftAmount">
<el-input v-model="form.giftAmount" placeholder="请输入礼品金额" />
</el-form-item>
<el-form-item label="排序号" prop="sortOrder">
<el-input v-model="form.sortOrder" placeholder="请输入排序号" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="CrmGiftApplyDetail" lang="ts">
import {
addCrmGiftApplyDetail,
delCrmGiftApplyDetail,
getCrmGiftApplyDetail,
listCrmGiftApplyDetail,
updateCrmGiftApplyDetail
} from '@/api/oa/crm/crmGiftApplyDetail';
import { CrmGiftApplyDetailForm, CrmGiftApplyDetailQuery, CrmGiftApplyDetailVO } from '@/api/oa/crm/crmGiftApplyDetail/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const crmGiftApplyDetailList = ref<CrmGiftApplyDetailVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const crmGiftApplyDetailFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `礼品申请明细ID`, visible: true },
{ key: 1, label: `租户编号`, visible: true },
{ key: 2, label: `申请单ID`, visible: true },
{ key: 3, label: `礼品ID`, visible: true },
{ key: 4, label: `礼品编码`, visible: true },
{ key: 5, label: `礼品名称`, visible: true },
{ key: 6, label: `规格型号`, visible: true },
{ key: 7, label: `单价(含税)`, visible: true },
{ key: 8, label: `库存数量`, visible: true },
{ key: 9, label: `申请数量`, visible: true },
{ key: 10, label: `礼品金额`, visible: true },
{ key: 11, label: `排序号`, visible: true },
{ key: 12, label: `备注`, visible: true },
{ key: 13, label: `删除标志`, visible: true },
{ key: 14, label: `创建部门`, visible: true },
{ key: 15, label: `创建者`, visible: true },
{ key: 16, label: `创建时间`, visible: true },
{ key: 17, label: `更新者`, visible: true },
{ key: 18, label: `更新时间`, visible: true }
]);
const initFormData: CrmGiftApplyDetailForm = {
detailId: undefined,
applicationId: undefined,
giftId: undefined,
giftCode: undefined,
giftName: undefined,
specification: undefined,
unitPrice: undefined,
inventoryQuantity: undefined,
applicationQuantity: undefined,
giftAmount: undefined,
sortOrder: undefined,
remark: undefined
};
const data = reactive<PageData<CrmGiftApplyDetailForm, CrmGiftApplyDetailQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
applicationId: undefined,
giftId: undefined,
giftCode: undefined,
giftName: undefined,
specification: undefined,
unitPrice: undefined,
inventoryQuantity: undefined,
applicationQuantity: undefined,
giftAmount: undefined,
sortOrder: undefined,
params: {}
},
rules: {
detailId: [{ required: true, message: '礼品申请明细ID不能为空', trigger: 'blur' }],
applicationId: [{ required: true, message: '申请单ID不能为空', trigger: 'blur' }],
giftId: [{ required: true, message: '礼品ID不能为空', trigger: 'blur' }],
applicationQuantity: [{ required: true, message: '申请数量不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询礼品申请明细列表 */
const getList = async () => {
loading.value = true;
const res = await listCrmGiftApplyDetail(queryParams.value);
crmGiftApplyDetailList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
crmGiftApplyDetailFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: CrmGiftApplyDetailVO[]) => {
ids.value = selection.map((item) => item.detailId);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加礼品申请明细';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: CrmGiftApplyDetailVO) => {
reset();
const _detailId = row?.detailId || ids.value[0];
const res = await getCrmGiftApplyDetail(_detailId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改礼品申请明细';
};
/** 提交按钮 */
const submitForm = () => {
crmGiftApplyDetailFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.detailId) {
await updateCrmGiftApplyDetail(form.value).finally(() => (buttonLoading.value = false));
} else {
await addCrmGiftApplyDetail(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: CrmGiftApplyDetailVO) => {
const _detailIds = row?.detailId || ids.value;
await proxy?.$modal.confirm('是否确认删除礼品申请明细编号为"' + _detailIds + '"的数据项?').finally(() => (loading.value = false));
await delCrmGiftApplyDetail(_detailIds);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'oa/crm/crmGiftApplyDetail/export',
{
...queryParams.value
},
`crmGiftApplyDetail_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

@ -0,0 +1,284 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
<el-form-item label="礼品编码" prop="giftCode">
<el-input v-model="queryParams.giftCode" placeholder="请输入礼品编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="礼品名称" prop="giftName">
<el-input v-model="queryParams.giftName" placeholder="请输入礼品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['oa/crm:crmGiftInfo:add']"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['oa/crm:crmGiftInfo:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['oa/crm:crmGiftInfo:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['oa/crm:crmGiftInfo:export']"></el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="crmGiftInfoList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="礼品编码" align="center" prop="giftCode" min-width="120" v-if="columns[0].visible" />
<el-table-column label="礼品名称" align="center" prop="giftName" min-width="150" v-if="columns[1].visible" />
<el-table-column label="规格型号" align="center" prop="specification" min-width="120" v-if="columns[2].visible" />
<el-table-column label="采购单价" align="center" prop="unitPrice" width="120" v-if="columns[3].visible">
<template #default="scope">
<span>{{ scope.row.unitPrice ? '¥' + scope.row.unitPrice : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="库存数量" align="center" prop="inventoryQuantity" width="100" v-if="columns[4].visible" />
<el-table-column label="备注" align="center" prop="remark" min-width="150" show-overflow-tooltip v-if="columns[5].visible" />
<el-table-column label="操作" align="center" fixed="right" width="120" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['oa/crm:crmGiftInfo:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['oa/crm:crmGiftInfo:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改礼品信息对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="crmGiftInfoFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="礼品编码" prop="giftCode">
<el-input v-model="form.giftCode" placeholder="请输入礼品编码" />
</el-form-item>
<el-form-item label="礼品名称" prop="giftName">
<el-input v-model="form.giftName" placeholder="请输入礼品名称" />
</el-form-item>
<el-form-item label="规格型号" prop="specification">
<el-input v-model="form.specification" placeholder="请输入规格型号" />
</el-form-item>
<el-form-item label="采购单价(含税)" prop="unitPrice">
<el-input-number v-model="form.unitPrice" :min="0" :precision="2" placeholder="请输入采购单价" style="width: 100%" />
</el-form-item>
<el-form-item label="单位" prop="unitId">
<el-select v-model="form.unitId" placeholder="请选择单位" filterable clearable style="width: 100%">
<el-option v-for="unit in unitList" :key="unit.unitId" :label="unit.unitName" :value="unit.unitId" />
</el-select>
</el-form-item>
<el-form-item label="库存数量" prop="inventoryQuantity">
<el-input-number v-model="form.inventoryQuantity" :min="0" :precision="0" placeholder="请输入库存数量" style="width: 100%" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="CrmGiftInfo" lang="ts">
import { addCrmGiftInfo, delCrmGiftInfo, getCrmGiftInfo, listCrmGiftInfo, updateCrmGiftInfo } from '@/api/oa/crm/crmGiftInfo';
import { CrmGiftInfoForm, CrmGiftInfoQuery, CrmGiftInfoVO } from '@/api/oa/crm/crmGiftInfo/types';
import { getBaseUnitInfoList } from '@/api/oa/base/unitInfo';
import { BaseUnitInfoVO } from '@/api/oa/base/unitInfo/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const crmGiftInfoList = ref<CrmGiftInfoVO[]>([]);
const unitList = ref<BaseUnitInfoVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const crmGiftInfoFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `礼品编码`, visible: true },
{ key: 1, label: `礼品名称`, visible: true },
{ key: 2, label: `规格型号`, visible: true },
{ key: 3, label: `采购单价`, visible: true },
{ key: 4, label: `库存数量`, visible: true },
{ key: 5, label: `备注`, visible: true }
]);
const initFormData: CrmGiftInfoForm = {
giftId: undefined,
giftCode: undefined,
giftName: undefined,
specification: undefined,
unitPrice: undefined,
unitId: undefined,
inventoryQuantity: undefined,
remark: undefined
};
const data = reactive<PageData<CrmGiftInfoForm, CrmGiftInfoQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
giftCode: undefined,
giftName: undefined,
specification: undefined,
unitPrice: undefined,
unitId: undefined,
inventoryQuantity: undefined,
params: {}
},
rules: {
giftCode: [{ required: true, message: '礼品编码不能为空', trigger: 'blur' }],
giftName: [{ required: true, message: '礼品名称不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询礼品信息列表 */
const getList = async () => {
loading.value = true;
const res = await listCrmGiftInfo(queryParams.value);
crmGiftInfoList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
crmGiftInfoFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: CrmGiftInfoVO[]) => {
ids.value = selection.map((item) => item.giftId);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加礼品信息';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: CrmGiftInfoVO) => {
reset();
const _giftId = row?.giftId || ids.value[0];
const res = await getCrmGiftInfo(_giftId);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改礼品信息';
};
/** 提交按钮 */
const submitForm = () => {
crmGiftInfoFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.giftId) {
await updateCrmGiftInfo(form.value).finally(() => (buttonLoading.value = false));
} else {
await addCrmGiftInfo(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: CrmGiftInfoVO) => {
const _giftIds = row?.giftId || ids.value;
await proxy?.$modal.confirm('是否确认删除礼品信息编号为"' + _giftIds + '"的数据项?').finally(() => (loading.value = false));
await delCrmGiftInfo(_giftIds);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'oa/crm/crmGiftInfo/export',
{
...queryParams.value
},
`crmGiftInfo_${new Date().getTime()}.xlsx`
);
};
/** 加载单位列表 */
const loadUnitList = async () => {
try {
const res = await getBaseUnitInfoList({ activeFlag: '1' });
unitList.value = res.data || [];
} catch (error) {
console.error('加载单位列表失败:', error);
}
};
onMounted(async () => {
await loadUnitList();
getList();
});
</script>

@ -0,0 +1,137 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px">
<el-form-item label="申请单编号" prop="applicationCode">
<el-input v-model="queryParams.applicationCode" placeholder="请输入申请单编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="礼品名称" prop="giftName">
<el-input v-model="queryParams.giftName" placeholder="请输入礼品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="领取人" prop="recipientName">
<el-input v-model="queryParams.recipientName" placeholder="请输入领取人姓名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="发放时间" prop="issueDate">
<el-date-picker clearable v-model="queryParams.issueDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery"></el-button>
<el-button icon="Refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['oa/crm:crmGiftIssueRecord:export']"></el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="crmGiftIssueRecordList">
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column label="申请单编号" align="center" prop="applicationCode" min-width="140" v-if="columns[0].visible" />
<el-table-column label="礼品编码" align="center" prop="giftCode" min-width="100" v-if="columns[1].visible" />
<el-table-column label="礼品名称" align="center" prop="giftName" min-width="120" v-if="columns[2].visible" />
<el-table-column label="规格型号" align="center" prop="specification" min-width="100" v-if="columns[3].visible" />
<el-table-column label="发放数量" align="center" prop="issueQuantity" width="90" v-if="columns[4].visible" />
<el-table-column label="发放时间" align="center" prop="issueDate" width="160" v-if="columns[5].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.issueDate, '{y}-{m}-{d} {h}:{i}') }}</span>
</template>
</el-table-column>
<el-table-column label="领取人" align="center" prop="recipientName" min-width="100" v-if="columns[6].visible" />
<el-table-column label="发放人" align="center" prop="issueByName" min-width="100" v-if="columns[7].visible" />
<el-table-column label="发放部门" align="center" prop="issueDeptName" min-width="120" v-if="columns[8].visible" />
<el-table-column label="发放前库存" align="center" prop="beforeInventory" width="100" v-if="columns[9].visible" />
<el-table-column label="发放后库存" align="center" prop="afterInventory" width="100" v-if="columns[10].visible" />
<el-table-column label="备注" align="center" prop="remark" min-width="150" show-overflow-tooltip v-if="columns[11].visible" />
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- P1-5: 发放记录通过申请单发放功能生成列表页移除新增/修改/删除对话框 -->
</div>
</template>
<script setup name="CrmGiftIssueRecord" lang="ts">
import { listCrmGiftIssueRecord } from '@/api/oa/crm/crmGiftIssueRecord';
import { CrmGiftIssueRecordQuery } from '@/api/oa/crm/crmGiftIssueRecord/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const crmGiftIssueRecordList = ref<CrmGiftIssueRecordVO[]>([]);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `申请单编号`, visible: true },
{ key: 1, label: `礼品编码`, visible: true },
{ key: 2, label: `礼品名称`, visible: true },
{ key: 3, label: `规格型号`, visible: true },
{ key: 4, label: `发放数量`, visible: true },
{ key: 5, label: `发放时间`, visible: true },
{ key: 6, label: `领取人`, visible: true },
{ key: 7, label: `发放人`, visible: true },
{ key: 8, label: `发放部门`, visible: true },
{ key: 9, label: `发放前库存`, visible: true },
{ key: 10, label: `发放后库存`, visible: true },
{ key: 11, label: `备注`, visible: true }
]);
const queryParams = reactive<CrmGiftIssueRecordQuery>({
pageNum: 1,
pageSize: 10,
applicationCode: undefined,
giftName: undefined,
recipientName: undefined,
issueDate: undefined
});
/** 查询礼品发放记录列表 */
const getList = async () => {
loading.value = true;
const res = await listCrmGiftIssueRecord(queryParams);
crmGiftIssueRecordList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'oa/crm/crmGiftIssueRecord/export',
{
...queryParams.value
},
`crmGiftIssueRecord_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>
Loading…
Cancel
Save