ソースを参照

Merge branch 'mp-server-test' into 'master'

Mp server test

See merge request quanshu/mp-server!1035
Evan 2 年 前
コミット
c637985dc6
26 ファイル変更469 行追加4 行削除
  1. 82 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelApplyController.java
  2. 24 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java
  3. 1 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  4. 23 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  5. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserShareController.java
  6. 19 0
      mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java
  7. 4 0
      mp-admin/src/test/java/com/qs/mp/task/MyTest.java
  8. 4 1
      mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java
  9. 3 1
      mp-common/src/main/java/com/qs/mp/common/enums/CommStatusEnum.java
  10. 3 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java
  11. 127 0
      mp-service/src/main/java/com/qs/mp/admin/domain/ChannelApply.java
  12. 5 0
      mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java
  13. 2 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java
  14. 6 0
      mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponVO.java
  15. 13 0
      mp-service/src/main/java/com/qs/mp/admin/mapper/ChannelApplyMapper.java
  16. 16 0
      mp-service/src/main/java/com/qs/mp/admin/service/IChannelApplyService.java
  17. 8 0
      mp-service/src/main/java/com/qs/mp/admin/service/ICouponService.java
  18. 20 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/ChannelApplyServiceImpl.java
  19. 14 0
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  20. 4 0
      mp-service/src/main/java/com/qs/mp/channel/domain/Channel.java
  21. 3 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/SaleSiteEditParam.java
  22. 6 0
      mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java
  23. 34 0
      mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java
  24. 18 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java
  25. 28 0
      mp-service/src/main/resources/mapper/admin/ChannelApplyMapper.xml
  26. 1 1
      mp-service/src/main/resources/mapper/channel/ChannelMapper.xml

+ 82 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelApplyController.java

