feat:hard、wallet表格添加人员、人员身份字段和搜索
fix:优化hard模块统计导出
This commit is contained in:
1 parent
974287545e
commit
cf5637d306
33 files changed
+605
-292
No files matched your search
@@ -154,32 +154,6 @@ export interface CanteenUserReservationStatisticsResponse {
|
||||
msg?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 按预约使用日期查询食堂预约部门统计。
|
||||
*/
|
||||
export function listByDept(query: any) {
|
||||
return request({
|
||||
url: "/hard/hard-canteen-appt-total-log/list-by-dept",
|
||||
method: "post",
|
||||
data: query,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 食堂统计
|
||||
*/
|
||||
export function canteenProudctTotal(query: any) {
|
||||
return request({
|
||||
url: "/hard/hard-canteen-appt-total-log/proudct-reserv-total",
|
||||
method: "post",
|
||||
params: {
|
||||
current: query.current,
|
||||
size: query.size,
|
||||
},
|
||||
data: query,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 按用户和用餐日期范围分页查询每日食堂预约,后端会保留每天没有预约日志的权限范围用户。
|
||||
*/
|
||||
@@ -250,38 +224,3 @@ export function exportCanteenUserReservation(query: CanteenUserReservationQuery)
|
||||
responseType: "blob",
|
||||
})
|
||||
}
|
||||
|
||||
/** 菜品预约统计导出查询条件,日期范围使用预约使用时间闭区间。 */
|
||||
export interface CanteenProductReservationExportQuery {
|
||||
/** 预约使用日期时间范围,格式为 YYYY-MM-DD HH:mm:ss。 */
|
||||
apptUseDateTimeList?: [string, string]
|
||||
/** 餐段字典编码。 */
|
||||
hourType?: string | number
|
||||
/** 食堂商户主键。 */
|
||||
merchantId?: string | number
|
||||
/** 用户部门主键集合。 */
|
||||
userDeptIds?: Array<string | number>
|
||||
/** 是否包含所选部门。 */
|
||||
isInclude?: boolean
|
||||
/** 商户部门主键集合。 */
|
||||
merchantDeptIds?: Array<string | number>
|
||||
/** 菜品预约统计允许的商户主键集合。 */
|
||||
mchIds?: Array<string | number>
|
||||
}
|
||||
|
||||
/** 菜品预约统计异步导出提交接口的统一响应。 */
|
||||
export interface CanteenProductReservationExportTaskResponse {
|
||||
/** 后端创建的异步任务进度。 */
|
||||
data: AsyncTaskProgress
|
||||
/** 后端返回的任务提交提示。 */
|
||||
msg?: string
|
||||
}
|
||||
|
||||
/** 按当前菜品预约统计筛选条件提交异步导出任务。 */
|
||||
export function submitCanteenProductReservationExport(query: CanteenProductReservationExportQuery) {
|
||||
return request<unknown, CanteenProductReservationExportTaskResponse>({
|
||||
url: "/hard/hard-canteen-appt-total-log/product-reserv-export-task",
|
||||
method: "post",
|
||||
data: query,
|
||||
})
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
import request from "/@/utils/request"
|
||||
import type { AsyncTaskProgress } from "/@/api/asyncTask"
|
||||
|
||||
/** 食堂销售统计来源协议编码。 */
|
||||
export const SALE_SOURCE = {
|
||||
@@ -58,6 +59,14 @@ export interface CanteenStatisticsRow {
|
||||
children?: CanteenStatisticsRow[]
|
||||
}
|
||||
|
||||
/** 食堂销售统计异步导出提交接口响应。 */
|
||||
export interface CanteenStatisticsExportTaskResponse {
|
||||
/** 后端创建的初始异步任务进度。 */
|
||||
data: AsyncTaskProgress
|
||||
/** 后端返回的任务提交提示。 */
|
||||
msg?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 食堂菜品购买部门统计
|
||||
*/
|
||||
@@ -147,6 +156,24 @@ export function exportDept(query: CanteenStatisticsQuery) {
|
||||
})
|
||||
}
|
||||
|
||||
/** 提交按自然日分批生成的菜品销售统计异步导出任务。 */
|
||||
export function submitProductExport(query: CanteenStatisticsQuery) {
|
||||
return request<unknown, CanteenStatisticsExportTaskResponse>({
|
||||
url: "/hard/hard-canteen-total-log/export-product-task",
|
||||
method: "post",
|
||||
data: query,
|
||||
})
|
||||
}
|
||||
|
||||
/** 提交按自然日分批生成的部门销售统计异步导出任务。 */
|
||||
export function submitDeptExport(query: CanteenStatisticsQuery) {
|
||||
return request<unknown, CanteenStatisticsExportTaskResponse>({
|
||||
url: "/hard/hard-canteen-total-dept/export-dept-task",
|
||||
method: "post",
|
||||
data: query,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜品出售商户统计
|
||||
*/
|
||||
|
||||
-8
@@ -32,14 +32,6 @@ export function getObj(id?: string) {
|
||||
})
|
||||
}
|
||||
|
||||
export function delObjs(ids?: Object) {
|
||||
return request({
|
||||
url: "/third/third-pay-order",
|
||||
method: "delete",
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
|
||||
export function putObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/third/third-pay-order",
|
||||
|
||||
+10
-10
@@ -11,18 +11,18 @@
|
||||
:show-summary="true"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column width="200" label="用户">
|
||||
<el-table-column width="280" label="用户信息">
|
||||
<template #default="{ row }">
|
||||
<div v-if="row.userId && row.userId != -1" class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }}</span>
|
||||
<span> {{ row.userMobile }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<span>未知用户</span>
|
||||
<div v-if="row.userId && row.userId != -1" class="min-w-0">
|
||||
<user-info-cell :user="row" :show-gender="false" />
|
||||
</div>
|
||||
<span v-else>未知用户</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="320" label="身份信息">
|
||||
<template #default="{ row }">
|
||||
<user-identity-info v-if="row.userId && row.userId != -1" :user="row" />
|
||||
<span v-else class="text-[var(--el-text-color-placeholder)]">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="200px" label="商品">
|
||||
|
||||
@@ -187,6 +187,12 @@
|
||||
</DraggableDepTree>
|
||||
<dept-person-total-table ref="deptPersonTotalTableRef" />
|
||||
<product-total-table ref="productTotalTableRef" />
|
||||
<async-task-progress-component
|
||||
ref="exportProgressRef"
|
||||
:config="exportTaskConfig"
|
||||
@success="handleExportSuccess"
|
||||
@failure="handleExportFailure"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -198,6 +204,9 @@ import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { parseTime } from "/@/utils/formatTime"
|
||||
import { Right } from "@element-plus/icons-vue"
|
||||
import type { AsyncTaskPollingConfig, AsyncTaskProgress } from "/@/api/asyncTask"
|
||||
import AsyncTaskProgressComponent from "/@/components/AsyncTaskProgress.vue"
|
||||
import { downBlobFile } from "/@/utils/other"
|
||||
|
||||
import * as hardTotalApi from "/@/api/hard/hard-total"
|
||||
|
||||
@@ -214,8 +223,18 @@ const productTotalTableRef = ref()
|
||||
const queryRef = ref()
|
||||
const showSearch = ref(true)
|
||||
const activeName = ref("all")
|
||||
/** 导出互斥标记,避免连续点击生成重复下载请求。 */
|
||||
const exporting = ref(false)
|
||||
/** 异步导出从提交到终态的本地互斥状态,防止同一页面重复创建并覆盖当前跟踪任务。 */
|
||||
const exportSubmitting = ref(false)
|
||||
/** 部门销售统计异步导出进度弹窗引用。 */
|
||||
const exportProgressRef = ref<InstanceType<typeof AsyncTaskProgressComponent>>()
|
||||
/** 部门销售统计导出进度配置,与后端 Redis 业务命名空间保持一致。 */
|
||||
const exportTaskConfig: AsyncTaskPollingConfig = {
|
||||
progressUrl: "/hard/async-task/progress",
|
||||
redisKey: "hard:canteen-sales:export:department",
|
||||
showDialogOnFinished: false,
|
||||
waitingMessage: "正在按日期分批生成部门销售统计文件,请耐心等待进度达到 100%",
|
||||
downloadButtonText: "下载 Excel",
|
||||
}
|
||||
const sourceTabs = [
|
||||
{ name: "all", label: "全部", codes: [hardTotalApi.SALE_SOURCE.OFFLINE_PURCHASE, hardTotalApi.SALE_SOURCE.RESERVATION_VERIFIED] },
|
||||
{ name: hardTotalApi.SALE_SOURCE.OFFLINE_PURCHASE, label: "线下购买", codes: [hardTotalApi.SALE_SOURCE.OFFLINE_PURCHASE] },
|
||||
@@ -241,7 +260,7 @@ const aggregateSourceName = computed(() =>
|
||||
)
|
||||
|
||||
// table hook
|
||||
const { sortChangeHandle, postDownBlobFile, tableStyle } = useTable(state)
|
||||
const { sortChangeHandle, tableStyle } = useTable(state)
|
||||
|
||||
onMounted(() => {
|
||||
getDataList()
|
||||
@@ -355,18 +374,43 @@ const getRowStatisticsDateTimeList = (row: any) => {
|
||||
}
|
||||
|
||||
const exportExcel = async () => {
|
||||
if (exporting.value) {
|
||||
useMessage().warning("导出正在处理中,请勿重复操作")
|
||||
if (exportSubmitting.value) {
|
||||
useMessage().warning("已有食堂菜品部门统计导出任务正在处理")
|
||||
return
|
||||
}
|
||||
exporting.value = true
|
||||
exportSubmitting.value = true
|
||||
try {
|
||||
await postDownBlobFile("/hard/hard-canteen-total-dept/export-dept", { ...state.queryForm }, "食堂菜品部门统计.xlsx")
|
||||
} finally {
|
||||
exporting.value = false
|
||||
const response = await hardTotalApi.submitDeptExport({ ...state.queryForm })
|
||||
if (!response.data?.taskId) {
|
||||
exportSubmitting.value = false
|
||||
useMessage().error("导出任务提交成功,但响应中缺少任务ID")
|
||||
return
|
||||
}
|
||||
useMessage().success(response.msg || "食堂菜品部门统计导出任务已提交")
|
||||
exportProgressRef.value?.start(response.data)
|
||||
} catch (error: any) {
|
||||
exportSubmitting.value = false
|
||||
useMessage().error(error?.msg || "食堂菜品部门统计导出任务提交失败")
|
||||
}
|
||||
}
|
||||
|
||||
/** 异步导出成功后下载文件中心返回的完整统计文件。 */
|
||||
const handleExportSuccess = async (progress: AsyncTaskProgress) => {
|
||||
exportSubmitting.value = false
|
||||
if (!progress.resultFileUrl) {
|
||||
useMessage().error("导出完成,但未返回文件下载地址")
|
||||
return
|
||||
}
|
||||
useMessage().success(progress.message || "食堂菜品部门统计导出完成")
|
||||
await downBlobFile(progress.resultFileUrl, {}, progress.resultFileName || "食堂菜品部门统计.xlsx")
|
||||
}
|
||||
|
||||
/** 异步导出失败时展示后台任务返回的受控错误信息。 */
|
||||
const handleExportFailure = (progress: AsyncTaskProgress) => {
|
||||
exportSubmitting.value = false
|
||||
useMessage().error(progress.message || "食堂菜品部门统计导出失败")
|
||||
}
|
||||
|
||||
// 搜索
|
||||
const doSearch = () => {
|
||||
getDataList()
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<el-tab-pane v-for="tab in sourceTabs" :key="tab.name" :label="tab.label"
|
||||
:name="tab.name" />
|
||||
</el-tabs>
|
||||
<right-toolbar v-model:showSearch="showSearch" :export="'hard_canteenProductTotal_export'"
|
||||
<right-toolbar v-model:showSearch="showSearch" :export="canExport"
|
||||
@exportExcel="exportExcel" class="ml10 mr20" @queryTable="getDataList" />
|
||||
</div>
|
||||
<el-table :data="displayRows" v-loading="state.loading" border row-key="_statisticsRowKey"
|
||||
@@ -138,9 +138,15 @@
|
||||
v-bind="state.pagination" />
|
||||
</template>
|
||||
</DraggableDepTree>
|
||||
</div>
|
||||
<product-total-table ref="productTotalTableRef" />
|
||||
<async-task-progress-component
|
||||
ref="exportProgressRef"
|
||||
:config="exportTaskConfig"
|
||||
@success="handleExportSuccess"
|
||||
@failure="handleExportFailure"
|
||||
/>
|
||||
</div>
|
||||
<product-total-table ref="productTotalTableRef" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="canteen-product-appt-total">
|
||||
@@ -150,6 +156,10 @@ import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { parseTime } from "/@/utils/formatTime"
|
||||
import { Right } from "@element-plus/icons-vue"
|
||||
import { auths } from "/@/utils/authFunction"
|
||||
import type { AsyncTaskPollingConfig, AsyncTaskProgress } from "/@/api/asyncTask"
|
||||
import AsyncTaskProgressComponent from "/@/components/AsyncTaskProgress.vue"
|
||||
import { downBlobFile } from "/@/utils/other"
|
||||
|
||||
import * as hardTotalApi from "/@/api/hard/hard-total"
|
||||
|
||||
@@ -160,8 +170,20 @@ const queryRef = ref()
|
||||
const showSearch = ref(true)
|
||||
const productTotalTableRef = ref()
|
||||
const activeName = ref("all")
|
||||
/** 导出互斥标记,避免连续点击生成重复下载请求。 */
|
||||
const exporting = ref(false)
|
||||
/** 迁移期间兼容旧预约菜单和新综合统计菜单的导出权限。 */
|
||||
const canExport = computed(() => auths(["hard_canteenProductTotal_export", "hard_canteenProductApptTotal_export"]))
|
||||
/** 异步导出从提交到终态的本地互斥状态,防止同一页面重复创建并覆盖当前跟踪任务。 */
|
||||
const exportSubmitting = ref(false)
|
||||
/** 菜品销售统计异步导出进度弹窗引用。 */
|
||||
const exportProgressRef = ref<InstanceType<typeof AsyncTaskProgressComponent>>()
|
||||
/** 菜品销售统计导出进度配置,与后端 Redis 业务命名空间保持一致。 */
|
||||
const exportTaskConfig: AsyncTaskPollingConfig = {
|
||||
progressUrl: "/hard/async-task/progress",
|
||||
redisKey: "hard:canteen-sales:export:product",
|
||||
showDialogOnFinished: false,
|
||||
waitingMessage: "正在按日期分批生成销售统计文件,请耐心等待进度达到 100%",
|
||||
downloadButtonText: "下载 Excel",
|
||||
}
|
||||
const sourceTabs = [
|
||||
{ name: "all", label: "全部", codes: [hardTotalApi.SALE_SOURCE.OFFLINE_PURCHASE, hardTotalApi.SALE_SOURCE.RESERVATION_VERIFIED] },
|
||||
{ name: hardTotalApi.SALE_SOURCE.OFFLINE_PURCHASE, label: "线下购买", codes: [hardTotalApi.SALE_SOURCE.OFFLINE_PURCHASE] },
|
||||
@@ -186,7 +208,7 @@ const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
})
|
||||
|
||||
// table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, postDownBlobFile, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, tableStyle } = useTable(state)
|
||||
|
||||
/**
|
||||
* 后端按自然日分页返回合计行,来源明细挂在 sourceRows;这里按业务层级展开为连续表格行,
|
||||
@@ -204,20 +226,45 @@ const displayRows = computed(() =>
|
||||
|
||||
const aggregateSourceName = computed(() => (activeName.value === "all" ? "线下 + 预约" : sourceTabs.find((tab) => tab.name === activeName.value)?.label || "当前来源"))
|
||||
|
||||
// 导出excel
|
||||
/** 按当前筛选条件提交按日期分批、流式写入的异步导出任务。 */
|
||||
const exportExcel = async () => {
|
||||
if (exporting.value) {
|
||||
useMessage().warning("导出正在处理中,请勿重复操作")
|
||||
if (exportSubmitting.value) {
|
||||
useMessage().warning("已有食堂菜品销售统计导出任务正在处理")
|
||||
return
|
||||
}
|
||||
exporting.value = true
|
||||
exportSubmitting.value = true
|
||||
try {
|
||||
await postDownBlobFile("/hard/hard-canteen-total-log/export-product", { ...state.queryForm }, "食堂菜品销售统计.xlsx")
|
||||
} finally {
|
||||
exporting.value = false
|
||||
const response = await hardTotalApi.submitProductExport({ ...state.queryForm })
|
||||
if (!response.data?.taskId) {
|
||||
exportSubmitting.value = false
|
||||
useMessage().error("导出任务提交成功,但响应中缺少任务ID")
|
||||
return
|
||||
}
|
||||
useMessage().success(response.msg || "食堂菜品销售统计导出任务已提交")
|
||||
exportProgressRef.value?.start(response.data)
|
||||
} catch (error: any) {
|
||||
exportSubmitting.value = false
|
||||
useMessage().error(error?.msg || "食堂菜品销售统计导出任务提交失败")
|
||||
}
|
||||
}
|
||||
|
||||
/** 异步导出成功后下载文件中心返回的完整统计文件。 */
|
||||
const handleExportSuccess = async (progress: AsyncTaskProgress) => {
|
||||
exportSubmitting.value = false
|
||||
if (!progress.resultFileUrl) {
|
||||
useMessage().error("导出完成,但未返回文件下载地址")
|
||||
return
|
||||
}
|
||||
useMessage().success(progress.message || "食堂菜品销售统计导出完成")
|
||||
await downBlobFile(progress.resultFileUrl, {}, progress.resultFileName || "食堂菜品销售统计.xlsx")
|
||||
}
|
||||
|
||||
/** 异步导出失败时展示后台任务返回的受控错误信息。 */
|
||||
const handleExportFailure = (progress: AsyncTaskProgress) => {
|
||||
exportSubmitting.value = false
|
||||
useMessage().error(progress.message || "食堂菜品销售统计导出失败")
|
||||
}
|
||||
|
||||
// 点击table展开行
|
||||
const tableExpandChange = async (e: any) => {
|
||||
const rowKey = statisticsRowKey(e)
|
||||
|
||||
@@ -11,18 +11,18 @@
|
||||
:show-summary="true"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column width="200" label="用户">
|
||||
<el-table-column width="280" label="用户信息">
|
||||
<template #default="{ row }">
|
||||
<div v-if="row.userId && row.userId != -1" class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }}</span>
|
||||
<span> {{ row.userMobile }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<span>未知用户</span>
|
||||
<div v-if="row.userId && row.userId != -1" class="min-w-0">
|
||||
<user-info-cell :user="row" :show-gender="false" />
|
||||
</div>
|
||||
<span v-else>未知用户</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="320" label="身份信息">
|
||||
<template #default="{ row }">
|
||||
<user-identity-info v-if="row.userId && row.userId != -1" :user="row" />
|
||||
<span v-else class="text-[var(--el-text-color-placeholder)]">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="200px" label="商品">
|
||||
|
||||
@@ -23,19 +23,24 @@
|
||||
<el-form-item style="width: 300px" label="申请时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-table class="min-h-0 flex-1" height="100%" :data="state.dataList" v-loading="state.loading" border :cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle" @selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="username" label="用户" />
|
||||
<el-table-column prop="userAvatar" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" />
|
||||
<el-table-column label="支付金额" align="center" prop="practicalTotalPrice">
|
||||
<template #default="{ row }">
|
||||
<span class="color-primary">
|
||||
@@ -127,6 +132,10 @@ import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import dayjs from "dayjs"
|
||||
import { AUTO_REFUND_RULE, AUTO_REFUND_TASK_TYPE, getAutoRefundTaskStatus, getAutoRefundTaskType } from "/@/constants/autoRefund"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -151,7 +160,12 @@ const draggableDepTreeRef = ref() // 树组件ref引用
|
||||
const { push } = useRouter()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 250px" label="是否完成" prop="isDone">
|
||||
<dict-select v-model="state.queryForm.isDone" dict-code="yes_no_type" />
|
||||
</el-form-item>
|
||||
@@ -56,8 +60,12 @@
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="username" label="授权用户" />
|
||||
<el-table-column prop="userMobile" label="授权用户手机号" />
|
||||
<el-table-column label="授权用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="hardName" label="授权硬件设备" />
|
||||
<el-table-column prop="authStatus" label="是否授权">
|
||||
<template #default="{ row }">
|
||||
@@ -89,6 +97,10 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import * as hardAuth from "/@/api/hard/hard-auth"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -104,7 +116,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardAuth.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 300px" label="是否完成" prop="isDone">
|
||||
<dict-select v-model="state.queryForm.isDone" dict-code="yes_no_type" />
|
||||
</el-form-item>
|
||||
@@ -53,7 +57,12 @@
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="username" width="120" label="预定用户" />
|
||||
<el-table-column label="预定用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="hardName" width="180" label="硬件" />
|
||||
<el-table-column prop="title" width="180" label="预定类型" />
|
||||
<el-table-column width="160" label="商品">
|
||||
@@ -137,6 +146,10 @@ import * as hardBroadcastApi from "/@/api/hard/hard-broadcast"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -154,7 +167,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardBroadcastApi.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -21,6 +21,12 @@
|
||||
<el-form-item style="width: 400px" label="创建时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<right-toolbar v-model:showSearch="showSearch" :export="'dzc_hardDoorFlow_export'"
|
||||
@@ -46,9 +52,11 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="errorDesc" label="错误描述" width="120" />
|
||||
</el-table-column>
|
||||
<el-table-column label="购买用户">
|
||||
<el-table-column prop="username" label="姓名" width="120" />
|
||||
<el-table-column prop="userMobile" label="手机号" width="120" />
|
||||
<el-table-column label="购买用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="开门流程">
|
||||
<el-table-column prop="requestOpenDto" label="请求开门参数" width="180">
|
||||
@@ -114,6 +122,10 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import * as hardDoorFlow from "/@/api/hard/hard-door-flow"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
// 定义查询字典
|
||||
@@ -127,7 +139,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardDoorFlow.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
@search="getDataList"
|
||||
@reset="resetQuery"
|
||||
>
|
||||
<el-form-item style="width: 250px" label="用户" prop="userIdChild">
|
||||
<select-user v-model="state.queryForm.userIdChild" />
|
||||
<el-form-item style="width: 250px" label="用户" prop="userIds">
|
||||
<select-user v-model="state.queryForm.userIds" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 220px" label="商户" prop="merchantIds">
|
||||
<select-mch v-model="state.queryForm.merchantIds" />
|
||||
@@ -31,6 +31,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 200px" label="设备类型" prop="hardType">
|
||||
<dict-select v-model="state.queryForm.hardType" dict-code="hard_type" />
|
||||
</el-form-item>
|
||||
@@ -41,17 +45,11 @@
|
||||
@sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="60" />
|
||||
<el-table-column width="200" label="用户">
|
||||
<template #default="{ row }">
|
||||
<div class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div
|
||||
class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }}</span>
|
||||
<span> {{ row.userMobile }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<el-table-column min-width="280" label="用户信息">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column min-width="300" label="身份信息">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column width="250px" label="设备信息">
|
||||
<template #default="{ row }">
|
||||
@@ -114,6 +112,10 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import * as hardInvoiceApi from "/@/api/hard/hard-invoice"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -138,7 +140,12 @@ const draggableDepTreeRef = ref() // 树组件ref引用
|
||||
const { push } = useRouter()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardInvoiceApi.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -17,11 +17,14 @@
|
||||
<el-form-item style="width: 300px" label="商户" prop="mchIds">
|
||||
<select-mch deptMch v-model="state.queryForm.mchIds" :apiParams="{ parentIsNull: false }" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 450px" label="创建时间" prop="payTimeList">
|
||||
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item style="width: 450px" label="创建时间" prop="payTimeList">
|
||||
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 300px" label="设备类型" prop="hardTypeCode">
|
||||
<dict-select v-model="state.queryForm.hardTypeCode" dict-code="hard_type" />
|
||||
</el-form-item>
|
||||
@@ -47,18 +50,8 @@
|
||||
@sort-change="sortChangeHandle" :show-summary="false" :summary-method="getSummaries">
|
||||
<el-table-column type="selection" width="60" align="center" />
|
||||
<el-table-column type="index" label="#" width="50" />
|
||||
<el-table-column width="200" label="用户">
|
||||
<template #default="{ row }">
|
||||
<div class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div
|
||||
class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }}</span>
|
||||
<span> {{ row.userMobile }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="280" label="用户信息"><template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template></el-table-column>
|
||||
<el-table-column width="320" label="身份信息"><template #default="{ row }"><user-identity-info :user="row" /></template></el-table-column>
|
||||
<el-table-column width="200px" label="商品">
|
||||
<template #default="{ row }">
|
||||
<div class="desc">
|
||||
@@ -201,6 +194,7 @@ import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { TableColumnCtx } from "element-plus"
|
||||
import { VNode } from "vue"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { push } = useRouter()
|
||||
|
||||
@@ -227,6 +221,10 @@ const multiple = ref(true)
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {
|
||||
isOfflineOrder: 1,
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardOrder.pageJoin,
|
||||
})
|
||||
|
||||
@@ -59,6 +59,10 @@
|
||||
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss"
|
||||
type="datetimerange" />
|
||||
</el-form-item>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<div class="flex justify-between items-center">
|
||||
@@ -79,23 +83,23 @@
|
||||
@sort-change="sortChangeHandle" :show-summary="true" :summary-method="getSummaries"
|
||||
row-key="id">
|
||||
<el-table-column type="index" label="#" width="50" />
|
||||
<el-table-column width="200" label="用户">
|
||||
<el-table-column width="280" label="用户信息">
|
||||
<template #default="{ row }">
|
||||
<div v-if="row.userId && row.userId != -1"
|
||||
class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div
|
||||
class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }}</span>
|
||||
<span> {{ row.userMobile }}</span>
|
||||
<span> {{ row.userDeptName }}</span>
|
||||
</div>
|
||||
class="min-w-0">
|
||||
<user-info-cell :user="row" :show-gender="false" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<span>未知用户</span>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="320" label="身份信息">
|
||||
<template #default="{ row }">
|
||||
<user-identity-info v-if="row.userId && row.userId != -1" :user="row" />
|
||||
<span v-else class="text-[var(--el-text-color-placeholder)]">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="220px" prop="paymentInformation" label="付款信息">
|
||||
<template #default="{ row }">
|
||||
<div class="flex justify-between items-start">
|
||||
@@ -325,6 +329,7 @@ import { getDicts } from "/@/api/admin/dict"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
import { ElLoading, TableColumnCtx } from "element-plus"
|
||||
import { VNode } from "vue"
|
||||
|
||||
@@ -369,7 +374,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardOrder.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -21,8 +21,12 @@
|
||||
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<el-form-item style="width: 300px" label="设备类型" prop="hardTypeCode">
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 300px" label="设备类型" prop="hardTypeCode">
|
||||
<dict-select v-model="state.queryForm.hardTypeCode" dict-code="hard_type" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -38,18 +42,8 @@
|
||||
@sort-change="sortChangeHandle" :show-summary="false" :summary-method="getSummaries">
|
||||
<el-table-column type="selection" width="60" align="center" />
|
||||
<el-table-column type="index" label="#" width="50" />
|
||||
<el-table-column width="200" label="用户">
|
||||
<template #default="{ row }">
|
||||
<div class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div
|
||||
class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }}</span>
|
||||
<span> {{ row.userMobile }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="280" label="用户信息"><template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template></el-table-column>
|
||||
<el-table-column width="320" label="身份信息"><template #default="{ row }"><user-identity-info :user="row" /></template></el-table-column>
|
||||
<el-table-column width="200px" label="商品">
|
||||
<template #default="{ row }">
|
||||
<div class="desc">
|
||||
@@ -189,6 +183,7 @@ import { getDicts } from "/@/api/admin/dict"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { VNode } from "vue"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { push } = useRouter()
|
||||
|
||||
@@ -213,6 +208,10 @@ const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: hardOrder.noRecogPageJoin,
|
||||
})
|
||||
@@ -356,4 +355,4 @@ const getSummaries = (param: SummaryMethodProps) => {
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
@@ -31,14 +31,14 @@
|
||||
</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
<el-input-number v-model="form.fzRatio" :min="0.01" :max="100" :precision="2"
|
||||
<el-input-number v-model="form.fzRatio" :min="0" :max="100" :precision="2"
|
||||
controls-position="right" />
|
||||
<span class="ml-2 text-[var(--el-text-color-secondary)]">%</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<div class="w-full" v-if="form.platformType == '10'">
|
||||
<el-alert title="微信支付配置" type="success" effect="dark" :closable="false" />
|
||||
<el-form-item class="mt-[10px]" label="微信商户号" prop="settingJson.subMchid">
|
||||
<el-form-item class="mt-[10px]" label="微信子商户号" prop="settingJson.subMchid">
|
||||
<el-input v-model="form.settingJson.subMchid" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
@@ -55,6 +55,9 @@
|
||||
placeholder="可选;留空保持原配置" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
<el-alert v-if="['10', '20'].includes(form.platformType) && Number(form.fzRatio) > 0"
|
||||
class="mt-[4px]" type="info" show-icon :closable="false"
|
||||
title="保存启用配置后,系统会自动建立默认平台分佣关系;关系绑定完成前不能创建支付订单。" />
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
|
||||
-16
@@ -381,20 +381,4 @@ const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
multiple.value = !objs.length;
|
||||
};
|
||||
|
||||
// 删除操作
|
||||
const handleDelete = async (ids: string[]) => {
|
||||
try {
|
||||
await useMessageBox().confirm('此操作将永久删除');
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await thirdPayOrderApi.delObjs(ids);
|
||||
getDataList();
|
||||
useMessage().success('删除成功');
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -20,6 +20,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 220px" label="商户" prop="merchantIdList">
|
||||
<select-mch multiple v-model="state.queryForm.merchantIdList" />
|
||||
</el-form-item>
|
||||
@@ -55,8 +59,12 @@
|
||||
@sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="username" label="用户" show-overflow-tooltip />
|
||||
<el-table-column prop="userMobile" label="手机号" show-overflow-tooltip />
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="merchantName" label="所属商户" show-overflow-tooltip />
|
||||
<el-table-column prop="cardNumber" label="用户卡号" show-overflow-tooltip />
|
||||
<el-table-column prop="isActiveHardware" label="是否激活" show-overflow-tooltip>
|
||||
@@ -101,6 +109,10 @@ import { refreshAvatar, cancelAdminBindCard, pageJoin, delObjs } from "/@/api/wa
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { ElLoading } from "element-plus"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -124,7 +136,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 260px" label="操作标签" prop="tagList">
|
||||
<dict-select v-model="state.queryForm.tagList" dict-code="wallet_transaction_tag" multiple />
|
||||
</el-form-item>
|
||||
@@ -49,13 +53,12 @@
|
||||
show-summary :cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="index" label="#" width="60" />
|
||||
<el-table-column prop="username" label="用户" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column prop="userAvatar" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" />
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -140,6 +143,7 @@ import { pageCz, czTotal, delObjs } from "/@/api/wallet/wallet-transaction"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const showDrawer = ref(false)
|
||||
const balanceStatisticsLoading = ref(false)
|
||||
@@ -167,6 +171,10 @@ const draggableDepTreeRef = ref() // 树组件ref引用
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
tagList: [],
|
||||
},
|
||||
pageList: pageCz,
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
<el-form-item style="width: 300px" label="用户" prop="userIds">
|
||||
<select-user v-model="state.queryForm.userIds" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -51,8 +57,12 @@
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="username" label="申请人" />
|
||||
<el-table-column prop="deptName" label="部门" />
|
||||
<el-table-column label="申请人信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="applyStartTime" width="200" label="申请使用时间">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.applyStartTime }}</span>
|
||||
@@ -101,6 +111,10 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import { fetchList, pageJoin, delObjs } from "/@/api/wallet/wallet-foreign"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
import ProcessDrawer from "/@/components/processDrawer/index.vue"
|
||||
|
||||
@@ -123,7 +137,12 @@ const multiple = ref(true)
|
||||
const { push } = useRouter()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
<el-form-item style="width: 300px" label="饭卡卡号" prop="cardNumber">
|
||||
<el-input v-model="state.queryForm.cardNumber" placeholder="饭卡卡号" clearable />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
|
||||
<el-row>
|
||||
@@ -55,8 +61,12 @@
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="username" label="申请人" />
|
||||
<el-table-column prop="deptName" label="部门" />
|
||||
<el-table-column label="申请人信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="freeStatus" label="是否冻结">
|
||||
<template #default="{ row }">
|
||||
<dict-tag :options="yes_no_type" :value="row.freeStatus" />
|
||||
@@ -108,6 +118,10 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import { delObjs, pageJoin } from "/@/api/wallet/wallet-freeze"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
import ProcessDrawer from "/@/components/processDrawer/index.vue"
|
||||
|
||||
@@ -128,7 +142,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
<el-form-item style="width: 300px" label="不活跃月数" prop="unactiveMonthsNumber">
|
||||
<el-input v-model="state.queryForm.unactiveMonthsNumber" type="number" placeholder="不活跃月数" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -69,14 +75,12 @@
|
||||
>
|
||||
<el-table-column v-auth="'wallet_walletManage_del'" type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="username" label="用户" />
|
||||
<el-table-column prop="userAvatar" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" label="手机号" />
|
||||
<el-table-column prop="deptName" label="部门" />
|
||||
<el-table-column prop="walletTypeName" label="钱包类型" />
|
||||
<el-table-column prop="balance" label="余额">
|
||||
<template #default="{ row }">{{ row.balance && displayPrice(row.balance) }}</template>
|
||||
@@ -97,6 +101,10 @@ import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { formatDate } from "/@/utils/formatTime"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { wallet_type, yes_no_type } = useDict("wallet_type", "yes_no_type")
|
||||
// 定义变量内容
|
||||
@@ -111,6 +119,10 @@ const multiple = ref(true)
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {
|
||||
unactiveMonthsNumber: 3,
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJoinActive,
|
||||
})
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
<el-form-item style="width: 300px" label="消费时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -39,13 +45,8 @@
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="username" label="用户" show-overflow-tooltip />
|
||||
<el-table-column prop="userAvatar" label="头像" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" show-overflow-tooltip />
|
||||
<el-table-column label="用户信息" min-width="280"><template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template></el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320"><template #default="{ row }"><user-identity-info :user="row" /></template></el-table-column>
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -113,6 +114,7 @@ import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { pageJz, jzTotal } from "/@/api/wallet/wallet-transaction"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
/** 所有钱包流水列表共用的备注编辑表单。 */
|
||||
const TransactionRemarkForm = defineAsyncComponent(() => import("../components/transaction-remark-form.vue"))
|
||||
@@ -138,7 +140,12 @@ const multiple = ref(true)
|
||||
const draggableDepTreeRef = ref()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJz,
|
||||
})
|
||||
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
<el-form-item style="width: 200px" label="饭卡类型" prop="walletTypeId">
|
||||
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -41,14 +47,12 @@
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="username" width="100" label="用户" />
|
||||
<el-table-column prop="userAvatar" width="80" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" />
|
||||
<el-table-column prop="deptName" label="部门" width="200" />
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -125,6 +129,7 @@ import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import AsyncTaskProgressComponent from "/@/components/AsyncTaskProgress.vue"
|
||||
import { downBlobFile } from "/@/utils/other"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const TransactionList = defineAsyncComponent(() => import("../components/transaction-list.vue"))
|
||||
@@ -156,7 +161,12 @@ const showSearch = ref(true)
|
||||
const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: walletManage.fetchListJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -30,6 +30,12 @@
|
||||
placeholder="选择月份"
|
||||
/>
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8 flex justify-between" style="width: 100%">
|
||||
@@ -53,14 +59,8 @@
|
||||
show-summary :cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="index" label="#" width="60" />
|
||||
<el-table-column prop="username" label="用户" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column prop="userAvatar" width="80" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" />
|
||||
<el-table-column prop="deptName" label="部门" width="200" />
|
||||
<el-table-column label="用户信息" min-width="280"><template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template></el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320"><template #default="{ row }"><user-identity-info :user="row" /></template></el-table-column>
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -132,6 +132,7 @@ import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { formatDate } from "/@/utils/formatTime"
|
||||
import AsyncTaskProgressComponent from "/@/components/AsyncTaskProgress.vue"
|
||||
import { downBlobFile } from "/@/utils/other"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { wallet_type, yes_no_type } = useDict("wallet_type", "yes_no_type")
|
||||
// 定义变量内容
|
||||
@@ -163,6 +164,10 @@ const exportTaskConfig: AsyncTaskPollingConfig = {
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {
|
||||
walletRecordMonth: formatDate(new Date(), "YYYY-mm"),
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: fetchListJoinQb,
|
||||
})
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 200px" label="饭卡类型" prop="walletTypeId">
|
||||
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
||||
</el-form-item>
|
||||
@@ -57,7 +61,12 @@
|
||||
@sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="username" label="申请人" />
|
||||
<el-table-column label="申请人信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="bizType" width="120" label="充值类型">
|
||||
<template #default="{ row }">
|
||||
<dict-tag :options="wallet_biz_recharge" :value="row.bizType" />
|
||||
@@ -79,7 +88,6 @@
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="deptName" width="200" label="部门" />
|
||||
<el-table-column prop="importTime" width="100" label="操作金额">
|
||||
<template #default="{ row }">
|
||||
<span class="color-danger" v-if="row.bizType == 4">重置余额</span>
|
||||
@@ -172,6 +180,10 @@ import ProcessDrawer from "/@/components/processDrawer/index.vue"
|
||||
import { getDicts } from "/@/api/admin/dict"
|
||||
import { useUserInfo } from "/@/stores/userInfo"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { push } = useRouter()
|
||||
|
||||
@@ -204,7 +216,12 @@ const tabItems = ref<any>([{}])
|
||||
const processDrawerRef = ref()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: walletRechargeApplyApi.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -22,6 +22,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 350px" label="备注" prop="remark">
|
||||
<el-input v-model="state.queryForm.remark" />
|
||||
</el-form-item>
|
||||
@@ -54,6 +58,12 @@
|
||||
@sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="50" />
|
||||
<el-table-column label="申请用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="code" min-width="120" label="发票编号" sortable />
|
||||
<el-table-column prop="time" min-width="120" label="发票日期">
|
||||
<template #default="{ row }">
|
||||
@@ -151,6 +161,10 @@ import { parseTime } from "/@/utils/formatTime"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import ProcessDrawer from "/@/components/processDrawer/index.vue"
|
||||
import { getDicts } from "/@/api/admin/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -174,7 +188,12 @@ const activeName = ref()
|
||||
const tabItems = ref<any>([{}])
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: WalletRechargeInvoiceApi.fetchList,
|
||||
})
|
||||
const printDialogRef = ref()
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 200px" label="充值类型" prop="bizType">
|
||||
<dict-select v-model="state.queryForm.bizType" dict-code="wallet_biz_recharge" />
|
||||
</el-form-item>
|
||||
@@ -48,18 +52,11 @@
|
||||
:header-cell-style="tableStyle.headerCellStyle" :summary-method="getSummaries" show-summary
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="index" label="#" width="60" />
|
||||
<el-table-column width="200" label="用户">
|
||||
<template #default="{ row }">
|
||||
<div class="flex flex-row items-center justify-center">
|
||||
<preview-image width="50px" height="50px" :src="row.userAvatar" />
|
||||
<div
|
||||
class="flex flex-col ml-2 items-start cursor-pointer hover:underline hover:text-blue-500">
|
||||
<span> {{ row.username }} </span>
|
||||
<span> {{ row.userMobile }} </span>
|
||||
<span> {{ row.userDeptName }} </span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="importTime" label="充值月" min-width="100" />
|
||||
<el-table-column prop="bizType" label="充值类型" min-width="100">
|
||||
@@ -120,6 +117,7 @@ import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import * as walletRechargeImportApi from "/@/api/wallet/wallet-recharge-import"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { wallet_biz_recharge, wallet_type, check_status, wallet_transaction_tag } = useDict(
|
||||
"wallet_biz_recharge",
|
||||
@@ -141,6 +139,10 @@ const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
},
|
||||
queryForm: {
|
||||
tagList: [],
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: walletRechargeImportApi.pageJoin,
|
||||
})
|
||||
|
||||
@@ -25,6 +25,10 @@
|
||||
</el-form-item>
|
||||
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
<el-form-item style="width: 250px" label="是否退回" prop="isRefund">
|
||||
<dict-select v-model="state.queryForm.isRefund" dict-code="yes_no_type" />
|
||||
</el-form-item>
|
||||
@@ -45,10 +49,11 @@
|
||||
@sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column label="用户">
|
||||
<el-table-column width="120" prop="username" label="姓名" />
|
||||
<el-table-column width="120" prop="userMobile" label="手机号" />
|
||||
<el-table-column width="120" prop="userDeptName" label="部门" />
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column width="150" label="转账类型">
|
||||
<template #default="{ row }">
|
||||
@@ -136,6 +141,10 @@ import * as walletRuleTransactionApi from "/@/api/wallet/wallet-rule-transaction
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
@@ -152,7 +161,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: walletRuleTransactionApi.pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
<el-form-item style="width: 300px" label="用户" prop="userIds">
|
||||
<select-user v-model="state.queryForm.userIds" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -51,8 +57,12 @@
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="username" label="申请人" />
|
||||
<el-table-column prop="deptName" label="部门" />
|
||||
<el-table-column label="申请人信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="300">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="count" width="100" label="申请数量" />
|
||||
<el-table-column prop="useCount" width="100" label="使用数量" />
|
||||
<el-table-column prop="processStatus" width="100" label="审核状态">
|
||||
@@ -103,6 +113,10 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import { fetchList, delObjs, pageJoin } from "/@/api/wallet/wallet-stride"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import {
|
||||
createEmptyUserIdentityStudentQuery,
|
||||
createEmptyUserIdentityTeacherQuery,
|
||||
} from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
import ProcessDrawer from "/@/components/processDrawer/index.vue"
|
||||
|
||||
@@ -125,7 +139,12 @@ const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageJoin,
|
||||
})
|
||||
|
||||
|
||||
@@ -21,6 +21,12 @@
|
||||
<el-form-item style="width: 300px" label="退款时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -36,13 +42,8 @@
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="username" width="120" label="用户" show-overflow-tooltip />
|
||||
<el-table-column prop="userAvatar" label="头像" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" show-overflow-tooltip />
|
||||
<el-table-column label="用户信息" min-width="280"><template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template></el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320"><template #default="{ row }"><user-identity-info :user="row" /></template></el-table-column>
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -113,6 +114,7 @@ import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import * as hardAfterSaleApi from "/@/api/hard/hard-after-sale"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
/** 所有钱包流水列表共用的备注编辑表单。 */
|
||||
const TransactionRemarkForm = defineAsyncComponent(() => import("../components/transaction-remark-form.vue"))
|
||||
@@ -140,7 +142,12 @@ const draggableDepTreeRef = ref()
|
||||
const { push } = useRouter()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageTh,
|
||||
})
|
||||
|
||||
|
||||
@@ -21,6 +21,12 @@
|
||||
<el-form-item style="width: 300px" label="退款时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -35,13 +41,12 @@
|
||||
show-summary :cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="index" label="#" width="60" />
|
||||
<el-table-column prop="username" label="用户" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column prop="userAvatar" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" show-overflow-tooltip />
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -114,6 +119,7 @@ import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import * as hardAfterSaleApi from "/@/api/hard/hard-after-sale"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const showDrawer = ref(false)
|
||||
const balanceStatisticsLoading = ref(false)
|
||||
@@ -142,7 +148,12 @@ const draggableDepTreeRef = ref()
|
||||
const { push } = useRouter()
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageTk,
|
||||
})
|
||||
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
<el-form-item style="width: 300px" label="消费时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<template #more>
|
||||
<user-identity-query v-model:identity-types="state.queryForm.identityTypes"
|
||||
v-model:student-info="state.queryForm.studentInfo"
|
||||
v-model:teacher-info="state.queryForm.teacherInfo"
|
||||
v-model:has-face="state.queryForm.hasFace" />
|
||||
</template>
|
||||
</SearchPanel>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
@@ -38,13 +44,12 @@
|
||||
show-summary :cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle" @sort-change="sortChangeHandle">
|
||||
<el-table-column type="index" label="#" width="60" />
|
||||
<el-table-column prop="username" label="用户" min-width="160" show-overflow-tooltip />
|
||||
<el-table-column prop="userAvatar" label="头像">
|
||||
<template #default="{ row }">
|
||||
<preview-image :src="row.userAvatar" />
|
||||
</template>
|
||||
<el-table-column label="用户信息" min-width="280">
|
||||
<template #default="{ row }"><user-info-cell :user="row" :show-gender="false" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column label="身份信息" min-width="320">
|
||||
<template #default="{ row }"><user-identity-info :user="row" /></template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="userMobile" width="120" label="手机号" show-overflow-tooltip />
|
||||
<el-table-column prop="walletTypeUniqueCode" width="200" label="饭卡类型">
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-center justify-center">
|
||||
@@ -120,6 +125,7 @@ import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { deptTree } from "/@/api/admin/dept"
|
||||
import { createEmptyUserIdentityStudentQuery, createEmptyUserIdentityTeacherQuery } from "/@/components/UserIdentityQuery/types"
|
||||
|
||||
const { push } = useRouter()
|
||||
|
||||
@@ -149,7 +155,12 @@ const multiple = ref(true)
|
||||
const draggableDepTreeRef = ref() // 树组件ref引用
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
queryForm: {
|
||||
identityTypes: [],
|
||||
studentInfo: createEmptyUserIdentityStudentQuery(),
|
||||
teacherInfo: createEmptyUserIdentityTeacherQuery(),
|
||||
hasFace: "",
|
||||
},
|
||||
pageList: pageXf,
|
||||
})
|
||||
|
||||
|
||||
Reference in new issue
Block a user