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