@@ -0,0 +1,82 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.ChannelApply;
+import com.qs.mp.admin.domain.Supplier;
+import com.qs.mp.admin.service.IChannelApplyService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author Evan
+ * @date 2023/3/15
+ */
+@Api(tags = "创客申请管理API")
+@RestController
+@RequestMapping("/api/v1/mp/admin/channel/apply")
+public class ChannelApplyController extends BaseApiController {
+
+    @Autowired
+    public IChannelApplyService channelApplyService;
+
+    @ApiOperation("提交申请")
+    @PostMapping("/submit")
+    public AjaxResult submit(@RequestBody ChannelApply channelApply) {
+        if (StringUtils.isEmpty(channelApply.getName())) {
+            return AjaxResult.error("姓名不能为空");
+        }
+        if (StringUtils.isEmpty(channelApply.getPhone())) {
+            return AjaxResult.error("手机号不能为空");
+        }
+        channelApplyService.save(channelApply);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("列表")
+    @PostMapping("/list")
+    @ApiResponses(
+        @ApiResponse(code = 200, message = "创客申请列表", response = ChannelApply.class)
+    )
+    @PreAuthorize("@ss.hasPermi('business:apply:list')")
+    public TableDataInfo list(@RequestBody ChannelApply channelApply) {
+        startPage();
+        List<ChannelApply> list = channelApplyService.list(new LambdaQueryWrapper<ChannelApply>()
+            .like(StringUtils.isNotBlank(channelApply.getName()), ChannelApply::getName, channelApply.getName())
+            .eq(StringUtils.isNotBlank(channelApply.getPhone()), ChannelApply::getPhone, channelApply.getPhone())
+            .eq(channelApply.getStatus() != null, ChannelApply::getStatus, channelApply.getStatus())
+            .orderByAsc(ChannelApply::getStatus)
+            .orderByDesc(ChannelApply::getId));
+        return getDataTable(list);
+    }
+
+    @ApiOperation("更新为已联系")
+    @PostMapping("/update/{id}")
+    @ApiImplicitParams(
+        @ApiImplicitParam(name = "id", value = "创客申请id", required = true, paramType = "path", dataType = "long")
+    )
+    @PreAuthorize("@ss.hasPermi('business:apply:update')")
+    public AjaxResult update(@PathVariable("id") Long id) {
+        channelApplyService.update(new LambdaUpdateWrapper<ChannelApply>()
+            .set(ChannelApply::getStatus, 1)
+            .eq(ChannelApply::getId, id));
+        return AjaxResult.success();
+    }
+}

+ 24 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java

@@ -29,10 +29,14 @@ import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.CouponStatusEnum;
+import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysUserService;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -88,6 +92,9 @@ public class CouponMgrController extends BaseApiController {
     @Autowired
     private MapperFacade mapperFacade;
 
+
+    @Autowired
+    private IUserCouponService userCouponService;
     /**
      * 获取代金券列表信息,支持翻页
      *
@@ -107,6 +114,7 @@ public class CouponMgrController extends BaseApiController {
             .like(null != coupon && StringUtils.isNotBlank(coupon.getTitle()), Coupon::getTitle, coupon.getTitle());
         queryWrapper.lambda().eq(null != coupon && null != coupon.getStatus(), Coupon::getStatus, coupon.getStatus());
         queryWrapper.lambda().eq(null != coupon && null != coupon.getType(), Coupon::getType, coupon.getType());
+        queryWrapper.lambda().eq(null != coupon && null != coupon.getIsNewUserCoupon(), Coupon::getIsNewUserCoupon, coupon.getIsNewUserCoupon());
         queryWrapper.lambda()
             .notIn(null != coupon && !CollectionUtils.isEmpty(coupon.getExcludeCouponIds()), Coupon::getCouponId,
                 coupon.getExcludeCouponIds());
@@ -183,6 +191,12 @@ public class CouponMgrController extends BaseApiController {
                 couponVO.setChannelList(list);
             }
         }
+
+        // 查询已使用数量
+        int count = userCouponService.count(new LambdaQueryWrapper<UserCoupon>()
+            .eq(UserCoupon::getCouponId, couponId)
+            .eq(UserCoupon::getStatus, UserCouponStatusEnum.USED));
+        couponVO.setUsedQty(count);
         return AjaxResult.success(couponVO);
     }
 
@@ -211,6 +225,11 @@ public class CouponMgrController extends BaseApiController {
         if (StringUtils.isNotBlank(couponParam.getCouponId())) {
             return AjaxResult.error("该代金券已存在");
         }
+        if (couponParam.getIsNewUserCoupon() != null && couponParam.getIsNewUserCoupon() == 1) {
+            if (!CouponTypeEnum.TICKET_ORDER.equals(couponParam.getType())) {
+                return AjaxResult.error("该类型优惠券不支持新用户发放");
+            }
+        }
         Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
         // 1、校验名称是否重复(代金券表)
         LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
@@ -262,6 +281,11 @@ public class CouponMgrController extends BaseApiController {
         if (null == couponParam || StringUtils.isBlank(couponParam.getCouponId())) {
             return error(ErrorCodeEnum.ERROR_CODE_1001);
         }
+        if (couponParam.getIsNewUserCoupon() != null && couponParam.getIsNewUserCoupon() == 1) {
+            if (!CouponTypeEnum.TICKET_ORDER.equals(couponParam.getType())) {
+                return AjaxResult.error("该类型优惠券不支持新用户发放");
+            }
+        }
         Coupon coupon = mapperFacade.map(couponParam, Coupon.class);
         // 1、校验修改代金券是否为当前用户的代金券
         Coupon oldCoupon = couponService.getById(coupon.getCouponId());

+ 1 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -347,6 +347,7 @@ public class SaleSiteMgrController extends BaseApiController {
 
         boolean rtn = channelService.update(new LambdaUpdateWrapper<Channel>()
             .set(Channel::getName, saleSiteEditParam.getName())
+            .set(saleSiteEditParam.getCommFlag() != null, Channel::getCommFlag, saleSiteEditParam.getCommFlag())
             .eq(Channel::getChannelId, saleSiteEditParam.getChannelId()));
 
         if (!rtn) {

+ 23 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java

@@ -22,6 +22,7 @@ import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.domain.vo.AliPhoneDecryptVO;
 import com.qs.mp.common.enums.AppSourceEnum;
+import com.qs.mp.common.enums.AsyncTaskTypeEnum;
 import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.enums.WxActTypeEnum;
 import com.qs.mp.common.jsms.JSMSUtils;
@@ -31,9 +32,11 @@ import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.common.utils.UUIDUtils;
 import com.qs.mp.common.utils.http.HttpUtils;
 import com.qs.mp.core.domain.LoginUser;
+import com.qs.mp.framework.domain.AsyncTask;
 import com.qs.mp.framework.domain.WxAccount;
 import com.qs.mp.framework.security.handle.HostHolder;
 import com.qs.mp.framework.service.IAppTokenService;
+import com.qs.mp.framework.service.IAsyncTaskService;
 import com.qs.mp.framework.service.IWxAccountService;
 import com.qs.mp.framework.web.service.SysLoginService;
 import com.qs.mp.system.domain.SysUser;
@@ -129,6 +132,9 @@ public class UserController extends BaseApiController {
     @Autowired
     private SysLoginService sysLoginService;
 
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
+
     private static final String CBC_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
     private static final String KEY_ALGORITHM = "AES";
     private static final String UTF8 = "UTF-8";
@@ -208,6 +214,14 @@ public class UserController extends BaseApiController {
             sysUser.setNickName(mobile);
             sysUser.setPhonenumber(mobile);
             sysUserService.registerUser(sysUser);
+
+            // 插入新用户发券任务
+            AsyncTask asyncTask = new AsyncTask();
+            asyncTask.setBizId(String.valueOf(sysUser.getUserId()));
+            asyncTask.setType(AsyncTaskTypeEnum.NEW_USER_SEND_COUPON.getValue());
+            if (!asyncTaskService.save(asyncTask)) {
+                logger.error("插入新用户发券任务失败,userId:{}", sysUser.getUserId());
+            }
         }
         Map<String, String> result = sysLoginService.wxAuthLogin(mobile, wxLoginParams.getIdentity());
         for (String key : result.keySet()) {
@@ -448,6 +462,15 @@ public class UserController extends BaseApiController {
             sysUser.setNickName(phoneNumber);
             sysUser.setPhonenumber(phoneNumber);
             sysUserService.registerUser(sysUser);
+
+            // 插入新用户发券任务
+            AsyncTask asyncTask = new AsyncTask();
+            asyncTask.setBizId(String.valueOf(sysUser.getUserId()));
+            asyncTask.setType(AsyncTaskTypeEnum.NEW_USER_SEND_COUPON.getValue());
+            if (!asyncTaskService.save(asyncTask)) {
+                logger.error("插入新用户发券任务失败,userId:{}", sysUser.getUserId());
+            }
+
         }
         Map<String, String> result = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
         for (String key : result.keySet()) {

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserShareController.java

@@ -53,7 +53,7 @@ public class UserShareController extends BaseApiController {
 			String rst = wxUrlLinkService.generateUnlimitCode("", userId + "&" + type, appId);
 			return new AjaxResult(Type.SUCCESS, "", rst);
 		}
-		String rst = wxUrlLinkService.generateUnlimitCode("pages/ticketBox/detail", boxId + "&" + userId + "&" + type, appId);
+		String rst = wxUrlLinkService.generateUnlimitCode("pages/index/index", boxId + "&" + userId + "&" + type, appId);
 		return new AjaxResult(Type.SUCCESS, "", rst);
 	}
 }

+ 19 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java

@@ -4,8 +4,11 @@ package com.qs.mp.web.controller.system;
 import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.domain.model.LoginBody;
+import com.qs.mp.common.enums.AsyncTaskTypeEnum;
 import com.qs.mp.common.enums.UserIdentityEnum;
+import com.qs.mp.framework.domain.AsyncTask;
 import com.qs.mp.framework.security.handle.HostHolder;
+import com.qs.mp.framework.service.IAsyncTaskService;
 import com.qs.mp.framework.web.service.SysLoginService;
 import com.qs.mp.framework.web.service.SysPermissionService;
 import com.qs.mp.sms.domain.SmsCode;
@@ -20,6 +23,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -34,6 +39,9 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 public class SysLoginController
 {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
     @Autowired
     private SysLoginService loginService;
 
@@ -49,6 +57,9 @@ public class SysLoginController
     @Autowired
     private HostHolder hostHolder;
 
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
+
     /**
      * 登录方法
      *
@@ -103,6 +114,14 @@ public class SysLoginController
             sysUser.setNickName(smsCode.getMobile());
             sysUser.setPhonenumber(smsCode.getMobile());
             sysUserService.registerUser(sysUser);
+
+            // 插入新用户发券任务
+            AsyncTask asyncTask = new AsyncTask();
+            asyncTask.setBizId(String.valueOf(sysUser.getUserId()));
+            asyncTask.setType(AsyncTaskTypeEnum.NEW_USER_SEND_COUPON.getValue());
+            if (!asyncTaskService.save(asyncTask)) {
+                logger.error("插入新用户发券任务失败,userId:{}", sysUser.getUserId());
+            }
         }
 
         AjaxResult ajax = AjaxResult.success();

+ 4 - 0
mp-admin/src/test/java/com/qs/mp/task/MyTest.java

@@ -42,6 +42,8 @@ import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
@@ -55,6 +57,8 @@ import java.util.*;
  */
 @SpringBootTest
 public class MyTest {
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
 
     @Autowired
     private IWalletService walletService;

+ 4 - 1
mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java

@@ -14,7 +14,10 @@ public enum AsyncTaskTypeEnum implements IEnum<Integer> {
     CHANNEL_CONFIRM_RECEIPT(1,"经销商确认收货任务"),
     TICKET_PAY(2,"盲票付款任务"),
     TICKET_GENERATE(3, "盲票生成任务"),
-    CARD_ORDER_DELIVER(4, "卡密订单自动发货");
+    CARD_ORDER_DELIVER(4, "卡密订单自动发货"),
+
+    NEW_USER_SEND_COUPON(5, "新用户发券"),
+    ;
 
     private Integer value;
     private String desc;

+ 3 - 1
mp-common/src/main/java/com/qs/mp/common/enums/CommStatusEnum.java

@@ -14,7 +14,9 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 public enum CommStatusEnum implements IEnum<Integer> {
   NO(0, "未结佣"),
   YES(1, "已结佣"),
-  DOING(2, "结佣中");
+  DOING(2, "结佣中"),
+
+  NO_COMM(3, "不分佣");
 
   private final int value;
   private final String desc;

+ 3 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java

@@ -81,6 +81,9 @@ public class AsyncConsumeTask {
         } else if (AsyncTaskTypeEnum.CARD_ORDER_DELIVER.getValue().equals(asyncTask.getType())) {
             // 卡密订单发货任务
             asyncTaskService.cardOrderDeliver(asyncTask);
+        } else if (AsyncTaskTypeEnum.NEW_USER_SEND_COUPON.getValue().equals(asyncTask.getType())) {
+            // 新人发优惠券任务
+            asyncTaskService.sendNewUserCoupon(asyncTask);
         } else {
             // 都没匹配到则忽略不处理任务
             return;

+ 127 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/ChannelApply.java

@@ -0,0 +1,127 @@
+package com.qs.mp.admin.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 创客申请表实体类
+ * @auther quanshu
+ * @create 2023-03-15 14:35:51
+ */
+@TableName("mp_channel_apply")
+@Data
+@ApiModel("创客申请表")
+public class ChannelApply implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Id
+     */
+    @ApiModelProperty("id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    @TableField("name")
+    private String name;
+
+    /**
+     * 手机号
+     */
+    @ApiModelProperty("手机号")
+    @TableField("phone")
+    private String phone;
+
+    /**
+     * 省份
+     */
+    @ApiModelProperty("省份")
+    @TableField("province")
+    private String province;
+
+    /**
+     * 省份ID
+     */
+    @ApiModelProperty("省id")
+    @TableField("province_id")
+    private Long provinceId;
+
+    /**
+     * 市
+     */
+    @ApiModelProperty("市")
+    @TableField("city")
+    private String city;
+
+    /**
+     * 市ID
+     */
+    @ApiModelProperty("市id")
+    @TableField("city_id")
+    private Long cityId;
+
+    /**
+     * 区
+     */
+    @ApiModelProperty("区")
+    @TableField("area")
+    private String area;
+
+    /**
+     * 区ID
+     */
+    @ApiModelProperty("区id")
+    @TableField("area_id")
+    private Long areaId;
+
+    /**
+     * 状态:0未联系,1已联系
+     */
+    @ApiModelProperty("状态:0未联系,1已联系")
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 行业资源说明
+     */
+    @ApiModelProperty("行业资源说明")
+    @TableField("resource")
+    private String resource;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 5 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java

@@ -54,6 +54,11 @@ public class Coupon implements Serializable {
     @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
     private CouponTypeEnum type;
 
+
+    @ApiModelProperty("是否新用户注册发放:0否,1是")
+    @TableField("is_new_user_coupon")
+    private Integer isNewUserCoupon;
+
     /**
      * 图片
      */

+ 2 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java

@@ -118,5 +118,7 @@ public class CouponParam {
   @ApiModelProperty("排除的优惠券id列表")
   private List<Long> excludeCouponIds;
 
+  @ApiModelProperty("是否新用户注册发放:0否,1是")
+  private Integer isNewUserCoupon;
 
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/CouponVO.java

@@ -62,6 +62,9 @@ public class CouponVO {
     @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
     private CouponTypeEnum type;
 
+    @ApiModelProperty("是否新用户注册发放:0否,1是")
+    private Integer isNewUserCoupon;
+
     /**
      * 图片
      */
@@ -157,6 +160,9 @@ public class CouponVO {
     @ApiModelProperty("已发放量")
     private Integer distributeQty;
 
+    @ApiModelProperty("已使用数量")
+    private Integer usedQty;
+
     /**
      * 创建时间
      */

+ 13 - 0
mp-service/src/main/java/com/qs/mp/admin/mapper/ChannelApplyMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.admin.mapper;
+
+import com.qs.mp.admin.domain.ChannelApply;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-03-15 14:35:51
+ * @describe 创客申请表mapper类
+ */
+public interface ChannelApplyMapper extends BaseMapper<ChannelApply> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/admin/service/IChannelApplyService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.admin.service;
+
+import com.qs.mp.admin.domain.ChannelApply;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 创客申请表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-15
+ */
+public interface IChannelApplyService extends IService<ChannelApply> {
+
+}

+ 8 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ICouponService.java

@@ -48,4 +48,12 @@ public interface ICouponService extends IService<Coupon> {
 	 * @param couponId
 	 */
     void distributeByMarketing(Long userId, String couponId);
+
+
+	/**
+	 * 新用户发券
+	 * @param userId
+	 * @param couponId
+	 */
+	void distributeByNewUser(Long userId, Long couponId);
 }

+ 20 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/ChannelApplyServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.admin.service.impl;
+
+import com.qs.mp.admin.domain.ChannelApply;
+import com.qs.mp.admin.mapper.ChannelApplyMapper;
+import com.qs.mp.admin.service.IChannelApplyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 创客申请表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-15
+ */
+@Service
+public class ChannelApplyServiceImpl extends ServiceImpl<ChannelApplyMapper, ChannelApply> implements IChannelApplyService {
+
+}

+ 14 - 0
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java

@@ -95,6 +95,20 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
         Assert.isTrue(rtn, "发放优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void distributeByNewUser(Long userId, Long couponId) {
+        Coupon coupon = getById(couponId);
+        UserCoupon userCoupon = getUserCoupon(userId, coupon);
+        userCoupon.setUseAreaDesc(coupon.getUseArea().getDesc());
+        userCouponService.save(userCoupon);
+        boolean rtn = update(new LambdaUpdateWrapper<Coupon>().set(Coupon::getDistributeQty, coupon.getDistributeQty() + 1)
+            .eq(Coupon::getCouponId, coupon.getCouponId()).eq(Coupon::getDistributeQty, coupon.getDistributeQty()));
+        if (!rtn) {
+            logger.error("新用户优惠券发放失败.couponId:{}", coupon.getCouponId());
+            throw new ServiceException("新用户优惠券发放失败。couponId:" + coupon.getCouponId());
+        }
+    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)

+ 4 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/Channel.java

@@ -229,6 +229,10 @@ public class Channel implements Serializable {
   @ApiModelProperty("状态,启用.停用")
   private ChannelStatusEnum status;
 
+  @TableField("comm_flag")
+  @ApiModelProperty("分佣标识:0默认,1不分佣")
+  private Integer commFlag;
+
   /**
    * 创建时间
    */

+ 3 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/SaleSiteEditParam.java

@@ -24,4 +24,7 @@ public class SaleSiteEditParam {
     @ApiModelProperty("门店名称")
     private String name;
 
+    @ApiModelProperty("分佣标识:0默认,1不分佣")
+    private Integer commFlag;
+
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java

@@ -45,4 +45,10 @@ public interface IAsyncTaskService extends IService<AsyncTask> {
      * @param asyncTask
      */
     void cardOrderDeliver(AsyncTask asyncTask);
+
+    /**
+     * 新用户发优惠券
+     * @param asyncTask
+     */
+    void sendNewUserCoupon(AsyncTask asyncTask);
 }

+ 34 - 0
mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.Goods;
 import com.qs.mp.admin.domain.GoodsCard;
 import com.qs.mp.admin.domain.Ticket;
@@ -29,6 +30,8 @@ import com.qs.mp.framework.domain.AsyncTask;
 import com.qs.mp.framework.mapper.AsyncTaskMapper;
 import com.qs.mp.framework.service.IAsyncTaskService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.user.domain.UserDeliverOrder;
 import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.user.domain.UserDeliverOrderItemCard;
@@ -118,6 +121,9 @@ public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask
     @Autowired
     private IUserPrizeStorageService userPrizeStorageService;
 
+    @Autowired
+    private ISysUserService sysUserService;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -282,4 +288,32 @@ public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask
             throw new ServiceException("卡密商品发货更新订单明细发货时间失败");
         }
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void sendNewUserCoupon(AsyncTask asyncTask) {
+        logger.info("收到发放新人优惠券任务,bizId={}", asyncTask.getBizId());
+
+        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(asyncTask.getBizId()));
+        if (sysUser == null) {
+            logger.error("收到发放新人优惠券任务,未查到用户信息,bizId={}", asyncTask.getBizId());
+            return;
+        }
+        // 捞取已上架的新人发放优惠券
+        List<Coupon> couponList = couponService.list(new LambdaQueryWrapper<Coupon>()
+            .eq(Coupon::getType, CouponTypeEnum.TICKET_ORDER)
+            .eq(Coupon::getStatus, CouponStatusEnum.PUT_ON)
+            .eq(Coupon::getIsNewUserCoupon, 1));
+        if (CollectionUtils.isEmpty(couponList)) {
+            logger.info("未查到设置的新人优惠券,bizId={}", asyncTask.getBizId());
+            return;
+        }
+        for (Coupon coupon : couponList) {
+            couponService.distributeByNewUser(sysUser.getUserId(), coupon.getCouponId());
+        }
+        logger.info("发放新人优惠券任务结束,bizId={}", asyncTask.getBizId());
+
+    }
+
+
 }

+ 18 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -591,6 +591,24 @@ public class UserTicketOrderServiceImpl extends
             BeanUtils.copyProperties(ticketOrder, channelCommParam);
             Assert.isTrue(channelCommParam.getCommStatus() != CommStatusEnum.YES,
                 "结佣处理,结佣状态异常,不是结佣中或未结佣。orderId=" + orderId);
+
+            // 判断线上票判断渠道商是否打标,打标则不分佣
+            if (TicketTypeEnum.ONLINE.equals(ticketOrder.getResource())) {
+                if (ticketOrder.getChannelId() != null) {
+                    Channel channel = channelService.getById(ticketOrder.getChannelId());
+                    if (channel.getCommFlag() == 1) {
+                        // 不分佣,更新订单状态
+                        boolean rst = update(
+                            new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
+                                    CommStatusEnum.NO_COMM)
+                                .eq(UserTicketOrder::getOrderId, orderId)
+                                .in(UserTicketOrder::getCommStatus, CommStatusEnum.DOING, CommStatusEnum.NO));
+                        Assert.isTrue(rst, "定制渠道不结佣,更新订单状态失败。orderId:" + orderId);
+                        return true;
+                    }
+                }
+            }
+
         } else {
             ChannelOrder channelOrder = channelOrderService.getById(orderId);
             ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(

+ 28 - 0
mp-service/src/main/resources/mapper/admin/ChannelApplyMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.admin.mapper.ChannelApplyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.admin.domain.ChannelApply">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="phone" property="phone" />
+        <result column="province" property="province" />
+        <result column="province_id" property="provinceId" />
+        <result column="city" property="city" />
+        <result column="city_id" property="cityId" />
+        <result column="area" property="area" />
+        <result column="area_id" property="areaId" />
+        <result column="status" property="status" />
+        <result column="resource" property="resource" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, phone, province, province_id, city, city_id, area, area_id, status, resource, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 1 - 1
mp-service/src/main/resources/mapper/channel/ChannelMapper.xml

@@ -84,7 +84,7 @@
 
      <!-- 查询经销商列表信息 -->
     <select id="selectSaleSiteList" resultType="com.qs.mp.channel.domain.vo.ChannelVO">
-      select t1.channel_id as channelId, t1.channel_no, t1.name, t1.parent_id, t1.level, t1.site_type, t1.site_name, t1.comm_rate as commRate, t1.province, t1.province_id, t1.city, t1.city_id, t1.area, t1.area_id, t1.address, t1.contact, t1.mobile, t1.user_id, t1.certify_status, t1.verify_status, t1.status, t1.created_time, t1.updated_time ,
+      select t1.channel_id as channelId, t1.channel_no, t1.name, t1.parent_id, t1.level, t1.site_type, t1.site_name, t1.comm_rate as commRate, t1.province, t1.province_id, t1.city, t1.city_id, t1.area, t1.area_id, t1.address, t1.contact, t1.mobile, t1.user_id, t1.certify_status, t1.verify_status,t1.comm_flag, t1.status, t1.created_time, t1.updated_time ,
              t2.off_line_qty_cnt, t2.off_line_sale_cnt, t4.sale_qty-t2.off_line_sale_cnt as on_line_sale_cnt, t3.user_cnt
       from mp_channel t1
              left join (