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