From ecdd0fb84ddd09e84143896eb99956bcf9629446 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期二, 30 九月 2025 19:26:22 +0800
Subject: [PATCH] 更新
---
seller/src/api/prize-store.js | 7 +
seller/src/views/activity/store-prize-proof.vue | 328 +++++++++++++++++++++++++++++++++-------------
manager/src/api/prize-store.js | 7 +
seller/src/api/common.js | 10 +
manager/src/views/activity-prize/prize-store.vue | 64 ++++++++-
5 files changed, 313 insertions(+), 103 deletions(-)
diff --git a/manager/src/api/prize-store.js b/manager/src/api/prize-store.js
index fd67570..ae23293 100644
--- a/manager/src/api/prize-store.js
+++ b/manager/src/api/prize-store.js
@@ -34,3 +34,10 @@
params:params
})
}
+
+export const getDetailData = (params) =>{
+ return service({
+ url: "/lmk/scan-prize/getDetailData/"+params,
+ method: "GET",
+ })
+}
diff --git a/manager/src/views/activity-prize/prize-store.vue b/manager/src/views/activity-prize/prize-store.vue
index 4ad9f62..4cd5d7c 100644
--- a/manager/src/views/activity-prize/prize-store.vue
+++ b/manager/src/views/activity-prize/prize-store.vue
@@ -108,12 +108,7 @@
class="add-btn"
v-if="row.generateStatus ==='NOT_GENERATE'"
>鐢熸垚浼樻儬鍗�</Button>
- <Button
- style="margin-left: 10px;"
- type="primary"
- class="add-btn"
- :disabled="row.material !== 'NOT_GENERATE'"
- >鏌ョ湅鏉愭枡</Button>
+
<Button
@click="detail(row)"
style="margin-left: 10px;"
@@ -174,6 +169,13 @@
>
<template slot-scope="{ row }" slot="action">
<Button
+ @click="lookSupplementaryMaterials(row)"
+ type="primary"
+ class="add-btn"
+ :disabled="row.material === 'NOT_GENERATE'"
+ >鏌ョ湅鏉愭枡</Button>
+ <Button
+ style="margin-left: 20px"
@click="generalQrCode(row)"
type="primary"
class="add-btn"
@@ -275,12 +277,41 @@
<Button type="primary" @click="handleSubmit" :loading="submitLoading">纭畾</Button>
</div>
</Modal>
+ <Modal
+ v-model="dialogVisible2"
+ title="鏉愭枡璇︽儏"
+ width="1200"
+ :mask-closable="false"
+ @on-cancel="handleCancel2">
+ <Row :gutter="16">
+ <Col span="12">
+ <div class="detail-item">
+ <label>鏂囨湰鍐呭锛�</label>
+ <span>{{ detailData.content }}</span>
+ </div>
+ </Col>
+ <Col span="24">
+ <div class="detail-item">
+ <label>鏂囦欢锛�</label>
+ <div v-if="detailData.urlPath" class="detail-image">
+ <img
+ :src="detailData.urlPath" alt="濂栧搧灏侀潰"
+ class="preview-image-limit"
+ >
+ </div>
+ </div>
+ </Col>
+
+ </Row>
+ </Modal>
+
+
</div>
</template>
<script>
import vueQr from "vue-qr";
-import { getPage,add,changeStatus,generateStorePrize,getClaimPage} from "@/api/prize-store.js"
+import { getPage,add,changeStatus,generateStorePrize,getClaimPage ,getDetailData} from "@/api/prize-store.js"
import * as API_Activity_Prize from "@/api/activity-prize.js"
import * as API_Order from "@/api/order";
@@ -292,6 +323,7 @@
name: 'CouponManagement',
data() {
return {
+ detailData:{},
QRCodeUrl:"",
showGeneralQrCode:false,
codeLoading:false,
@@ -339,7 +371,7 @@
title: "鎿嶄綔",
slot: "action",
align: "center",
- width: 200,
+ width: 400,
fixed: "right"
}
],
@@ -439,6 +471,8 @@
dialogVisible: false,
dialogStatus: '',
dialogTitle: '',
+ dialogVisible2: false,
+
// 琛ㄥ崟楠岃瘉瑙勫垯
formRules: {
@@ -514,6 +548,17 @@
}
},
methods: {
+ lookSupplementaryMaterials(row){
+ this.dialogVisible2 = true;
+ getDetailData(row.id).then(res =>{
+ if (res.code === 200){
+ this.detailData = res.data;
+ }
+ })
+
+
+
+ },
closeGeneralQrCode(){
this.showGeneralQrCode = false;
this.QRCodeUrl = '';
@@ -703,6 +748,9 @@
handleCancel() {
this.dialogVisible = false;
},
+ handleCancel2() {
+ this.dialogVisible2 = false;
+ },
// 鎻愪氦琛ㄥ崟
handleSubmit() {
diff --git a/seller/src/api/common.js b/seller/src/api/common.js
index cad5dcf..8e1fe45 100644
--- a/seller/src/api/common.js
+++ b/seller/src/api/common.js
@@ -1,5 +1,5 @@
import { commonUrl, getRequest, uploadFileRequest, uploadFile, request} from "@/libs/axios";
-
+import service from "../libs/axios";
// 閫氳繃id鑾峰彇瀛愬湴鍖�
export const getChildRegion = (id) => {
return getRequest(`${commonUrl}/common/common/region/item/${id}`);
@@ -31,3 +31,11 @@
export function sendSms (params) {
return getRequest(`${commonUrl}/common/common/sms/${params.verificationEnums}/${params.mobile}`,params);
}
+export const uploadFileByLmk = (params) =>{
+ return service({
+ url: "/lmk/common/upload",
+ method: "POST",
+ headers:{'Content-Type': 'multipart/form-data'},
+ data: params
+ })
+}
diff --git a/seller/src/api/prize-store.js b/seller/src/api/prize-store.js
index a4248ce..302a60e 100644
--- a/seller/src/api/prize-store.js
+++ b/seller/src/api/prize-store.js
@@ -7,5 +7,12 @@
params: params
})
}
+export const add = (params) =>{
+ return service({
+ url: "/lmk/scan-prize",
+ method: "POST",
+ data: params
+ })
+}
diff --git a/seller/src/views/activity/store-prize-proof.vue b/seller/src/views/activity/store-prize-proof.vue
index 9dfd315..fa62a06 100644
--- a/seller/src/views/activity/store-prize-proof.vue
+++ b/seller/src/views/activity/store-prize-proof.vue
@@ -8,57 +8,48 @@
:label-width="75"
class="search-form mb_10"
>
- <Form-item label="浼樻儬鍒稿悕绉�" prop="couponName">
- <Input
- type="text"
- v-model="searchForm.couponName"
- placeholder="璇疯緭鍏ヤ紭鎯犲埜鍚嶇О"
- clearable
- style="width: 200px"
- />
- </Form-item>
- <Form-item label="浼氬憳鍚嶇О" prop="memberName">
- <Input
- type="text"
- v-model="searchForm.memberName"
- placeholder="璇疯緭鍏ヤ細鍛樺悕绉�"
- clearable
- style="width: 200px"
- />
- </Form-item>
- <Form-item label="鑾峰彇鏂瑰紡" prop="getType">
- <Select
- v-model="searchForm.getType"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 200px"
- >
- <Option value="FREE">鍏嶈垂鑾峰彇</Option>
- <Option value="ACTIVITY">娲诲姩鑾峰彇</Option>
- </Select>
- </Form-item>
- <Form-item label="浼樻儬鍒哥姸鎬�" prop="memberCouponStatus">
- <Select
- v-model="searchForm.memberCouponStatus"
- placeholder="璇烽�夋嫨"
- clearable
- style="width: 200px"
- >
- <Option value="NEW">宸查鍙�</Option>
- <Option value="USED">宸蹭娇鐢�</Option>
- <Option value="EXPIRE">宸茶繃鏈�</Option>
- <Option value="CLOSED">宸蹭綔搴�</Option>
- </Select>
- </Form-item>
- <Form-item label="娲诲姩鏃堕棿">
- <DatePicker
- v-model="selectDate"
- type="daterange"
- clearable
- placeholder="閫夋嫨璧峰鏃堕棿"
- style="width: 200px"
- ></DatePicker>
- </Form-item>
+<!-- <Form-item label="浼樻儬鍒稿悕绉�" prop="couponName">-->
+<!-- <Input-->
+<!-- type="text"-->
+<!-- v-model="searchForm.couponName"-->
+<!-- placeholder="璇疯緭鍏ヤ紭鎯犲埜鍚嶇О"-->
+<!-- clearable-->
+<!-- style="width: 200px"-->
+<!-- />-->
+<!-- </Form-item>-->
+<!-- <Form-item label="浼氬憳鍚嶇О" prop="memberName">-->
+<!-- <Input-->
+<!-- type="text"-->
+<!-- v-model="searchForm.memberName"-->
+<!-- placeholder="璇疯緭鍏ヤ細鍛樺悕绉�"-->
+<!-- clearable-->
+<!-- style="width: 200px"-->
+<!-- />-->
+<!-- </Form-item>-->
+<!-- <Form-item label="鑾峰彇鏂瑰紡" prop="getType">-->
+<!-- <Select-->
+<!-- v-model="searchForm.getType"-->
+<!-- placeholder="璇烽�夋嫨"-->
+<!-- clearable-->
+<!-- style="width: 200px"-->
+<!-- >-->
+<!-- <Option value="FREE">鍏嶈垂鑾峰彇</Option>-->
+<!-- <Option value="ACTIVITY">娲诲姩鑾峰彇</Option>-->
+<!-- </Select>-->
+<!-- </Form-item>-->
+<!-- <Form-item label="浼樻儬鍒哥姸鎬�" prop="memberCouponStatus">-->
+<!-- <Select-->
+<!-- v-model="searchForm.memberCouponStatus"-->
+<!-- placeholder="璇烽�夋嫨"-->
+<!-- clearable-->
+<!-- style="width: 200px"-->
+<!-- >-->
+<!-- <Option value="NEW">宸查鍙�</Option>-->
+<!-- <Option value="USED">宸蹭娇鐢�</Option>-->
+<!-- <Option value="EXPIRE">宸茶繃鏈�</Option>-->
+<!-- <Option value="CLOSED">宸蹭綔搴�</Option>-->
+<!-- </Select>-->
+<!-- </Form-item>-->
<Button
@click="handleSearch"
type="primary"
@@ -66,12 +57,6 @@
class="search-btn"
>鎼滅储</Button
>
- <Button
- @click="queryExportCoupon"
- type="primary"
- class="search-btn">
- 瀵煎嚭棰嗗彇璁板綍
- </Button>
</Form>
<Table
v-if="refreshTable"
@@ -81,8 +66,15 @@
:data="data"
ref="table"
class="mt_10"
- @on-selection-change="changeSelect"
>
+ <template slot-scope="{ row }" slot="action">
+ <Button
+ @click="supplementaryMaterials(row)"
+ type="primary"
+ class="add-btn"
+ v-if="row.material === 'NOT_GENERATE' && row.claimStatus ==='CLAIM'"
+ >琛ュ厖鏉愭枡</Button>
+ </template>
</Table>
<Row type="flex" justify="end" class="mt_10">
<Page
@@ -99,53 +91,189 @@
></Page>
</Row>
</Card>
+
+ <Modal
+ title="琛ュ厖鏉愭枡"
+ v-model="showModal"
+ width="1200"
+ :mask-closable="false"
+ @on-cancel="handleCancel">
+
+
+ <Upload
+ v-if="!tempUrl"
+ :before-upload="(file) => handleBeforeUpload(file)"
+ :format="['jpg','jpeg','png','gif']"
+ :max-size="20480"
+ action=""
+ accept="image/*"
+ >
+ <Button icon="ios-cloud-upload-outline" >涓婁紶鍥剧墖</Button>
+ </Upload>
+ <div v-if="tempUrl" class="upload-file-info">
+ <img :src="tempUrl" alt="鍥剧墖" class="preview-image-limit">
+ <Button type="text" @click="handleRemove('content')">鍒犻櫎</Button>
+ </div>
+
+ <Input
+ v-model="form.content"
+ style="width: 300px"
+ :rows="4"
+ type="textarea"
+ placeholder="璇疯緭鍏ュ唴瀹�"
+ />
+ <div slot="footer">
+ <Button @click="handleCancel">鍙栨秷</Button>
+ <Button type="primary" :loading="submitLoading" @click="save">鎻愪氦</Button>
+ </div>
+ </Modal>
+
</div>
</template>
<script>
-import { getPage } from "@/api/prize-store.js"
+import { uploadFileByLmk, delByKey } from "@/api/common.js"
+import { getPage,add } from "@/api/prize-store.js"
export default {
name: "store-prize-proof",
data() {
return {
+ submitLoading:false,
+ file: null,
+ tempUrl:null,
+ showModal:false,
loading: true, // 琛ㄥ崟鍔犺浇鐘舵��
+ form:{
+ storePrizeClaimId:null,
+ urlPath:null,
+ content:""
+ },
searchForm: {
// 鎼滅储妗嗗垵濮嬪寲瀵硅薄
pageNumber: 1, // 褰撳墠椤垫暟
pageSize: 10, // 椤甸潰澶у皬
},
- selectList: [], // 澶氶�夋暟鎹�
- selectCount: 0, // 澶氶�夎鏁�
columns: [
- // 琛ㄥご
{
- title: "浼氬憳鍚嶇О",
- key: "memberName",
- minWidth: 130,
- fixed: "left",
+ title: "娲诲姩鍚�",
+ key: "prizeActivityName",
+ align: "center",
+ tooltip: true
},
{
- title: "浼樻儬鍒稿悕绉�",
- key: "couponName",
- minWidth: 100,
+ title: "缂栧彿",
+ key: "no",
+ align: "center",
+ tooltip: true
+ },
+ {
+ title: "鏉愭枡琛ュ厖鐘舵��",
+ key: "material",
+ align: "center",
tooltip: true,
+ render: (h, params) => {
+ const status = params.row.material;
+ const color = status === 'GENERATE' ? 'success' : status === 'NOT_GENERATE' ? 'default' : 'warning';
+ const text = status === 'GENERATE' ? '宸茶ˉ鍏�' : status === 'NOT_GENERATE' ? '鏈ˉ鍏�' : '鏈煡';
+
+ return h('Tag', {
+ props: {
+ color: color
+ }
+ }, text);
+ }
+ },
+
+ {
+ title: "棰嗗彇鐘舵��",
+ key: "claimStatus",
+ align: "center",
+ tooltip: true,
+ render: (h, params) => {
+ const status = params.row.claimStatus;
+ const color = status === 'CLAIM' ? 'success' : status === 'NOT_CLAIM' ? 'default' : 'warning';
+ const text = status === 'CLAIM' ? '宸查鍙�' : status === 'NOT_CLAIM' ? '鏈鍙�' : '鏈煡';
+
+ return h('Tag', {
+ props: {
+ color: color
+ }
+ }, text);
+ }
},
{
- title: "鍙戝竷搴楅摵",
- key: "storeName",
- minWidth: 100,
- render: (h, params) => {
- return h("div", (params.row.storeName === 'platform' && "骞冲彴") || params.row.storeName);
- },
- },
+ title: "鎿嶄綔",
+ slot: "action",
+ align: "center",
+ fixed: "right"
+ }
],
data: [], // 琛ㄥ崟鏁版嵁
total: 0, // 琛ㄥ崟鏁版嵁鎬绘暟
refreshTable: true, // 淇敼閫変腑鐘舵�佸悗鍒锋柊琛ㄦ牸
- selectDate: [], //閫変腑鐨勪俊鎭�
};
},
methods: {
+ // 鏂囦欢涓婁紶鍓嶅鐞�
+ handleBeforeUpload(file) {
+ this.file = file;
+ this.tempUrl = URL.createObjectURL(file);
+ return false;
+ },
+ handleRemove(type) {
+ this.file = null;
+ this.tempUrl = null;
+ },
+ async save(){
+ await this.myUploadFileByLmk();
+ let fileState = false;
+ let contentState = false;
+ if (this.form.url_path === '' || this.form.url_path=== null) {
+ fileState= true;
+ }
+ if (this.form.content === '' || this.form.content=== null){
+ contentState = true;
+ }
+ if (fileState && contentState){
+ this.$Message.error("璇烽�夋嫨鍥剧墖鎴栬緭鍏ユ枃鏈唴瀹硅ˉ鍏ㄦ潗鏂欙紒")
+ }
+ this.submitLoading = true
+ add(this.form).then(res =>{
+ this.submitLoading = false
+ if (res.code === 200){
+ this.$Message.success("鎴愬姛")
+ }
+ this.showModal = false;
+ })
+ this.getDataList();
+ },
+ async myUploadFileByLmk(){
+ if (this.file){
+ const formData = new FormData()
+ formData.append('file', this.file)
+ await uploadFileByLmk(formData).then(res => {
+ this.submitLoading = false
+ if (res.code === 200) {
+ this.form.urlPath = res.data.fileKey;
+ }else{
+ }
+ }).catch(() => {
+ this.submitLoading = false
+ })
+ }
+ },
+
+ supplementaryMaterials(row){
+ this.form ={
+ storePrizeClaimId:null,
+ urlPath:null,
+ content:""
+ }
+ this.file = null;
+ this.tempUrl = null;
+ this.showModal = true;
+ this.form.storePrizeClaimId = row.id;
+ },
// 鍒濆鍖栨暟鎹�
init() {
this.getDataList();
@@ -167,30 +295,18 @@
this.searchForm.pageSize = 10;
this.getDataList();
},
- /**
- * 閫夋嫨浼樻儬鍒�
- */
- changeSelect(e) {
- this.selectList = e;
- this.selectCount = e.length;
- if (this.getType === "ACTIVITY") this.check();
+ handleCancel(){
+ this.showModal =false;
},
+
getDataList() {
// 鑾峰彇鏁版嵁
this.loading = true;
- if (this.selectDate && this.selectDate[0] && this.selectDate[1]) {
- this.searchForm.startTime = this.selectDate[0].getTime();
- this.searchForm.endTime = this.selectDate[1].getTime();
- } else {
- this.searchForm.startTime = null;
- this.searchForm.endTime = null;
- }
getPage(this.searchForm).then((res) => {
this.loading = false;
if (res.code === 200) {
- console.log(res);
- this.data = res.data.records;
- this.total = res.data.total;
+ this.data = res.data;
+ this.total = res.total;
}
});
this.total = this.data.length;
@@ -202,3 +318,27 @@
},
};
</script>
+<style lang="scss" scoped>
+.preview-image{
+ width: 200px;
+ height: auto;
+ object-fit: contain
+}
+.preview-image {
+ max-width: 100%;
+ max-height: 70vh;
+ object-fit: contain;
+ border-radius: 4px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ display: block;
+ margin: 0 auto;
+}
+.preview-image-limit{
+ max-width: 100%;
+ max-height: 200px;
+ object-fit: contain;
+ border-radius: 4px;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+ display: block;
+}
+</style>
--
Gitblit v1.8.0