Sfoglia il codice sorgente

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

Mp server test

See merge request quanshu/mp-server!246
zhong chunping 3 anni fa
parent
commit
882a16ce40
57 ha cambiato i file con 1369 aggiunte e 381 eliminazioni
  1. 31 18
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java
  2. 33 9
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  3. 106 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelWithdrawMgrController.java
  4. 17 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java
  5. 15 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java
  6. 26 15
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java
  7. 21 15
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  8. 32 5
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java
  9. 165 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelCouponVerifyController.java
  10. 5 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelInviteController.java
  11. 38 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/DeliveryCompanyController.java
  12. 9 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java
  13. 1 1
      mp-admin/src/main/resources/application-test.yml
  14. 4 2
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelMoneyEnum.java
  15. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java
  16. 40 0
      mp-common/src/main/java/com/qs/mp/common/enums/CouponSettleStatusEnum.java
  17. 2 1
      mp-common/src/main/java/com/qs/mp/common/enums/DeliverOrderStatusEnum.java
  18. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/ErrorCodeEnum.java
  19. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/PrizeStorageInTypeEnum.java
  20. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/TicketPrizeTypeEnum.java
  21. 3 0
      mp-common/src/main/java/com/qs/mp/common/enums/UserCouponStatusEnum.java
  22. 3 6
      mp-common/src/main/java/com/qs/mp/common/jsms/JSMSUtils.java
  23. 9 9
      mp-common/src/main/java/com/qs/mp/common/utils/WebhookService.java
  24. 2 1
      mp-quartz/src/main/java/com/qs/mp/quartz/task/TicketBoxTask.java
  25. 49 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderShipParam.java
  26. 0 11
      mp-service/src/main/java/com/qs/mp/admin/domain/param/CouponParam.java
  27. 48 0
      mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderShipParam.java
  28. 7 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  29. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java
  30. 112 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCouponVerifyLog.java
  31. 6 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelWithdraw.java
  32. 7 3
      mp-service/src/main/java/com/qs/mp/channel/domain/param/VerifyParam.java
  33. 27 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelWithdrawVO.java
  34. 13 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelCouponVerifyLogMapper.java
  35. 8 1
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelWithdrawMapper.java
  36. 23 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelCouponVerifyLogService.java
  37. 12 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java
  38. 22 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelWithdrawService.java
  39. 98 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelCouponVerifyLogServiceImpl.java
  40. 3 2
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelMoneyLogServiceImpl.java
  41. 85 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  42. 129 124
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java
  43. 56 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java
  44. 2 2
      mp-service/src/main/java/com/qs/mp/sms/service/impl/SmsLogServiceImpl.java
  45. 0 65
      mp-service/src/main/java/com/qs/mp/user/domain/UserCouponVerifyLog.java
  46. 0 13
      mp-service/src/main/java/com/qs/mp/user/mapper/UserCouponVerifyLogMapper.java
  47. 10 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java
  48. 0 16
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponVerifyLogService.java
  49. 10 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java
  50. 2 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCoinServiceImpl.java
  51. 7 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  52. 0 20
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponVerifyLogServiceImpl.java
  53. 26 1
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java
  54. 28 0
      mp-service/src/main/resources/mapper/channel/ChannelCouponVerifyLogMapper.xml
  55. 3 2
      mp-service/src/main/resources/mapper/channel/ChannelMapper.xml
  56. 9 1
      mp-service/src/main/resources/mapper/channel/ChannelWithdrawMapper.xml
  57. 0 21
      mp-service/src/main/resources/mapper/user/UserCouponVerifyLogMapper.xml

+ 31 - 18
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java

@@ -11,9 +11,11 @@ import com.qs.mp.channel.domain.vo.ChannelVO;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.constant.UserConstants;
 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.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.system.domain.SysUser;
