From 4ecc52d0f6558cbbcec1c86647c9dba04ac66b7d Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期五, 06 十二月 2024 17:35:33 +0800
Subject: [PATCH] add: 供应商子账号

---
 src/main/java/com/mzl/flower/dto/request/supplier/QuerySupplierSubDTO.java |   41 +++++
 src/main/java/com/mzl/flower/service/supplier/SupplierSubService.java      |  203 +++++++++++++++++++++++++
 src/main/java/com/mzl/flower/web/supplier/SupplierSubController.java       |   60 +++++++
 src/main/java/com/mzl/flower/mapper/supplier/SupplierSubMapper.java        |   16 ++
 src/main/java/com/mzl/flower/entity/supplier/SupplierSub.java              |   35 ++++
 src/main/java/com/mzl/flower/dto/request/supplier/SupplierSubDTO.java      |   28 +++
 src/main/java/com/mzl/flower/dto/response/supplier/SupplierSubVO.java      |   41 +++++
 src/main/resources/mapper/supplier/SupplierSubMapper.xml                   |   48 ++++++
 8 files changed, 472 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/mzl/flower/dto/request/supplier/QuerySupplierSubDTO.java b/src/main/java/com/mzl/flower/dto/request/supplier/QuerySupplierSubDTO.java
new file mode 100644
index 0000000..8ddf4c4
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/supplier/QuerySupplierSubDTO.java
@@ -0,0 +1,41 @@
+package com.mzl.flower.dto.request.supplier;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class QuerySupplierSubDTO {
+
+    @ApiModelProperty("供应商子账号ID")
+    private Long id;
+
+    @ApiModelProperty("供应商ID")
+    private Long supplierId;
+
+    @ApiModelProperty("供应商ID名称")
+    private String supplierName;
+
+    @ApiModelProperty("主账号手机号")
+    private String supplierPhone;
+
+    @ApiModelProperty("子账号手机号")
+    private String phone;
+
+//    @ApiModelProperty("申请时间(yyyy-mm-dd)")
+//    private String createDateBeginStr;
+//
+//    @ApiModelProperty("申请时间(yyyy-mm-dd)")
+//    private String createDateEndStr;
+
+    @ApiModelProperty("启用/禁用(USER_ENABLED_OR_DISABLED)")
+    private Integer isEnabled;
+
+//    @ApiModelProperty(value = "申请时间(yyyy-mm-dd)", hidden = true)
+//    private LocalDateTime createDateBegin;
+//
+//    @ApiModelProperty(value = "申请时间(yyyy-mm-dd)", hidden = true)
+//    private LocalDateTime createDateEnd;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/supplier/SupplierSubDTO.java b/src/main/java/com/mzl/flower/dto/request/supplier/SupplierSubDTO.java
new file mode 100644
index 0000000..e99f72b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/supplier/SupplierSubDTO.java
@@ -0,0 +1,28 @@
+package com.mzl.flower.dto.request.supplier;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SupplierSubDTO {
+
+    private Long id;
+
+    @ApiModelProperty("供应商ID(父ID)")
+    private Long supplierId;
+
+    @ApiModelProperty("子账号名称")
+    private String name;
+
+    @ApiModelProperty("子账号联系人")
+    private String contact;
+
+    @ApiModelProperty("子账号手机号")
+    private String phone;
+
+    @ApiModelProperty("子账号密码")
+    private String password;
+
+    @ApiModelProperty("启用/禁用")
+    private Boolean isEnabled;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/supplier/SupplierSubVO.java b/src/main/java/com/mzl/flower/dto/response/supplier/SupplierSubVO.java
new file mode 100644
index 0000000..7a8398f
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/supplier/SupplierSubVO.java
@@ -0,0 +1,41 @@
+package com.mzl.flower.dto.response.supplier;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+public class SupplierSubVO extends AbstractTransDTO {
+
+    private Long id;
+
+    @ApiModelProperty("供应商ID")
+    private String supplierId;
+
+    @ApiModelProperty("供应商ID名称")
+    private String supplierName;
+
+    @ApiModelProperty("供应商联系人")
+    private String contactName;
+
+    @ApiModelProperty("主账号(手机号)")
+    private String contactTel;
+
+    @ApiModelProperty("子账号名称")
+    private String name;
+
+    @ApiModelProperty("子账号手机号")
+    private String phone;
+
+    @ApiModelProperty("子账号联系人")
+    private String contact;
+
+    @ApiModelProperty("创建时间")
+    private Date createTime;
+
+    @ApiModelProperty("启用/禁用")
+    private Boolean isEnabled;
+}
diff --git a/src/main/java/com/mzl/flower/entity/supplier/SupplierSub.java b/src/main/java/com/mzl/flower/entity/supplier/SupplierSub.java
new file mode 100644
index 0000000..4902cc8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/supplier/SupplierSub.java
@@ -0,0 +1,35 @@
+package com.mzl.flower.entity.supplier;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("t_supplier_sub_info")
+public class SupplierSub extends BaseAutoEntity {
+    @ApiModelProperty("供应商ID(父ID)")
+    private String userId;
+
+    @ApiModelProperty("供应商ID(父ID)")
+    private Long supplierId;
+
+    @ApiModelProperty("子账号名称")
+    private String name;
+
+    @ApiModelProperty("子账号联系人")
+    private String contact;
+
+    @ApiModelProperty("子账号手机号")
+    private String phone;
+
+    @ApiModelProperty("子账号密码")
+    private String password;
+
+    @ApiModelProperty("启用/禁用")
+    private Boolean isEnabled;
+
+}
diff --git a/src/main/java/com/mzl/flower/mapper/supplier/SupplierSubMapper.java b/src/main/java/com/mzl/flower/mapper/supplier/SupplierSubMapper.java
new file mode 100644
index 0000000..c281252
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/supplier/SupplierSubMapper.java
@@ -0,0 +1,16 @@
+package com.mzl.flower.mapper.supplier;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.supplier.QuerySupplierSubDTO;
+import com.mzl.flower.dto.response.supplier.SupplierSubVO;
+import com.mzl.flower.entity.supplier.SupplierSub;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SupplierSubMapper extends BaseMapper<SupplierSub> {
+    List<SupplierSubVO> querySupplierSub(@Param("dto") QuerySupplierSubDTO dto, Page page);
+}
diff --git a/src/main/java/com/mzl/flower/service/supplier/SupplierSubService.java b/src/main/java/com/mzl/flower/service/supplier/SupplierSubService.java
new file mode 100644
index 0000000..14dab63
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/supplier/SupplierSubService.java
@@ -0,0 +1,203 @@
+package com.mzl.flower.service.supplier;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.register.RegisterDTO;
+import com.mzl.flower.dto.request.supplier.QuerySupplierSubDTO;
+import com.mzl.flower.dto.request.supplier.SupplierSubDTO;
+import com.mzl.flower.dto.response.supplier.SupplierDTO;
+import com.mzl.flower.dto.response.supplier.SupplierSubVO;
+import com.mzl.flower.entity.supplier.SupplierSub;
+import com.mzl.flower.entity.system.User;
+import com.mzl.flower.mapper.supplier.SupplierSubMapper;
+import com.mzl.flower.mapper.system.UserMapper;
+import com.mzl.flower.service.BaseService;
+import com.mzl.flower.utils.DateUtils;
+import com.mzl.flower.utils.UUIDGenerator;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class SupplierSubService {
+
+    private final SupplierSubMapper supplierSubMapper;
+    private final PasswordEncoder passwordEncoder;
+    private final UserMapper userMapper;
+    private final BaseService baseService;
+
+
+    public void addOrUpdateSupplier(SupplierSubDTO dto) {
+
+
+        SupplierSub supplierSub;
+        if (dto.getId() == null) {
+
+            if (StringUtils.isEmpty(dto.getSupplierId())) {
+                throw new ValidationException("供应商主账号ID不能为空");
+            }
+
+            //检查该供应商下是否有名称一样的子账号
+            if (checkExistName(dto.getName(), dto.getSupplierId())) {
+                throw new ValidationException("子账号名称已存在");
+            }
+
+            //检查手机号
+            String userType = Constants.USER_TYPE.supplier.name();
+            if (checkUserExist(dto.getPhone(), userType)) {
+                throw new ValidationException("该手机号码已经注册");
+            }
+
+            supplierSub = new SupplierSub();
+            BeanUtils.copyProperties(dto, supplierSub, "id");
+            supplierSub.create(SecurityUtils.getUserId());
+            supplierSub.setIsEnabled(true);
+
+            //用户信息注册
+            RegisterDTO registerDTO = new RegisterDTO();
+            registerDTO.setTel(supplierSub.getPhone());
+            String uuid = UUIDGenerator.getUUID();
+            String password = passwordEncoder.encode(supplierSub.getPassword());
+            registerDTO.setPassword(password);
+            registerUser(registerDTO, uuid, password);
+            supplierSub.setUserId(uuid);
+            //保存子账号信息
+            supplierSubMapper.insert(supplierSub);
+        } else {
+
+            supplierSub = supplierSubMapper.selectById(dto.getId());
+            if (supplierSub == null) {
+                throw new ValidationException("供应商子信息未登记");
+            }
+
+            if (!StringUtils.isEmpty(dto.getName()) && !dto.getName().equals(supplierSub.getName())) {
+                if (checkExistName(dto.getName(), supplierSub.getSupplierId())) {
+                    throw new ValidationException("子账号名称已存在");
+                }
+                supplierSub.setName(dto.getName());
+            }
+
+            if (!StringUtils.isEmpty(dto.getContact()) && !dto.getContact().equals(supplierSub.getContact())) {
+                supplierSub.setContact(dto.getContact());
+            }
+
+            if (StringUtils.isEmpty(supplierSub.getUserId())) {
+                throw new ValidationException("该账号用户信息未注册");
+            }
+
+            User user = userMapper.selectById(supplierSub.getUserId());
+            if (!StringUtils.isEmpty(dto.getPhone()) && !dto.getPhone().equals(supplierSub.getPhone())) {
+                String userType = Constants.USER_TYPE.supplier.name();
+                if (checkUserExist(dto.getPhone(), userType)) {
+                    throw new ValidationException("该手机号码已经注册");
+                }
+                supplierSub.setPhone(dto.getPhone());
+            }
+
+
+            if (!StringUtils.isEmpty(dto.getPassword())) {
+                //判断密码是否一致
+                if (!ObjectUtils.isEmpty(user)) {
+                    String encode = passwordEncoder.encode(dto.getPassword());
+                    if (!encode.equals(user.getPassword())) {
+                        user.setPassword(encode);
+                        userMapper.updateById(user);
+                        supplierSub.setPassword(encode);
+                    }
+                }
+            }
+            if (!StringUtils.isEmpty(dto.getPhone())) {
+                if (!ObjectUtils.isEmpty(user)) {
+                    user.setLoginName(dto.getPhone());
+                    user.setTel(dto.getPhone());
+                    user.setNickName(dto.getPhone());
+                    userMapper.updateById(user);
+                }
+            }
+            supplierSub.setIsEnabled(supplierSub.getIsEnabled());
+            supplierSub.update(SecurityUtils.getUserId());
+            supplierSubMapper.updateById(supplierSub);
+        }
+    }
+
+
+    private boolean checkExistName(String name, Long supplierId) {
+        if (StringUtils.isEmpty(name)) {
+            LambdaQueryWrapper<SupplierSub> lambdaQueryWrapper = new LambdaQueryWrapper();
+            lambdaQueryWrapper.eq(SupplierSub::getName, name).eq(SupplierSub::getSupplierId, supplierId);
+            return supplierSubMapper.selectCount(lambdaQueryWrapper) > 0;
+        }
+        return false;
+    }
+
+
+    public Page<SupplierDTO> querySupplier(QuerySupplierSubDTO dto, Page page) {
+        List<SupplierSubVO> list = supplierSubMapper.querySupplierSub(dto, page);
+        page.setRecords(list);
+        return page;
+    }
+
+
+    public void isEnable(Long id) {
+        SupplierSub supplierSub = supplierSubMapper.selectById(id);
+        if (supplierSub == null) {
+            throw new ValidationException("供应商信息不存在");
+        }
+        if (supplierSub.getIsEnabled()) {
+            supplierSub.setIsEnabled(false);
+            //强制下线
+            baseService.removeToken(supplierSub.getUserId());
+        } else {
+            supplierSub.setIsEnabled(true);
+        }
+        supplierSub.update(SecurityUtils.getUserId());
+        supplierSubMapper.updateById(supplierSub);
+    }
+
+
+    public void registerUser(RegisterDTO dto, String uuid, String password) {
+        User user = new User();
+        user.setId(uuid);
+        user.setLoginName(dto.getTel());
+        user.setTel(dto.getTel());
+        user.setNickName(dto.getTel());
+        user.setPassword(password);
+        user.setType(Constants.USER_TYPE.supplier.name());
+        user.setStatus(Constants.STATUS_ACTIVE);
+        user.setIsSys(Constants.N);
+        user.create();
+        userMapper.insert(user);
+    }
+
+    //供应商手机号唯一,主子不能用同一个手机号
+    private boolean checkUserExist(String tel, String userType) {
+        List<String> userTypes = new ArrayList<>();
+        userTypes.add(userType);
+        User user = userMapper.getActiveUser(tel, userTypes);
+        return user != null;
+    }
+
+    public void delete(Long id) {
+        SupplierSub supplierSub = supplierSubMapper.selectById(id);
+        if (!ObjectUtils.isEmpty(supplierSub)) {
+            if (!StringUtils.isEmpty(supplierSub.getUserId())) {
+                //删除用户表信息
+                userMapper.deleteById(supplierSub.getUserId());
+            }
+            //删除供应商子表信息
+            supplierSubMapper.deleteById(id);
+        }
+    }
+}
diff --git a/src/main/java/com/mzl/flower/web/supplier/SupplierSubController.java b/src/main/java/com/mzl/flower/web/supplier/SupplierSubController.java
new file mode 100644
index 0000000..783f5e5
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/supplier/SupplierSubController.java
@@ -0,0 +1,60 @@
+package com.mzl.flower.web.supplier;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.dto.request.supplier.*;
+import com.mzl.flower.service.supplier.SupplierSubService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+
+@RestController
+@RequestMapping("/api/supplierSub")
+@Api(value = "供应商子账号管理", tags = "供应商子账号管理")
+@Validated
+@Slf4j
+public class SupplierSubController extends BaseController {
+
+    private final SupplierSubService supplierSubService;
+
+    public SupplierSubController(SupplierSubService supplierSubService) {
+        this.supplierSubService = supplierSubService;
+    }
+
+
+    @PostMapping("/addOrUpdate")
+    @ApiOperation(value = "供应商子账号信息登记、修改", notes = "供应商信息子账号登记、修改")
+    public ResponseEntity<ReturnDataDTO> addOrUpdateSupplier(@Validated @RequestBody SupplierSubDTO dto) {
+        supplierSubService.addOrUpdateSupplier(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    @GetMapping("/page")
+    @ApiOperation(value = "运营端-供应商子账号分页查询", notes = "运营端-供应商子账号分页查询")
+    public ResponseEntity<ReturnDataDTO<Page<SupplierSubDTO>>> querySupplier(QuerySupplierSubDTO dto, Page page) {
+        return returnData(R.SUCCESS.getCode(), supplierSubService.querySupplier(dto, page));
+    }
+
+
+    @GetMapping("/page/isEnable")
+    @ApiOperation(value = "子账号启用/禁用", notes = "子账号启用/禁用")
+    public ResponseEntity<ReturnDataDTO<String>> isEnable(@NotNull(message = "id不能为空") Long id) {
+        supplierSubService.isEnable(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping("/delete/{id}")
+    @ApiOperation(value = "子账号删除", notes = "子账号删除")
+    public ResponseEntity<ReturnDataDTO> delete(@PathVariable("id") Long id) {
+        supplierSubService.delete(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+}
diff --git a/src/main/resources/mapper/supplier/SupplierSubMapper.xml b/src/main/resources/mapper/supplier/SupplierSubMapper.xml
new file mode 100644
index 0000000..d9cefda
--- /dev/null
+++ b/src/main/resources/mapper/supplier/SupplierSubMapper.xml
@@ -0,0 +1,48 @@
+<?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.mzl.flower.mapper.supplier.SupplierSubMapper">
+
+
+    <select id="querySupplierSub" resultType="com.mzl.flower.dto.response.supplier.SupplierSubVO">
+        SELECT
+        t.*,s.name as supplierName,s.contact_name as contactName,s.contact_tel as contactTel
+        FROM
+            t_supplier_sub_info t
+        LEFT JOIN t_supplier_info s ON t.supplier_id = s.id
+        WHERE t.deleted = 0
+        <if test="dto.supplierId!=null ">
+            AND t.supplier_id =#{dto.supplierId}
+        </if>
+
+        <if test="dto.supplierName!=null and dto.supplierName!=''">
+            AND s.name LIKE CONCAT('%',#{dto.supplierName}, '%')
+        </if>
+
+        <if test="dto.supplierPhone!=null and dto.supplierPhone!=''">
+            AND s.contact_tel LIKE CONCAT('%',#{dto.supplierPhone}, '%')
+        </if>
+
+        <if test="dto.phone!=null and dto.phone!=''">
+            AND t.phone LIKE CONCAT('%',#{dto.phone}, '%')
+        </if>
+
+<!--        <if test="dto.createDateBegin!=null ">-->
+<!--            <![CDATA[-->
+<!--               AND t.create_time >= #{dto.createDateBegin}-->
+<!--            ]]>-->
+<!--        </if>-->
+<!--        <if test="dto.createDateEnd!=null ">-->
+<!--            <![CDATA[-->
+<!--               AND t.create_time <= #{dto.createDateEnd}-->
+<!--            ]]>-->
+<!--        </if>-->
+        <if test="dto.isEnabled!=null">
+            AND t.is_enabled = #{dto.isEnabled}
+        </if>
+        <if test="dto.id!=null">
+            AND t.id = #{dto.id}
+        </if>
+        order by t.create_time desc
+    </select>
+
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3