Merge branch 'master' of https://gitea.zianxin.com/zax/biz-pc-cloud
This commit is contained in:
commit
427ba457e7
10 files changed
+646
-41
No files matched your search
@@ -0,0 +1,40 @@
|
||||
import request from "/@/utils/request"
|
||||
|
||||
export function fetchList(query?: Object) {
|
||||
return request({
|
||||
url: "/wallet/act/act-cancel/page",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function addObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/wallet/act/act-cancel",
|
||||
method: "post",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
export function getObj(id?: string) {
|
||||
return request({
|
||||
url: "/wallet/act/act-cancel/" + id,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function delObjs(ids?: Object) {
|
||||
return request({
|
||||
url: "/wallet/act/act-cancel",
|
||||
method: "delete",
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
|
||||
export function putObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/wallet/act/act-cancel",
|
||||
method: "put",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
<template>
|
||||
<div class="upload-box">
|
||||
<el-upload v-model:file-list="fileList" list-type="picture-card" multiple :accept="fileType.join(',')"
|
||||
:class="['upload', 'no-border', self_disabled ? 'disabled' : '']" :drag="true" :disabled="self_disabled"
|
||||
:before-upload="beforeUpload" :on-preview="handlePictureCardPreview" :on-error="uploadError"
|
||||
:on-remove="handleRemove" :on-success="uploadSuccess" :http-request="handleHttpUpload">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon>
|
||||
</el-upload>
|
||||
|
||||
<el-dialog v-model="dialogVisible">
|
||||
<img class="m-auto" w-full :src="dialogImageUrl" alt="Preview Image" />
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, watch } from "vue"
|
||||
import { Plus } from "@element-plus/icons-vue"
|
||||
import { ElUpload, ElDialog, UploadRequestOptions, ElNotification, UploadFile, UploadProps, formContextKey } from "element-plus"
|
||||
import request from "/@/utils/request"
|
||||
|
||||
interface UploadFileProps {
|
||||
disabled?: boolean
|
||||
fileType?: string[]
|
||||
fileSize?: number
|
||||
height?: string
|
||||
width?: string
|
||||
borderRadius?: string
|
||||
}
|
||||
const props = withDefaults(defineProps<UploadFileProps>(), {
|
||||
disabled: false,
|
||||
fileType: () => ["image/jpeg", "image/png", "image/gif"],
|
||||
fileSize: 5,
|
||||
height: "150px",
|
||||
width: "150px",
|
||||
borderRadius: "8px",
|
||||
})
|
||||
|
||||
const imageUrls = defineModel("modelValue", { default: "" })
|
||||
|
||||
const imageBaseUrl = import.meta.env.VITE_IMAGE_BASE_PATH
|
||||
const dialogVisible = ref(false)
|
||||
const fileList = ref<any>([])
|
||||
const dialogImageUrl = ref("")
|
||||
// 获取 el-form 组件上下文
|
||||
const formContext = inject(formContextKey, void 0)
|
||||
|
||||
// 自定义上传方法
|
||||
const handleHttpUpload = async (options: UploadRequestOptions) => {
|
||||
let formData = new FormData()
|
||||
formData.append("file", options.file)
|
||||
try {
|
||||
const res = await request({
|
||||
url: "/admin/sys-file/qn/upload",
|
||||
method: "post",
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
data: formData,
|
||||
})
|
||||
if (res.code == 0) {
|
||||
return res
|
||||
}
|
||||
} catch (error) {
|
||||
options.onError(error as any)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 文件上传之前判断
|
||||
* @param rawFile 选择的文件
|
||||
* */
|
||||
const beforeUpload: UploadProps["beforeUpload"] = (rawFile) => {
|
||||
const imgSize = rawFile.size / 1024 / 1024 < props.fileSize
|
||||
const imgType = props.fileType.includes(rawFile.type)
|
||||
if (!imgType)
|
||||
ElNotification({
|
||||
title: "温馨提示",
|
||||
message: "上传图片不符合所需的格式!",
|
||||
type: "warning",
|
||||
})
|
||||
if (!imgSize)
|
||||
setTimeout(() => {
|
||||
ElNotification({
|
||||
title: "温馨提示",
|
||||
message: `上传图片大小不能超过 ${props.fileSize}M!`,
|
||||
type: "warning",
|
||||
})
|
||||
}, 0)
|
||||
return imgType && imgSize
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 图片上传成功
|
||||
* */
|
||||
const uploadSuccess = (response: any, uploadFile: UploadFile, uploadFiles: any) => {
|
||||
console.log("success", uploadFiles)
|
||||
|
||||
const urls = uploadFiles
|
||||
.map((item: any) => {
|
||||
// 处理新上传和已有的图片URL
|
||||
return item.response ? item.response.data.url : item.fileUrl
|
||||
})
|
||||
.filter(Boolean)
|
||||
.join(",")
|
||||
imageUrls.value = urls
|
||||
|
||||
console.log("fileList.value", fileList.value)
|
||||
console.log("urls", urls)
|
||||
|
||||
ElNotification({
|
||||
title: "温馨提示",
|
||||
message: "图片上传成功!",
|
||||
type: "success",
|
||||
})
|
||||
}
|
||||
|
||||
// 预览
|
||||
const handlePictureCardPreview = (uploadFile: any) => {
|
||||
dialogImageUrl.value = uploadFile.url
|
||||
dialogVisible.value = true
|
||||
}
|
||||
|
||||
// 移除
|
||||
const handleRemove = (uploadFile: any, uploadFiles: any[]) => {
|
||||
const urls = uploadFiles
|
||||
.map((item) => {
|
||||
return item.response ? item.response.data.url : item.fileUrl
|
||||
})
|
||||
.filter(Boolean)
|
||||
.join(",")
|
||||
imageUrls.value = urls
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 图片上传错误
|
||||
* */
|
||||
const uploadError = () => {
|
||||
ElNotification({
|
||||
title: "温馨提示",
|
||||
message: "图片上传失败,请您重新上传!",
|
||||
type: "error",
|
||||
})
|
||||
}
|
||||
|
||||
// 判断是否禁用上传和删除
|
||||
const self_disabled = computed(() => {
|
||||
return props.disabled || formContext?.disabled
|
||||
})
|
||||
|
||||
watch(
|
||||
() => imageUrls.value,
|
||||
(newValue) => {
|
||||
if (!newValue || Object.prototype.toString.call(newValue) !== "[object String]") {
|
||||
fileList.value = []
|
||||
return
|
||||
}
|
||||
|
||||
if (!newValue.match(/x-oss-process/g)) {
|
||||
fileList.value = newValue
|
||||
.split(",")
|
||||
.map((item: string) => {
|
||||
const url = item.startsWith("http") ? item : imageBaseUrl + item
|
||||
return {
|
||||
name: item.split("/").pop() || "",
|
||||
url: url,
|
||||
fileUrl: item,
|
||||
}
|
||||
})
|
||||
.filter((item) => item.url)
|
||||
|
||||
console.log("fileList.value", fileList.value)
|
||||
} else {
|
||||
fileList.value = newValue
|
||||
.split("?")
|
||||
.filter(
|
||||
(item) =>
|
||||
item.endsWith(".jpg") || item.endsWith(".png") || item.endsWith(".gif") || item.endsWith(".jpeg") || item.endsWith(".webp"),
|
||||
)
|
||||
.map((item: string) => {
|
||||
const url = item.startsWith("http") ? item : imageBaseUrl + item
|
||||
return {
|
||||
name: item.split("/").pop() || "",
|
||||
url: url,
|
||||
fileUrl: item,
|
||||
}
|
||||
})
|
||||
.filter((item) => item.url)
|
||||
|
||||
console.log("fileList.value", fileList.value)
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.is-error {
|
||||
.upload {
|
||||
|
||||
:deep(.el-upload),
|
||||
:deep(.el-upload-dragger) {
|
||||
border: 1px dashed var(--el-color-danger) !important;
|
||||
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.disabled) {
|
||||
|
||||
.el-upload,
|
||||
.el-upload-dragger {
|
||||
cursor: not-allowed !important;
|
||||
background: var(--el-disabled-bg-color);
|
||||
border: 1px dashed var(--el-border-color-darker) !important;
|
||||
|
||||
&:hover {
|
||||
border: 1px dashed var(--el-border-color-darker) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.upload-box {
|
||||
overflow: hidden;
|
||||
|
||||
.no-border {
|
||||
:deep(.el-upload) {
|
||||
border: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.upload) {
|
||||
.el-upload {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: v-bind(width);
|
||||
height: v-bind(height);
|
||||
overflow: hidden;
|
||||
border: 1px dashed var(--el-border-color-darker);
|
||||
border-radius: v-bind(borderRadius);
|
||||
transition: var(--el-transition-duration-fast);
|
||||
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary);
|
||||
|
||||
.upload-handle {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.el-upload-dragger {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
background-color: transparent;
|
||||
border: 1px dashed var(--el-border-color-darker);
|
||||
border-radius: v-bind(borderRadius);
|
||||
|
||||
&:hover {
|
||||
border: 1px dashed var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
|
||||
.el-upload-dragger.is-dragover {
|
||||
background-color: var(--el-color-primary-light-9);
|
||||
border: 2px dashed var(--el-color-primary) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -6,6 +6,8 @@ import UploadExcel from "/@/components/Upload/Excel.vue"
|
||||
import UploadFile from "/@/components/Upload/index.vue"
|
||||
import UploadImg from "/@/components/Upload/Image.vue"
|
||||
import UploadImgs from "/@/components/Upload/Images.vue"
|
||||
import UploadQnImgs from "/@/components/Upload/qnImages.vue"
|
||||
|
||||
import DelWrap from "/@/components/DelWrap/index.vue"
|
||||
import Editor from "/@/components/Editor/index.vue"
|
||||
import Tip from "/@/components/Tip/index.vue"
|
||||
@@ -67,6 +69,7 @@ export default {
|
||||
app.component("UploadFile", UploadFile)
|
||||
app.component("UploadImg", UploadImg)
|
||||
app.component("UploadImgs", UploadImgs)
|
||||
app.component("UploadQnImgs", UploadQnImgs)
|
||||
app.component("Editor", Editor)
|
||||
app.component("Tip", Tip)
|
||||
app.component("DelWrap", DelWrap)
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="活动商户" prop="mchId">
|
||||
<select-mch v-model="form.mchId" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="活动公告" prop="noticeId">
|
||||
<el-input v-model="form.noticeId" placeholder="请输入公告id" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="活动标题" prop="actTitle">
|
||||
<el-input v-model="form.actTitle" placeholder="请输入活动标题" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="到期时间" prop="expireTime">
|
||||
<el-date-picker type="date" placeholder="请选择到期时间" v-model="form.expireTime"
|
||||
:value-format="dateStr"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col v-if="false" :span="24" class="mb20">
|
||||
<el-form-item label="活动状态" prop="actStatus">
|
||||
<dict-select v-model="form.actStatus" dict-code="act_status" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="活动内容" prop="actContent">
|
||||
<editor v-if="visible" v-model:get-html="form.actContent" placeholder="请输入活动内容"></editor>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="ActCancelDialog">
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { useMessage } from "/@/hooks/message";
|
||||
import * as actCancelApi from "/@/api/act/actCancel";
|
||||
import { rule } from '/@/utils/validate';
|
||||
const emit = defineEmits(['refresh']);
|
||||
|
||||
// 定义变量内容
|
||||
const dataFormRef = ref();
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
// 定义字典
|
||||
|
||||
// 提交表单数据
|
||||
const form = reactive({
|
||||
id: '',
|
||||
mchId: '',
|
||||
noticeId: '',
|
||||
expireTime: '',
|
||||
actStatus: '',
|
||||
actTitle: '',
|
||||
actContent: '',
|
||||
});
|
||||
|
||||
// 定义校验规则
|
||||
const dataRules = ref({
|
||||
})
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (id: string) => {
|
||||
visible.value = true
|
||||
form.id = ''
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
});
|
||||
|
||||
// 获取actCancel信息
|
||||
if (id) {
|
||||
form.id = id
|
||||
getactCancelData(id)
|
||||
}
|
||||
};
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => { });
|
||||
if (!valid) return false;
|
||||
|
||||
try {
|
||||
loading.value = true;
|
||||
form.id ? await actCancelApi.putObj(form) : await actCancelApi.addObj(form);
|
||||
useMessage().success(form.id ? '修改成功' : '添加成功');
|
||||
visible.value = false;
|
||||
emit('refresh');
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// 初始化表单数据
|
||||
const getactCancelData = (id: string) => {
|
||||
// 获取数据
|
||||
loading.value = true
|
||||
actCancelApi.getObj(id).then((res: any) => {
|
||||
Object.assign(form, res.data)
|
||||
}).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
};
|
||||
|
||||
// 暴露变量
|
||||
defineExpose({
|
||||
openDialog
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,138 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList">
|
||||
<el-row>
|
||||
<el-form-item style="width: 300px" label="活动标题" prop="actTitle">
|
||||
<el-input v-model="state.queryForm.actTitle" placeholder="请输入活动标题" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 300px" label="活动商户" prop="mchId">
|
||||
<select-mch v-model="state.queryForm.mchId" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 300px" label="活动状态" prop="actStatus">
|
||||
<dict-select v-model="state.queryForm.actStatus" dict-code="act_status" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="getDataList">
|
||||
{{ $t("common.queryBtn") }}
|
||||
</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">
|
||||
{{ $t("common.resetBtn") }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()"
|
||||
v-auth="'wallet_actCancel_add'">
|
||||
新 增
|
||||
</el-button>
|
||||
<el-button plain :disabled="multiple" icon="Delete" type="primary" v-auth="'wallet_actCancel_del'"
|
||||
@click="handleDelete(selectObjs)">
|
||||
删除
|
||||
</el-button>
|
||||
<right-toolbar v-model:showSearch="showSearch" :export="'wallet_actCancel_export'" @exportExcel="exportExcel"
|
||||
class="ml10 mr20" style="float: right;" @queryTable="getDataList"></right-toolbar>
|
||||
</div>
|
||||
</el-row>
|
||||
<el-table :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="mchId" label="活动商户id" show-overflow-tooltip />
|
||||
<el-table-column prop="noticeId" label="公告id" show-overflow-tooltip />
|
||||
<el-table-column prop="expireTime" label="到期时间" show-overflow-tooltip />
|
||||
<el-table-column prop="actStatus" label="活动状态(1:正常 2:关闭)" show-overflow-tooltip />
|
||||
<el-table-column prop="actTitle" label="活动标题" show-overflow-tooltip />
|
||||
<el-table-column prop="actContent" label="活动内容" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<el-button icon="edit-pen" text type="primary" v-auth="'wallet_actCancel_edit'"
|
||||
@click="formDialogRef.openDialog(scope.row.id)">编辑</el-button>
|
||||
<el-button icon="delete" text type="primary" v-auth="'wallet_actCancel_del'"
|
||||
@click="handleDelete([scope.row.id])">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||
</div>
|
||||
|
||||
<!-- 编辑、新增 -->
|
||||
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="systemActCancel">
|
||||
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||
import * as actCancelApi from "/@/api/act/actCancel";
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message";
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
|
||||
// 定义查询字典
|
||||
|
||||
// 定义变量内容
|
||||
const formDialogRef = ref()
|
||||
// 搜索变量
|
||||
const queryRef = ref()
|
||||
const showSearch = ref(true)
|
||||
// 多选变量
|
||||
const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
pageList: actCancelApi.fetchList
|
||||
})
|
||||
|
||||
// table hook
|
||||
const {
|
||||
getDataList,
|
||||
currentChangeHandle,
|
||||
sizeChangeHandle,
|
||||
sortChangeHandle,
|
||||
downBlobFile,
|
||||
tableStyle
|
||||
} = useTable(state)
|
||||
|
||||
// 清空搜索条件
|
||||
const resetQuery = () => {
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields()
|
||||
// 清空多选
|
||||
selectObjs.value = []
|
||||
getDataList()
|
||||
}
|
||||
|
||||
// 导出excel
|
||||
const exportExcel = () => {
|
||||
downBlobFile('/wallet/actCancel/export', Object.assign(state.queryForm, { ids: selectObjs }), 'actCancel.xlsx')
|
||||
}
|
||||
|
||||
// 多选事件
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id);
|
||||
multiple.value = !objs.length;
|
||||
};
|
||||
|
||||
// 删除操作
|
||||
const handleDelete = async (ids: string[]) => {
|
||||
try {
|
||||
await useMessageBox().confirm('此操作将永久删除');
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await actCancelApi.delObjs(ids);
|
||||
getDataList();
|
||||
useMessage().success('删除成功');
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" width="40%" v-model="visible" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="120px" v-loading="loading">
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="120px"
|
||||
v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商品名" prop="name">
|
||||
@@ -14,12 +15,12 @@
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商品封面图片" prop="cover">
|
||||
<upload-imgs v-model="form.cover" :disabled="form.skuType == '0'" />
|
||||
<upload-qn-imgs v-model="form.cover" :disabled="form.skuType == '0'" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商品识别图片" prop="pic">
|
||||
<upload-imgs v-model="form.pic" :disabled="form.skuType == '0'" />
|
||||
<upload-qn-imgs v-model="form.pic" :disabled="form.skuType == '0'" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
@@ -149,7 +150,7 @@ const openDialog = (id: string) => {
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
||||
const valid = await dataFormRef.value.validate().catch(() => { })
|
||||
if (!valid) return false
|
||||
|
||||
try {
|
||||
|
||||
@@ -14,12 +14,9 @@ const loading = ref(false)
|
||||
|
||||
onMounted(async () => {
|
||||
try {
|
||||
// 是否生成环境
|
||||
if (import.meta.env.VITE_ENV === "prod") {
|
||||
openPlanUrl("https://stgl.pj.gov.cn/cockpit/#/canteen")
|
||||
} else {
|
||||
openPlanUrl("http://localhost:5173/#/canteen")
|
||||
}
|
||||
const isDev = import.meta.env.MODE === "development"
|
||||
const url = isDev ? "http://localhost:5173/#/canteen" : "https://stgl.pj.gov.cn/cockpit/#/canteen"
|
||||
openPlanUrl(url)
|
||||
loading.value = true
|
||||
router.back()
|
||||
} catch (error: any) {
|
||||
|
||||
@@ -42,6 +42,19 @@
|
||||
</el-form-item>
|
||||
<!-- **************************** end 营养分析 end **************************** -->
|
||||
|
||||
|
||||
<!-- **************************** start 今日菜品复购排行 start **************************** -->
|
||||
<el-divider class="my-12">今日菜品复购排行</el-divider>
|
||||
<el-form-item prop="nutritionSetting.repurchaseTopExcludeCategoryIds">
|
||||
<template #label>
|
||||
<div class="flex items-center gap-1">
|
||||
<span>需要排除的菜品分类</span>
|
||||
</div>
|
||||
</template>
|
||||
<select-ctcg v-model="form.nutritionSetting.repurchaseTopExcludeCategoryIds" multiple
|
||||
placeholder="请选择需要排除的菜品分类" />
|
||||
</el-form-item>
|
||||
<!-- **************************** end 今日菜品复购排行 end **************************** -->
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
@@ -66,6 +79,8 @@ const form = reactive<any>({
|
||||
scCategoryIds: [],
|
||||
// 主食菜品分类
|
||||
zsCategoryIds: [],
|
||||
// 复购排行需要排除的菜品分类
|
||||
repurchaseTopExcludeCategoryIds: [],
|
||||
},
|
||||
})
|
||||
|
||||
@@ -91,6 +106,7 @@ async function getSetting() {
|
||||
hcCategoryIds: [],
|
||||
scCategoryIds: [],
|
||||
zsCategoryIds: [],
|
||||
repurchaseTopExcludeCategoryIds: [],
|
||||
}
|
||||
}
|
||||
if (data) {
|
||||
|
||||
@@ -6,22 +6,20 @@
|
||||
:defaultTreeWidth="20" :nodeClickable="false">
|
||||
<template #default>
|
||||
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList">
|
||||
<el-row>
|
||||
<el-form-item style="width: 300px" label="用户" prop="userId">
|
||||
<select-user v-model="state.queryForm.userId" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 200px" label="饭卡卡号" prop="cardNumber">
|
||||
<el-input v-model="state.queryForm.cardNumber" placeholder="饭卡卡号" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 200px" label="饭卡类型" prop="walletTypeId">
|
||||
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型"
|
||||
clearable />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="getDataList">{{ $t("common.queryBtn")
|
||||
}}</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">{{ $t("common.resetBtn") }}</el-button>
|
||||
</el-form-item>
|
||||
<select-user v-model="state.queryForm.userId" />
|
||||
<el-form-item style="width: 300px" label="用户" prop="userId">
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 200px" label="饭卡卡号" prop="cardNumber">
|
||||
<el-input v-model="state.queryForm.cardNumber" placeholder="饭卡卡号" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 200px" label="饭卡类型" prop="walletTypeId">
|
||||
<select-wallet-type v-model="state.queryForm.walletTypeId" placeholder="饭卡类型" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="getDataList">{{ $t("common.queryBtn")
|
||||
}}</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">{{ $t("common.resetBtn") }}</el-button>
|
||||
</el-form-item>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<el-row>
|
||||
|
||||
@@ -33,13 +33,15 @@
|
||||
<span class="color-primary">{{ userConfigDetail.sourceWalletTypeName }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="源钱包余额: ">
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.sourceWalletBalance - form.balance * 100) }}</span>
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.sourceWalletBalance - form.balance
|
||||
* 100) }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包: ">
|
||||
<span class="color-primary">{{ userConfigDetail.targetWalletTypeName }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包余额: ">
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.targetWalletBalance + form.balance * 100) }}</span>
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.targetWalletBalance + form.balance
|
||||
* 100) }}</span>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-descriptions :column="2" border title="转账统计">
|
||||
@@ -52,8 +54,8 @@
|
||||
<el-descriptions-item :rowspan="1" label="源钱包支持最大转账金额: ">
|
||||
<span class="color-primary">{{ displayPrice(userConfigDetail.maxTransferBalance) }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包已转账金额: "
|
||||
>{{ displayPrice(userConfigDetail.totalTransferBalance) }}
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包已转账金额: ">{{
|
||||
displayPrice(userConfigDetail.totalTransferBalance) }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
@@ -61,19 +63,14 @@
|
||||
<span>用户</span>
|
||||
<span class="color-primary">{{ walletDetail.username }}</span>
|
||||
<span>将</span>
|
||||
<el-input-number class="mx-1" style="width: 200px" :min="1" :max="5000" v-model="form.balance" placeholder="" />
|
||||
<el-input-number class="mx-1" style="width: 200px" :min="1" :max="5000" v-model="form.balance"
|
||||
placeholder="" />
|
||||
<span>元从</span>
|
||||
<span class="color-primary">{{ walletDetail.walletTypeName }}</span>
|
||||
<span>转到</span>
|
||||
<select-wallet-type
|
||||
class="mx-1"
|
||||
:clearable="false"
|
||||
:autoFirst="true"
|
||||
:apiParams="{ notWalletTypeIds: walletDetail.walletTypeId }"
|
||||
style="width: 200px"
|
||||
v-model="form.targetWalletTypeId"
|
||||
@change="selectWalletTypeChange"
|
||||
/>
|
||||
<select-wallet-type class="mx-1" :clearable="false" :autoFirst="true"
|
||||
:apiParams="{ notWalletTypeIds: walletDetail.walletTypeId }" style="width: 200px"
|
||||
v-model="form.targetWalletTypeId" @change="selectWalletTypeChange" />
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
@@ -182,7 +179,7 @@ const getUserConfig = async (userId: any, sourceWalletId: any, targetWalletId: a
|
||||
const _pa = {
|
||||
userId: userId,
|
||||
sourceWalletTypeId: sourceWalletId,
|
||||
targetWalletTypeId: targetWalletId,
|
||||
targetWalletTypeId: targetWalletId ?? null,
|
||||
}
|
||||
try {
|
||||
const { data } = await walletRuleJoin.userConfig(_pa)
|
||||
|
||||
Reference in new issue
Block a user