zhangkaikai vor 1 Jahr
Ursprung
Commit
232be13da9

+ 107 - 13
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/SaleSiteMgrController.java

@@ -5,13 +5,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qs.mp.admin.domain.excel.ChannelExcel;
-import com.qs.mp.admin.domain.excel.UserTicketOrderItemExcel;
+import com.qs.mp.admin.domain.excel.ChannelImportExcel;
 import com.qs.mp.admin.domain.param.ChannelQueryParam;
+import com.qs.mp.admin.domain.vo.ChannelImportErrorVO;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
-import com.qs.mp.channel.domain.ChannelOrder;
-import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.channel.domain.param.ChannelParam;
 import com.qs.mp.channel.domain.param.SaleSiteEditParam;
@@ -28,10 +27,8 @@ 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.UserTicketOrderStatusEnum;
-import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.system.service.ISysUserService;
-import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.ExcelUtil;
 import com.qs.mp.web.controller.common.BaseApiController;
@@ -41,23 +38,18 @@ import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import ma.glasnost.orika.MapperFacade;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
 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.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
-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;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * @auther zhongcp
@@ -174,6 +166,108 @@ public class SaleSiteMgrController extends BaseApiController {
         return "";
     }
 
+    @PostMapping("/template/download")
+    @ApiOperation("下载门店导入模板")
+    public AjaxResult siteTemplateDownLoad() {
+        ExcelUtil<ChannelImportExcel> excelUtil = new ExcelUtil<>(ChannelImportExcel.class);
+        return excelUtil.exportExcel(null, "门店导入模板", false);
+    }
+
+
+    @PostMapping("/import")
+    @ApiOperation("导入门店信息")
+    @PreAuthorize("@ss.hasPermi('business::salesite:import')")
+    public AjaxResult saleSiteImport(@RequestParam("file") MultipartFile file) {
+
+        try {
+            // 解析excel数据
+            ExcelUtil<ChannelImportExcel> excelUtil = new ExcelUtil<>(ChannelImportExcel.class);
+            List<ChannelImportExcel> siteList = excelUtil.importExcel(file.getInputStream());
+            if (CollectionUtils.isEmpty(siteList)) {
+                return AjaxResult.error("导入数据为空");
+            }
+            // 校验导入门店手机号是否重复
+            List<String> mobileList = new ArrayList<>();
+            for (ChannelImportExcel channelImportExcel : siteList) {
+                if (StringUtils.isEmpty(channelImportExcel.getMobile())) {
+                    return AjaxResult.error("导入的手机号存在空值");
+                }
+                if (StringUtils.isEmpty(channelImportExcel.getName())) {
+                    return AjaxResult.error("导入的门店名称存在空值");
+                }
+                if (StringUtils.isEmpty(channelImportExcel.getParentsName())) {
+                    return AjaxResult.error("导入的上级渠道为空");
+                }
+                if (channelImportExcel.getCommRate() == null) {
+                    return AjaxResult.error("导入的佣金比例为空");
+                }
+                mobileList.add(channelImportExcel.getMobile());
+            }
+            long count = mobileList.stream().distinct().count();
+            if (siteList.size() != count) {
+                return AjaxResult.error("导入的手机号存在重复值");
+            }
+
+            // 该账号是否已注册 门店是否已注册
+//            checkIsRegister(mobileList);
+
+            // 门店名称不能重复
+            long nameCount = siteList.stream().map(ChannelImportExcel::getName).distinct().count();
+            if (siteList.size() != nameCount) {
+                return AjaxResult.error("导入的门店名称存在重复");
+            }
+
+            // 判断上级渠道是否存在
+            List<ChannelImportErrorVO> channelImportErrorVOS = new ArrayList<>();
+            siteList.forEach(importExcel -> {
+                ChannelImportErrorVO importErrorVO = mapperFacade.map(importExcel, ChannelImportErrorVO.class);
+                Channel parentsChannel = channelService.getOne(new QueryWrapper<Channel>().eq("name", importExcel.getParentsName()));
+                if (parentsChannel == null) {
+                    importErrorVO.setErrorReason("上级渠道不存在");
+                } else {
+                    if (importExcel.getCommRate().compareTo(parentsChannel.getCommRate()) > 0) {
+                        importErrorVO.setErrorReason("佣金比例大于上级渠道");
+                    }
+                }
+                Channel site = channelService.getOne(
+                        new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, importExcel.getMobile()));
+                if (site != null) {
+                    importErrorVO.setErrorReason(importErrorVO.getErrorReason() == null ? "" : importErrorVO.getErrorReason() + "/" + "门店已被注册");
+                }
+                if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(importExcel.getMobile()))) {
+                    importErrorVO.setErrorReason(importErrorVO.getErrorReason() == null ? "" : importErrorVO.getErrorReason() + "/" + "手机号已被注册");
+                }
+                if (importErrorVO.getErrorReason() != null) {
+                    channelImportErrorVOS.add(importErrorVO);
+                }
+            });
+
+            if (!CollectionUtils.isEmpty(channelImportErrorVOS)) {
+                return AjaxResult.error("导入信息有误", channelImportErrorVOS);
+            }
+            // 导入门店 并注册账号
+            channelService.importSite(siteList);
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success();
+    }
+
+    private void checkIsRegister(List<String> mobileList) {
+        mobileList.forEach(mobile -> {
+            int mobileCount = channelService.count(
+                    new LambdaQueryWrapper<Channel>().eq(Channel::getMobile, mobile));
+            if (mobileCount > 0) {
+                throw new ServiceException("手机号码" + mobile + "已注册!");
+            }
+            if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(mobile))) {
+                throw new ServiceException("手机号码" + mobile + "已注册!");
+            }
+        });
+    }
+
+
     @PostMapping("/export")
     @PreAuthorize("@ss.hasPermi('business:salesite:export')")
     @ApiOperation("导出经销商信息")

