zxl
23 小时以前 ecdd0fb84ddd09e84143896eb99956bcf9629446
更新
5个文件已修改
416 ■■■■ 已修改文件
manager/src/api/prize-store.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager/src/views/activity-prize/prize-store.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
seller/src/api/common.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
seller/src/api/prize-store.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
seller/src/views/activity/store-prize-proof.vue 328 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
  })
}
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() {
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
  })
}
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
  })
}
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>