doum
20 小时以前 c25fecae568a074e338bce625a92960aca859fb8
经销商管理
已添加1个文件
已修改10个文件
557 ■■■■ 文件已修改
admin/src/api/business/memberCoupon.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberCouponWindow.vue 349 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaOrgsWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/coupon.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/memberCoupon.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/MemberCouponController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/MemberCouponAddDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/memberCoupon.js
@@ -15,5 +15,5 @@
// åˆ›å»º
export function create (data) {
  return request.post('/business/memberCoupon/create', data)
  return request.post('/business/memberCoupon/addBatch', data)
}
admin/src/components/business/OperaMemberCouponWindow.vue
@@ -1,92 +1,58 @@
<template>
  <GlobalWindow
      :title="title"
      width="80%"
      width="60%"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix=":" inline>
      <p class="tip-header" >基本属性</p>
      <el-form-item label="优惠券名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入优惠券名称" :maxlength="12" v-trim/>
      </el-form-item>
      <el-form-item label="类型" prop="couponType">
          <el-radio-group v-model="form.couponType">
            <el-radio :label="0" >满减券</el-radio>
            <el-radio :label="1">折扣券</el-radio>
          </el-radio-group>
      </el-form-item>
      <el-form-item label="优惠规则" prop="couponRule" >
        <div class="coupon-rule">
          <div class="discrep">订单满</div>
          <el-input v-model="form.limitPrice"   placeholder="请输入"     @input="inputAction(form, 'limitPrice')"
          >
            <template slot="append">元</template>
          </el-input>
          <div class="discrep" >{{form.couponType === 1?',享':',减'}}</div>
          <el-input  v-model="form.price"     placeholder="请输入"    @input="inputAction(form, 'price')"  >
            <template slot="append" >{{form.couponType ===1?'折':'元'}}</template>
          </el-input>
        </div>
      </el-form-item>
      <el-form-item label="优惠券说明" prop="info">
        <el-input type="textarea" v-model="form.info" placeholder="请输入优惠券说明"  v-trim/>
      </el-form-item>
      <p class="tip-header" >使用限制</p>
      <el-form-item label="有效期" prop="useType">
        <el-radio-group v-model="form.useType">
          <el-radio :label="0">固定时段</el-radio>
          <el-radio :label="1">固定时长</el-radio>
      <el-form-item label="发放对象" prop="applyType">
        <el-radio-group v-model="form.addType">
          <el-radio :label="0">指定会员</el-radio>
          <el-radio :label="1">指定手机号</el-radio>
          <el-radio :label="2">全部会员</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="使用时段" prop="getDate" v-if="form.useType===0">
        <div class="date-style">
          <el-date-picker
              v-model="getDate"
              type="datetimerange"
              value-format="yyyy-MM-dd HH:mm:ss"
              format="yyyy-MM-dd HH:mm:ss"
              range-separator="至"
              start-placeholder="开始时间"
              end-placeholder="结束时间"
              @change="selectDate"
          ></el-date-picker>
        </div>
      </el-form-item>
      <el-form-item label="固定时长" prop="validDays" v-if="form.useType===1">
        <div class="coupon-rule">
          <div class="discrep">领劵后</div>
          <el-input
              v-model="form.validDays"
              placeholder="请输入"
              @input="inputAction(form, 'validDays')"
      <el-form-item v-if="form.addType===0" label="选择用户" prop="addMemberIds" >
          <el-select  v-model="form.addMemberIds" placeholder="请输入会员昵称/手机号,再选择" clearable     filterable    remote  reserve-keyword    :remote-method="remoteMethod"
              :loading="searchLoading"
                      style="width: 400px;"
          >
            <template slot="append">天</template>
          </el-input>
          <div class="discrep">有效</div>
        </div>
            <el-option
                v-for="item in users"
                :key="item.id"
                :label="item.nickname+'  '+(item.phone||'')"
                :value="item.id">
            </el-option>
          </el-select>
      </el-form-item>
      <el-form-item label="适用对象" prop="applyType">
        <el-radio-group v-model="form.applyType">
          <el-radio :label="0">全场通用</el-radio>
          <el-radio :label="1">按品类</el-radio>
          <el-radio :label="2">指定商品</el-radio>
        </el-radio-group>
      <el-form-item v-if="form.addType===1" label="指定手机号" prop="addMemberPhones" >
        <el-input  style="width: 400px;"  type="textarea"   v-model="form.addMemberPhones"   placeholder="请输入手机号"   v-trim/>
        <p class="tip-warn" style="margin-bottom: 1px;"><i class="el-icon-warning"></i>提醒:多个手机号,请换行输入</p>
      </el-form-item>
      <el-form-item v-if="form.applyType===1" label="选择品类" prop="applyCateIdList" >
        <el-select v-model="form.applyCateIdList"  placeholder="请选择,支持多选" filterable multiple clearable >
          <el-option  v-for="item in categorys" :key="'optCate'+item.id"  :label="item.name"  :value="item.id">  </el-option>
        </el-select>
      </el-form-item>
      <el-form-item v-if="form.applyType===2" label="选择商品" prop="applyIdList" style="display: flex">
          <span style="font-size: 12px;color: #216EEE"   @click="selectGoods">已指定【 {{applyDataList.length}} ã€‘件商品</span>
        <el-button style="margin-left:30px;display: inline-block;width: 80px;" type="primary"  @click="selectGoods">去选择 </el-button>
      </el-form-item>
      <p class="tip-header" >发放规则</p>
      <el-form-item label="发放总量" prop="num">
        <div class="num-style">
          <el-input-number  v-model="form.num" :controls="false" :min="1" :max="99999" placeholder="请输入发放总量(1~99999)" v-trim></el-input-number>
      <el-form-item label="发放内容" prop="num">
        <div  style="border: 1px solid #f2f2f2">
          <el-table style="width: 600px;"  :data="form.addCouponList">
            <el-table-column prop="name" label="优惠券" min-width="300px" align="center">
              <template slot-scope="{row}" >
                <el-select v-model="row.couponId" style="width: 200px;margin: 0px 20px" clearable filterable   placeholder="请选择优惠券"  >
                  <el-option v-for="item in couponList"   :label="item.name"  :value="item.id">  </el-option>
                </el-select>
              </template>
            </el-table-column>
            <el-table-column prop="num" label="数量" min-width="200px" align="center">
              <template slot-scope="{row}" >
                <el-input  style="width: 150px;margin: 0px 20px" type="number"   v-model="row.num"   placeholder="请输入数量"   v-trim/>
              </template>
            </el-table-column>
            <el-table-column  label="操作" min-width="100px" align="center">
              <template slot-scope="scope" >
                <el-button style="color: red;border: none;" @click="delCoupon( scope.$index)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
          <el-button s type="primary" icon="el-icon-plus" @click="addCoupon()" style="height: 30px;margin: 10px;">添加</el-button>
        </div>
      </el-form-item>
    </el-form>