+ 28 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/excel/ChannelImportExcel.java

@@ -0,0 +1,28 @@
+package com.qs.mp.admin.domain.excel;
+
+import com.qs.mp.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-22 4:29 PM
+ **/
+
+@ApiModel("门店导入模板")
+@Data
+public class ChannelImportExcel {
+    @Excel(name = "手机号")
+    private String mobile;
+
+    @Excel(name = "门店名称")
+    private String name;
+
+    @Excel(name = "佣金比例(%)")
+    private BigDecimal commRate;
+
+    @Excel(name = "上级渠道")
+    private String parentsName;
+}

+ 33 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/vo/ChannelImportErrorVO.java

@@ -0,0 +1,33 @@
+package com.qs.mp.admin.domain.vo;
+
+import com.qs.mp.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhangkaikai
+ * @create 2023-05-23 11:07 AM
+ **/
+
+@Data
+@ApiModel
+public class ChannelImportErrorVO {
+
+    @ApiModelProperty("错误原因")
+    private String errorReason;
+
+    @ApiModelProperty("手机号")
+    private String mobile;
+
+    @ApiModelProperty("门店名称")
+    private String name;
+
+    @ApiModelProperty("佣金比例")
+    private BigDecimal commRate;
+
+    @ApiModelProperty("上级渠道")
+    private String parentsName;
+}

+ 8 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelService.java

@@ -1,6 +1,8 @@
 package com.qs.mp.channel.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.excel.ChannelImportExcel;
+import com.qs.mp.admin.domain.vo.ChannelImportErrorVO;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.param.PromoterCreateParam;
@@ -152,4 +154,10 @@ public interface IChannelService extends IService<Channel> {
      * @param channelId 推广员id
      */
     void deletePromoter(Long channelId);
+
+    /**
+     * 导入门店并注册账号
+     * @param siteList
+     */
+    void importSite(List<ChannelImportExcel> siteList);
 }

+ 47 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelServiceImpl.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.admin.domain.excel.ChannelImportExcel;
+import com.qs.mp.admin.domain.vo.ChannelImportErrorVO;
 import com.qs.mp.admin.domain.vo.IndexVO;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.PromoterUser;
@@ -34,7 +36,10 @@ import com.qs.mp.user.service.IUserAddrService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -220,6 +225,48 @@ public class ChannelServiceImpl extends ServiceImpl<ChannelMapper, Channel> impl
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void importSite(List<ChannelImportExcel> siteList) {
+
+        siteList.forEach(site -> {
+            // 注册账号
+            SysUser user = new SysUser();
+            user.setUserName(site.getMobile());
+            user.setNickName(site.getMobile());
+            user.setPhonenumber(site.getMobile());
+            user.setCreateBy("门店导入");
+            // 获取默认的角色
+            SysRole sysRole = roleService.selectDefaultRoleByType(RoleTypeEnum.SALESITE_ROLE.getValue());
+            if (null == sysRole || null == sysRole.getRoleId()) {
+                throw new ServiceException("未设置默认角色,请联系管理员");
+            }
+            Long[] roleIds = new Long[1];
+            roleIds[0] = sysRole.getRoleId();
+            user.setRoleIds(roleIds);
+            int userNum = userService.insertUser(user);
+            if (userNum == 0 || null == user.getUserId()) {
+                throw new ServiceException("账号创建失败,请联系管理员");
+            }
+
+            // 注册门店
+            Channel parentsChannel = channelService.getOne(new QueryWrapper<Channel>().eq("name", site.getParentsName()));
+            Channel channel = new Channel();
+            channel.setUserId(user.getUserId());
+            channel.setName(site.getName());
+            channel.setMobile(site.getMobile());
+            channel.setLevel(0);
+            channel.setChannelNo(parentsChannel.getChannelNo() + ".");
+            channel.setParentId(parentsChannel.getChannelId());
+            boolean res = channelService.save(channel);
+            if (res && null != channel.getChannelId()) {
+                channel.setChannelNo(channel.getChannelNo() + channel.getChannelId());
+                channelService.updateById(channel);
+            } else {
+                throw new ServiceException("手机号" + site.getMobile() + "注册门店失败");
+            }
+        });
+    }
 
     @Override
     @Transactional