@@ -31,6 +33,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -51,16 +54,16 @@ public class ChannelMgrController extends BaseApiController {
 
 	@Autowired
 	private IChannelService channelService;
-	
+
 	@Autowired
 	private IChannelUserRelService channelUserRelService;
-	
+
 	@Autowired
 	private IChannelOrderService channelOrderService;
-	
+
 	@Autowired
 	private ISysUserService userService;
-	
+
 	@Autowired
 	private MapperFacade mapperFacade;
 
@@ -70,6 +73,7 @@ public class ChannelMgrController extends BaseApiController {
 	 * @return
 	 */
 	@PostMapping("/tree")
+	@PreAuthorize("@ss.hasPermi('business:channel:list')")
 	public AjaxResult treeChannel(@RequestBody Channel channel) {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		QueryWrapper<Channel> queryWrapper = new QueryWrapper<>();
@@ -97,14 +101,15 @@ public class ChannelMgrController extends BaseApiController {
 		}
 		return AjaxResult.success(list);
 	}
-	
-	
+
+
 	/**
 	 * 查询所有渠道列表
 	 *
 	 * @return
 	 */
 	@PostMapping("/listAll")
+	@PreAuthorize("@ss.hasPermi('business:channel:list')")
 	public AjaxResult listAllChannel() {
 		List<Channel> list = new ArrayList<Channel>();
 		LambdaQueryWrapper<Channel> queryWrapper = new LambdaQueryWrapper<Channel>();
@@ -113,14 +118,15 @@ public class ChannelMgrController extends BaseApiController {
 		list = channelService.list(queryWrapper);
 		return AjaxResult.success(list);
 	}
-	
-	
+
+
 	/**
 	 * 获取我的下级渠道列表信息,支持翻页
 	 *
 	 * @return
 	 */
 	@PostMapping("/list")
+	@PreAuthorize("@ss.hasPermi('business:channel:list')")
 	public TableDataInfo listChannel(@RequestBody Channel channel) {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		startPage();
@@ -151,15 +157,17 @@ public class ChannelMgrController extends BaseApiController {
 		}
 		return getDataTable(list);
 	}
-	
-	
+
+
 	/**
 	 * 渠道管理新增一级渠道信息
 	 * @param
 	 * @return
 	 */
+	@Log(title = "新增渠道", businessType = BusinessType.INSERT)
 	@ApiOperation(value = "新增子渠道信息", notes = "渠道端新增子渠道")
 	@PostMapping("/create")
+	@PreAuthorize("@ss.hasPermi('business:channel:add')")
 	public AjaxResult channelCreate(@Validated @RequestBody ChannelParam channelParam) {
 		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
 			return AjaxResult.error("该渠道已存在");
@@ -182,7 +190,7 @@ public class ChannelMgrController extends BaseApiController {
 //		if(null != channel.getParentId() && channel.getParentId() != 0) {
 //			Channel parentChannel = channelService.getById(channel.getParentId());
 //			if(null != parentChannel) {
-//				 if(null != parentChannel.getCommRate() 
+//				 if(null != parentChannel.getCommRate()
 //						 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
 //					 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
 //				 }
@@ -204,7 +212,7 @@ public class ChannelMgrController extends BaseApiController {
 		} catch (Exception e) {
 			return AjaxResult.error("渠道'" + channel.getName() + "'新增失败" + e.getMessage());
 		}
-		
+
 		return AjaxResult.success("渠道'" + channel.getName() + "'新增成功");
 	}
 
@@ -213,8 +221,10 @@ public class ChannelMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "修改渠道", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "编辑子渠道信息", notes = "渠道端编辑子渠道")
 	@PostMapping("/update")
+	@PreAuthorize("@ss.hasPermi('business:channel:edit')")
 	public AjaxResult channelUpdate(@Validated @RequestBody ChannelParam channelParam) {
 		if (null == channelParam || null == channelParam.getChannelId()) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
@@ -250,7 +260,7 @@ public class ChannelMgrController extends BaseApiController {
 		// 3.校验佣金比例,不能高于其父渠道的佣金比例,不能低于其子渠道的最大佣金比例
 //		Channel parentChannel = channelService.getById(oldChannel.getParentId());
 //		if(null != parentChannel) {
-//			 if(null != parentChannel.getCommRate() 
+//			 if(null != parentChannel.getCommRate()
 //					 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
 //				 return AjaxResult.error("佣金比例不能高于父渠道的佣金比例");
 //			 }
@@ -277,15 +287,17 @@ public class ChannelMgrController extends BaseApiController {
 		}
 		return AjaxResult.success("渠道'" + channel.getName() + "'编辑成功");
 	}
-	
-	
+
+
 	/**
 	 * 停用、启用渠道
 	 * @param
 	 * @return
 	 */
+	@Log(title = "启停渠道", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "停用、启用渠道信息", notes = "渠道管理编辑子渠道")
 	@PostMapping("/status")
+	@PreAuthorize("@ss.hasPermi('business:channel:edit')")
 	public AjaxResult channelStatus(@RequestBody JSONObject jsonObject) {
 		String channelId = jsonObject.containsKey("channelId")?jsonObject.get("channelId").toString():"";
 		String status = jsonObject.containsKey("status")?jsonObject.get("status").toString():"";
@@ -300,8 +312,8 @@ public class ChannelMgrController extends BaseApiController {
 		}
 		return AjaxResult.success("操作成功");
 	}
-	
-	
+
+
 	/**
 	 * 查询渠道详情
 	 * @param
@@ -309,6 +321,7 @@ public class ChannelMgrController extends BaseApiController {
 	 */
 	@ApiOperation(value = "查询渠道详情信息", notes = "渠道管理编辑子渠道查询渠道详情")
 	@PostMapping("/detail")
+	@PreAuthorize("@ss.hasPermi('business:channel:query')")
 	public AjaxResult getChannelDetail(@RequestBody JSONObject jsonObject) {
 		String channelId = (null != jsonObject && jsonObject.containsKey("channelId"))?jsonObject.getString("channelId"):"";
 		if (StringUtils.isBlank(channelId)) {
@@ -333,5 +346,5 @@ public class ChannelMgrController extends BaseApiController {
 	    channelVO.setOperData(channelOperDataVO);
 		return AjaxResult.success(channelVO);
 	}
-	
+
 }

+ 33 - 9
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -2,24 +2,35 @@ package com.qs.mp.web.controller.api.admin;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.domain.param.ChannelOrderShipParam;
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
 import java.util.List;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -27,7 +38,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 @RestController
-@RequestMapping("/api/v1/admin/channel/order")
+@RequestMapping("/api/v1/mp/admin/channel/order")
 @Api(tags = "渠道订单管理接口")
 @AllArgsConstructor
 public class ChannelOrderMgrController extends BaseApiController {
@@ -38,6 +49,9 @@ public class ChannelOrderMgrController extends BaseApiController {
   @Autowired
   private IChannelOrderItemService channelOrderItemService;
 
+  @Autowired
+  private IChannelOrderDetailService channelOrderDetailService;
+
   @Autowired
   private MapperFacade mapperFacade;
 
@@ -49,6 +63,7 @@ public class ChannelOrderMgrController extends BaseApiController {
    */
   @PostMapping("/list")
   @ApiOperation(value = "订单列表" , notes = "获取所有订单信息")
+  @PreAuthorize("@ss.hasPermi('order:channel:list')")
   public TableDataInfo list(@RequestBody JSONObject param) {
    // Long channelId = SecurityUtils.getLoginUser().getChannelId();
     Integer status = param.getInteger("status");
@@ -73,13 +88,14 @@ public class ChannelOrderMgrController extends BaseApiController {
    */
   @PostMapping("/detail")
   @ApiOperation(value = "订单详情" , notes = "在订单列表页面查看详情")
+  @PreAuthorize("@ss.hasPermi('order:channel:query')")
   public AjaxResult query(@RequestBody ChannelOrder order) {
     if(null == order || StringUtils.isBlank(order.getOrderId())) {
     	return error(ErrorCodeEnum.ERROR_CODE_1001);
-    }    
+    }
     LambdaQueryWrapper<ChannelOrder> queryWrapper = new LambdaQueryWrapper<ChannelOrder>();
     queryWrapper.eq(ChannelOrder::getOrderId, order.getOrderId());
-    
+
     ChannelOrder channelOrder = channelOrderService.getOne(queryWrapper);
     ChannelOrderVO channelOrderVO = mapperFacade.map(channelOrder, ChannelOrderVO.class);
     channelOrderVO.setItems(channelOrderItemService.list(new LambdaQueryWrapper<ChannelOrderItem>()
@@ -87,17 +103,25 @@ public class ChannelOrderMgrController extends BaseApiController {
     return AjaxResult.success(channelOrderVO);
   }
 
-  
+
 
   /**
    * 订单发货
    */
+  @Log(title = "经销商订单发货", businessType = BusinessType.UPDATE)
   @PostMapping("/ship")
   @ApiOperation(value = "订单发货" , notes = "在订单发货页面提交")
-  public AjaxResult ship(@RequestBody ChannelOrder order) {
-
-    return AjaxResult.success();
-  }
-
+  @PreAuthorize("@ss.hasPermi('order:channel:ship')")
+  public AjaxResult ship(@RequestBody ChannelOrderShipParam shipParam) {
+		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(null != shipParam && null != shipParam.getPkgIds()
+				&& shipParam.getPkgIds().size() > 0) {
+			boolean rtn = channelOrderService.channelOrderShip(shipParam.getOrderId(), shipParam.getPkgIds());
+			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
+		}
+		return AjaxResult.error("发货失败");
+	}
 
 }

+ 106 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelWithdrawMgrController.java

@@ -0,0 +1,106 @@
+package com.qs.mp.web.controller.api.admin;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderItem;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.channel.domain.vo.ChannelWithdrawVO;
+import com.qs.mp.channel.service.IChannelOrderItemService;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.annotation.Log;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.BusinessType;
+import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.Date;
+import java.util.List;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+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;
+
+
+@RestController
+@RequestMapping("/api/v1/mp/admin/channel/withdraw")
+@Api(tags = "渠道提现申请管理接口")
+@AllArgsConstructor
+public class ChannelWithdrawMgrController extends BaseApiController {
+
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 提现申请列表
+   */
+  @PostMapping("/list")
+  @ApiOperation(value = "提现申请列表" , notes = "获取所有提现信息")
+  @PreAuthorize("@ss.hasPermi('finance:withdraw:list')")
+  public TableDataInfo list(@RequestBody JSONObject param) {
+    Integer status = param.getInteger("status");
+    String name = param.getString("name");
+    Date startDay = param.getDate("startDay");
+    Date endDay = param.getDate("endDay");
+    startPage();
+    List<ChannelWithdrawVO> withdrawList = channelWithdrawService.listWithdrawVO(new QueryWrapper<ChannelWithdraw>()
+        .eq(null != status && status != 0, "t1.status", status)
+        .eq(StringUtils.isNotBlank(name), "t2.name", name)
+        .ge(null != startDay, "t1.created_time", startDay)
+        .lt(null != endDay, "t1.created_time", DateUtils.addDays(endDay, 1))
+        .orderByDesc("t1.created_time"));
+    return getDataTable(withdrawList);
+  }
+
+  /**
+   * 提现申请详情
+   */
+  @PostMapping("/detail")
+  @PreAuthorize("@ss.hasPermi('finance:withdraw:query')")
+  @ApiOperation(value = "申请详情" , notes = "在提现列表页面查看详情")
+  public AjaxResult query(@RequestBody JSONObject param) {
+    Long id = param.getLong("id");
+    if (null == id || 0 == id) {
+      return error(ErrorCodeEnum.ERROR_CODE_1001);
+    }
+    List<ChannelWithdrawVO> withdrawList = channelWithdrawService.listWithdrawVO(new QueryWrapper<ChannelWithdraw>()
+        .eq("t1.id", id));
+    return AjaxResult.success(withdrawList.get(0));
+  }
+
+  /**
+   * 提现申请审核结果
+   */
+  @Log(title = "提现申请审核", businessType = BusinessType.UPDATE)
+  @PostMapping("/verify")
+  @ApiOperation(value = "申请审核" , notes = "在提现详情页面审核")
+  @PreAuthorize("@ss.hasPermi('finance:withdraw:verify')")
+  public AjaxResult verify(@RequestBody ChannelWithdraw withdraw) {
+    if (null == withdraw.getId() || null == withdraw.getStatus()) {
+      return error(ErrorCodeEnum.ERROR_CODE_1001);
+    }
+    ChannelWithdraw channelWithdraw = channelWithdrawService.getById(withdraw.getId());
+    if (channelWithdraw.getStatus() != ChannelWithdrawStatusEnum.WITHDRAWING) {
+      return error("提现申请状态异常,不是提现中");
+    }
+    channelWithdrawService.verify(channelWithdraw, withdraw.getStatus(), withdraw.getVerifyContent());
+    return AjaxResult.success("操作成功");
+  }
+
+}

+ 17 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/CouponMgrController.java

@@ -20,9 +20,11 @@ import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.constant.UserConstants;
 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.CouponUseAreaEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
@@ -44,6 +46,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -89,6 +92,7 @@ public class CouponMgrController extends BaseApiController {
 	 * @return
 	 */
 	@PostMapping("/list")
+	@PreAuthorize("@ss.hasPermi('business:coupon:list')")
 	public TableDataInfo listCoupon(@RequestBody Coupon coupon) {
 		List<Coupon> list = new ArrayList<Coupon>();
 		startPage();
@@ -111,6 +115,7 @@ public class CouponMgrController extends BaseApiController {
 	 * @return
 	 */
 	@PostMapping(value = "/detail")
+	@PreAuthorize("@ss.hasPermi('business:coupon:query')")
 	public AjaxResult getCouponDetail(@RequestBody JSONObject jsonObject) {
 		String couponId = jsonObject.getString("couponId");
 		if (StringUtils.isBlank(couponId)){
@@ -160,12 +165,14 @@ public class CouponMgrController extends BaseApiController {
 	}
 
 	/**
-	 * 新增代金券信息
+	 * 新增优惠券信息
 	 * @param
 	 * @return
 	 */
-	@ApiOperation(value = "新增代金券信息", notes = "代金券端新增代金券")
+	@Log(title = "新增优惠券", businessType = BusinessType.INSERT)
+	@ApiOperation(value = "新增优惠券信息", notes = "新增优惠券")
 	@PostMapping("/create")
+	@PreAuthorize("@ss.hasPermi('business:coupon:add')")
 	public AjaxResult couponCreate(@Validated @RequestBody CouponParam couponParam) {
 		if (StringUtils.isNotBlank(couponParam.getCouponId())) {
 			return AjaxResult.error("该代金券已存在");
@@ -212,8 +219,10 @@ public class CouponMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "修改优惠券", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "编辑代金券信息", notes = "代金券端编辑代金券")
 	@PostMapping("/update")
+	@PreAuthorize("@ss.hasPermi('business:coupon:edit')")
 	public AjaxResult couponUpdate(@Validated @RequestBody CouponParam couponParam) {
 		if (null == couponParam || StringUtils.isBlank(couponParam.getCouponId())) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
@@ -255,11 +264,13 @@ public class CouponMgrController extends BaseApiController {
 
 
 	/**
-	 * 停用、启用代金
+	 * 上下架优惠
 	 * @param
 	 * @return
 	 */
-	@ApiOperation(value = "停用、启用代金券信息", notes = "代金券管理编辑代金券")
+	@Log(title = "上下架优惠券", businessType = BusinessType.UPDATE)
+	@PreAuthorize("@ss.hasPermi('business:coupon:on')")
+	@ApiOperation(value = "上下架优惠券信息", notes = "优惠券管理编辑代金券")
 	@PostMapping("/status")
 	public AjaxResult couponStatus(@RequestBody JSONObject jsonObject) {
 		String couponId = jsonObject.getString("couponId");
@@ -283,7 +294,9 @@ public class CouponMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "删除优惠券", businessType = BusinessType.DELETE)
 	@PostMapping(value = "/remove")
+	@PreAuthorize("@ss.hasPermi('business:coupon:remove')")
 	public AjaxResult removeCoupon(@RequestBody JSONObject jsonObject) {
 		String couponId = jsonObject.getString("couponId");
 	    if (StringUtils.isBlank(couponId)){

+ 15 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/GoodsMgrController.java

@@ -11,8 +11,10 @@ import com.qs.mp.admin.domain.param.GoodsQueryParam;
 import com.qs.mp.admin.domain.vo.GoodsVO;
 import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsSkuService;
+import com.qs.mp.common.annotation.Log;
 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.ErrorCodeEnum;
 import com.qs.mp.common.enums.GoodsStatusEnum;
 import com.qs.mp.common.utils.LogUtil;
@@ -31,6 +33,7 @@ import ma.glasnost.orika.MapperFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
@@ -66,6 +69,7 @@ public class GoodsMgrController extends BaseApiController {
 	 * @return
 	 */
 	@PostMapping("/list")
+	@PreAuthorize("@ss.hasPermi('business:goods:list')")
 	public TableDataInfo list(@RequestBody GoodsQueryParam queryParam) {
 		startPage();
 		QueryWrapper<Goods> queryWrapper = new QueryWrapper<Goods>();
@@ -97,6 +101,7 @@ public class GoodsMgrController extends BaseApiController {
 	 * @return
 	 */
 	@PostMapping(value = "/detail")
+	@PreAuthorize("@ss.hasPermi('business:goods:query')")
 	public AjaxResult getGoodsDetail(@RequestBody JSONObject jsonObject) {
 		Long goodsId = jsonObject.getLong("goodsId");
 	    if (null == goodsId || 0 == goodsId){
@@ -126,8 +131,10 @@ public class GoodsMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "新增商品", businessType = BusinessType.INSERT)
 	@ApiOperation(value = "新增商品信息", notes = "后台商品管理新增商品")
 	@PostMapping("/create")
+	@PreAuthorize("@ss.hasPermi('business:goods:add')")
 	public AjaxResult goodsCreate(@Validated @RequestBody GoodsParam goodsParam) {
 		Goods goods = mapperFacade.map(goodsParam, Goods.class);
 		// 1、校验名称是否重复(商品表)
@@ -176,8 +183,10 @@ public class GoodsMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "修改商品", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "编辑商品信息", notes = "后台商品管理修改商品信息")
 	@PostMapping("/update")
+	@PreAuthorize("@ss.hasPermi('business:goods:edit')")
 	public AjaxResult goodsUpdate(@Validated @RequestBody GoodsParam goodsParam) {
 		if (null == goodsParam || null == goodsParam.getGoodsId() || 0 == goodsParam.getGoodsId()) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
@@ -285,12 +294,14 @@ public class GoodsMgrController extends BaseApiController {
 
 
 	/**
-	 * 停用、启用商品
+	 * 上下架商品
 	 * @param
 	 * @return
 	 */
-	@ApiOperation(value = "停用、启用商品", notes = "停用、启用商品")
+	@Log(title = "上下架商品", businessType = BusinessType.UPDATE)
+	@ApiOperation(value = "上下架商品", notes = "上下架商品")
 	@PostMapping("/status")
+	@PreAuthorize("@ss.hasPermi('business:goods:on')")
 	public AjaxResult goodsStatus(@RequestBody JSONObject jsonObject) {
 		String goodsId = jsonObject.getString("goodsId");
 
@@ -314,7 +325,9 @@ public class GoodsMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "删除商品", businessType = BusinessType.DELETE)
 	@PostMapping(value = "/remove")
+	@PreAuthorize("@ss.hasPermi('business:goods:remove')")
 	public AjaxResult removeGoods(@RequestBody JSONObject jsonObject) {
 		Long goodsId = jsonObject.getLong("goodsId");
 	    if (null == goodsId || 0 == goodsId){

+ 26 - 15
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -13,9 +13,11 @@ import com.qs.mp.channel.domain.vo.ChannelVO;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.constant.UserConstants;
 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.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.system.domain.SysUser;
@@ -32,6 +34,7 @@ import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -52,16 +55,16 @@ public class SaleSiteMgrController extends BaseApiController {
 
 	@Autowired
 	private IChannelService channelService;
-	
+
 	@Autowired
 	private IChannelUserRelService channelUserRelService;
-	
+
 	@Autowired
 	private IChannelOrderService channelOrderService;
-	
+
 	@Autowired
 	private ISysUserService userService;
-	
+
 	@Autowired
 	private MapperFacade mapperFacade;
 
@@ -72,6 +75,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	 * @return
 	 */
 	@PostMapping("/list")
+	@PreAuthorize("@ss.hasPermi('business:salesite:list')")
 	public TableDataInfo listChannel(@RequestBody Channel channel) {
 		List<ChannelVO> list = new ArrayList<ChannelVO>();
 		startPage();
@@ -103,15 +107,17 @@ public class SaleSiteMgrController extends BaseApiController {
 		}
 		return getDataTable(list);
 	}
-	
-	
+
+
 	/**
 	 * 新增经销商信息
 	 * @param
 	 * @return
 	 */
+	@Log(title = "新增经销商", businessType = BusinessType.INSERT)
 	@ApiOperation(value = "新增经销商信息", notes = "经销商端新增经销商")
 	@PostMapping("/create")
+	@PreAuthorize("@ss.hasPermi('business:salesite:add')")
 	public AjaxResult channelCreate(@Validated @RequestBody SaleSiteParam channelParam) {
 		if (channelParam.getChannelId() != null && channelParam.getChannelId() != 0) {
 			return AjaxResult.error("该经销商已存在");
@@ -134,7 +140,7 @@ public class SaleSiteMgrController extends BaseApiController {
 		if(null != channel.getParentId() && channel.getParentId() != 0) {
 			Channel parentChannel = channelService.getById(channel.getParentId());
 			if(null != parentChannel) {
-				 if(null != parentChannel.getCommRate() 
+				 if(null != parentChannel.getCommRate()
 						 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
 					 return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
 				 }
@@ -143,7 +149,7 @@ public class SaleSiteMgrController extends BaseApiController {
 			}else {
 				return AjaxResult.error("父经销商不存在");
 			}
-			
+
 		}else {
 			channel.setLevel(1);
 			channel.setChannelNo("");
@@ -154,7 +160,7 @@ public class SaleSiteMgrController extends BaseApiController {
 		} catch (Exception e) {
 			return AjaxResult.error("经销商'" + channel.getName() + "'新增失败" + e.getMessage());
 		}
-		
+
 		return AjaxResult.success("经销商'" + channel.getName() + "'新增成功");
 	}
 
@@ -163,8 +169,10 @@ public class SaleSiteMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "修改经销商", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "编辑经销商信息", notes = "经销商端编辑经销商")
 	@PostMapping("/update")
+	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
 	public AjaxResult channelUpdate(@Validated @RequestBody ChannelParam channelParam) {
 		if (null == channelParam || null == channelParam.getChannelId()) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
@@ -200,7 +208,7 @@ public class SaleSiteMgrController extends BaseApiController {
 		// 3.校验佣金比例,不能高于其父经销商的佣金比例,不能低于其子经销商的最大佣金比例
 		Channel parentChannel = channelService.getById(oldChannel.getParentId());
 		if(null != parentChannel) {
-			 if(null != parentChannel.getCommRate() 
+			 if(null != parentChannel.getCommRate()
 					 && channel.getCommRate().compareTo(parentChannel.getCommRate()) > 0) {
 				 return AjaxResult.error("佣金比例不能高于父经销商的佣金比例");
 			 }
@@ -216,15 +224,17 @@ public class SaleSiteMgrController extends BaseApiController {
 		}
 		return AjaxResult.success("经销商'" + channel.getName() + "'编辑成功");
 	}
-	
-	
+
+
 	/**
 	 * 停用、启用经销商
 	 * @param
 	 * @return
 	 */
+	@Log(title = "经销商启用停用", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "停用、启用经销商信息", notes = "经销商管理编辑经销商")
 	@PostMapping("/status")
+	@PreAuthorize("@ss.hasPermi('business:salesite:edit')")
 	public AjaxResult channelStatus(@RequestBody JSONObject jsonObject) {
 		String channelId = jsonObject.containsKey("channelId")?jsonObject.get("channelId").toString():"";
 		String status = jsonObject.containsKey("status")?jsonObject.get("status").toString():"";
@@ -247,8 +257,8 @@ public class SaleSiteMgrController extends BaseApiController {
 		}
 		return AjaxResult.success("操作成功");
 	}
-	
-	
+
+
 	/**
 	 * 查询经销商详情
 	 * @param
@@ -256,6 +266,7 @@ public class SaleSiteMgrController extends BaseApiController {
 	 */
 	@ApiOperation(value = "查询经销商详情信息", notes = "经销商管理编辑子经销商查询经销商详情")
 	@PostMapping("/detail")
+	@PreAuthorize("@ss.hasPermi('business:salesite:query')")
 	public AjaxResult getChannelDetail(@RequestBody JSONObject jsonObject) {
 		String channelId = (null != jsonObject && jsonObject.containsKey("channelId"))?jsonObject.getString("channelId"):"";
 		if (StringUtils.isBlank(channelId)) {
@@ -281,5 +292,5 @@ public class SaleSiteMgrController extends BaseApiController {
 	    channelVO.setOperData(channelOperDataVO);
 		return AjaxResult.success(channelVO);
 	}
-	
+
 }

+ 21 - 15
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -24,6 +24,7 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.ServerEnvEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.enums.TicketTypeEnum;
 import com.qs.mp.common.utils.LogUtil;
@@ -68,35 +69,28 @@ public class TicketBoxMgrController extends BaseApiController {
 	@Autowired
 	private ITicketBoxService ticketBoxService;
 
-	@Autowired
-	private IChannelUserRelService channelUserRelService;
-
-	@Autowired
-	private ISysUserService userService;
-
 	@Autowired
 	private ITicketService ticketService;
 
 	@Autowired
 	private MapperFacade mapperFacade;
 
-
-	@Value("${wx-channel.appId}")
-	private String channelAppId;
-
-
 	@Value("${mp.exportUrl}")
 	private String exportUrl;
 
 	@Value("${export.page-size}")
 	private int pageSize;
 
+	@Value("${server.env}")
+	private String env;
+
 	/**
 	 * 查询所有盲票组列表
 	 *
 	 * @return
 	 */
 	@PostMapping("/list")
+	@PreAuthorize("@ss.hasPermi('business:ticket:list')")
 	public TableDataInfo list(@RequestBody TicketBox ticketBox) {
 		startPage();
 		List<TicketBox> list = ticketBoxService.list(new QueryWrapper<>());
@@ -109,8 +103,10 @@ public class TicketBoxMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "盲票新增", businessType = BusinessType.INSERT)
 	@ApiOperation(value = "新增盲票", notes = "管理端创建盲票")
 	@PostMapping("/create")
+	@PreAuthorize("@ss.hasPermi('business:ticket:add')")
 	public AjaxResult create(@Validated @RequestBody TicketBoxCreateParam param) {
 		if (param.getType() == TicketTypeEnum.OFFLINE) {
 			if (param.getPkgSalePrice() == null || param.getPkgSalePrice() == 0) {
@@ -130,8 +126,10 @@ public class TicketBoxMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "盲票上下架", businessType = BusinessType.UPDATE)
 	@ApiOperation(value = "盲票上下架", notes = "管理端盲票上下架")
 	@PostMapping("/put")
+	@PreAuthorize("@ss.hasPermi('business:ticket:on')")
 	public AjaxResult putOnOff(@RequestBody TicketBox param) {
 		if (StringUtils.isBlank(param.getBoxId()) || param.getStatus() == null) {
 				return AjaxResult.error("参数缺失");
@@ -162,8 +160,10 @@ public class TicketBoxMgrController extends BaseApiController {
 	 * @param
 	 * @return
 	 */
+	@Log(title = "盲票删除", businessType = BusinessType.DELETE)
 	@ApiOperation(value = "盲票删除", notes = "管理端盲票删除")
 	@PostMapping("/remove")
+	@PreAuthorize("@ss.hasPermi('business:ticket:remove')")
 	public AjaxResult remove(@RequestBody TicketBox param) {
 		if (StringUtils.isBlank(param.getBoxId())) {
 			return AjaxResult.error("参数缺失");
@@ -176,8 +176,9 @@ public class TicketBoxMgrController extends BaseApiController {
 		return AjaxResult.success("删除成功");
 	}
 
-	@Log(title = "盲票导出", businessType = BusinessType.EXPORT)
+	/*@Log(title = "盲票导出", businessType = BusinessType.EXPORT)
 	@PostMapping("/export")
+	@PreAuthorize("@ss.hasPermi('business:ticket:export')")
 	public AjaxResult exportTicket(@RequestBody BathIdParam ids) {
 		if (null == ids || null == ids.getIds() || ids.getIds().size() == 0) {
 			return AjaxResult.error("请选择需要导出的盲票组");
@@ -222,7 +223,9 @@ public class TicketBoxMgrController extends BaseApiController {
 					ticketExcel.setSerialNo(ticket.getSerialNo());
 					ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
 					ticketExcel.setDrawNum(ticket.getDrawNum());
-					ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+					if (!ServerEnvEnum.PROD.getCode().equals(env)) {
+						ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+					}
 					excelList.add(ticketExcel);
 				}
 			}
@@ -259,11 +262,12 @@ public class TicketBoxMgrController extends BaseApiController {
 		} catch (Exception e) {
 			return AjaxResult.error("导入失败,请联系管理员");
 		}
-	}
+	}*/
 
 
 	@Log(title = "导出印刷", businessType = BusinessType.EXPORT)
 	@PostMapping("/exportDraw")
+	@PreAuthorize("@ss.hasPermi('business:ticket:export')")
 	public AjaxResult exportDraw(@RequestBody BathIdParam ids) {
 		if (null == ids || null == ids.getIds() || ids.getIds().size() == 0) {
 			return AjaxResult.error("请选择需要导出的盲票组");
@@ -308,7 +312,9 @@ public class TicketBoxMgrController extends BaseApiController {
 					ticketExcel.setSerialNo(ticket.getSerialNo());
 					ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
 					ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
-					ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+					if (!ServerEnvEnum.PROD.getCode().equals(env)) {
+						ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));
+					}
 					excelList.add(ticketExcel);
 				}
 			}

+ 32 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java

@@ -3,11 +3,13 @@ package com.qs.mp.web.controller.api.admin;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.excel.TicketExcel;
 import com.qs.mp.admin.domain.param.BathIdParam;
 import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
@@ -49,13 +51,14 @@ import ma.glasnost.orika.MapperFacade;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 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;
 
 @RestController
-@RequestMapping("/api/v1/admin/deliver/order")
+@RequestMapping("/api/v1/mp/admin/deliver/order")
 @Api(tags = "用户提货订单接口")
 @AllArgsConstructor
 public class UserDeliverOrderMgrController extends BaseApiController {
@@ -86,6 +89,7 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	 */
 	@PostMapping("/list")
 	@ApiOperation(value = "用户提货订单列表", notes = "获取用户提货订单列表")
+	@PreAuthorize("@ss.hasPermi('order:deliver:list')")
 	public TableDataInfo list(@RequestBody UserDeliverOrderQueryParam queryParam) {
 		startPage();
 		QueryWrapper<UserDeliverOrder> queryWrapper = new QueryWrapper<UserDeliverOrder>();
@@ -110,6 +114,7 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	 */
 	@PostMapping("/detail")
 	@ApiOperation(value = "订单详情", notes = "在订单列表页面查看详情")
+	@PreAuthorize("@ss.hasPermi('order:deliver:query')")
 	public AjaxResult query(@RequestBody UserDeliverOrder order) {
 		if (null == order || StringUtils.isBlank(order.getOrderId())) {
 			return error(ErrorCodeEnum.ERROR_CODE_1001);
@@ -126,15 +131,37 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	/**
 	 * 订单发货
 	 */
+	@Log(title = "用户提货订单发货", businessType = BusinessType.UPDATE)
 	@PostMapping("/ship")
 	@ApiOperation(value = "订单发货", notes = "在订单发货页面提交")
-	public AjaxResult ship(@RequestBody UserDeliverOrder order) {
-
-		return AjaxResult.success();
+	@PreAuthorize("@ss.hasPermi('order:deliver:ship')")
+	public AjaxResult ship(@RequestBody UserDeliverOrderShipParam shipParam) {
+		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		List<UserDeliverOrderItem> itemList = new ArrayList<UserDeliverOrderItem>();
+		if(null != shipParam && null != shipParam.getItemIds()
+				&& shipParam.getItemIds().size() > 0) {
+			for(String itemId : shipParam.getItemIds() ) {
+				if(StringUtils.isNotBlank(itemId)) {
+					UserDeliverOrderItem item = new UserDeliverOrderItem();
+		        	item.setItemId(itemId);
+		        	item.setDeliveryId(shipParam.getDeliveryId());
+		        	item.setDeliveryFlowId(shipParam.getDeliveryFlowId());
+		        	itemList.add(item);
+				}
+			}
+		}
+		if(null != itemList && itemList.size() > 0) {
+			boolean rtn = userDeliverOrderService.userDeliverOrderShip(shipParam.getOrderId(), itemList);
+			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
+		}
+		return AjaxResult.error("发货失败");
 	}
 
-	@Log(title = "导出", businessType = BusinessType.EXPORT)
+	@Log(title = "提货订单导出", businessType = BusinessType.EXPORT)
 	@PostMapping("/export")
+	@PreAuthorize("@ss.hasPermi('order:deliver:export')")
 	public AjaxResult export(@RequestBody UserDeliverOrderQueryParam queryParam) {
 
 		List<DeliverOrderExcel> excelList = new ArrayList<DeliverOrderExcel>();

+ 165 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelCouponVerifyController.java

@@ -0,0 +1,165 @@
+package com.qs.mp.web.controller.api.channel;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
+import com.qs.mp.channel.service.IChannelCouponVerifyLogService;
+import com.qs.mp.channel.service.IChannelService;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.UserCouponChannel;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.service.IUserCouponChannelService;
+import com.qs.mp.user.service.IUserCouponService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import java.util.Date;
+import java.util.List;
+import ma.glasnost.orika.MapperFacade;
+import org.apache.catalina.User;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+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;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 渠道优惠券核销前端控制器
+ */
+@Api("渠道管理API")
+@RestController
+@RequestMapping("/api/v1/mp/channel/*")
+@Component
+public class ChannelCouponVerifyController extends BaseApiController {
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Autowired
+  private IUserCouponService userCouponService;
+
+  @Autowired
+  private IUserCouponChannelService userCouponChannelService;
+
+  @Autowired
+  private IChannelCouponVerifyLogService channelCouponVerifyLogService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+  /**
+   * 优惠券查询
+   *
+   * @param
+   * @return
+   */
+  @PostMapping(value = "coupon/query")
+  public AjaxResult query(@RequestBody JSONObject param) {
+    String verifyCode = param.getString("verifyCode");
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    UserCoupon userCoupon = userCouponService.getOne(new LambdaQueryWrapper<UserCoupon>()
+        .eq(UserCoupon::getVerifyCode, verifyCode));
+    if (null == userCoupon) {
+      return error("券码非法");
+    }
+    AjaxResult result = checkCoupon(verifyCode, channelId, userCoupon);
+    if (null != result) {
+      return result;
+    }
+    List<UserCouponVO> userCouponVOList = userCouponService.listUserCouponVO(
+        new QueryWrapper<UserCoupon>()
+            .eq("t1.verify_code", verifyCode));
+
+    return AjaxResult.success(userCouponVOList.get(0));
+  }
+
+  private AjaxResult checkCoupon(String verifyCode, Long channelId, UserCoupon userCoupon) {
+    AjaxResult result = null;
+
+    if (StringUtils.isBlank(verifyCode)) {
+      result = error(ErrorCodeEnum.ERROR_CODE_1001);
+    }
+    if (null == userCoupon) {
+      result = error("该券不存在!");
+    }
+    if (userCoupon.getStatus() == UserCouponStatusEnum.USED) {
+      result = error("该券已使用!");
+    }
+    if (userCoupon.getValidEnd().before(new Date())) {
+      result = error("该券已过期!");
+    }
+    UserCouponChannel couponChannel = userCouponChannelService.getOne(
+        new LambdaQueryWrapper<UserCouponChannel>()
+            .eq(UserCouponChannel::getUserCouponId, userCoupon.getId())
+            .eq(UserCouponChannel::getChannelId, channelId));
+    if (null == couponChannel) {
+      result = error("无权核销该券");
+    }
+    return result;
+  }
+
+  /**
+   * 优惠券核销
+   *
+   * @param
+   * @return
+   */
+  @PostMapping(value = "coupon/verify")
+  public AjaxResult verify(@RequestBody JSONObject param) {
+    String verifyCode = param.getString("verifyCode");
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    UserCoupon userCoupon = userCouponService.getOne(new LambdaQueryWrapper<UserCoupon>()
+        .eq(UserCoupon::getVerifyCode, verifyCode));
+    if (null == userCoupon) {
+      return error("券码非法");
+    }
+    AjaxResult result = checkCoupon(verifyCode, channelId, userCoupon);
+    if (null != result) {
+      return result;
+    }
+    channelCouponVerifyLogService.verify(channelId, userCoupon);
+    return AjaxResult.success("核销成功");
+  }
+
+  /**
+   * 获取我的核销记录
+   *
+   * @return
+   */
+  @PostMapping("coupon/verify/log/list")
+  public TableDataInfo list(@RequestBody JSONObject jsonObject) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+    startPage();
+    List<ChannelCouponVerifyLog> verifyLogList = channelCouponVerifyLogService.list(
+        new LambdaQueryWrapper<ChannelCouponVerifyLog>()
+            .eq(ChannelCouponVerifyLog::getChannelId, channelId)
+            .orderByDesc(ChannelCouponVerifyLog::getVerifyTime));
+    return getDataTable(verifyLogList);
+  }
+
+	/**
+	 * 优惠券核销记录详情
+	 *
+	 * @param
+	 * @return
+	 */
+	@PostMapping(value = "coupon/verify/log/detail")
+	public AjaxResult detail(@RequestBody JSONObject param) {
+		Long logId = param.getLong("logId");
+		if (null == logId || 0 == logId) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		ChannelCouponVerifyLog verifyLog = channelCouponVerifyLogService.getById(logId);
+		return AjaxResult.success(verifyLog);
+	}
+
+}

+ 5 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelInviteController.java

@@ -2,6 +2,7 @@ package com.qs.mp.web.controller.api.channel;
 
 import cn.jsms.api.ValidSMSResult;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.param.ChannelInviteParam;
 import com.qs.mp.channel.service.IChannelService;
@@ -82,7 +83,10 @@ public class ChannelInviteController extends BaseApiController {
 		if (res == null || !res.getIsValid()) {
 			return error("短信验证码错误");
 		}
-
+		int cnt = channelService.count(new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, param.getMobile()));
+		if (cnt > 0) {
+			return error("手机号已存在");
+		}
 		// 创建经销商
 		Channel channel = new Channel();
 		channel.setChannelNo(parent.getChannelNo() + ".");

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

@@ -0,0 +1,38 @@
+package com.qs.mp.web.controller.api.common;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.domain.Area;
+import com.qs.mp.common.domain.DeliveryCompany;
+import com.qs.mp.common.service.IAreaService;
+import com.qs.mp.common.service.IDeliveryCompanyService;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+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 zhongcp on 2022/3/2.
+ */
+@RestController
+@RequestMapping("/api/v1/mp/delivery")
+@Api(tags="快递公司接口")
+public class DeliveryCompanyController extends BaseApiController {
+
+    @Autowired
+    private IDeliveryCompanyService deliveryCompanyService;
+
+    @PostMapping("/company/list")
+    @ApiOperation(value="获取快递公司列表", notes="")
+	public AjaxResult list(@RequestBody JSONObject jsonObject){
+		  List<DeliveryCompany> list = deliveryCompanyService.list();
+		  return AjaxResult.success(list);
+	}
+
+}

+ 9 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserMineController.java

@@ -9,6 +9,8 @@ import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.PrizeStorageStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.UserCoin;
 import com.qs.mp.user.domain.UserCoinLog;
 import com.qs.mp.user.domain.UserCoupon;
@@ -124,10 +126,15 @@ public class UserMineController extends BaseApiController {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     Map<String, Object> storageMap = userPrizeStorageService.getMap(
         new QueryWrapper<UserPrizeStorage>()
-            .select("IFNULL(goods_num,0) as total")
+            .select("count(IFNULL(goods_num,0)) as total")
             .eq("user_id", userId).eq("status", PrizeStorageStatusEnum.NOT_DISTRIBUTED));
+    int couponCnt = userCouponService.count(new LambdaQueryWrapper<UserCoupon>()
+            .eq(UserCoupon::getUserId, userId)
+        .eq(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED)
+        .le(UserCoupon::getValidStart, DateUtils.getToday())
+        .ge(UserCoupon::getValidEnd, DateUtils.getToday()));
     JSONObject result = new JSONObject();
-    result.put("prizeNum", Integer.valueOf(String.valueOf(null != storageMap ? storageMap.get("total") : 0)));
+    result.put("prizeNum", Integer.valueOf(String.valueOf(null != storageMap ? storageMap.get("total") : 0)) + couponCnt);
 
     int ticketNum = userTicketOrderItemService.countMyTicket(userId, TicketStatusEnum.ACTIVATED);
     result.put("ticketNum", ticketNum);

+ 1 - 1
mp-admin/src/main/resources/application-test.yml

@@ -96,7 +96,7 @@ server:
   # 生成唯一ID的,同一Mac地址多应用的部署方式,用这个进行区分
   datacenterId: 1
   # 环境标识
-  env: test
+  env: prod
 
 
 #API访问

+ 4 - 2
mp-common/src/main/java/com/qs/mp/common/enums/ChannelMoneyEnum.java

@@ -11,9 +11,11 @@ import com.baomidou.mybatisplus.annotation.IEnum;
 public enum ChannelMoneyEnum implements IEnum<Integer> {
 
   COMMISSION(1, "佣金收入"),
-  WITHDRAW(2, "提现"),
+  WITHDRAW(2, "余额提现"),
   WITHDRAW_FEE(3, "提现手续费"),
-  PURCHASE(4, "进票");
+  PURCHASE(4, "进票"),
+  COUPON(5, "优惠券核销结算"),
+  WITHDRAW_BACK(6, "余额提现退回");
 
 
   private final int value;

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

@@ -26,7 +26,7 @@ public enum ChannelWithdrawStatusEnum implements IEnum<Integer> {
     this.desc = desc;
   }
 
-  public static ChannelWithdrawStatusEnum getChannelMoneyTypeEnum(int value) {
+  public static ChannelWithdrawStatusEnum getChannelWithdrawStatusEnum(int value) {
     for (ChannelWithdrawStatusEnum channelMoneyTypeEnum : ChannelWithdrawStatusEnum.values()) {
       if (channelMoneyTypeEnum.getValue() == value) {
         return channelMoneyTypeEnum;

+ 40 - 0
mp-common/src/main/java/com/qs/mp/common/enums/CouponSettleStatusEnum.java

@@ -0,0 +1,40 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.IEnum;
+
+/**
+ *
+ * 用户卡券使用状态
+ *
+ */
+public enum CouponSettleStatusEnum implements IEnum<Integer> {
+
+  INIT(1, "待结算"),
+  FINISHED(2, "已结算"),;
+
+  private final Integer value;
+  private final String desc;
+
+  CouponSettleStatusEnum(final Integer value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public Integer getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/enums/DeliverOrderStatusEnum.java

@@ -16,7 +16,8 @@ public enum DeliverOrderStatusEnum implements IEnum<Integer> {
   NOT_PAY(0, "待付款"),
   NOT_DELIVER(1, "待发货"),
   NOT_CONFIRM(2, "待收货"),
-  FINISHED(3, "已完成");
+  FINISHED(3, "已完成"),
+  PART_DELIVER(4, "部分发货");
 
   private final int value;
   private final String desc;

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

@@ -27,7 +27,7 @@ public enum ErrorCodeEnum {
   ERROR_CODE_1018(1018, "无权限查看"),
   ERROR_CODE_1019(1019, "盲票未付款"),
   ERROR_CODE_1020(1020, "库存不足"),
-  ERROR_CODE_1021(1021, "豆余额不足"),
+  ERROR_CODE_1021(1021, "豆余额不足"),
   ;
   private int code;
   private String msg;

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

@@ -12,7 +12,7 @@ import com.baomidou.mybatisplus.annotation.IEnum;
 public enum PrizeStorageInTypeEnum implements IEnum<Integer> {
 
   TICKET_CASHED(1, "奖品兑奖"),
-  COIN_EXCHANGE(2, "豆兑换");
+  COIN_EXCHANGE(2, "豆兑换");
 
 
   private final int value;

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

@@ -15,7 +15,7 @@ public enum TicketPrizeTypeEnum implements IEnum<String> {
 
   GOODS("goods", "商品"),
   COUPON("coupon", "优惠券"),
-  COIN("coin", "豆");
+  COIN("coin", "豆");
 
   private final String value;
   private final String desc;

+ 3 - 0
mp-common/src/main/java/com/qs/mp/common/enums/UserCouponStatusEnum.java

@@ -1,13 +1,16 @@
 package com.qs.mp.common.enums;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
 import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
 
 /**
  *
  * 用户卡券使用状态
  *
  */
+@JSONType(deserializer = EnumValueDeserializer.class)
 public enum UserCouponStatusEnum implements IEnum<Integer> {
 
   UNUSED(1, "未使用"),

+ 3 - 6
mp-common/src/main/java/com/qs/mp/common/jsms/JSMSUtils.java

@@ -36,11 +36,8 @@ public class JSMSUtils {
 
     protected static final Logger logger = LoggerFactory.getLogger(JSMSUtils.class);
 
-    private static final String appkey = "2f17e0698d004ca7411a9ef6";
-    private static final String masterSecret = "a6446a6b8bf8a4be72bf86d4";
-/*
-    private static final String devKey = "242780bfdd7315dc1989fedb";
-    private static final String devSecret = "2f5ced2bef64167950e63d13";*/
+    private static final String appkey = "07abbc24df161327ea51d311";
+    private static final String masterSecret = "a7710786463881179a3d5b22";
     private static String env;
 
     @Value("${server.env}")
@@ -79,7 +76,7 @@ public class JSMSUtils {
     }
 
     public static SendSMSResult sendChannelActNotify(String mobile) {
-        return sendSMSResult(mobile, 206374);
+        return sendSMSResult(mobile, 206810);
     }
 
 

+ 9 - 9
mp-common/src/main/java/com/qs/mp/common/utils/WebhookService.java

@@ -10,14 +10,14 @@ import org.springframework.stereotype.Component;
 
 @Component
 public class WebhookService {
-    
+
     private static Logger logger = LoggerFactory.getLogger(WebhookService.class);
     //private String dingToken = "https://oapi.dingtalk.com/robot/send?access_token=a2f955b2c685e4449ac98fd4a41b9ba1238a6badb58aba4da9c6fc50714fc43d";
     //final static String alertUrl = "https://oapi.dingtalk.com/robot/send?access_token=79bd929c6cdec2150dbd2d5fdb5b4a499c9ad8137da511eab85bc7d381af9d7a";
     //final static String url = "https://oapi.dingtalk.com/robot/send?access_token=a2f955b2c685e4449ac98fd4a41b9ba1238a6badb58aba4da9c6fc50714fc43d";
-    final static String wxLogMonitorUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ab1d9a09-2425-410e-b3ef-be8ee681146f";
+    final static String wxLogMonitorUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4275487c-8706-4676-ae21-e74db900fcb6";
 
-    private static String  wxRobotUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=1433d0df-6def-4077-b466-e8f79f2fc60c";
+    private static String  wxRobotUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=dd8d3a48-01f2-44b0-b4bb-406e2f466050";
     private static String env;
 
     @Value("${server.env}")
@@ -44,7 +44,7 @@ public class WebhookService {
         if (mobiles != null) {
             at.setAtMobiles(Arrays.asList(mobiles));
         }
-        
+
         request.setAt(at);
         try {
             OapiRobotSendResponse response = client.execute(request);
@@ -58,16 +58,16 @@ public class WebhookService {
 
     public static String sendWXRobot(String url , String msg) {
         //System.out.println("企业微信机器人告警发送:" + msg);
-        String jsonStr = "{\n" + 
-                "        \"msgtype\": \"text\",\n" + 
-                "        \"text\": {\n" + 
+        String jsonStr = "{\n" +
+                "        \"msgtype\": \"text\",\n" +
+                "        \"text\": {\n" +
                 "            \"content\": "+ JSON.toJSONString(msg)+"\n" +
-                "        }\n" + 
+                "        }\n" +
                 "   }";
         //System.out.println(jsonStr);
         return OkHttpUtil.post(url, jsonStr, null);
     }
-    
+
     public static String sendLogAlertMsg(String msg) {
 
         return sendWXRobot(wxLogMonitorUrl,msg);

+ 2 - 1
mp-quartz/src/main/java/com/qs/mp/quartz/task/TicketBoxTask.java

@@ -97,8 +97,9 @@ public class TicketBoxTask {
 
     HashMap<String, HashMap<String, Integer>> pkgAwardsMap = new HashMap<>();
     if(null != listAll && listAll.size() > 0 ) {
-      listAll.sort(Comparator.comparing(Ticket::getSerialNo));
+//      listAll.sort(Comparator.comparing(Ticket::getSerialNo));
       for (Ticket ticket : listAll) {
+        LogUtil.info(logger, "ticketid:{0}", ticket.getTicketId());
         JSONArray jsonArray = JSONArray.parseArray(ticket.getDrawNum());
         for (int i = 0; i < jsonArray.size(); i++) {
           JSONObject jo = jsonArray.getJSONObject(i);

+ 49 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderShipParam.java

@@ -0,0 +1,49 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import lombok.Data;
+
+/**
+ * @describe 用户提货订单发货
+ * @auther quanshu
+ * @create 2022-03-07 20:43:44
+ */
+@ApiModel(value = "用户提货订单发货参数")
+@Data
+public class ChannelOrderShipParam {
+
+	@ApiModelProperty(value = "订单编号", required = false)
+	private String orderId;
+
+	/**
+	 * 物流公司ID
+	 */
+	@NotNull(message = "快递公司不能为空")
+	@ApiModelProperty(value = "物流公司", required = false)
+	private Long deliveryId;
+
+	/**
+	 * 物流单号ID
+	 */
+	@NotNull(message = "物流单号不能为空")
+	@ApiModelProperty(value = "物流单号", required = false)
+	private String deliveryFlowId;
+	
+	
+	@NotNull(message = "票包列表不能为空")
+	@ApiModelProperty(value = "票包ID列表", required = false)
+	private List<String> pkgIds;
+}

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

@@ -1,18 +1,13 @@
 package com.qs.mp.admin.domain.param;
 
-import com.alibaba.fastjson.annotation.JSONField;
-import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.qs.mp.common.enums.CouponDiscountTypeEnum;
 import com.qs.mp.common.enums.CouponDistributeTypeEnum;
 import com.qs.mp.common.enums.CouponStatusEnum;
 import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.CouponUseAreaEnum;
-
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-
 import javax.validation.constraints.NotNull;
-
 import lombok.Data;
 
 /**
@@ -41,7 +36,6 @@ public class CouponParam {
    * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
    */
   @ApiModelProperty(value = "代金券类型", required = false)
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CouponTypeEnum type;
 
   /**
@@ -60,7 +54,6 @@ public class CouponParam {
    * 优惠类型;1代金券(默认)、2折扣券、3兑换券
    */
   @ApiModelProperty(value = "优惠类型;1代金券、2折扣券、3兑换券", required = false)
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CouponDiscountTypeEnum discountType;
 
   /**
@@ -80,7 +73,6 @@ public class CouponParam {
    * 渠道代金券,渠道承担比例
    */
   @ApiModelProperty(value = "渠道代金券,渠道承担比例", required = true)
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private Integer channelSharedRate;
 
 
@@ -88,21 +80,18 @@ public class CouponParam {
    * 状态;off下架 on正常
    */
   @ApiModelProperty(value = "状态", required = false)
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CouponStatusEnum status;
 
   /**
    * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
    */
   @ApiModelProperty(value = "使用范围", required = true)
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CouponUseAreaEnum useArea;
 
   /**
    * 发放方式;1系统发放(默认) 2用户主动领取
    */
   @ApiModelProperty(value = "发放方式", required = false)
-  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
   private CouponDistributeTypeEnum distributeType;
 
   /**

+ 48 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderShipParam.java

@@ -0,0 +1,48 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import lombok.Data;
+
+/**
+ * @describe 用户提货订单发货
+ * @auther quanshu
+ * @create 2022-03-07 20:43:44
+ */
+@ApiModel(value = "用户提货订单发货参数")
+@Data
+public class UserDeliverOrderShipParam {
+
+	@ApiModelProperty(value = "订单编号", required = false)
+	private String orderId;
+
+	/**
+	 * 物流公司ID
+	 */
+	@NotNull(message = "快递公司不能为空")
+	@ApiModelProperty(value = "物流公司", required = false)
+	private Long deliveryId;
+
+	/**
+	 * 物流单号ID
+	 */
+	@NotNull(message = "物流单号不能为空")
+	@ApiModelProperty(value = "物流单号", required = false)
+	private String deliveryFlowId;
+	
+	
+	@NotNull(message = "发货商品不能为空")
+	@ApiModelProperty(value = "发货商品", required = false)
+	private List<String> itemIds;;
+
+}

+ 7 - 1
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qs.mp.admin.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.Goods;
@@ -35,6 +36,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
 
 /**
  * <p>
@@ -106,9 +108,13 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
       userCouponChannel.setChannelId(ticketOrder.getChannelId());
       userCouponChannelService.save(userCouponChannel);
 			Channel channel = channelService.getById(ticketOrder.getChannelId());
-			userCoupon.setUseAreaDesc(channel.getName());
+			userCoupon.setUseAreaDesc(channel.getSiteName());
     }
 		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()));
+		Assert.isTrue(rtn, "领取优惠券奖品,更新优惠券发放量失败。couponId:" + coupon.getCouponId());
   }
 
   @Override

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/service/impl/TicketBoxServiceImpl.java

@@ -152,7 +152,7 @@ public class TicketBoxServiceImpl extends ServiceImpl<TicketBoxMapper, TicketBox
           awardsPrize.setPicUrl(coupon.getPicUrl());
           awardsPrize.setValue(coupon.getDiscount());
         } else {
-          awardsPrize.setTitle("豆");
+          awardsPrize.setTitle("豆");
           awardsPrize.setPicUrl("md.jpeg");
         }
         awardsPrizeList.add(awardsPrize);

+ 112 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCouponVerifyLog.java

@@ -0,0 +1,112 @@
+package com.qs.mp.channel.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qs.mp.common.enums.CouponDiscountTypeEnum;
+import com.qs.mp.common.enums.CouponSettleStatusEnum;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @describe 渠道优惠券核销流水实体类
+ * @auther quanshu
+ * @create 2022-03-21 14:47:23
+ */
+@TableName("mp_channel_coupon_verify_log")
+@Data
+public class ChannelCouponVerifyLog implements Serializable {
+
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 主键
+   */
+  @TableId(value = "id", type = IdType.AUTO)
+  private Long id;
+
+  /**
+   * 渠道ID
+   */
+  @TableField("channel_id")
+  private Long channelId;
+
+  /**
+   * 用户优惠券ID
+   */
+  @TableField("user_coupon_id")
+  private String userCouponId;
+
+  /**
+   * 券码
+   */
+  @TableField("verify_code")
+  private String verifyCode;
+
+  /**
+   * 标题
+   */
+  @TableField("title")
+  private String title;
+
+  /**
+   * 优惠类型;1代金券、2折扣券、3兑换券
+   */
+  @TableField("discount_type")
+  private CouponDiscountTypeEnum discountType;
+
+  /**
+   * 优惠金额(比例)
+   */
+  @TableField("discount")
+  private Integer discount;
+
+  /**
+   * 发放时间
+   */
+  @TableField("distribute_time")
+  private Date distributeTime;
+
+  /**
+   * 有效期开始日
+   */
+  @TableField("valid_start")
+  private Date validStart;
+
+  /**
+   * 有效期结束日
+   */
+  @TableField("valid_end")
+  private Date validEnd;
+
+  /**
+   * 核销时间
+   */
+  @TableField("verify_time")
+  private Date verifyTime;
+
+  /**
+   * 结算状态;1待结算 2已结算
+   */
+  @TableField("settle_status")
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponSettleStatusEnum settleStatus;
+
+  /**
+   * 创建时间
+   */
+  @TableField("created_time")
+  private Date createdTime;
+
+  /**
+   * 更新时间
+   */
+  @TableField("updated_time")
+  private Date updatedTime;
+
+
+}

+ 6 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelWithdraw.java

@@ -92,6 +92,12 @@ public class ChannelWithdraw implements Serializable {
   @TableField("transfer_img")
   private String transferImg;
 
+  /**
+   * 转账时间
+   */
+  @TableField("transfer_time")
+  private Date transferTime;
+
   /**
    * 审核内容备注
    */

+ 7 - 3
mp-service/src/main/java/com/qs/mp/channel/domain/param/VerifyParam.java

@@ -22,11 +22,15 @@ public class VerifyParam {
 	@NotNull(message = "联系人不能为空")
 	@ApiModelProperty(value = "联系人",required=true)
 	private String contact;
-	
+
 	@NotNull(message = "门店类型不能为空")
 	@ApiModelProperty(value = "门店类型",required=true)
 	private SiteTypeEnum siteType;
 
+	@NotNull(message = "门店名称不能为空")
+	@ApiModelProperty(value = "门店名称",required=true)
+	private String siteName;
+
 	@NotNull(message = "省ID不能为空")
 	@ApiModelProperty(value = "省ID",required=true)
 	private Long provinceId;
@@ -50,7 +54,7 @@ public class VerifyParam {
 	@NotNull(message = "区不能为空")
 	@ApiModelProperty(value = "区",required=true)
 	private String area;
-	
+
 	@NotNull(message = "详细地址不能为空")
 	@ApiModelProperty(value = "详细地址",required=true)
 	private String address;
@@ -58,7 +62,7 @@ public class VerifyParam {
 	@NotNull(message = "营业执照不能为空")
 	@ApiModelProperty(value = "营业执照",required=true)
 	private String bizLicensePic;
-	
+
 	@NotNull(message = "门店照片不能为空")
 	@ApiModelProperty(value = "门店照片",required=true)
 	private String doorPic;

+ 27 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelWithdrawVO.java

@@ -0,0 +1,27 @@
+package com.qs.mp.channel.domain.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/21
+ */
+@Data
+public class ChannelWithdrawVO extends ChannelWithdraw {
+  /**
+   * 渠道名称
+   */
+  private String name;
+
+  /**
+   * 渠道级别,0:经销商;1:一级渠道;2:二级渠道
+   */
+  private Integer level;
+
+  /**
+   * 手机号
+   */
+  private String mobile;
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelCouponVerifyLogMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.mapper;
+
+import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-03-21 14:47:23
+ * @describe 渠道优惠券核销流水mapper类
+ */
+public interface ChannelCouponVerifyLogMapper extends BaseMapper<ChannelCouponVerifyLog> {
+
+}

+ 8 - 1
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelWithdrawMapper.java

@@ -1,7 +1,14 @@
 package com.qs.mp.channel.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.channel.domain.ChannelCart;
 import com.qs.mp.channel.domain.ChannelWithdraw;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.domain.vo.ChannelWithdrawVO;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @auther quanshu
@@ -9,5 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @describe 渠道提现表mapper类
  */
 public interface ChannelWithdrawMapper extends BaseMapper<ChannelWithdraw> {
-
+  List<ChannelWithdrawVO> listWithdrawVO(@Param(Constants.WRAPPER) Wrapper<ChannelWithdraw> queryWrapper);
 }

+ 23 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelCouponVerifyLogService.java

@@ -0,0 +1,23 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.UserCoupon;
+
+/**
+ * <p>
+ * 渠道优惠券核销流水 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-21
+ */
+public interface IChannelCouponVerifyLogService extends IService<ChannelCouponVerifyLog> {
+
+  /**
+   * 核销
+   * @param channelId
+   * @param userCoupon
+   */
+  void verify(Long channelId, UserCoupon userCoupon);
+}

+ 12 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -1,6 +1,9 @@
 package com.qs.mp.channel.service;
 
 import com.qs.mp.channel.domain.ChannelOrder;
+
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.pay.domain.PayOrder;
@@ -37,4 +40,13 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
    * @param payOrder
    */
   void paySuccess(PayOrder payOrder);
+  
+	/**
+	 * 渠道订单发货
+	 * 
+	 * @param orderId
+	 * @param pkgIds
+	 * @return
+	 */
+	boolean channelOrderShip(String orderId, List<String> pkgIdList);
 }

+ 22 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelWithdrawService.java

@@ -1,8 +1,14 @@
 package com.qs.mp.channel.service;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelWithdraw;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.channel.domain.vo.ChannelWithdrawVO;
+import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -21,4 +27,20 @@ public interface IChannelWithdrawService extends IService<ChannelWithdraw> {
    * @return
    */
   boolean apply(Channel channel, ChannelWithdraw channelWithdraw);
+
+  /**
+   * 查询提现申请记录
+   * @param queryWrapper
+   * @return
+   */
+  List<ChannelWithdrawVO> listWithdrawVO(Wrapper<ChannelWithdraw> queryWrapper);
+
+  /**
+   * 提现申请审核
+   * @param withdraw
+   * @param status
+   * @param verifyContent
+   * @return
+   */
+  boolean verify(ChannelWithdraw withdraw, ChannelWithdrawStatusEnum status, String verifyContent);
 }

+ 98 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelCouponVerifyLogServiceImpl.java

@@ -0,0 +1,98 @@
+package com.qs.mp.channel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.admin.service.ICouponService;
+import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
+import com.qs.mp.channel.domain.ChannelMoneyLog;
+import com.qs.mp.channel.mapper.ChannelCouponVerifyLogMapper;
+import com.qs.mp.channel.service.IChannelCouponVerifyLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.channel.service.IChannelMoneyLogService;
+import com.qs.mp.common.enums.ChannelMoneyEnum;
+import com.qs.mp.common.enums.CouponDiscountTypeEnum;
+import com.qs.mp.common.enums.CouponSettleStatusEnum;
+import com.qs.mp.common.enums.CouponStatusEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.service.IUserCouponService;
+import java.util.Date;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
+
+/**
+ * <p>
+ * 渠道优惠券核销流水 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-03-21
+ */
+@Service
+public class ChannelCouponVerifyLogServiceImpl extends ServiceImpl<ChannelCouponVerifyLogMapper, ChannelCouponVerifyLog> implements IChannelCouponVerifyLogService {
+
+  protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+  @Autowired
+  private ICouponService couponService;
+
+  @Autowired
+  private IUserCouponService userCouponService;
+
+  @Autowired
+  private IChannelMoneyLogService channelMoneyLogService;
+
+  @Override
+  @Transactional
+  public void verify(Long channelId, UserCoupon userCoupon) {
+    Date verifyDate = new Date();
+    // 核销券
+    boolean updateRst = userCouponService.update(new LambdaUpdateWrapper<UserCoupon>()
+        .set(UserCoupon::getStatus, UserCouponStatusEnum.USED)
+            .set(UserCoupon::getVerifyTime, verifyDate)
+        .eq(UserCoupon::getId, userCoupon.getId())
+        .eq(UserCoupon::getStatus, UserCouponStatusEnum.UNUSED));
+    Assert.isTrue(updateRst, "经销商核销券时,券状态更新失败。userCouponId:" + userCoupon.getId());
+    Coupon coupon = couponService.getById(userCoupon.getCouponId());
+
+    // 记录核销日志
+    ChannelCouponVerifyLog verifyLog = new ChannelCouponVerifyLog();
+    verifyLog.setChannelId(channelId);
+    verifyLog.setUserCouponId(userCoupon.getId());
+    verifyLog.setVerifyCode(userCoupon.getVerifyCode());
+    verifyLog.setTitle(coupon.getTitle());
+    verifyLog.setDiscountType(coupon.getDiscountType());
+    verifyLog.setDiscount(coupon.getDiscount());
+    verifyLog.setDistributeTime(userCoupon.getCreatedTime());
+    verifyLog.setValidStart(userCoupon.getValidStart());
+    verifyLog.setValidEnd(userCoupon.getValidEnd());
+    verifyLog.setVerifyTime(verifyDate);
+    verifyLog.setSettleStatus(CouponSettleStatusEnum.FINISHED);
+    save(verifyLog);
+
+    if (coupon.getDiscountType() == CouponDiscountTypeEnum.MONEY_OFF){
+      int logMoney = coupon.getDiscount() * (100 - coupon.getChannelSharedRate()) / 100;
+      if (logMoney == 0) {
+        LogUtil.warn(logger, "优惠券核销结算金额为0,忽略。userCouponId:{0}", userCoupon.getId());
+      } else {
+        // 结算
+        ChannelMoneyLog moneyLog = new ChannelMoneyLog();
+        moneyLog.setChannelId(channelId);
+        moneyLog.setType(ChannelMoneyEnum.COUPON);
+        moneyLog.setLogMoney(logMoney);
+        moneyLog.setLogText("券码:" + userCoupon.getVerifyCode());
+        moneyLog.setBizTime(new Date());
+        moneyLog.setRefId(String.valueOf(verifyLog.getId()));
+        channelMoneyLogService.changeMoney(moneyLog);
+      }
+    } else {
+      LogUtil.warn(logger, "优惠券核销结算,类型非代金券,忽略。userCouponId:{0}", userCoupon.getId());
+    }
+  }
+
+}

+ 3 - 2
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelMoneyLogServiceImpl.java

@@ -65,7 +65,8 @@ public class ChannelMoneyLogServiceImpl extends ServiceImpl<ChannelMoneyLogMappe
 
     //1、更新渠道余额表
     boolean rtn = channelService.update(new LambdaUpdateWrapper<Channel>().set(Channel::getMoney, money)
-            .set(ChannelMoneyEnum.WITHDRAW == moneyLog.getType() || ChannelMoneyEnum.WITHDRAW_FEE == moneyLog.getType(), Channel::getFrozenMoney, channel.getFrozenMoney() + logMoney)
+        .set(ChannelMoneyEnum.WITHDRAW == moneyLog.getType() || ChannelMoneyEnum.WITHDRAW_FEE == moneyLog.getType(), Channel::getFrozenMoney, channel.getFrozenMoney() + logMoney)
+        .set(ChannelMoneyEnum.WITHDRAW_BACK == moneyLog.getType(), Channel::getFrozenMoney, channel.getFrozenMoney() - logMoney)
         .eq(Channel::getChannelId, channel.getChannelId()).eq(Channel::getMoney, channel.getMoney()));
     Assert.isTrue(rtn, "渠道余额更新失败,channelId:" + channel.getChannelId());
 
@@ -81,7 +82,7 @@ public class ChannelMoneyLogServiceImpl extends ServiceImpl<ChannelMoneyLogMappe
 
   private boolean checkIncome(ChannelMoneyEnum bizType){
     //判断收支类型是否符合预定义类型
-    if(ChannelMoneyEnum.COMMISSION == bizType){
+    if(ChannelMoneyEnum.COMMISSION == bizType || ChannelMoneyEnum.COUPON == bizType || ChannelMoneyEnum.WITHDRAW_BACK == bizType){
       return true;
     }else if(ChannelMoneyEnum.WITHDRAW == bizType || ChannelMoneyEnum.WITHDRAW_FEE == bizType
     || ChannelMoneyEnum.PURCHASE == bizType ){

+ 85 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -3,26 +3,35 @@ package com.qs.mp.channel.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.mapper.ChannelOrderMapper;
 import com.qs.mp.channel.service.IChannelCartService;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +66,12 @@ public class ChannelOrderServiceImpl extends
 
   @Autowired
   private IChannelCartService channelCartService;
+  
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+  
+  @Autowired
+  private IChannelOrderDetailService channelOrderDetailervice;
 
   @Override
   @Transactional
@@ -190,4 +205,74 @@ public class ChannelOrderServiceImpl extends
       throw new ServiceException("渠道采购票组订单支付成功时,更新订单状态失败");
     }
   }
+
+	@Override
+	@Transactional
+	public boolean channelOrderShip(String orderId, List<String> pkgIdList) {
+		ChannelOrder channelOrder = getById(orderId);
+		if(null == channelOrder || StringUtils.isBlank(channelOrder.getOrderId())) {
+			throw new ServiceException("发货订单异常,发货失败");
+		}
+		
+		List<TicketPackage> ticketPkgList = new ArrayList<TicketPackage>();
+		if(null != pkgIdList && pkgIdList.size() > 0) {
+			LambdaQueryWrapper<TicketPackage> queryWrapper = new LambdaQueryWrapper<TicketPackage>();
+			queryWrapper.eq(TicketPackage::getStatus, TicketPkgStatusEnum.FOR_SALE);
+			queryWrapper.in(TicketPackage::getPkgId,  pkgIdList);
+			ticketPkgList = ticketPackageService.list(queryWrapper);
+			if(null == ticketPkgList || ticketPkgList.size() == 0
+					|| ticketPkgList.size() != pkgIdList.size()) {
+				throw new ServiceException("发货票包状态异常,发货失败");
+			}
+		}
+		List<ChannelOrderItem> orderItemList = channelOrderItemService.list(
+		        new LambdaQueryWrapper<ChannelOrderItem>()
+		            .eq(ChannelOrderItem::getOrderId, orderId));
+		// 验证发货的盲票包是否与订单中的盲票包数量一致
+		if(null == orderItemList || orderItemList.size() == 0 ) {
+			throw new ServiceException("订单明细查询异常, 发货失败");
+		}
+		List<ChannelOrderDetail> detailList = new ArrayList<ChannelOrderDetail>();
+		// 验证是否为本订单盲票
+		for(TicketPackage ticketPackage:ticketPkgList) {
+			if(null != ticketPackage && StringUtils.isNotBlank(ticketPackage.getBoxId())) {
+				long num = orderItemList.stream().filter(channelOrderItem -> channelOrderItem.getBoxId().equals(ticketPackage.getBoxId())).count();
+				if(num < 1) {
+					String msg = "票包"+ticketPackage.getStartSn()+"-" + ticketPackage.getEndSn() +"非本订单盲票";
+					throw new ServiceException(msg);
+				}
+				ChannelOrderDetail channelOrderDetail = new ChannelOrderDetail();
+				channelOrderDetail.setBoxId(ticketPackage.getBoxId());
+				channelOrderDetail.setPkgId(ticketPackage.getPkgId());
+				channelOrderDetail.setOrderId(orderId);
+				channelOrderDetail.setStartSn(ticketPackage.getStartSn());
+				channelOrderDetail.setEndSn(ticketPackage.getEndSn());
+				channelOrderDetail.setChannelId(channelOrder.getChannelId());
+				detailList.add(channelOrderDetail);
+			}
+		}
+		// 校验数量是否一致
+		for(ChannelOrderItem orderItem:orderItemList) {
+			if(null != orderItem && StringUtils.isNotBlank(orderItem.getBoxId()) ) {
+				long totalNum = ticketPkgList.stream().filter(TicketPackage -> TicketPackage.getBoxId().equals(orderItem.getBoxId())).count();
+				if(totalNum != orderItem.getOrderNum()) {
+					String msg = "票组"+orderItem.getTitle()+"盲票包" + (totalNum > orderItem.getOrderNum()?"少于":"已超出")+"订单购买的盲票包数量";
+					throw new ServiceException(msg);
+				}
+			}
+		}
+		
+		boolean res = channelOrderDetailervice.saveBatch(detailList);
+		if(res) {
+			// 修改票包已销售状态
+			LambdaUpdateWrapper<TicketPackage> updateWrapper = new LambdaUpdateWrapper<TicketPackage>();
+			updateWrapper.set(TicketPackage::getStatus, TicketPkgStatusEnum.SOLD);
+			updateWrapper.in(TicketPackage::getPkgId, pkgIdList);
+			return ticketPackageService.update(updateWrapper);
+		}
+		
+		return false;
+	}
+	  
+  
 }

+ 129 - 124
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java

@@ -2,6 +2,7 @@ package com.qs.mp.channel.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.vo.ChannelOperDataVO;
 import com.qs.mp.channel.domain.vo.ChannelVO;
@@ -18,8 +19,6 @@ import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysRoleService;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.utils.SecurityUtils;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
 import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -34,130 +33,136 @@ import org.springframework.transaction.annotation.Transactional;
  * @since 2022-03-02
  */
 @Service
-public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> implements IChannelService {
-
-	@Autowired
-	private IChannelService channelService;
-
-	@Autowired
-	private IChannelUserRelService channelUserRelService;
-
-	@Autowired
-	private IChannelCommissionService channelCommissionService;
-
-    @Autowired
-    private ISysUserService userService;
-
-    @Autowired
-    private ISysRoleService roleService;
-
-	@Override
-	@Transactional
-	public void saveChannel(Channel channel, ChannelRoleEnum channelRole){
-		boolean res = channelService.save(channel);
-		if(res && null != channel.getChannelId()) {
-			channel.setChannelNo(channel.getChannelNo()+channel.getChannelId());
-		    // 获取默认的角色
-		    SysRole sysRole = roleService.selectDefaultRoleByType(
-						channelRole == ChannelRoleEnum.CHANNEL ? RoleTypeEnum.CHANNEL_ROLE.getValue() : RoleTypeEnum.SALESITE_ROLE.getValue());
-		    if (null == sysRole || null == sysRole.getRoleId()) {
-		      throw new ServiceException(
-		          "未设置默认角色,请联系管理员");
-		    }
-			// 生成用户
-			SysUser sysUser = new SysUser();
-			sysUser.setUserName(channel.getMobile());
-		    sysUser.setPhonenumber(channel.getMobile());
-		    sysUser.setNickName(channel.getMobile());
+public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> implements
+    IChannelService {
+
+  @Autowired
+  private IChannelService channelService;
+
+  @Autowired
+  private IChannelUserRelService channelUserRelService;
+
+  @Autowired
+  private IChannelCommissionService channelCommissionService;
+
+  @Autowired
+  private ISysUserService userService;
+
+  @Autowired
+  private ISysRoleService roleService;
+
+  @Override
+  @Transactional
+  public void saveChannel(Channel channel, ChannelRoleEnum channelRole) {
+    boolean res = channelService.save(channel);
+    if (res && null != channel.getChannelId()) {
+      channel.setChannelNo(channel.getChannelNo() + channel.getChannelId());
+			SysUser sysUser = userService.selectUserByUserName(channel.getMobile());
+			if (null == sysUser) {
+				// 生成用户
+				sysUser = new SysUser();
+				sysUser.setUserName(channel.getMobile());
+				sysUser.setPhonenumber(channel.getMobile());
+				sysUser.setNickName(channel.getMobile());
 //		    sysUser.setDeptId(SecurityUtils.getDeptId());
 //			sysUser.setCreateBy(SecurityUtils.getUsername());
-			Long[] roleIds = new Long[1];
-			roleIds[0] = sysRole.getRoleId();
-		    sysUser.setRoleIds(roleIds);
-			int userNum = userService.insertUser(sysUser);
-		    if (userNum == 0 || null == sysUser.getUserId()) {
-		        throw new ServiceException("账号创建失败,请联系管理员");
-		    }
-		    channel.setUserId(sysUser.getUserId());
-		    boolean ures = channelService.updateById(channel);
-		    if(!ures) {
-		    	throw new ServiceException("请联系管理员");
-		    }
-		    // 4.发送账号创建成功短信
-			JSMSUtils.sendChannelActNotify(channel.getMobile());
-		}else {
-			throw new ServiceException("请联系管理员");
-		}
-	}
-
-
-	@Override
-	@Transactional
-	public void updateChannel(Channel channel, boolean mobileChange) {
-	    // 4.更新入库
-		 boolean editRes = channelService.updateById(channel);
-		 if(editRes && mobileChange
-				 && null != channel.getUserId()) {
-			 SysUser sysUser = new SysUser();
-			 sysUser.setUserId(channel.getUserId());
-			 sysUser.setUserName(channel.getMobile());
-			 sysUser.setPhonenumber(channel.getMobile());
-			 sysUser.setNickName(channel.getName());
-			 sysUser.setDeptId(SecurityUtils.getDeptId());
-			 int userNum = userService.updateUser(sysUser);
-			 if (userNum == 0 || null == sysUser.getUserId()) {
-		       throw new ServiceException("更新失败,请联系管理员");
-		     }
-			 // 发送账号更新成功短信
-		 }
-	}
-
-	@Override
-	public List<ChannelVO> selectChannelVoList(Wrapper<Channel> queryWrapper) {
-		return getBaseMapper().selectChannelVoList(queryWrapper);
-	}
-
-	@Override
-	public Channel getChannelByUserId(Long userId) {
-		return getBaseMapper().selectOne(new LambdaQueryWrapper<Channel>().eq(Channel::getUserId, userId));
-	}
-
-	@Override
-	public int getChannelSiteCnt(String channelNo) {
-		return getBaseMapper().getChannelSiteCnt(channelNo);
-	}
-
-	@Override
-	public ChannelVO getChannelVoById(Long channelId) {
-		return getBaseMapper().getChannelVoById(channelId);
-	}
-
-	@Override
-	public ChannelOperDataVO getChannelOperData(String channelNo, int days) {
-		ChannelOperDataVO channelOperData = new ChannelOperDataVO();
-		// 查询销售金额
-		channelOperData.setSaleAmt(channelCommissionService.getChannelSaleAmtCnt(channelNo, days));
-		// 查询佣金金额
-		channelOperData.setCommAmt(channelCommissionService.getChannelCommAmtCnt(channelNo, days));
-		// 查询新增用户数
-		int newUserCnt = channelUserRelService.getChannelNewUserCnt(channelNo, days);
-		channelOperData.setNewUserCnt(newUserCnt);
-		return channelOperData;
-	}
-
-
-	@Override
-	public ChannelOperDataVO getChannelTotalOperData(String channelNo) {
-		ChannelOperDataVO channelOperData = new ChannelOperDataVO();
-		// 查询销售金额
-		channelOperData.setSaleAmt(channelCommissionService.getChannelTotalSaleAmtCnt(channelNo));
-		// 查询佣金金额
-		channelOperData.setCommAmt(channelCommissionService.getChannelTotalCommAmtCnt(channelNo));
-		// 查询新增用户数
-		// int newUserCnt = channelUserRelService.getChannelNewUserCnt(channelNo, days);
-		// channelOperData.setNewUserCnt(newUserCnt);
-		return channelOperData;
-	}
+				// 获取默认的角色
+				SysRole sysRole = roleService.selectDefaultRoleByType(
+						channelRole == ChannelRoleEnum.CHANNEL ? RoleTypeEnum.CHANNEL_ROLE.getValue()
+								: RoleTypeEnum.SALESITE_ROLE.getValue());
+				if (null == sysRole || null == sysRole.getRoleId()) {
+					throw new ServiceException(
+							"未设置默认角色,请联系管理员");
+				}
+				Long[] roleIds = new Long[1];
+				roleIds[0] = sysRole.getRoleId();
+				sysUser.setRoleIds(roleIds);
+				int userNum = userService.insertUser(sysUser);
+				if (userNum == 0 || null == sysUser.getUserId()) {
+					throw new ServiceException("账号创建失败,请联系管理员");
+				}
+			}
+      channel.setUserId(sysUser.getUserId());
+      boolean ures = channelService.updateById(channel);
+      if (!ures) {
+        throw new ServiceException("请联系管理员");
+      }
+      // 4.发送账号创建成功短信
+      JSMSUtils.sendChannelActNotify(channel.getMobile());
+    } else {
+      throw new ServiceException("请联系管理员");
+    }
+  }
+
+
+  @Override
+  @Transactional
+  public void updateChannel(Channel channel, boolean mobileChange) {
+    // 4.更新入库
+    boolean editRes = channelService.updateById(channel);
+    if (editRes && mobileChange
+        && null != channel.getUserId()) {
+      SysUser sysUser = new SysUser();
+      sysUser.setUserId(channel.getUserId());
+      sysUser.setUserName(channel.getMobile());
+      sysUser.setPhonenumber(channel.getMobile());
+      sysUser.setNickName(channel.getName());
+      sysUser.setDeptId(SecurityUtils.getDeptId());
+      int userNum = userService.updateUser(sysUser);
+      if (userNum == 0 || null == sysUser.getUserId()) {
+        throw new ServiceException("更新失败,请联系管理员");
+      }
+      // 发送账号更新成功短信
+    }
+  }
+
+  @Override
+  public List<ChannelVO> selectChannelVoList(Wrapper<Channel> queryWrapper) {
+    return getBaseMapper().selectChannelVoList(queryWrapper);
+  }
+
+  @Override
+  public Channel getChannelByUserId(Long userId) {
+    return getBaseMapper().selectOne(
+        new LambdaQueryWrapper<Channel>().eq(Channel::getUserId, userId));
+  }
+
+  @Override
+  public int getChannelSiteCnt(String channelNo) {
+    return getBaseMapper().getChannelSiteCnt(channelNo);
+  }
+
+  @Override
+  public ChannelVO getChannelVoById(Long channelId) {
+    return getBaseMapper().getChannelVoById(channelId);
+  }
+
+  @Override
+  public ChannelOperDataVO getChannelOperData(String channelNo, int days) {
+    ChannelOperDataVO channelOperData = new ChannelOperDataVO();
+    // 查询销售金额
+    channelOperData.setSaleAmt(channelCommissionService.getChannelSaleAmtCnt(channelNo, days));
+    // 查询佣金金额
+    channelOperData.setCommAmt(channelCommissionService.getChannelCommAmtCnt(channelNo, days));
+    // 查询新增用户数
+    int newUserCnt = channelUserRelService.getChannelNewUserCnt(channelNo, days);
+    channelOperData.setNewUserCnt(newUserCnt);
+    return channelOperData;
+  }
+
+
+  @Override
+  public ChannelOperDataVO getChannelTotalOperData(String channelNo) {
+    ChannelOperDataVO channelOperData = new ChannelOperDataVO();
+    // 查询销售金额
+    channelOperData.setSaleAmt(channelCommissionService.getChannelTotalSaleAmtCnt(channelNo));
+    // 查询佣金金额
+    channelOperData.setCommAmt(channelCommissionService.getChannelTotalCommAmtCnt(channelNo));
+    // 查询新增用户数
+    // int newUserCnt = channelUserRelService.getChannelNewUserCnt(channelNo, days);
+    // channelOperData.setNewUserCnt(newUserCnt);
+    return channelOperData;
+  }
 
 
 }

+ 56 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java

@@ -1,11 +1,13 @@
 package com.qs.mp.channel.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelBankCard;
 import com.qs.mp.channel.domain.ChannelMoneyLog;
 import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.vo.ChannelWithdrawVO;
 import com.qs.mp.channel.mapper.ChannelWithdrawMapper;
 import com.qs.mp.channel.service.IChannelBankCardService;
 import com.qs.mp.channel.service.IChannelMoneyLogService;
@@ -13,10 +15,14 @@ import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelWithdrawService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.common.enums.ChannelMoneyEnum;
+import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
+import com.qs.mp.common.utils.LogUtil;
 import java.util.Date;
+import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
 
 /**
  * <p>
@@ -84,4 +90,54 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
     // 创建提现记录
     return rst;
   }
+
+  @Override
+  public List<ChannelWithdrawVO> listWithdrawVO(Wrapper<ChannelWithdraw> queryWrapper) {
+    return getBaseMapper().listWithdrawVO(queryWrapper);
+  }
+
+  @Override
+  @Transactional
+  public boolean verify(ChannelWithdraw withdraw, ChannelWithdrawStatusEnum status, String verifyContent) {
+    if (status == ChannelWithdrawStatusEnum.FINISHED) {
+      boolean rtn = update(new LambdaUpdateWrapper<ChannelWithdraw>()
+          .set(ChannelWithdraw::getStatus, status)
+          .set(ChannelWithdraw::getTransferTime, new Date())
+          .eq(ChannelWithdraw::getId, withdraw.getId())
+          .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAWING));
+      Assert.isTrue(rtn, "提现申请审核通过,更新提现申请状态失败。id:" + withdraw.getId());
+
+      // 更新冻结金额
+      Channel channel = channelService.getById(withdraw.getChannelId());
+      Assert.isTrue(channel.getFrozenMoney() >= withdraw.getMoney() + withdraw.getChargeAmt(),
+          "提现申请审核通过,更新冻结金额时冻结金额为:" + channel.getFrozenMoney() + ",本次要释放冻结金额为:" + withdraw.getMoney() + withdraw.getChargeAmt());
+
+      boolean updateRtn = channelService.update(new LambdaUpdateWrapper<Channel>()
+          .set(Channel::getFrozenMoney, channel.getFrozenMoney() - withdraw.getMoney() - withdraw.getChargeAmt())
+          .eq(Channel::getChannelId, withdraw.getChannelId())
+          .eq(Channel::getFrozenMoney, channel.getFrozenMoney()));
+      Assert.isTrue(updateRtn, "提现申请审核通过,更新账号冻结金额。channelId:" + channel.getChannelId());
+    } else if (status == ChannelWithdrawStatusEnum.FAILED) {
+      boolean rtn = update(new LambdaUpdateWrapper<ChannelWithdraw>()
+          .set(ChannelWithdraw::getStatus, status)
+          .set(ChannelWithdraw::getVerifyContent, verifyContent)
+          .eq(ChannelWithdraw::getId, withdraw.getId())
+          .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAWING));
+      Assert.isTrue(rtn, "提现申请审核不通过,更新提现申请状态失败。id:" + withdraw.getId());
+
+      // 退回冻结金额
+      Channel channel = channelService.getById(withdraw.getChannelId());
+      Assert.isTrue(channel.getFrozenMoney() >= withdraw.getMoney() + withdraw.getChargeAmt(),
+          "提现申请审核不通过,解冻冻结金额时冻结金额为:" + channel.getFrozenMoney() + ",本次要解冻金额为:" + withdraw.getMoney() + withdraw.getChargeAmt());
+      ChannelMoneyLog moneyLog = new ChannelMoneyLog();
+      moneyLog.setChannelId(channel.getChannelId());
+      moneyLog.setType(ChannelMoneyEnum.WITHDRAW_BACK);
+      moneyLog.setLogMoney(withdraw.getMoney() + withdraw.getChargeAmt());
+      moneyLog.setBizTime(new Date());
+      moneyLog.setRefId(String.valueOf(withdraw.getId()));
+      moneyLog.setLogText(null);
+      channelMoneyLogService.changeMoney(moneyLog);
+    }
+    return true;
+  }
 }

+ 2 - 2
mp-service/src/main/java/com/qs/mp/sms/service/impl/SmsLogServiceImpl.java

@@ -30,10 +30,10 @@ public class SmsLogServiceImpl extends ServiceImpl<SmsLogMapper, SmsLog> impleme
 
   @Override
   public String sendSmsVerifyCode(String mobile) {
-    SysUser sysUser = sysUserService.selectUserByUserName(mobile);
+    /*SysUser sysUser = sysUserService.selectUserByUserName(mobile);
     if (null == sysUser) {
       throw new ServiceException(ErrorCodeEnum.ERROR_CODE_1013);
-    }
+    }*/
     SendSMSResult res = JSMSUtils.sendSMSCode(mobile);
     if (res != null) {
       saveSmsLog(mobile, res, SmsSendSceneEnum.VERIFY);

+ 0 - 65
mp-service/src/main/java/com/qs/mp/user/domain/UserCouponVerifyLog.java

@@ -1,65 +0,0 @@
-package com.qs.mp.user.domain;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import java.util.Date;
-import lombok.Data;
-
-/**
- * @describe 优惠券核销记录实体类
- * @auther quanshu
- * @create 2022-03-07 20:45:43
- */
-@TableName("mp_user_coupon_verify_log")
-@Data
-public class UserCouponVerifyLog implements Serializable {
-
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * 主键
-   */
-  @TableId(value = "id", type = IdType.AUTO)
-  private Long id;
-
-  /**
-   * 用户优惠券ID
-   */
-  @TableField("user_coupon_id")
-  private Long userCouponId;
-
-  /**
-   * 优惠券ID
-   */
-  @TableField("coupon_id")
-  private String couponId;
-
-  /**
-   * 核销时间
-   */
-  @TableField("verify_time")
-  private Date verifyTime;
-
-  /**
-   * 核销用户
-   */
-  @TableField("verify_user")
-  private String verifyUser;
-
-  /**
-   * 创建时间
-   */
-  @TableField("created_time")
-  private Date createdTime;
-
-  /**
-   * 更新时间
-   */
-  @TableField("updated_time")
-  private Date updatedTime;
-
-
-}

+ 0 - 13
mp-service/src/main/java/com/qs/mp/user/mapper/UserCouponVerifyLogMapper.java

@@ -1,13 +0,0 @@
-package com.qs.mp.user.mapper;
-
-import com.qs.mp.user.domain.UserCouponVerifyLog;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * @auther quanshu
- * @create 2022-03-07 20:45:43
- * @describe 优惠券核销记录mapper类
- */
-public interface UserCouponVerifyLogMapper extends BaseMapper<UserCouponVerifyLog> {
-
-}

+ 10 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java

@@ -1,10 +1,13 @@
 package com.qs.mp.user.service;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
 import com.qs.mp.user.domain.UserCoupon;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.user.domain.vo.UserCouponVO;
 import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -36,4 +39,11 @@ public interface IUserCouponService extends IService<UserCoupon> {
    * @return
    */
   List<UserCouponVO> listCoupon(Long userId, UserCouponStatusEnum status);
+
+  /**
+   * 查询券列表
+   * @param queryWrapper
+   * @return
+   */
+  List<UserCouponVO> listUserCouponVO(Wrapper<UserCoupon> queryWrapper);
 }

+ 0 - 16
mp-service/src/main/java/com/qs/mp/user/service/IUserCouponVerifyLogService.java

@@ -1,16 +0,0 @@
-package com.qs.mp.user.service;
-
-import com.qs.mp.user.domain.UserCouponVerifyLog;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * <p>
- * 优惠券核销记录 服务类
- * </p>
- *
- * @author quanshu
- * @since 2022-03-07
- */
-public interface IUserCouponVerifyLogService extends IService<UserCouponVerifyLog> {
-
-}

+ 10 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java

@@ -2,6 +2,7 @@ package com.qs.mp.user.service;
 
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
 
 import java.util.List;
 
@@ -64,4 +65,13 @@ public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 	 * @return
 	 */
 	public int selectUserDeliverOrderCount(Wrapper<UserDeliverOrder> wrapper);
+	
+	
+	/**
+	 * 用户提货订单发货
+	 * @param orderId
+	 * @param itemList
+	 * @return
+	 */
+	boolean userDeliverOrderShip(String orderId, List<UserDeliverOrderItem> itemList);
 }

+ 2 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCoinServiceImpl.java

@@ -41,12 +41,13 @@ public class UserCoinServiceImpl extends ServiceImpl<UserCoinMapper, UserCoin> i
       boolean rtn = update(new LambdaUpdateWrapper<UserCoin>().set(UserCoin::getCoin, userCoin.getCoin() + logCoin)
           .eq(UserCoin::getUserId, userId).eq(UserCoin::getCoin, userCoin.getCoin()));
       Assert.isTrue(rtn, "更新盲豆余额失败。userId:" + userId);
+      userCoin.setCoin(userCoin.getCoin() + logCoin);
     }
 
     UserCoinLog userCoinLog = new UserCoinLog();
     userCoinLog.setUserId(userId);
     userCoinLog.setType(CoinLogTypeEnum.PRIZE);
-    userCoinLog.setMoney(userCoin.getCoin() + logCoin);
+    userCoinLog.setMoney(userCoin.getCoin());
     userCoinLog.setLogMoney(logCoin);
     userCoinLog.setIncomeExpense(CoinLogTypeEnum.INCOME);
     userCoinLog.setLogText("盲票奖品");

+ 7 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qs.mp.common.enums.CouponTypeEnum;
 import com.qs.mp.common.enums.UserCouponStatusEnum;
@@ -52,9 +53,14 @@ public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCou
       queryWrapper.eq("t1.status", UserCouponStatusEnum.UNUSED)
           .lt("t1.valid_end", DateUtils.getToday());
     } else if (status == UserCouponStatusEnum.USED) {
-      queryWrapper.eq("t1.status", UserCouponStatusEnum.UNUSED);
+      queryWrapper.eq("t1.status", UserCouponStatusEnum.USED);
     }
     List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(queryWrapper);
     return userCouponVOList;
   }
+
+  @Override
+  public List<UserCouponVO> listUserCouponVO(Wrapper<UserCoupon> queryWrapper) {
+    return getBaseMapper().listUserCouponVO(queryWrapper);
+  }
 }

+ 0 - 20
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponVerifyLogServiceImpl.java

@@ -1,20 +0,0 @@
-package com.qs.mp.user.service.impl;
-
-import com.qs.mp.user.domain.UserCouponVerifyLog;
-import com.qs.mp.user.mapper.UserCouponVerifyLogMapper;
-import com.qs.mp.user.service.IUserCouponVerifyLogService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 优惠券核销记录 服务实现类
- * </p>
- *
- * @author quanshu
- * @since 2022-03-07
- */
-@Service
-public class UserCouponVerifyLogServiceImpl extends ServiceImpl<UserCouponVerifyLogMapper, UserCouponVerifyLog> implements IUserCouponVerifyLogService {
-
-}

+ 26 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java

@@ -47,6 +47,9 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
+  @Autowired
+  private IUserDeliverOrderService userDeliverOrderService;
+
   @Autowired
   private IUserDeliverOrderItemService userDeliverOrderItemService;
 
@@ -145,5 +148,27 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
 	public int selectUserDeliverOrderCount(Wrapper<UserDeliverOrder> wrapper) {
 		return getBaseMapper().selectUserDeliverOrderCount(wrapper);
 	}
-  
+
+	@Override
+	@Transactional
+	public boolean userDeliverOrderShip(String orderId, List<UserDeliverOrderItem> itemList) {
+		boolean res = userDeliverOrderItemService.updateBatchById(itemList);
+		if(res) {
+			// 检测订单是否全部提货完成
+			LambdaQueryWrapper<UserDeliverOrderItem> queryWrapper = new LambdaQueryWrapper<UserDeliverOrderItem>();
+			queryWrapper.eq(UserDeliverOrderItem::getOrderId, orderId);
+			queryWrapper.isNull(UserDeliverOrderItem::getDeliveryFlowId);
+			int noShipCnt = userDeliverOrderItemService.count(queryWrapper);
+			// 部分发货是订单状态仍保留待发货状态, 全部发完的时候再修改订单状态为待收货
+			LambdaUpdateWrapper<UserDeliverOrder> updateWrapper = new LambdaUpdateWrapper<UserDeliverOrder>();
+			updateWrapper.eq(UserDeliverOrder::getOrderId, orderId);
+			if(noShipCnt == 0) {
+				updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_CONFIRM);
+			}else {
+				updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.PART_DELIVER);
+			}
+			return userDeliverOrderService.update(updateWrapper);
+		}
+		return false;
+	}
 }

+ 28 - 0
mp-service/src/main/resources/mapper/channel/ChannelCouponVerifyLogMapper.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.channel.mapper.ChannelCouponVerifyLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelCouponVerifyLog">
+        <id column="id" property="id" />
+        <result column="channel_id" property="channelId" />
+        <result column="user_coupon_id" property="userCouponId" />
+        <result column="verify_code" property="verifyCode" />
+        <result column="title" property="title" />
+        <result column="discount_type" property="discountType" />
+        <result column="discount" property="discount" />
+        <result column="distribute_time" property="distributeTime" />
+        <result column="valid_start" property="validStart" />
+        <result column="valid_end" property="validEnd" />
+        <result column="verify_time" property="verifyTime" />
+        <result column="settle_status" property="settleStatus" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, channel_id, user_coupon_id, verify_code, title, discount_type, discount, distribute_time, valid_start, valid_end, verify_time, settle_status, created_time, updated_time
+    </sql>
+
+</mapper>

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

@@ -10,6 +10,7 @@
         <result column="parent_id" property="parentId" />
         <result column="level" property="level" />
         <result column="site_type" property="siteType" />
+        <result column="site_name" property="siteName" />
         <result column="comm_rate" property="commRate" />
         <result column="province" property="province" />
         <result column="province_id" property="provinceId" />
@@ -36,7 +37,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        channel_id, channel_no, name, parent_id, level, site_type, comm_rate, province, province_id, city, city_id, area, area_id, address, contact, mobile, user_id, money, frozen_money, certify_status, verify_status, biz_license_pic, door_pic, memo, invite_pic, status, created_time, updated_time
+        channel_id, channel_no, name, parent_id, level, site_type, site_name, comm_rate, province, province_id, city, city_id, area, area_id, address, contact, mobile, user_id, money, frozen_money, certify_status, verify_status, biz_license_pic, door_pic, memo, invite_pic, status, created_time, updated_time
     </sql>
 
     <!-- 查询子渠道信息 -->
@@ -54,7 +55,7 @@
 		where t1.`level`= 0
 		and (t1.channel_no like concat(#{channelNo}, '.%') or t1.channel_no = #{channelNo})
     </select>
-    
+
      <!-- 查询渠道信息 -->
     <select id="getChannelVoById" resultType="com.qs.mp.channel.domain.vo.ChannelVO">
 		select t1.* , t2.name parentName

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

@@ -16,6 +16,7 @@
         <result column="branch_name" property="branchName" />
         <result column="status" property="status" />
         <result column="transfer_img" property="transferImg" />
+        <result column="transfer_time" property="transferTime" />
         <result column="verify_content" property="verifyContent" />
         <result column="verifier" property="verifier" />
         <result column="create_time" property="createTime" />
@@ -24,7 +25,14 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, channel_id, money, charge_amt, available_money, pay_type, user_name, card_no, bank_name, branch_name, status, transfer_img, verify_content, verifier, create_time, update_time
+        id, channel_id, money, charge_amt, available_money, pay_type, user_name, card_no, bank_name, branch_name, status, transfer_img, transfer_time, verify_content, verifier, create_time, update_time
     </sql>
 
+    <select id="listWithdrawVO" resultType="com.qs.mp.channel.domain.vo.ChannelWithdrawVO">
+        select t1.*, t2.name, t2.level, t2.mobile
+        from mp_channel_withdraw t1
+                 left join mp_channel t2 on t1.channel_id = t2.channel_id
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>

+ 0 - 21
mp-service/src/main/resources/mapper/user/UserCouponVerifyLogMapper.xml

@@ -1,21 +0,0 @@
-<?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.user.mapper.UserCouponVerifyLogMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.qs.mp.user.domain.UserCouponVerifyLog">
-        <id column="id" property="id" />
-        <result column="user_coupon_id" property="userCouponId" />
-        <result column="coupon_id" property="couponId" />
-        <result column="verify_time" property="verifyTime" />
-        <result column="verify_user" property="verifyUser" />
-        <result column="created_time" property="createdTime" />
-        <result column="updated_time" property="updatedTime" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, user_coupon_id, coupon_id, verify_time, verify_user, created_time, updated_time
-    </sql>
-
-</mapper>