From cc0d20ddc18606e6b032e4a15ba589d9b57ae032 Mon Sep 17 00:00:00 2001 From: SjS Date: Wed, 2 Apr 2025 20:06:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E7=9B=B8=E5=85=B3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/bst/area/mapper/AreaMapper.java | 3 + .../com/ruoyi/bst/area/mapper/AreaMapper.xml | 6 +- .../ruoyi/bst/area/service/AreaService.java | 3 + .../ruoyi/bst/area/service/AreaValidator.java | 6 + .../area/service/impl/AreaServiceImpl.java | 7 + .../area/service/impl/AreaValidatorImpl.java | 6 + .../domain/CustomerService.java | 55 ++++ .../domain/CustomerServiceQuery.java | 14 + .../domain/CustomerServiceVO.java | 9 + .../domain/enums/CustomerServiceStatus.java | 17 ++ .../mapper/CustomerServiceMapper.java | 77 ++++++ .../mapper/CustomerServiceMapper.xml | 240 ++++++++++++++++++ .../service/CustomerServiceService.java | 65 +++++ .../service/CustomerServiceValidator.java | 18 ++ .../impl/CustomerServiceServiceImpl.java | 110 ++++++++ .../impl/CustomerServiceValidatorImpl.java | 94 +++++++ .../bst/fault/service/FaultValidator.java | 5 + .../service/impl/FaultValidatorImpl.java | 55 ++++ .../web/app/AppCustomerServiceController.java | 35 +++ .../web/bst/CustomerServiceController.java | 130 ++++++++++ .../com/ruoyi/web/bst/FaultController.java | 5 +- 21 files changed, 958 insertions(+), 2 deletions(-) create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerService.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceQuery.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceVO.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/enums/CustomerServiceStatus.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.xml create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceService.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceValidator.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceServiceImpl.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceValidatorImpl.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/FaultValidator.java create mode 100644 ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/impl/FaultValidatorImpl.java create mode 100644 ruoyi-web/src/main/java/com/ruoyi/web/app/AppCustomerServiceController.java create mode 100644 ruoyi-web/src/main/java/com/ruoyi/web/bst/CustomerServiceController.java diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.java index ec88605..abe1b26 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.bst.area.mapper; import java.util.List; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; import org.apache.ibatis.annotations.Param; import com.ruoyi.bst.area.domain.Area; @@ -81,4 +82,6 @@ public interface AreaMapper int logicDel(@Param("ids") List ids); + public Long selectAreaByStoreId(Long storeId); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml index 341c4ec..8eb916c 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/mapper/AreaMapper.xml @@ -87,7 +87,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ${@com.ruoyi.framework.util.DataScopeUtil@dataScope( null, - "ba.user_id,ba.create_id", + "ba.user_id,ba.create_id,su.agent_id", null, null, query.scope @@ -242,6 +242,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaService.java index 166c269..b509c9f 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaService.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaService.java @@ -5,6 +5,7 @@ import java.util.List; import com.ruoyi.bst.area.domain.Area; import com.ruoyi.bst.area.domain.AreaQuery; import com.ruoyi.bst.area.domain.AreaVO; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; /** * 运营区Service接口 @@ -76,4 +77,6 @@ public interface AreaService public AreaVO selectOne(AreaQuery query); + public Long selectAreaByStoreId(Long storeId); + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java index deb72e6..14223e2 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/AreaValidator.java @@ -49,4 +49,10 @@ public interface AreaValidator { */ boolean canCheckForJoin(Long areaId); + /** + * 是否允许添加客服 + * @param areaId + * @return + */ + boolean canAddCustomerService(Long areaId); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java index 2bdc8a8..4d8e1e7 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaServiceImpl.java @@ -1,7 +1,9 @@ package com.ruoyi.bst.area.service.impl; +import java.util.Collections; import java.util.List; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; import org.locationtech.jts.geom.Geometry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -57,6 +59,11 @@ public class AreaServiceImpl implements AreaService return CollectionUtils.firstElement(list); } + @Override + public Long selectAreaByStoreId(Long storeId) { + return areaMapper.selectAreaByStoreId(storeId); + } + /** * 查询运营区列表 * diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java index 3744dd7..5c92823 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/area/service/impl/AreaValidatorImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.bst.area.service.impl; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -93,6 +94,11 @@ public class AreaValidatorImpl implements AreaValidator { return canOperate(Arrays.asList(areaId)); } + @Override + public boolean canAddCustomerService(Long areaId) { + return canOperate(Collections.singletonList(areaId)); + } + private boolean isAgent(AreaVO area, Long userId) { return area != null && area.getAgentId() != null && area.getAgentId().equals(userId); } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerService.java new file mode 100644 index 0000000..1e01288 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerService.java @@ -0,0 +1,55 @@ +package com.ruoyi.bst.customerService.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 客服对象 bst_customer_service + * + * @author ruoyi + * @date 2025-04-02 + */ +@Data +public class CustomerService extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private Long id; + + @Excel(name = "所属运营区id") + @ApiModelProperty("所属运营区id") + private Long areaId; + + @Excel(name = "运营商id") + @ApiModelProperty("运营商id") + private Long storeId; + + @Excel(name = "客服姓名") + @ApiModelProperty("客服姓名") + private String name; + + @Excel(name = "客服电话") + @ApiModelProperty("客服电话") + private String contact; + + @JsonFormat(pattern = "HH:mm:ss") + @Excel(name = "工作开始时间", width = 30, dateFormat = "HH:mm:ss") + @ApiModelProperty("工作开始时间") + private Date startTime; + + @JsonFormat(pattern = "HH:mm:ss") + @Excel(name = "工作结束时间", width = 30, dateFormat = "HH:mm:ss") + @ApiModelProperty("工作结束时间") + private Date endTime; + + @Excel(name = "是否启用") + @ApiModelProperty("是否启用") + private String isEnabled; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceQuery.java new file mode 100644 index 0000000..9869a3d --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceQuery.java @@ -0,0 +1,14 @@ +package com.ruoyi.bst.customerService.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class CustomerServiceQuery extends CustomerService{ + + @ApiModelProperty("客服ID列表") + private List ids; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceVO.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceVO.java new file mode 100644 index 0000000..4460be0 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/CustomerServiceVO.java @@ -0,0 +1,9 @@ +package com.ruoyi.bst.customerService.domain; + +import lombok.Data; + +@Data +public class CustomerServiceVO extends CustomerService{ + + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/enums/CustomerServiceStatus.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/enums/CustomerServiceStatus.java new file mode 100644 index 0000000..b765e71 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/domain/enums/CustomerServiceStatus.java @@ -0,0 +1,17 @@ +package com.ruoyi.bst.customerService.domain.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum CustomerServiceStatus { + + DISABLE("0", "禁用"), + ENABLE("1", "启用"); + + + private final String status; + private final String msg; + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.java new file mode 100644 index 0000000..20b54bd --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.java @@ -0,0 +1,77 @@ +package com.ruoyi.bst.customerService.mapper; + +import java.util.List; +import com.ruoyi.bst.customerService.domain.CustomerService; +import com.ruoyi.bst.customerService.domain.CustomerServiceVO; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; +import com.ruoyi.system.user.domain.UserQuery; +import org.apache.ibatis.annotations.Param; + +/** + * 客服Mapper接口 + * + * @author ruoyi + * @date 2025-04-02 + */ +public interface CustomerServiceMapper +{ + /** + * 查询客服 + * + * @param id 客服主键 + * @return 客服 + */ + CustomerServiceVO selectCustomerServiceById(Long id); + + /** + * 查询客服列表 + * + * @param query 客服 + * @return 客服集合 + */ + List selectCustomerServiceList(@Param("query")CustomerServiceQuery query); + + /** + * 新增客服 + * + * @param customerService 客服 + * @return 结果 + */ + int insertCustomerService(CustomerService customerService); + + /** + * 批量新增客服 + */ + int batchInsert(@Param("list") List list); + + /** + * 批量修改客服 + */ + int batchUpdate(@Param("list") List list); + + /** + * 修改客服 + * + * @param customerService 客服 + * @return 结果 + */ + public int updateCustomerService(@Param("data") CustomerService customerService); + + /** + * 删除客服 + * + * @param id 客服主键 + * @return 结果 + */ + int deleteCustomerServiceById(Long id); + + /** + * 批量删除客服 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteCustomerServiceByIds(Long[] ids); + + public int logicDel(@Param("ids") List ids); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.xml new file mode 100644 index 0000000..cae4adf --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/mapper/CustomerServiceMapper.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + select + bcs.id, + bcs.area_id, + bcs.name, + bcs.contact, + bcs.start_time, + bcs.end_time, + bcs.is_enabled, + bcs.create_time, + bcs.store_id, + su.agent_id + from bst_customer_service bcs + left join sys_user su on bcs.store_id = su.user_id + + + + and id = #{query.id} + and area_id = #{query.areaId} + and name like concat('%', #{query.name}, '%') + and contact = #{query.contact} + and start_time = #{query.startTime} + and end_time = #{query.endTime} + and is_enabled = #{query.isEnabled} + ${@com.ruoyi.framework.util.DataScopeUtil@dataScope( + null, + "bcs.store_id,su.agent_id", + null, + null, + query.scope + )} + ${query.params.dataScope} + ${query.params.dataScope} + + + + + + + + insert into bst_customer_service + + area_id, + store_id, + name, + contact, + start_time, + end_time, + is_enabled, + create_time, + + + #{areaId}, + #{storeId}, + #{name}, + #{contact}, + #{startTime}, + #{endTime}, + #{isEnabled}, + #{createTime}, + + + + + insert into bst_customer_service + + area_id, + name, + contact, + start_time, + end_time, + is_enabled, + create_time, + + values + + + #{i.areaId}, + default, + #{i.name}, + default, + #{i.contact}, + default, + #{i.startTime}, + default, + #{i.endTime}, + default, + #{i.isEnabled}, + default, + #{i.createTime}, + default, + + + + + + update bst_customer_service + + + + + WHEN #{item.id} THEN #{item.areaId} + + + WHEN #{item.id} THEN `area_id` + + + + + + + WHEN #{item.id} THEN #{item.name} + + + WHEN #{item.id} THEN `name` + + + + + + + WHEN #{item.id} THEN #{item.contact} + + + WHEN #{item.id} THEN `contact` + + + + + + + WHEN #{item.id} THEN #{item.startTime} + + + WHEN #{item.id} THEN `start_time` + + + + + + + WHEN #{item.id} THEN #{item.endTime} + + + WHEN #{item.id} THEN `end_time` + + + + + + + WHEN #{item.id} THEN #{item.isEnabled} + + + WHEN #{item.id} THEN `is_enabled` + + + + + + + WHEN #{item.id} THEN #{item.createTime} + + + WHEN #{item.id} THEN `create_time` + + + + + where id in + + #{item.id} + + + + + update bst_customer_service + + + + where id = #{data.id} + + + + + update bst_customer_service + set deleted = true + where id in + + #{id} + + and deleted = false + + + + area_id = #{data.areaId}, + name = #{data.name}, + contact = #{data.contact}, + start_time = #{data.startTime}, + end_time = #{data.endTime}, + is_enabled = #{data.isEnabled}, + create_time = #{data.createTime}, + + + + delete from bst_customer_service where id = #{id} + + + + delete from bst_customer_service where id in + + #{id} + + + diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceService.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceService.java new file mode 100644 index 0000000..52cb8ad --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceService.java @@ -0,0 +1,65 @@ +package com.ruoyi.bst.customerService.service; + +import java.util.List; +import com.ruoyi.bst.customerService.domain.CustomerService; +import com.ruoyi.bst.customerService.domain.CustomerServiceVO; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; + +/** + * 客服Service接口 + * + * @author ruoyi + * @date 2025-04-02 + */ +public interface CustomerServiceService +{ + /** + * 查询客服 + * + * @param id 客服主键 + * @return 客服 + */ + public CustomerServiceVO selectCustomerServiceById(Long id); + + /** + * 查询客服列表 + * + * @param customerService 客服 + * @return 客服集合 + */ + public List selectCustomerServiceList(CustomerServiceQuery customerService); + + /** + * 新增客服 + * + * @param customerService 客服 + * @return 结果 + */ + public int insertCustomerService(CustomerService customerService); + + /** + * 修改客服 + * + * @param customerService 客服 + * @return 结果 + */ + public int updateCustomerService(CustomerService customerService); + + /** + * 批量删除客服 + * + * @param ids 需要删除的客服主键集合 + * @return 结果 + */ + public int deleteCustomerServiceByIds(Long[] ids); + + /** + * 删除客服信息 + * + * @param id 客服主键 + * @return 结果 + */ + public int deleteCustomerServiceById(Long id); + + public int logicDel(List ids); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceValidator.java new file mode 100644 index 0000000..6c44d07 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/CustomerServiceValidator.java @@ -0,0 +1,18 @@ +package com.ruoyi.bst.customerService.service; + + +import java.util.Collections; +import java.util.List; + +public interface CustomerServiceValidator { + + /** + * 当前用户是否可编辑客服 + * @param customerId + * @return + */ + boolean canEdit(Long customerId); + + + boolean canDeleteAll(List ids); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceServiceImpl.java new file mode 100644 index 0000000..2e66b03 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceServiceImpl.java @@ -0,0 +1,110 @@ +package com.ruoyi.bst.customerService.service.impl; + +import java.util.List; + +import com.ruoyi.bst.area.domain.AreaVO; +import com.ruoyi.bst.area.service.AreaService; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.bst.customerService.mapper.CustomerServiceMapper; +import com.ruoyi.bst.customerService.domain.CustomerService; +import com.ruoyi.bst.customerService.domain.CustomerServiceVO; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; +import com.ruoyi.bst.customerService.service.CustomerServiceService; + +/** + * 客服Service业务层处理 + * + * @author ruoyi + * @date 2025-04-02 + */ +@Service +public class CustomerServiceServiceImpl implements CustomerServiceService +{ + @Autowired + private CustomerServiceMapper customerServiceMapper; + + @Autowired + private AreaService areaService; + /** + * 查询客服 + * + * @param id 客服主键 + * @return 客服 + */ + @Override + public CustomerServiceVO selectCustomerServiceById(Long id) + { + return customerServiceMapper.selectCustomerServiceById(id); + } + + /** + * 查询客服列表 + * + * @param customerService 客服 + * @return 客服 + */ + @Override + public List selectCustomerServiceList(CustomerServiceQuery customerService) + { + return customerServiceMapper.selectCustomerServiceList(customerService); + } + + /** + * 新增客服 + * + * @param customerService 客服 + * @return 结果 + */ + @Override + public int insertCustomerService(CustomerService customerService) + { + Long storeId = areaService.selectAreaById(customerService.getAreaId()).getUserId(); + customerService.setStoreId(storeId); + customerService.setCreateTime(DateUtils.getNowDate()); + return customerServiceMapper.insertCustomerService(customerService); + } + + /** + * 修改客服 + * + * @param customerService 客服 + * @return 结果 + */ + @Override + public int updateCustomerService(CustomerService customerService) + { + return customerServiceMapper.updateCustomerService(customerService); + } + + /** + * 批量删除客服 + * + * @param ids 需要删除的客服主键 + * @return 结果 + */ + @Override + public int deleteCustomerServiceByIds(Long[] ids) + { + return customerServiceMapper.deleteCustomerServiceByIds(ids); + } + + /** + * 删除客服信息 + * + * @param id 客服主键 + * @return 结果 + */ + @Override + public int deleteCustomerServiceById(Long id) + { + return customerServiceMapper.deleteCustomerServiceById(id); + } + + @Override + public int logicDel(List ids) { + return customerServiceMapper.logicDel(ids); + } +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceValidatorImpl.java new file mode 100644 index 0000000..3fe2936 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/customerService/service/impl/CustomerServiceValidatorImpl.java @@ -0,0 +1,94 @@ +package com.ruoyi.bst.customerService.service.impl; + +import com.ruoyi.bst.area.domain.AreaQuery; +import com.ruoyi.bst.area.domain.AreaVO; +import com.ruoyi.bst.area.service.AreaService; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; +import com.ruoyi.bst.customerService.domain.CustomerServiceVO; +import com.ruoyi.bst.customerService.mapper.CustomerServiceMapper; +import com.ruoyi.bst.customerService.service.CustomerServiceValidator; +import com.ruoyi.common.core.domain.vo.UserVO; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.collection.CollectionUtils; +import com.ruoyi.system.user.domain.UserQuery; +import com.ruoyi.system.user.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; + +@Service +public class CustomerServiceValidatorImpl implements CustomerServiceValidator { + + + @Autowired + private CustomerServiceMapper customerServiceMapper; + + @Autowired + private UserService userService; + + @Override + public boolean canEdit(Long customerId) { + return canOperate(Arrays.asList(customerId)); + } + + @Override + public boolean canDeleteAll(List ids) { + return canOperate(ids); + } + + + // 是否可以操作客服 + private boolean canOperate(List customerIds) { + + if (SecurityUtils.isSysAdmin()) { + return true; + } + if (CollectionUtils.isEmptyElement(customerIds)) { + return true; + } + + // 查询客服 + CustomerServiceQuery query = new CustomerServiceQuery(); + query.setIds(customerIds); + query.setScope(true); + List customerServiceList = customerServiceMapper.selectCustomerServiceList(query); + Long userId = SecurityUtils.getUserId(); + + // 判断是否可以操作客服 + for (Long customerId : customerIds) { + CustomerServiceVO customerService = customerServiceList.stream() + .filter(item -> item.getId().equals(customerId)) + .findFirst().orElse(null); + if (customerService == null) { + return false; + } + + boolean canOperate = isStore(customerService, userId) || isAgent(customerService, userId); + if (!canOperate) { + return false; + } + } + return true; + } + + + private boolean isStore(CustomerServiceVO customerService, Long userId) { + return customerService != null && customerService.getStoreId() != null && customerService.getStoreId().equals(userId); + } + + + private boolean isAgent(CustomerServiceVO customerService, Long userId) { + UserVO user = userService.selectUserById(customerService.getStoreId()); + if (user == null) { + return false; + } + return user.getAgentId() != null && user.getAgentId().equals(userId); + + + } + +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/FaultValidator.java b/ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/FaultValidator.java new file mode 100644 index 0000000..56a0604 --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/FaultValidator.java @@ -0,0 +1,5 @@ +package com.ruoyi.bst.fault.service; + +public interface FaultValidator { + boolean canEdit(Long faultId); +} diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/impl/FaultValidatorImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/impl/FaultValidatorImpl.java new file mode 100644 index 0000000..73959ce --- /dev/null +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/fault/service/impl/FaultValidatorImpl.java @@ -0,0 +1,55 @@ +package com.ruoyi.bst.fault.service.impl; + +import com.ruoyi.bst.fault.domain.FaultQuery; +import com.ruoyi.bst.fault.domain.FaultVO; +import com.ruoyi.bst.fault.mapper.FaultMapper; +import com.ruoyi.bst.fault.service.FaultValidator; +import com.ruoyi.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +@Service +public class FaultValidatorImpl implements FaultValidator { + + @Autowired + private FaultMapper faultMapper; + + @Override + public boolean canEdit(Long faultId) { + return canOperate(Arrays.asList(faultId)); + } + + private boolean canOperate(List faultIds) { + if (SecurityUtils.isSysAdmin()){ + return true; + } + + FaultQuery query = new FaultQuery(); + query.setId(faultIds.get(0)); + query.setScope(true); + List faultList = faultMapper.selectFaultList(query); + Long userId = SecurityUtils.getUserId(); + + // 判断是否可以处理故障 + for (Long faultId : faultIds) { + FaultVO fault = faultList.stream() + .filter(item -> item.getId().equals(faultId)) + .findFirst().orElse(null); + if (fault == null) { + return false; + } + boolean canOperate = isStore(fault, userId); + if (!canOperate) { + return false; + } + } + return true; + } + + private boolean isStore(FaultVO fault, Long userId) { + return fault != null && fault.getStoreId() != null && fault.getStoreId().equals(userId); + } +} diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/app/AppCustomerServiceController.java b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppCustomerServiceController.java new file mode 100644 index 0000000..2d716b8 --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/app/AppCustomerServiceController.java @@ -0,0 +1,35 @@ +package com.ruoyi.web.app; + +import com.ruoyi.bst.articleCategory.domain.ArticleCategoryQuery; +import com.ruoyi.bst.articleCategory.domain.enums.ArticleCategoryStatus; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; +import com.ruoyi.bst.customerService.domain.enums.CustomerServiceStatus; +import com.ruoyi.bst.customerService.service.CustomerServiceService; +import com.ruoyi.common.annotation.Anonymous; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.TableDataInfo; +import io.swagger.annotations.ApiOperation; +import org.checkerframework.checker.units.qual.A; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/app/customerService") +public class AppCustomerServiceController extends BaseController { + + + @Autowired + private CustomerServiceService customerServiceService; + + @ApiOperation("获取客服列表") + @GetMapping("/list") + public TableDataInfo list(CustomerServiceQuery query) { + startPage(); + startOrderBy(); + query.setIsEnabled(CustomerServiceStatus.ENABLE.getStatus()); + return getDataTable(customerServiceService.selectCustomerServiceList(query)); + } + +} diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/CustomerServiceController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/CustomerServiceController.java new file mode 100644 index 0000000..42bf477 --- /dev/null +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/CustomerServiceController.java @@ -0,0 +1,130 @@ +package com.ruoyi.web.bst; + +import com.ruoyi.bst.area.domain.AreaVO; +import com.ruoyi.bst.area.service.AreaService; +import com.ruoyi.bst.area.service.AreaValidator; +import com.ruoyi.bst.customerService.domain.CustomerService; +import com.ruoyi.bst.customerService.domain.CustomerServiceQuery; +import com.ruoyi.bst.customerService.domain.CustomerServiceVO; +import com.ruoyi.bst.customerService.service.CustomerServiceService; +import com.ruoyi.bst.customerService.service.CustomerServiceValidator; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.poi.ExcelUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 客服Controller + * + * @author ruoyi + * @date 2025-04-02 + */ +@RestController +@RequestMapping("/bst/customerService") +public class CustomerServiceController extends BaseController +{ + @Autowired + private CustomerServiceService customerServiceService; + + @Autowired + private CustomerServiceValidator customerServiceValidator; + + @Autowired + private AreaService areaService; + + @Autowired + private AreaValidator areaValidator; + + /** + * 查询客服列表 + */ + @PreAuthorize("@ss.hasPermi('bst:customerService:list')") + @GetMapping("/list") + public TableDataInfo list(CustomerServiceQuery query) + { + startPage(); + startOrderBy(); + List list = customerServiceService.selectCustomerServiceList(query); + return getDataTable(list); + } + + /** + * 导出客服列表 + */ + @PreAuthorize("@ss.hasPermi('bst:customerService:export')") + @Log(title = "客服", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, CustomerServiceQuery query) + { + List list = customerServiceService.selectCustomerServiceList(query); + ExcelUtil util = new ExcelUtil(CustomerServiceVO.class); + util.exportExcel(response, list, "客服数据"); + } + + /** + * 获取客服详细信息 + */ + @PreAuthorize("@ss.hasPermi('bst:customerService:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(customerServiceService.selectCustomerServiceById(id)); + } + + /** + * 新增客服 + */ + @PreAuthorize("@ss.hasPermi('bst:customerService:add')") + @Log(title = "客服", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody CustomerService customerService) + { + if (customerService.getAreaId() != null) { + AreaVO area = areaService.selectAreaById(customerService.getAreaId()); + ServiceUtil.assertion(area==null, "当前运营区不存在"); + ServiceUtil.assertion(!areaValidator.canAddCustomerService(customerService.getAreaId()), "您无权插入客服"); + } + return toAjax(customerServiceService.insertCustomerService(customerService)); + } + + /** + * 修改客服 + */ + @PreAuthorize("@ss.hasPermi('bst:customerService:edit')") + @Log(title = "客服", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody CustomerService customerService) + { + if (customerService.getAreaId() != null) { + ServiceUtil.assertion(!areaValidator.canAddCustomerService(customerService.getAreaId()), "您无权修改该运营区下的信息"); + } + + if (!customerServiceValidator.canEdit(customerService.getId())) { + return AjaxResult.error("您没有权限修改ID为" + customerService.getId() + "的客服信息"); + } + return toAjax(customerServiceService.updateCustomerService(customerService)); + } + + /** + * 删除客服 + */ + @PreAuthorize("@ss.hasPermi('bst:customerService:remove')") + @Log(title = "客服", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable List ids) + { + if (!customerServiceValidator.canDeleteAll(ids)) { + return AjaxResult.error("您没有权限删除ID为" + ids + "的客服信息"); + } + return toAjax(customerServiceService.logicDel(ids)); + } +} diff --git a/ruoyi-web/src/main/java/com/ruoyi/web/bst/FaultController.java b/ruoyi-web/src/main/java/com/ruoyi/web/bst/FaultController.java index e8c2511..cc59c0d 100644 --- a/ruoyi-web/src/main/java/com/ruoyi/web/bst/FaultController.java +++ b/ruoyi-web/src/main/java/com/ruoyi/web/bst/FaultController.java @@ -7,6 +7,7 @@ import com.ruoyi.bst.fault.domain.enums.FaultHandleStatus; import com.ruoyi.bst.fault.domain.enums.FaultStatus; import com.ruoyi.bst.fault.service.FaultConverter; import com.ruoyi.bst.fault.service.FaultService; +import com.ruoyi.bst.fault.service.FaultValidator; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -35,6 +36,8 @@ public class FaultController extends BaseController private FaultService faultService; @Autowired private FaultConverter faultConverter; + @Autowired + private FaultValidator faultValidator; /** * 查询故障列表 @@ -118,7 +121,7 @@ public class FaultController extends BaseController @ApiOperation("处理申报信息") @PutMapping("/handle") public AjaxResult update(@RequestBody Fault fault) { - if (!faultConverter.canEdit(fault.getId())){ + if (!faultValidator.canEdit(fault.getId())){ return AjaxResult.error("您没有权限修改id为" + fault.getId() + "的故障申报"); } faultService.updateFault(faultService.handle(fault));