@@ -96,226 +62,103 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import { fetchList as shopList } from '@/api/business/shop'
import GlobalWindow from '@/components/common/GlobalWindow'
import { findAll as labelList } from '@/api/business/labels'
import { allList as goodsList} from '@/api/business/goods'
import OperaCouponGoodsWindow from '@/components/business/OperaCouponGoodsWindow'
import { allList } from '@/api/business/coupon'
import { findAll, findAll as memberlist } from '@/api/business/member'
export default {
  name: 'OperaCouponWindow',
  extends: BaseOpera,
  components: { GlobalWindow,OperaCouponGoodsWindow },
  components: { GlobalWindow, OperaCouponGoodsWindow },
  data () {
    const couponRules = (rule, value, callback) => {
      if (!this.form.limitPrice) {
        callback(new Error('请输入满额'))
      } else if (!this.form.price) {
        callback(new Error('请完善优惠规则'))
      if (!this.form.addCouponList || !this.form.addCouponList.length) {
        callback(new Error('请选择优惠券信息'))
      } else {
        callback()
      }
    }
    const getDateRules = (rule, value, callback) => {
      if (!this.form.startDate) {
        callback(new Error('请选择开始时间'))
      } else if (!this.form.endDate) {
        callback(new Error('请输入结束时间'))
      } else {
        callback()
      }
    }
    const numRule = (rule, value, callBack) => {
      if (value < 0) {
        callBack(new Error())
      } else {
        callBack()
        var r = true
        this.form.addCouponList.forEach(item => {
          if (!item.id || !item.num) {
            r = false
          }
        })
        if (!r) {
          callback(new Error('请完善优惠券信息'))
        } else {
          callback()
        }
      }
    }
    return {
      searchLoading: false,
      getDate: [],
      applyDataList:[],
      showGoods:false,
      couponList: [],
      users: [],
      // è¡¨å•数据
      form: {
        id: null,
        name: '',
        couponType: 0,
        applyType: 0,
        useType: 0,
        shopId: '',
        applyIdList: [],
        applyCateIdList: [],
        type: 0,
        limitPrice: '',
        price: '',
        startDate: '',
        endDate: '',
        applyIds: '',
        validDays: '',
        getMethod: '',
        integral: '',
        status: '',
        num: '',
        info: ''
        addType: 0,
        addMemberIds: null,
        addMemberPhones: null,
        addCouponList: [{ id: null, num: null }]
      },
      shops: [],
      categorys: [],
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入优惠券名称', tigger: 'blur' }
        addType: [
          { required: true, message: '请选择发放对象' }
        ],
        couponRule: [
        addCouponList: [
          { required: true, validator: couponRules, tigger: 'blur' }
        ],
        useType: [
          { required: true, message: '请选择有效期方式' }
        ],
        couponType: [
          { required: true, message: '请选择类型' }
        ],
        applyType: [
          { required: true, message: '请选择适用对象类型' }
        ],
        num: [
          { required: true, validator: numRule, message: '请输入发放总数', tigger: 'blur' }
        ],
        /*integral: [
          { required: true, validator: numRule, message: '请输入兑换条件', tigger: 'blur' }
        ],*/
        // validDays: [
        //   { required: true, message: '请输入可用时间', tigger: 'blur' }
        // ],
        // getDate: [
        //   { required: true, validator: getDateRules, tigger: 'change' }
        // ],
        // shopId: [
        //   { required: true, validator: numRule, message: '请选择关联店铺', tigger: 'change' }
        // ]
        ]
      }
    }
  },
  created () {
    this.config({
      api: '/business/coupon',
      api: '/business/memberCoupon',
      'field.id': 'id'
    })
  },
  methods: {
    selectGoods(){
      this.$refs.OperaCouponGoodsWindow.open('选择商品', this.applyDataList)
    },
    loadLabels(){
      labelList({
        type: 0 // å•†å“åˆ†ç±»
      }).then(res => {
        this.categorys = res || []
      })
    },
    loadSelectGoods(){
      console.log(this.form.applyIdList)
      if(!this.form.applyIdList || !this.form.applyIdList.length){
        return
      }
      goodsList({
        idList: this.form.applyIdList // å•†å“åˆ†ç±»
      }).then(res => {
        this.applyDataList = res || []
      })
    },
    doSelect(rows){
      console.log(rows,this.applyDataList)
      this.applyDataList =[]
      this.form.applyIdList=[]
      if(rows && rows.length){
        rows.forEach(item => {
          this.applyDataList.push(item)
          this.form.applyIdList.push(item.id)
        })
      }
    },
    open (title, target, type) {
      this.showGoods=false
      this.title = title
      this.visible = true
      this.form.type = type
      this.getDate = []
      this.form.startDate = ''
      this.form.endDate = ''
      this.applyDataList=[]
      this.form.applyIdList=[]
      this.form.applyCateIdList=[]
      this.loadLabels()
      this.form.limitPrice=null
      this.form.price=null
      this.form.startDate=null
      this.form.endDate=null
      this.form.num=1
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          console.log(this.form)
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.getDate = [target.startDate, target.endDate]
        if(this.form.applyType === 1){
          this.form.applyCateIdList =[]
          var ta = this.form.applyIds.split(',')
          if(ta && ta.length){
            ta.forEach(tt =>{
              this.form.applyCateIdList.push(parseInt(tt))
            })
          }
        }
        if(this.form.applyType === 2){
          this.form.applyIdList = this.form.applyIds.split(',')
          this.loadSelectGoods()
        }
      })
    },
    selectDate (value) {
      this.form.startDate = value[0]
      this.form.endDate = value[1]
    },
    inputAction (item, key) {
      if (item[key] < 0) {
        item[key] = ''
      } else {
        item[key] = item[key].replace(/[^\d.]/g, '')
          .replace(/\.{2,}/g, '.')
          .replace('.', '$#$')
          .replace(/\./g, '')
          .replace('$#$', '.')
          .replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
          .replace(/^\./g, '')
      }
    },
    remoteMethod (query) {
      if (query !== '') {
        this.searchLoading = true
        const action = this.form.type == 2 ? activityList : shopList
        action({
        findAll({
          capacity: 999,
          model: {
            name: query
            nickname: query,
            status: 0
          }
        })
          .then(res => {
            this.shops = res.records
            this.users = res
          })
          .finally(() => {
            this.searchLoading = false
          })
      }
    },
    getCouponList () {
      allList({status:0})
        .then(res => {
          if (res) {
            this.couponList = res || []
          }
        })
    },
    delCoupon (index) {
      this.form.addCouponList.splice(index, 1)
    },
    addCoupon (type) {
      this.form.addCouponList.push({ id: null, num: null })
    },
    open (title, target, type) {
      this.title = title
      this.visible = true
      this.form.addMemberIds=null
      this.form.addMemberPhones=null
      this.form.addType = 0
      this.form.addCouponList = [{id:null,num:null}]
      this.getCouponList()
    }
  }
}
admin/src/components/business/OperaOrgsWindow.vue
@@ -128,7 +128,6 @@
      })
    },
    remoteMethod(query) {
      debugger
      if (query !== '') {
        this.searchLoading = true
        findAll({
@@ -145,7 +144,7 @@
            this.searchLoading = false
          })
      }
    },
    },
    uploadIdcardImgSuccess(file) {
      this.form.imgurlfull = file.imgurlfull
      this.form.imgurl = file.imgurl
admin/src/views/business/coupon.vue
@@ -47,15 +47,17 @@
        <el-table-column prop="num" label="发放总量" align="center" min-width="100px"></el-table-column>
        <el-table-column  label="已发送数量" align="center" min-width="100px">
          <template slot-scope="{row}">
            <el-button type="text" @click="showCouponUse(row.id)">{{ row.unused + row.used }}</el-button>
            <el-button type="text" @click="showCouponUse(row.id)">{{ row.received||0 }}</el-button>
          </template>
        </el-table-column>
        <el-table-column label="剩余数量" align="center" min-width="100px">
          <template slot-scope="{row}">
            {{ row.num - row.unused - row.used }}
            {{ (row.num||0) - (row.received||0) }}
          </template>
        </el-table-column>
<!--
        <el-table-column prop="used" label="使用数量" align="center" min-width="100px"></el-table-column>
-->
        <el-table-column prop="validDays" label="使用有效期" align="center" min-width="210px">
          <template slot-scope="{row}">
            <span v-if="row.useType ===0"><li> èµ·ï¼š{{ row.startDate}}</li> <li>止:{{row.endDate }}</li></span>
admin/src/views/business/memberCoupon.vue
@@ -39,7 +39,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:membercoupon:create', 'business:membercoupon:exportExcel']">
        <li><el-button type="primary"  @click="$refs.OperaMemberCouponWindow.open('新建', null)" v-permissions="['business:membercoupon:create']">定向发放</el-button></li>
        <li><el-button type="primary"  @click="$refs.OperaMemberCouponWindow.open('定向发放优惠券', null)" v-permissions="['business:membercoupon:create']">定向发放</el-button></li>
        <li> <el-button type="primary" :loading="isWorking.export" v-permissions="['business:membercoupon:exportExcel']" @click="exportExcel">导出</el-button></li>
      </ul>
      <el-table
server/dmmall_admin/src/main/java/com/doumee/api/business/MemberCouponController.java
@@ -7,6 +7,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.system.dto.MemberCouponAddDTO;
import com.doumee.service.business.MemberCouponService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -37,6 +38,13 @@
    public ApiResponse create(@RequestBody MemberCoupon memberCoupon) {
        return ApiResponse.success(memberCouponService.create(memberCoupon));
    }
    @PreventRepeat
    @ApiOperation("定向发放")
    @PostMapping("/create")
    @RequiresPermissions("business:membercoupon:create")
    public ApiResponse<String> addBatch(@RequestBody MemberCouponAddDTO memberCoupon) {
        return ApiResponse.success(memberCouponService.addBatch(memberCoupon));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
@@ -68,7 +68,7 @@
    @ExcelColumn(name="结束时间",width = 10 ,index = 6,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date endDate;
    @ApiModelProperty(value = "领取方式 0领取 1兑换", example = "1")
    @ApiModelProperty(value = "领取方式 0=首次注册;1=邀请好友;2=定向发放;", example = "1")
    @ExcelColumn(name="领取方式",width = 10,index = 4,valueMapping = "0=首次注册;1=邀请好友;2=定向发放;")
    private Integer getMethod;
@@ -131,6 +131,6 @@
    @ApiModelProperty(value = "优惠金额(元)", example = "1")
    @ExcelColumn(name="优惠金额(元)",width = 10,index = 7)
    @TableField(exist = false)
    private BigDecimal     couponPrice     ;
    private BigDecimal   couponPrice     ;
}
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/MemberCouponAddDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.system.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.model.Coupon;
import com.doumee.dao.business.model.MemberCoupon;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author T14
 */
@Data
@ApiModel("定向发放优惠券参数")
public class MemberCouponAddDTO {
    @ApiModelProperty(value = "添加类型 0指定人员 1指定手机号 2全部会员")
    private Integer addType;
    @ApiModelProperty(value = "用户id")
    private Integer addMemberIds;
    @ApiModelProperty(value = "优惠券信息")
    private List<Coupon> addCouponList;
    @ApiModelProperty(value = "手机号集合(文本域换行)")
    private String addMemberPhones;
    @ApiModelProperty(value = "手机号集合")
    private  List<String> phones;
}
server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
@@ -4,6 +4,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.MemberCoupon;
import com.doumee.dao.system.dto.MemberCouponAddDTO;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.dto.MemberCouponDTO;
import com.doumee.dao.web.request.PayDetailRequest;
@@ -145,4 +146,5 @@
     */
    List<MemberCoupon> getApplyCoupon(List<PayDetailRequest> requestList, Integer memberId);
    String addBatch(MemberCouponAddDTO memberCoupon);
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java
@@ -192,8 +192,9 @@
        Utils.MP.blankToNull(pageWrap );
        queryWrapper.selectAll(Coupon.class);
        queryWrapper.like(StringUtils.isNotBlank(pageWrap. getName()),Coupon::getName,pageWrap.getName());
        queryWrapper.eq(pageWrap.getStatus()!=null,Coupon::getStatus,pageWrap.getStatus());
        queryWrapper.eq(Coupon::getIsdeleted,Constants.ZERO);
        queryWrapper.orderByDesc(Coupon::getCreateDate);
        queryWrapper.orderByDesc(Coupon::getId);
        List<Coupon> result =  couponJoinMapper.selectList( queryWrapper);
        for(Coupon model:result){
            initCouponStatus(model);
@@ -207,9 +208,10 @@
        MPJLambdaWrapper<Coupon> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.selectAll(Coupon.class);
        queryWrapper.select("(select count(id) from member_coupon where ISDELETED=0 and COUPON_ID=t.id) as received");
        queryWrapper.select("(select count(id) from member_coupon where ISDELETED=0 and COUPON_ID=t.id and STATUS=0) as unused");
        queryWrapper.select("(select count(id) from member_coupon where ISDELETED=0 and COUPON_ID=t.id and STATUS=1) as used");
        //已发放数量(不包含定向发放)
        queryWrapper.select("(select count(id) from member_coupon where ISDELETED=0 and COUPON_ID=t.id and GET_METHOD !=2) as received");
//        queryWrapper.select("(select count(id) from member_coupon where ISDELETED=0 and COUPON_ID=t.id and STATUS=0) as unused");
//        queryWrapper.select("(select count(id) from member_coupon where ISDELETED=0 and COUPON_ID=t.id and STATUS=1) as used");
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Coupon::getName,pageWrap.getModel().getName());
        queryWrapper.eq(pageWrap.getModel().getCouponType()!=null,Coupon::getCouponType,pageWrap.getModel().getCouponType());
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -11,6 +11,7 @@
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.dto.MemberCouponAddDTO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.dto.CouponDTO;
import com.doumee.dao.web.dto.MemberCouponDTO;
@@ -29,6 +30,7 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -65,6 +67,146 @@
    @Autowired
    private MemberMapper memberMapper;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public    String addBatch(MemberCouponAddDTO memberCoupon){
        checkAddBatchParamValid(memberCoupon);
        int num = 0;
        List<Coupon> couponList = getCouponListByParam(memberCoupon);
        List<Member> memberList = getMemberListByParam(memberCoupon);
        List<MemberCoupon>  addList = new ArrayList<>();
        int index =1;
        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        Date now = new Date();
        for(Coupon param  : memberCoupon.getAddCouponList()){
            Coupon  coupon = getCouponFromListById(param.getId(),couponList);
            if(coupon == null){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,第【"+index+"】个优惠券查询无效,请刷新页面重新!");
            }
            for(Member member : memberList){
                for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
                    //挨个送
                    addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now));
                }
                num++;
            }
            index++;
        }
        if(addList.size()>0){
            //批量插入数据
            memberCouponMapper.insert(addList);
        }
        return "操作成功,成功人员数量:"+num+",共发放优惠券数量:"+addList.size();
    }
    private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) {
        MemberCoupon insert = new MemberCoupon();
        insert.setCreator(loginUserInfo.getId());
        insert.setCreateDate(now);
        insert.setEditor(loginUserInfo.getId());
        insert.setEditDate(now);
        insert.setIsdeleted(Constants.ZERO);
        insert.setRemark("定向发放");
        insert.setMemberId(member.getId());
        insert.setShopId(coupon.getShopId());
        insert.setType(coupon.getType());
        insert.setLimitPrice(coupon.getLimitPrice());
        insert.setPrice(coupon.getPrice());
        if(Constants.equalsObject(coupon.getUseType(),Constants.ZERO)){
            //如果是固定时段
            insert.setStartDate(coupon.getStartDate());
            insert.setEndDate(coupon.getEndDate());
        }else{
            //固定时长 //推迟天数
            insert.setEndDate(DateUtil.addDaysToDate(now,Constants.formatIntegerNum(coupon.getValidDays())));
            insert.setStartDate(now);
        }
        insert.setGetMethod(Constants.TWO);//定向发放
        insert.setIntegral(coupon.getIntegral());
        insert.setStatus(Constants.ZERO);//未使用
        insert.setInfo(coupon.getInfo());
//        insert.setBackIntegral(coupon.getB);
        insert.setName(coupon.getName());
        insert.setApplyIds(coupon.getApplyIds());
        insert.setApplyType(coupon.getApplyType());
        insert.setCouponId(coupon.getId());
        return  insert;
    }
    private Coupon getCouponFromListById(Integer id, List<Coupon> couponList) {
        for(Coupon c : couponList){
            if(Constants.equalsObject(id,c.getId())){
                return c;
            }
        }
        return null;
    }
    private List<Member> getMemberListByParam(MemberCouponAddDTO memberCoupon) {
        List<Member>  list = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .eq(Member::getIsdeleted,Constants.ZERO)
                .eq(memberCoupon.getAddType() == Constants.ZERO,Member::getId,memberCoupon.getAddMemberIds())
                .in(memberCoupon.getAddType() == Constants.ONE,Member::getPhone,memberCoupon.getPhones()));
        if(list == null || list.size()==0){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,未查询到有效的用户信息!");
        }
        return list;
    }
    private List<Coupon> getCouponListByParam(MemberCouponAddDTO memberCoupon) {
        List<Integer> ids = new ArrayList<>();
        for(Coupon coupon : memberCoupon.getAddCouponList()){
            if(coupon.getId() ==null || Constants.formatLongNum(coupon.getNum())==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
            ids.add(coupon.getId());
        }
        List<Coupon> list =  couponMapper.selectList(new QueryWrapper<Coupon>().lambda()
                .eq(Coupon::getStatus,Constants.ZERO)
                .eq(Coupon::getIsdeleted,Constants.ZERO)
                .in(Coupon::getId,ids));
        if(list == null || list.size()==0){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,未查询到有效优惠券数据,请刷新页面重试!");
        }
        return  list;
    }
    private  void checkAddBatchParamValid(MemberCouponAddDTO memberCoupon) {
        if(memberCoupon.getAddType() == null || memberCoupon.getAddCouponList()==null || memberCoupon.getAddCouponList().size()==0){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ZERO)){
            //指定人员
            if( memberCoupon.getAddMemberIds() ==null){
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
        }else   if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ONE)){
            //指定手机号
            if( StringUtils.isBlank(memberCoupon.getAddMemberPhones())){
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
            String[] ss =memberCoupon.getAddMemberPhones().split("\n");
            if(ss == null ||ss.length==0){
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
            memberCoupon.setPhones(Arrays.asList(ss));
        }else  if(Constants.equalsObject(memberCoupon.getAddType(),Constants.TWO)){
            //全部会员
        }else{
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
    }
    @Override
    public Integer create(MemberCoupon memberCoupon) {
        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
@@ -89,7 +231,6 @@
        if(memberCouponMapper.selectCount(queryWrapper) > Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "已兑换该优惠券,无法兑换!");
        };
        MemberCoupon insert = new MemberCoupon();
        Date now = new Date();
        insert.setCreator(loginUserInfo.getId());