diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/PriceSetController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/PriceSetController.java index 29a739ee..48293da1 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/PriceSetController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/PriceSetController.java @@ -27,6 +27,7 @@ import com.bms.common.enums.BusinessType; import com.bms.common.utils.MessageUtils; import com.bms.common.utils.StringUtils; import com.bms.price.domain.PrcCustomerPriceSet; +import com.bms.price.domain.PrcPriceSetUser; import com.bms.price.domain.PrcPriceExcelFile; import com.bms.price.domain.PrcPriceSet; import com.bms.price.domain.PrcPriceSetDetail; @@ -386,4 +387,30 @@ public class PriceSetController extends BaseController { return toAjax(priceSetService.deleteCustomerByIds(customerPricesetIds)); } + + @PreAuthorize("@ss.hasPermi('price:set:list')") + @GetMapping("/viewer/list") + public TableDataInfo viewerList(PrcPriceSetUser query) + { + startPage(); + List list = priceSetService.selectViewerList(query); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('price:set:edit')") + @Log(title = "Package viewer bind", businessType = BusinessType.INSERT) + @PostMapping("/viewer") + public AjaxResult addViewer(@RequestBody PrcPriceSetUser row) + { + row.setCreateBy(getUsername()); + return toAjax(priceSetService.insertViewer(row)); + } + + @PreAuthorize("@ss.hasPermi('price:set:edit')") + @Log(title = "Package viewer bind", businessType = BusinessType.DELETE) + @DeleteMapping("/viewer/{psuIds}") + public AjaxResult removeViewer(@PathVariable Long[] psuIds) + { + return toAjax(priceSetService.deleteViewerByIds(psuIds)); + } } diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSet.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSet.java index 8f260747..ccac8224 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSet.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSet.java @@ -42,6 +42,8 @@ public class PrcPriceSet extends BaseEntity private List details; private List versions; private List customers; + /** viewers explicitly bound to this package */ + private List viewers; /** async save task id (not persisted) */ private String saveTaskId; /** Y: ignored on save; library pull only via /detail/pullFromLibrary */ diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSetUser.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSetUser.java new file mode 100644 index 00000000..6e6dc368 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcPriceSetUser.java @@ -0,0 +1,21 @@ +package com.bms.price.domain; + +import com.bms.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** Package viewer bind: prc_price_set_user */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PrcPriceSetUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private Long psuId; + private Long priceSetId; + private Long userId; + /** login account */ + private String userName; + /** display only, not a table column */ + private String nickName; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcPriceSetUserMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcPriceSetUserMapper.java new file mode 100644 index 00000000..337a4232 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcPriceSetUserMapper.java @@ -0,0 +1,20 @@ +package com.bms.price.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.bms.price.domain.PrcPriceSetUser; + +public interface PrcPriceSetUserMapper +{ + PrcPriceSetUser selectPrcPriceSetUserById(Long psuId); + + List selectPrcPriceSetUserList(PrcPriceSetUser query); + + int insertPrcPriceSetUser(PrcPriceSetUser row); + + int deletePrcPriceSetUserByIds(Long[] psuIds); + + int deleteByPriceSetId(Long priceSetId); + + int countBySetAndUser(@Param("priceSetId") Long priceSetId, @Param("userId") Long userId); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcPriceSetService.java b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcPriceSetService.java index 08a19764..7ef854b1 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcPriceSetService.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcPriceSetService.java @@ -9,6 +9,7 @@ import com.bms.price.domain.PrcPriceSet; import com.bms.price.domain.PrcPriceSetCheckItem; import com.bms.price.domain.PrcPriceSetDetail; import com.bms.price.domain.PrcPriceSetSaveTask; +import com.bms.price.domain.PrcPriceSetUser; /** * 价格套餐 服务层 @@ -91,6 +92,12 @@ public interface IPrcPriceSetService public int deleteCustomerByIds(Long[] customerPricesetIds); + public List selectViewerList(PrcPriceSetUser query); + + public int insertViewer(PrcPriceSetUser row); + + public int deleteViewerByIds(Long[] psuIds); + /** chain expire_time = next version effective_time, then refresh 0/3/1/2 */ public int refreshAllVersionStatus(); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java index 96cf9507..05d0b0b7 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java @@ -18,6 +18,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import com.bms.common.annotation.DataScope; import com.bms.common.exception.ServiceException; import com.bms.common.utils.DateUtils; import com.bms.common.utils.MessageUtils; @@ -29,6 +30,7 @@ import com.bms.price.domain.BmsProductCountry; import com.bms.price.domain.PrcCustomerPriceSet; import com.bms.price.domain.PrcPriceExcelFile; import com.bms.price.domain.PrcPriceSet; +import com.bms.price.domain.PrcPriceSetUser; import com.bms.price.domain.PrcPriceSetCheckItem; import com.bms.price.domain.PrcPriceSetDetail; import com.bms.price.domain.PrcPriceSetProduct; @@ -42,9 +44,12 @@ import com.bms.price.mapper.PrcCustomerPriceSetMapper; import com.bms.price.mapper.PrcPriceSetDetailMapper; import com.bms.price.mapper.PrcPriceSetMapper; import com.bms.price.mapper.PrcPriceSetProductMapper; +import com.bms.price.mapper.PrcPriceSetUserMapper; import com.bms.price.mapper.PrcPriceSetVersionMapper; import com.bms.price.mapper.PrcSurchargeMapper; import com.bms.price.mapper.PrcSurchargeRelMapper; +import com.bms.common.core.domain.entity.SysUser; +import com.bms.system.mapper.SysUserMapper; import com.bms.price.service.IBmsProductService; import com.bms.price.service.IPrcPriceExcelFileService; import com.bms.price.service.IPrcPriceSetService; @@ -98,6 +103,12 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService @Autowired private PrcCustomerPriceSetMapper customerMapper; + @Autowired + private PrcPriceSetUserMapper priceSetUserMapper; + + @Autowired + private SysUserMapper sysUserMapper; + @Autowired private BmsProductCountryMapper productCountryMapper; @@ -132,9 +143,19 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService return set; } + /** + * Price-set list data scope: bound customer's sales user (same as customer list), + * package creator, or explicit viewer bind. Super admin skips filter in DataScopeAspect. + */ @Override + @DataScope(deptAlias = "su", deptField = "dept_id", userAlias = "su", userField = "user_id", + permission = "price:set:list") public List selectPrcPriceSetList(PrcPriceSet set) { + if (set != null) + { + set.getParams().put("viewerUserId", SecurityUtils.getUserId()); + } List list = setMapper.selectPrcPriceSetList(set); for (PrcPriceSet item : list) { @@ -2223,6 +2244,49 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService return customerMapper.deletePrcCustomerPriceSetByIds(customerPricesetIds); } + @Override + public List selectViewerList(PrcPriceSetUser query) + { + return priceSetUserMapper.selectPrcPriceSetUserList(query); + } + + @Override + @Transactional + public int insertViewer(PrcPriceSetUser row) + { + if (row == null || row.getPriceSetId() == null || row.getUserId() == null) + { + throw new ServiceException("price set user bind requires priceSetId and userId"); + } + requireSet(row.getPriceSetId()); + if (priceSetUserMapper.countBySetAndUser(row.getPriceSetId(), row.getUserId()) > 0) + { + throw new ServiceException("user already bound to this price set"); + } + SysUser user = sysUserMapper.selectUserById(row.getUserId()); + if (user == null) + { + throw new ServiceException("user not found"); + } + row.setUserName(user.getUserName()); + if (StringUtils.isEmpty(row.getCreateBy())) + { + row.setCreateBy(SecurityUtils.getUsername()); + } + return priceSetUserMapper.insertPrcPriceSetUser(row); + } + + @Override + @Transactional + public int deleteViewerByIds(Long[] psuIds) + { + if (psuIds == null || psuIds.length == 0) + { + return 0; + } + return priceSetUserMapper.deletePrcPriceSetUserByIds(psuIds); + } + private void replaceChildren(PrcPriceSet set) { saveOrUpdateVersion(set); @@ -2989,6 +3053,9 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService PrcCustomerPriceSet cquery = new PrcCustomerPriceSet(); cquery.setPriceSetId(priceSetId); set.setCustomers(customerMapper.selectPrcCustomerPriceSetList(cquery)); + PrcPriceSetUser uquery = new PrcPriceSetUser(); + uquery.setPriceSetId(priceSetId); + set.setViewers(priceSetUserMapper.selectPrcPriceSetUserList(uquery)); } private void fillVersionChildren(PrcPriceSetVersion version) diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetMapper.xml index 283a10b3..716e4462 100644 --- a/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetMapper.xml @@ -81,6 +81,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) ) + + + AND ( + EXISTS ( + SELECT 1 + FROM prc_customer_price_set cps + INNER JOIN ctr_customer c + ON c.customer_id = cps.customer_id + AND ifnull(c.del_flag, '0') = '0' + INNER JOIN sys_user su + ON su.del_flag = '0' + AND (su.user_name = c.sales_user_id + OR su.user_id = c.sales_user_id + 0) + WHERE cps.price_set_id = s.price_set_id + ${params.dataScope} + ) + OR EXISTS ( + SELECT 1 + FROM sys_user su + WHERE su.del_flag = '0' + AND su.user_name = s.created_by + ${params.dataScope} + ) + + OR EXISTS ( + SELECT 1 + FROM prc_price_set_user psu + WHERE psu.price_set_id = s.price_set_id + AND psu.user_id = #{params.viewerUserId} + ) + + ) + order by s.price_set_id desc diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetUserMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetUserMapper.xml new file mode 100644 index 00000000..19f33d05 --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/price/PrcPriceSetUserMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + select psu.psu_id, psu.price_set_id, psu.user_id, psu.user_name, + u.nick_name, psu.created_by, psu.create_time + from prc_price_set_user psu + left join sys_user u on u.user_id = psu.user_id + + + + + + + + + + insert into prc_price_set_user (price_set_id, user_id, user_name, created_by, create_time) + values (#{priceSetId}, #{userId}, #{userName}, #{createBy}, sysdate()) + + + + delete from prc_price_set_user where psu_id in + #{id} + + + + delete from prc_price_set_user where price_set_id = #{priceSetId} + + diff --git a/bms-back/sql/bms_init.sql b/bms-back/sql/bms_init.sql index bff5eae5..a63f3ba3 100644 --- a/bms-back/sql/bms_init.sql +++ b/bms-back/sql/bms_init.sql @@ -802,6 +802,23 @@ CREATE TABLE `prc_customer_price_set` ( CONSTRAINT `fk_customer_price_set` FOREIGN KEY (`price_set_id`) REFERENCES `prc_price_set` (`price_set_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户套餐表-客户某时间段内使用的套餐'; +-- ---------------------------- +-- 表结构:`prc_price_set_user` +-- ---------------------------- +CREATE TABLE `prc_price_set_user` ( + `psu_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `price_set_id` bigint(20) NOT NULL COMMENT '价格套餐id', + `user_id` bigint(20) NOT NULL COMMENT '用户id', + `user_name` varchar(64) NOT NULL DEFAULT '' COMMENT '登录账号', + `created_by` varchar(64) DEFAULT '' COMMENT '创建人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`psu_id`), + UNIQUE KEY `uk_psu_set_user` (`price_set_id`,`user_id`), + KEY `idx_psu_user` (`user_id`), + KEY `idx_psu_set` (`price_set_id`), + CONSTRAINT `fk_psu_set` FOREIGN KEY (`price_set_id`) REFERENCES `prc_price_set` (`price_set_id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='套餐可见用户绑定'; + -- ---------------------------- -- 表结构:`prc_income_bill` -- ---------------------------- diff --git a/bms-back/sql/price/prc_price_set_user.sql b/bms-back/sql/price/prc_price_set_user.sql new file mode 100644 index 00000000..e136c884 --- /dev/null +++ b/bms-back/sql/price/prc_price_set_user.sql @@ -0,0 +1,16 @@ +-- Price set viewer bind +SET NAMES utf8mb4; + +CREATE TABLE IF NOT EXISTS prc_price_set_user ( + psu_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + price_set_id bigint(20) NOT NULL COMMENT '价格套餐id', + user_id bigint(20) NOT NULL COMMENT '用户id', + user_name varchar(64) NOT NULL DEFAULT '' COMMENT '登录账号', + created_by varchar(64) DEFAULT '' COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (psu_id), + UNIQUE KEY uk_psu_set_user (price_set_id, user_id), + KEY idx_psu_user (user_id), + KEY idx_psu_set (price_set_id), + CONSTRAINT fk_psu_set FOREIGN KEY (price_set_id) REFERENCES prc_price_set (price_set_id) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='套餐可见用户绑定'; diff --git a/bms-front/src/api/price/set.js b/bms-front/src/api/price/set.js index 7bbe9b52..0a819332 100644 --- a/bms-front/src/api/price/set.js +++ b/bms-front/src/api/price/set.js @@ -412,3 +412,26 @@ export function delSetCustomer(ids) { method: 'delete' }) } + +export function listSetViewer(query) { + return request({ + url: '/price/set/viewer/list', + method: 'get', + params: query + }) +} + +export function addSetViewer(data) { + return request({ + url: '/price/set/viewer', + method: 'post', + data: data + }) +} + +export function delSetViewer(ids) { + return request({ + url: '/price/set/viewer/' + ids, + method: 'delete' + }) +} diff --git a/bms-front/src/views/price/set/components/detail/SetUserTable.vue b/bms-front/src/views/price/set/components/detail/SetUserTable.vue new file mode 100644 index 00000000..5f92ac18 --- /dev/null +++ b/bms-front/src/views/price/set/components/detail/SetUserTable.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/bms-front/src/views/price/set/detail.vue b/bms-front/src/views/price/set/detail.vue index a9211e30..d5376fe6 100644 --- a/bms-front/src/views/price/set/detail.vue +++ b/bms-front/src/views/price/set/detail.vue @@ -20,6 +20,8 @@ + +