diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java index 6a4f2698..9c548a72 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/collection/CollectionUtils.java @@ -1,6 +1,7 @@ package com.ruoyi.common.utils.collection; import com.ruoyi.common.utils.DateUtils; +import org.apache.poi.ss.formula.functions.T; import java.math.BigDecimal; import java.time.LocalDate; @@ -169,4 +170,11 @@ public class CollectionUtils extends org.springframework.util.CollectionUtils { } return result; } + + /** + * 计算集合中BigDecimal的和 + */ + public static BigDecimal sumDecimal(Collection collection, Function decimalMapper) { + return collection.stream().map(decimalMapper).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/enums/BonusArrivalType.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/enums/BonusArrivalType.java index e2ce60fc..99f5155b 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/enums/BonusArrivalType.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/domain/enums/BonusArrivalType.java @@ -20,7 +20,8 @@ public enum BonusArrivalType { PLATFORM("1", "平台"), AGENT("2", "代理商"), - MCH("3", "商户"); + MCH("3", "商户"), + STAFF("4", "员工"); private final String type; private final String msg; @@ -50,7 +51,7 @@ public enum BonusArrivalType { * 用户表 */ public static List userList() { - return asList(AGENT, MCH); + return asList(AGENT, MCH, STAFF); } /** diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java index 659eaadb..0599daf1 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/BonusConverter.java @@ -3,10 +3,8 @@ package com.ruoyi.ss.bonus.service; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.ss.bonus.domain.Bonus; import com.ruoyi.ss.device.domain.vo.DeviceVO; -import com.ruoyi.ss.transactionBill.domain.bo.RechargeBO; -import com.ruoyi.ss.transactionBill.domain.dto.RechargePayBO; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; -import com.ruoyi.ss.user.domain.SmUserVO; import java.util.List; @@ -15,27 +13,10 @@ import java.util.List; * 2024/8/20 */ public interface BonusConverter { - /** - * 支付转为分成明细 + * 生产分成列表 */ - List toPo(RechargePayBO bo); - - /** - * 订单转为分成明细 - */ - List toPo(RechargeBO bo); - - /** - * 生成分成列表 - * - * @param mch - * @param agent - * @param platform - * @param device - * @return - */ - List genBonusList(SmUserVO mch, SmUserVO agent, SysDept platform, DeviceVO device); + List toPoList(SysDept platform, DeviceVO device, List staffList); /** * 旧订单转为分成明细 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java index b3924de9..09ad70fa 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/bonus/service/impl/BonusConverterImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.ss.bonus.service.impl; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.ss.bonus.domain.Bonus; import com.ruoyi.ss.bonus.domain.enums.BonusArrivalType; import com.ruoyi.ss.bonus.domain.enums.BonusStatus; @@ -11,16 +11,8 @@ import com.ruoyi.ss.bonus.service.BonusConverter; import com.ruoyi.ss.device.domain.enums.DeviceServiceMode; import com.ruoyi.ss.device.domain.vo.DeviceVO; import com.ruoyi.ss.device.service.DeviceAssembler; -import com.ruoyi.ss.store.service.StoreService; -import com.ruoyi.ss.transactionBill.domain.TransactionBill; -import com.ruoyi.ss.transactionBill.domain.bo.RechargeBO; -import com.ruoyi.ss.transactionBill.domain.dto.RechargePayBO; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; import com.ruoyi.ss.transactionBill.domain.vo.TransactionBillVO; -import com.ruoyi.ss.transactionBill.service.TransactionBillService; -import com.ruoyi.ss.user.domain.SmUserVO; -import com.ruoyi.ss.user.service.ISmUserService; -import com.ruoyi.system.service.ISysConfigService; -import com.ruoyi.system.service.ISysDeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,68 +33,15 @@ import java.util.stream.Stream; @Service public class BonusConverterImpl implements BonusConverter { - @Autowired - private ISmUserService userService; - - @Autowired - private StoreService storeService; - - @Autowired - private ISysDeptService deptService; - - @Autowired - private TransactionBillService transactionBillService; - - @Autowired - private ISysConfigService sysConfigService; @Autowired private DeviceAssembler deviceAssembler; - /** - * 订单转为分成明细 - * - * @param bo - */ - @Override - public List toPo(RechargePayBO bo) { - if (bo == null) { - return Collections.emptyList(); - } - - TransactionBill bill = bo.getOrder(); - if (bill == null) { - return Collections.emptyList(); - } - - List result = genBonusList(bo.getMch(), null, bo.getPlatform(), bo.getDevice()); - - for (Bonus bonus : result) { - bonus.setBillId(bill.getBillId()); - bonus.setBillNo(bill.getBillNo()); - } - - return result; - } @Override - public List toPo(RechargeBO bo) { - if (bo == null) { - return Collections.emptyList(); - } - - TransactionBill bill = bo.getOrder(); - if (bill == null) { - return Collections.emptyList(); - } - - return genBonusList(bo.getMch(), bo.getAgent(), bo.getPlatform(), bo.getDevice()); - } - - @Override - public List genBonusList(SmUserVO mch, SmUserVO agent, SysDept platform, DeviceVO device) { + public List toPoList(SysDept platform, DeviceVO device, List staffList) { List result = new ArrayList<>(); - if (mch == null || platform == null || device == null) { + if (platform == null || device == null) { return result; } // 剩余可分配的分成比例 @@ -115,35 +54,61 @@ public class BonusConverterImpl implements BonusConverter { // 按照百分比收取服务费 BigDecimal serviceRate = device.getRealServiceRate(); // 服务费比例 - result.add(this.toPo(platform, serviceRate)); - + Bonus platformBonus = this.toPo(platform, serviceRate); + result.add(platformBonus); point = point.subtract(serviceRate); } // 代理模式 else if (DeviceServiceMode.AGENT.getMode().equals(device.getServiceMode())) { - // 平台收取服务费 - ServiceUtil.assertion(agent == null, "代理商不存在,请联系管理员处理"); - ServiceUtil.assertion(agent.getAgentServiceRate() == null, "代理商服务费未配置"); - ServiceUtil.assertion(device.getAgentServiceRate() == null, "代理商设备服务费未配置"); + // 平台收取代理商的服务费 + BigDecimal platformAgentServiceRate = device.getAgentUserServiceRate() == null ? BigDecimal.ZERO : device.getAgentUserServiceRate(); + // 代理商给商户设备设置的服务费 + BigDecimal agentMchServiceRate = device.getAgentServiceRate() == null ? BigDecimal.ZERO : device.getAgentServiceRate(); - result.add(this.toPo(platform, agent.getAgentServiceRate())); - point = point.subtract(agent.getAgentServiceRate()); + // 添加平台服务费 + Bonus platformBonus = this.toPo(platform, platformAgentServiceRate); + result.add(platformBonus); + point = point.subtract(platformAgentServiceRate); - // 代理商收取服务费 - BigDecimal agentArrivalPoint = device.getAgentServiceRate().subtract(agent.getAgentServiceRate()); - result.add(this.toPo(agent, agentArrivalPoint, agent.getUserId().toString(), BonusArrivalType.AGENT)); - point = point.subtract(agentArrivalPoint); + // 添加代理服务费 + // 代理商收取服务费 = 代理商给商户的服务费 - 平台收取代理商的服务费 + if (device.getAgentId() != null) { + BigDecimal agentArrivalPoint = agentMchServiceRate.subtract(platformAgentServiceRate); + Bonus agentBonus = this.toPo(device.getAgentId(), device.getAgentName(), agentArrivalPoint, device.getAgentId().toString(), BonusArrivalType.AGENT); + if (agentBonus != null) { + result.add(agentBonus); + point = point.subtract(agentArrivalPoint); + } + } } - ServiceUtil.assertion(point.compareTo(BigDecimal.ZERO) < 0, "商户剩余分成不允许小于0"); - ServiceUtil.assertion(point.compareTo(BigDecimal.valueOf(100)) > 0, "商户剩余分成不允许大于100"); + // 若有员工,则判断是否有分成 + if (CollectionUtils.isNotEmptyElement(staffList)) { + for (StoreStaffVO staff : staffList) { + if (staff == null || staff.getPoint().compareTo(BigDecimal.ZERO) == 0 || staff.getEnabled() == null || !staff.getEnabled()) { + continue; + } + String staffAncestors = Stream.of(device.getUserId(), staff.getUserId()) + .filter(Objects::nonNull) + .map(Object::toString) + .collect(Collectors.joining(",")); + Bonus staffBonus = this.toPo(staff.getUserId(), staff.getUserName(), staff.getPoint(), staffAncestors, BonusArrivalType.STAFF); + if (staffBonus != null) { + result.add(staffBonus); + point = point.subtract(staffBonus.getPoint()); + } + } + } // 剩余的给商户 String ancestors = Stream.of(device.getAgentId(), device.getUserId()) .filter(Objects::nonNull) .map(Object::toString) .collect(Collectors.joining(",")); - result.add(this.toPo(mch, point, ancestors, BonusArrivalType.MCH)); + Bonus mchBonus = this.toPo(device.getUserId(), device.getUserName(), point, ancestors, BonusArrivalType.MCH); + if (mchBonus != null) { + result.add(mchBonus); + } return result; } @@ -223,15 +188,15 @@ public class BonusConverterImpl implements BonusConverter { return po; } - private Bonus toPo(SmUserVO user, BigDecimal point, String ancestors, BonusArrivalType arrivalType) { - if (user == null || point == null) { + private Bonus toPo(Long userId, String userName, BigDecimal point, String ancestors, BonusArrivalType arrivalType) { + if (userId == null || point == null || point.compareTo(BigDecimal.ZERO) < 0 || point.compareTo(new BigDecimal(100)) > 0) { return null; } Bonus po = new Bonus(); po.setStatus(BonusStatus.UN_DIVIDEND.getStatus()); - po.setArrivalId(user.getUserId()); - po.setArrivalName(user.getRealOrUserName()); + po.setArrivalId(userId); + po.setArrivalName(userName); po.setArrivalType(arrivalType.getType()); po.setPoint(point); po.setAncestors(ancestors); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java index 54089203..5f2ec20e 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/DeviceVO.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonView; import com.ruoyi.common.core.domain.JsonViewProfile; import com.ruoyi.iot.interfaces.IotDevice; +import com.ruoyi.ss.bonus.domain.Bonus; import com.ruoyi.ss.device.domain.Device; import com.ruoyi.ss.device.domain.DeviceView; import com.ruoyi.ss.suit.domain.SuitVO; @@ -104,6 +105,9 @@ public class DeviceVO extends Device implements IotDevice { @JsonView(JsonViewProfile.App.class) private Boolean allowSwitch; + @ApiModelProperty("分成比例列表") + private List bonusList; + @Override public String iotMac1() { return getMac(); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java index ae4d4cc7..06adcbe4 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceAssembler.java @@ -51,4 +51,13 @@ public interface DeviceAssembler { default void assembleAllowSwitch(DeviceVO device, Long userId) { assembleAllowSwitch(Collections.singletonList(device), userId); } + + /** + * 拼接分成比例列表 + */ + void assembleBonusList(List list); + + default void assembleBonusList(DeviceVO device) { + this.assembleBonusList(Collections.singletonList(device)); + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceValidator.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceValidator.java index 47827f6f..047ee503 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceValidator.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceValidator.java @@ -98,4 +98,9 @@ public interface DeviceValidator { * 判断代理商是否允许商户开关 */ boolean isAgentAllowMchSwitch(DeviceVO device); + + /** + * 校验分成 + */ + void checkBonus(DeviceVO device); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java index 83671cf8..ac0b86c6 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceAssemblerImpl.java @@ -1,9 +1,13 @@ package com.ruoyi.ss.device.service.impl; import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.dashboard.domain.vo.BillCountVo; +import com.ruoyi.ss.bonus.domain.Bonus; +import com.ruoyi.ss.bonus.service.BonusConverter; import com.ruoyi.ss.device.domain.enums.DeviceServiceMode; import com.ruoyi.ss.device.domain.vo.DeviceVO; import com.ruoyi.ss.device.service.DeviceAssembler; @@ -14,6 +18,9 @@ import com.ruoyi.ss.deviceSuit.service.DeviceSuitService; import com.ruoyi.ss.store.domain.StoreQuery; import com.ruoyi.ss.store.domain.StoreVo; import com.ruoyi.ss.store.service.StoreService; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.service.StoreStaffService; import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery; import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillGroupBy; import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillStatus; @@ -21,6 +28,7 @@ import com.ruoyi.ss.transactionBill.domain.enums.TransactionBillType; import com.ruoyi.ss.transactionBill.service.TransactionBillService; import com.ruoyi.system.domain.enums.config.ConfigKey; import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.system.service.ISysDeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -50,6 +58,15 @@ public class DeviceAssemblerImpl implements DeviceAssembler { @Autowired private DeviceValidator deviceValidator; + @Autowired + private BonusConverter bonusConverter; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private StoreStaffService storeStaffService; + /** * 拼接套餐列表 * @@ -218,4 +235,31 @@ public class DeviceAssemblerImpl implements DeviceAssembler { device.setAllowSwitch(false); } } + + @Override + public void assembleBonusList(List list) { + if (CollectionUtils.isEmptyElement(list)) { + return; + } + + SysDept platform = deptService.selectDeptById(Constants.ROOT_DEPT); + + // 查询店铺员工 + List storeIds = CollectionUtils.map(list, DeviceVO::getStoreId); + Map> staffGroup = null; + if (CollectionUtils.isNotEmptyElement(storeIds)) { + StoreStaffQuery query = new StoreStaffQuery(); + query.setStoreIds(storeIds); + staffGroup = storeStaffService.selectStoreStaffList(query).stream().collect(Collectors.groupingBy(StoreStaffVO::getStoreId)); + } + + for (DeviceVO device : list) { + List staffList = null; + if (staffGroup != null && device.getStoreId() != null) { + staffList = staffGroup.get(device.getStoreId()); + } + List bonusList = bonusConverter.toPoList(platform, device, staffList); + device.setBonusList(bonusList); + } + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java index ac2a53e1..e36d00fb 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java @@ -192,6 +192,7 @@ public class DeviceServiceImpl implements DeviceService // 后校验 DeviceVO vo = this.selectById(data.getDeviceId()); + deviceAssembler.assembleBonusList(vo); deviceValidator.afterCheck(vo); // 创建OneNet设备1 @@ -314,9 +315,11 @@ public class DeviceServiceImpl implements DeviceService @Override public List selectSmDeviceByStoreId(Long storeId) { + if (storeId == null) { + return Collections.emptyList(); + } DeviceQuery dto = new DeviceQuery(); dto.setStoreId(storeId); - dto.setDeleted(false); return deviceMapper.selectSmDeviceList(dto); } @@ -756,6 +759,8 @@ public class DeviceServiceImpl implements DeviceService // 后校验 DeviceVO vo = this.selectById(deviceId); deviceValidator.checkAgent(vo); + deviceAssembler.assembleBonusList(vo); + deviceValidator.checkBonus(vo); // 添加绑定记录 int record = smDeviceBindRecordService.record(agentId, deviceId, BindRecordType.BIND, BindRecordUserType.AGENT); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java index fed961b9..4981c78c 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceValidatorImpl.java @@ -7,6 +7,7 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.collection.CollectionUtils; +import com.ruoyi.ss.bonus.domain.Bonus; import com.ruoyi.ss.device.domain.DeviceBO; import com.ruoyi.ss.device.domain.DeviceQuery; import com.ruoyi.ss.device.domain.enums.DeviceServiceMode; @@ -24,6 +25,7 @@ import com.ruoyi.ss.user.service.impl.SmUserServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.*; /** @@ -191,11 +193,14 @@ public class DeviceValidatorImpl extends BaseValidator implements DeviceValidato if (vo == null) { return; } + // 校验MAC this.checkMac(vo.getDeviceId(), vo.getMac(), vo.getMac2()); + // 校验SN this.checkSn(vo.getDeviceId(), vo.getDeviceNo()); - // 校验代理商 this.checkAgent(vo); + // 校验分成 + this.checkBonus(vo); } @@ -210,6 +215,7 @@ public class DeviceValidatorImpl extends BaseValidator implements DeviceValidato ServiceUtil.assertion(vo.getAgentServiceRate() == null || vo.getAgentUserServiceRate() == null, "设备代理商服务费或平台代理商服务费不允许为空"); ServiceUtil.assertion(vo.getAgentServiceRate().compareTo(vo.getAgentUserServiceRate()) < 0, "设备服务费不允许小于平台收取代理商的服务费:" + vo.getAgentUserServiceRate() + "%"); + ServiceUtil.assertion(vo.getAgentServiceRate().compareTo(new BigDecimal(100)) > 0, "代理服务费不允许超过100%"); } } @@ -256,4 +262,21 @@ public class DeviceValidatorImpl extends BaseValidator implements DeviceValidato } return true; } + + @Override + public void checkBonus(DeviceVO device) { + if (device == null || CollectionUtils.isEmpty(device.getBonusList())) { + return; + } + BigDecimal decimal100 = new BigDecimal(100); + + BigDecimal sumPoint = CollectionUtils.sumDecimal(device.getBonusList(), Bonus::getPoint); + ServiceUtil.assertion(sumPoint.compareTo(decimal100) > 0, "设备%s的总分成比例不允许超过100", device.getDeviceNo()); + + // 不允许分成小于0 + for (Bonus bonus : device.getBonusList()) { + ServiceUtil.assertion(bonus.getPoint() == null, "设备%s的分成比例不允许为空", device.getDeviceNo()); + ServiceUtil.assertion(bonus.getPoint().compareTo(BigDecimal.ZERO) < 0, "设备%s的分成比例不允许小于0", device.getDeviceNo()); + } + } } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/store/service/StoreValidator.java b/smart-switch-service/src/main/java/com/ruoyi/ss/store/service/StoreValidator.java index 64600912..6319cb28 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/store/service/StoreValidator.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/store/service/StoreValidator.java @@ -6,6 +6,7 @@ import com.ruoyi.ss.store.domain.StoreBO; import com.ruoyi.ss.store.domain.StoreVo; import java.time.LocalTime; +import java.util.Collections; import java.util.List; /** @@ -69,6 +70,10 @@ public interface StoreValidator { */ boolean isStoreBelongUser(List storeId, Long userId); + default boolean isStoreBelongUser(Long storeId, Long userId) { + return isStoreBelongUser(Collections.singletonList(storeId), userId); + } + /** * 判断店铺是否属于用户 */ diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaff.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaff.java new file mode 100644 index 00000000..7989eaf3 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaff.java @@ -0,0 +1,66 @@ +package com.ruoyi.ss.storeStaff.domain; + +import java.math.BigDecimal; +import java.util.List; + +import com.ruoyi.common.core.domain.ValidGroup; +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; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * 店铺员工对象 ss_store_staff + * + * @author ruoyi + * @date 2024-11-13 + */ +@Data +public class StoreStaff extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private Long employId; + + @Excel(name = "店铺ID") + @ApiModelProperty("店铺ID") + @NotNull(message = "店铺不能为空", groups = {ValidGroup.Create.class}) + private Long storeId; + + @Excel(name = "用户ID") + @ApiModelProperty("用户ID") + @NotNull(message = "用户不能为空", groups = {ValidGroup.Create.class}) + private Long userId; + + @Excel(name = "角色", readConverterExp = "1=店铺所有人,2=员工") + @ApiModelProperty("角色") + @NotNull(message = "角色不能为空", groups = {ValidGroup.Create.class}) + private String role; + + @Excel(name = "分成比例") + @ApiModelProperty("分成比例") + @NotNull(message = "分成比例不能为空", groups = {ValidGroup.Create.class}) + @Min(value = 0, message = "分成比例不允许小于0") + @Max(value = 100, message = "分成比例不允许大于100") + private BigDecimal point; + + @Excel(name = "是否启用") + @ApiModelProperty("是否启用") + @NotNull(message = "是否启用不能为空", groups = {ValidGroup.Create.class}) + private Boolean enabled; + + @Excel(name = "权限列表", readConverterExp = "1=查看店铺,2=操作店铺,3=查看设备,4=操作设备,5=查看订单,6=操作订单") + @ApiModelProperty("权限列表") + private List permissions; + + @Excel(name = "创建人ID") + @ApiModelProperty("创建人ID") + private Long createId; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaffQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaffQuery.java new file mode 100644 index 00000000..b3e3fa7f --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaffQuery.java @@ -0,0 +1,24 @@ +package com.ruoyi.ss.storeStaff.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author wjh + * 2024/11/13 + */ +@Data +public class StoreStaffQuery extends StoreStaffVO { + + @ApiModelProperty("ID列表") + private List employIds; + + @ApiModelProperty("排除的店铺员工ID") + private Long excludeEmployId; + + @ApiModelProperty("店铺ID列表") + private List storeIds; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaffVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaffVO.java new file mode 100644 index 00000000..1715a50e --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/domain/StoreStaffVO.java @@ -0,0 +1,22 @@ +package com.ruoyi.ss.storeStaff.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author wjh + * 2024/11/13 + */ +@Data +public class StoreStaffVO extends StoreStaff{ + + @ApiModelProperty("店铺名称") + private String storeName; + + @ApiModelProperty("用户名称") + private String userName; + + @ApiModelProperty("商户ID") + private Long mchId; + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/mapper/StoreStaffMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/mapper/StoreStaffMapper.java new file mode 100644 index 00000000..b71dbb86 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/mapper/StoreStaffMapper.java @@ -0,0 +1,75 @@ +package com.ruoyi.ss.storeStaff.mapper; + +import java.math.BigDecimal; +import java.util.List; +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; +import org.apache.ibatis.annotations.Param; + +/** + * 店铺员工Mapper接口 + * + * @author ruoyi + * @date 2024-11-13 + */ +public interface StoreStaffMapper +{ + /** + * 查询店铺员工 + * + * @param employId 店铺员工主键 + * @return 店铺员工 + */ + public StoreStaffVO selectStoreStaffByEmployId(Long employId); + + /** + * 查询店铺员工列表 + * + * @param query 店铺员工 + * @return 店铺员工集合 + */ + public List selectStoreStaffList(@Param("query")StoreStaffQuery query); + + /** + * 新增店铺员工 + * + * @param storeStaff 店铺员工 + * @return 结果 + */ + public int insertStoreStaff(StoreStaff storeStaff); + + /** + * 修改店铺员工 + * + * @param storeStaff 店铺员工 + * @return 结果 + */ + public int updateStoreStaff(@Param("data") StoreStaff storeStaff); + + /** + * 删除店铺员工 + * + * @param employId 店铺员工主键 + * @return 结果 + */ + public int deleteStoreStaffByEmployId(Long employId); + + /** + * 批量删除店铺员工 + * + * @param employIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteStoreStaffByEmployIds(@Param("employIds") List employIds); + + /** + * 查询分成比例总和 + */ + BigDecimal selectSumOfPoint(@Param("query") StoreStaffQuery query); + + /** + * 查询数量 + */ + int selectCount(@Param("query") StoreStaffQuery query); +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/mapper/StoreStaffMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/mapper/StoreStaffMapper.xml new file mode 100644 index 00000000..2d43a4f2 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/mapper/StoreStaffMapper.xml @@ -0,0 +1,142 @@ + + + + + + + + + + select + sss.employ_id, + sss.store_id, + sss.user_id, + sss.remark, + sss.role, + sss.point, + sss.enabled, + sss.permissions, + sss.create_time, + sss.create_by, + sss.create_id, + ss.name as store_name, + ss.user_id as mch_id, + su.user_name as user_name + from ss_store_staff sss + left join sm_store ss on ss.store_id = sss.store_id + left join sm_user su on su.user_id = sss.user_id + + + + and sss.employ_id = #{query.employId} + and sss.store_id = #{query.storeId} + and sss.user_id = #{query.userId} + and sss.remark like concat('%', #{query.remark}, '%') + and sss.role = #{query.role} + and sss.point = #{query.point} + and sss.enabled = #{query.enabled} + and sss.create_id = #{query.createId} + and ss.name like concat('%', #{query.storeName}, '%') + and su.user_name like concat('%', #{query.userName}, '%') + and ss.user_id = #{query.mchId} + + and sss.employ_id != #{query.excludeEmployId} + + + and sss.store_id in + + #{item} + + + + + + + + + + + + + + insert into ss_store_staff + + store_id, + user_id, + remark, + `role`, + `point`, + enabled, + permissions, + create_time, + create_by, + create_id, + + + #{storeId}, + #{userId}, + #{remark}, + #{role}, + #{point}, + #{enabled}, + #{permissions,typeHandler=com.ruoyi.system.mapper.typehandler.StringSplitListTypeHandler}, + #{createTime}, + #{createBy}, + #{createId}, + + + + + update ss_store_staff + + + + where employ_id = #{data.employId} + + + + store_id = #{data.storeId}, + user_id = #{data.userId}, + remark = #{data.remark}, + `role` = #{data.role}, + `point` = #{data.point}, + enabled = #{data.enabled}, + permissions = #{data.permissions,typeHandler=com.ruoyi.system.mapper.typehandler.StringSplitListTypeHandler}, + create_time = #{data.createTime}, + create_by = #{data.createBy}, + create_id = #{data.createId}, + + + + delete from ss_store_staff where employ_id = #{employId} + + + + delete from ss_store_staff where employ_id in + + #{employId} + + + diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/StoreStaffService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/StoreStaffService.java new file mode 100644 index 00000000..7fb8c484 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/StoreStaffService.java @@ -0,0 +1,80 @@ +package com.ruoyi.ss.storeStaff.service; + +import java.math.BigDecimal; +import java.util.List; +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; + +/** + * 店铺员工Service接口 + * + * @author ruoyi + * @date 2024-11-13 + */ +public interface StoreStaffService +{ + /** + * 查询店铺员工 + * + * @param employId 店铺员工主键 + * @return 店铺员工 + */ + public StoreStaffVO selectStoreStaffByEmployId(Long employId); + + /** + * 查询店铺员工列表 + * + * @param storeStaff 店铺员工 + * @return 店铺员工集合 + */ + public List selectStoreStaffList(StoreStaffQuery storeStaff); + + /** + * 新增店铺员工 + * + * @param storeStaff 店铺员工 + * @return 结果 + */ + public int insertStoreStaff(StoreStaff storeStaff); + + /** + * 修改店铺员工 + * + * @param storeStaff 店铺员工 + * @return 结果 + */ + public int updateStoreStaff(StoreStaff storeStaff); + + /** + * 批量删除店铺员工 + * + * @param employIds 需要删除的店铺员工主键集合 + * @return 结果 + */ + public int deleteStoreStaffByEmployIds(List employIds); + + /** + * 删除店铺员工信息 + * + * @param employId 店铺员工主键 + * @return 结果 + */ + public int deleteStoreStaffByEmployId(Long employId); + + /** + * 查询分成比例总和 + */ + BigDecimal selectSumOfPoint(StoreStaffQuery query); + + /** + * 查询数量 + */ + int selectCount(StoreStaffQuery query); + + /** + * 查询详情 + */ + StoreStaffVO selectOne(StoreStaffQuery query); + +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/StoreStaffValidator.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/StoreStaffValidator.java new file mode 100644 index 00000000..141fee1b --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/StoreStaffValidator.java @@ -0,0 +1,28 @@ +package com.ruoyi.ss.storeStaff.service; + +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; + +import java.util.List; + +/** + * @author wjh + * 2024/11/13 + */ +public interface StoreStaffValidator { + + /** + * 校验分成比例 + */ + void checkPoint(StoreStaff data); + + /** + * 新增、修改后校验 + */ + void afterCheck(StoreStaffVO vo); + + /** + * 是否是商户 + */ + boolean isMch(List employIds, Long userId); +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/impl/StoreStaffServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/impl/StoreStaffServiceImpl.java new file mode 100644 index 00000000..3629c1d7 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/impl/StoreStaffServiceImpl.java @@ -0,0 +1,146 @@ +package com.ruoyi.ss.storeStaff.service.impl; + +import java.math.BigDecimal; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; +import com.ruoyi.ss.storeStaff.service.StoreStaffValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.ss.storeStaff.mapper.StoreStaffMapper; +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; +import com.ruoyi.ss.storeStaff.service.StoreStaffService; +import org.springframework.transaction.support.TransactionTemplate; + +/** + * 店铺员工Service业务层处理 + * + * @author ruoyi + * @date 2024-11-13 + */ +@Service +public class StoreStaffServiceImpl implements StoreStaffService +{ + @Autowired + private StoreStaffMapper storeStaffMapper; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private StoreStaffValidator storeStaffValidator; + + /** + * 查询店铺员工 + * + * @param employId 店铺员工主键 + * @return 店铺员工 + */ + @Override + public StoreStaffVO selectStoreStaffByEmployId(Long employId) + { + return storeStaffMapper.selectStoreStaffByEmployId(employId); + } + + /** + * 查询店铺员工列表 + * + * @param storeStaff 店铺员工 + * @return 店铺员工 + */ + @Override + public List selectStoreStaffList(StoreStaffQuery storeStaff) + { + return storeStaffMapper.selectStoreStaffList(storeStaff); + } + + /** + * 新增店铺员工 + * + * @param storeStaff 店铺员工 + * @return 结果 + */ + @Override + public int insertStoreStaff(StoreStaff storeStaff) { + storeStaff.setCreateTime(DateUtils.getNowDate()); + + Integer result = transactionTemplate.execute(status -> { + int insert = storeStaffMapper.insertStoreStaff(storeStaff); + ServiceUtil.assertion(insert != 1, "新增店铺员工失败"); + + StoreStaffVO vo = this.selectStoreStaffByEmployId(storeStaff.getEmployId()); + storeStaffValidator.afterCheck(vo); + + return insert; + }); + + return result == null ? 0 : result; + } + + /** + * 修改店铺员工 + * + * @param storeStaff 店铺员工 + * @return 结果 + */ + @Override + public int updateStoreStaff(StoreStaff storeStaff) { + Integer result = transactionTemplate.execute(status -> { + int update = storeStaffMapper.updateStoreStaff(storeStaff); + ServiceUtil.assertion(update != 1, "修改店铺员工失败"); + + StoreStaffVO vo = this.selectStoreStaffByEmployId(storeStaff.getEmployId()); + storeStaffValidator.afterCheck(vo); + + return update; + }); + + return result == null ? 0 : result; + } + + /** + * 批量删除店铺员工 + * + * @param employIds 需要删除的店铺员工主键 + * @return 结果 + */ + @Override + public int deleteStoreStaffByEmployIds(List employIds) + { + return storeStaffMapper.deleteStoreStaffByEmployIds(employIds); + } + + /** + * 删除店铺员工信息 + * + * @param employId 店铺员工主键 + * @return 结果 + */ + @Override + public int deleteStoreStaffByEmployId(Long employId) + { + return storeStaffMapper.deleteStoreStaffByEmployId(employId); + } + + @Override + public BigDecimal selectSumOfPoint(StoreStaffQuery query) { + return storeStaffMapper.selectSumOfPoint(query); + } + + @Override + public int selectCount(StoreStaffQuery query) { + return storeStaffMapper.selectCount(query); + } + + @Override + public StoreStaffVO selectOne(StoreStaffQuery query) { + List list = selectStoreStaffList(query); + if (CollectionUtils.isEmpty(list)) { + return null; + } + return list.get(0); + } +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/impl/StoreStaffValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/impl/StoreStaffValidatorImpl.java new file mode 100644 index 00000000..d2424220 --- /dev/null +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/storeStaff/service/impl/StoreStaffValidatorImpl.java @@ -0,0 +1,108 @@ +package com.ruoyi.ss.storeStaff.service.impl; + +import com.ruoyi.common.utils.ServiceUtil; +import com.ruoyi.common.utils.collection.CollectionUtils; +import com.ruoyi.ss.bonus.domain.Bonus; +import com.ruoyi.ss.device.domain.vo.DeviceVO; +import com.ruoyi.ss.device.service.DeviceAssembler; +import com.ruoyi.ss.device.service.DeviceService; +import com.ruoyi.ss.device.service.DeviceValidator; +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.service.StoreStaffService; +import com.ruoyi.ss.storeStaff.service.StoreStaffValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +/** + * @author wjh + * 2024/11/13 + */ +@Service +public class StoreStaffValidatorImpl implements StoreStaffValidator { + + @Autowired + private DeviceAssembler deviceAssembler; + + @Autowired + private DeviceService deviceService; + + @Autowired + private DeviceValidator deviceValidator; + + @Autowired + private StoreStaffService storeStaffService; + + @Override + public void checkPoint(StoreStaff data) { + if (data == null) { + return; + } + + List deviceList = deviceService.selectSmDeviceByStoreId(data.getStoreId()); + if (CollectionUtils.isEmptyElement(deviceList)) { + return; + } + deviceAssembler.assembleBonusList(deviceList); + + // 校验设备分成 + for (DeviceVO device : deviceList) { + deviceValidator.checkBonus(device); + } + } + + @Override + public void afterCheck(StoreStaffVO vo) { + if (vo == null) { + return; + } + // 校验用户是否重复成为店铺员工 + this.checkRepeatUser(vo.getStoreId(), vo.getUserId(), vo.getEmployId()); + // 校验分成 + this.checkPoint(vo); + } + + @Override + public boolean isMch(List employIds, Long mchId) { + if (mchId == null) { + return false; + } + if (CollectionUtils.isEmptyElement(employIds)) { + return true; + } + StoreStaffQuery query = new StoreStaffQuery(); + query.setEmployIds(employIds); + query.setMchId(mchId); + List list = storeStaffService.selectStoreStaffList(query); + + for (Long employId : employIds) { + if (employId == null) { + continue; + } + StoreStaffVO staff = list.stream().filter(item -> Objects.equals(employId, item.getEmployId()) && Objects.equals(item.getMchId(), mchId)) + .findFirst() + .orElse(null); + if (staff == null) { + return false; + } + } + + return true; + } + + private void checkRepeatUser(Long storeId, Long userId, Long employId) { + if (storeId == null || userId == null) { + return; + } + StoreStaffQuery query = new StoreStaffQuery(); + query.setStoreId(storeId); + query.setUserId(userId); + query.setExcludeEmployId(employId); + ServiceUtil.assertion(storeStaffService.selectCount(query) > 0, "当前用户已成为店铺员工,请勿重复操作"); ; + } +} diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/bo/RechargeBO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/bo/RechargeBO.java index e1a7b0be..02ddce06 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/bo/RechargeBO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/bo/RechargeBO.java @@ -41,9 +41,6 @@ public class RechargeBO { // 店铺 private StoreVo store; - // 分成详情 - private List bonusList; - // 平台 private SysDept platform; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillConverterImpl.java index 3ad46a8f..8acd9f66 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillConverterImpl.java @@ -11,6 +11,7 @@ import com.ruoyi.ss.channel.service.ChannelService; import com.ruoyi.ss.channelWithdraw.domain.ChannelWithdrawVO; import com.ruoyi.ss.channelWithdraw.service.ChannelWithdrawService; import com.ruoyi.ss.device.domain.vo.DeviceVO; +import com.ruoyi.ss.device.service.DeviceAssembler; import com.ruoyi.ss.device.service.DeviceService; import com.ruoyi.ss.store.domain.StoreVo; import com.ruoyi.ss.store.service.StoreService; @@ -70,6 +71,9 @@ public class TransactionBillConverterImpl implements TransactionBillConverter { @Autowired private ISysDeptService deptService; + @Autowired + private DeviceAssembler deviceAssembler; + /** * 将参数转为充值BO * @@ -83,6 +87,7 @@ public class TransactionBillConverterImpl implements TransactionBillConverter { DeviceVO device = deviceService.selectByDeviceNo(dto.getDeviceNo()); ServiceUtil.assertion(device == null, "设备不存在"); + deviceAssembler.assembleBonusList(Collections.singletonList(device)); // 拼接分成列表 StoreVo store = storeService.selectSmStoreById(device.getStoreId()); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java index 4614935b..657c3386 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java @@ -265,10 +265,7 @@ public class TransactionBillServiceImpl implements TransactionBillService, After // 生成订单 TransactionBill order = parseToOrder(bo); - - // 生成分成列表 - List bonusList = bonusConverter.toPo(bo); - bo.setBonusList(bonusList); + List bonusList = bo.getDevice().getBonusList(); transactionTemplate.execute(status -> { // 收取月费 @@ -279,13 +276,13 @@ public class TransactionBillServiceImpl implements TransactionBillService, After int insert = this.insertSmTransactionBill(order); ServiceUtil.assertion(insert != 1, "下单失败"); - // 代理商模式,插入分成列表 - for (Bonus bonus : bo.getBonusList()) { + // 插入分成列表 + for (Bonus bonus : bonusList) { bonus.setBillId(order.getBillId()); bonus.setBillNo(order.getBillNo()); } - int bonusInsert = bonusService.batchInsert(bo.getBonusList()); - ServiceUtil.assertion(bonusInsert != bo.getBonusList().size(), "创建分成失败"); + int bonusInsert = bonusService.batchInsert(bonusList); + ServiceUtil.assertion(bonusInsert != bonusList.size(), "创建分成失败"); return insert; }); @@ -302,9 +299,9 @@ public class TransactionBillServiceImpl implements TransactionBillService, After // 处理充值服务费 private void handleRechargeService(RechargePayBO bo) { - TransactionBillVO order = bo.getOrder(); - - List bonusList = bonusConverter.toPo(bo); +// TransactionBillVO order = bo.getOrder(); +// +// List bonusList = bonusConverter.toPo(bo); // 获取商户的服务费配置 // UserRechargeServiceVO userRechargeService = this.getMchRechargeService(bo.getChannel(), bo.getMch(), bo.getDevice()); diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transfer/service/impl/TransferConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transfer/service/impl/TransferConverterImpl.java index 34c2596c..8a3675e0 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/transfer/service/impl/TransferConverterImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transfer/service/impl/TransferConverterImpl.java @@ -10,6 +10,8 @@ import com.ruoyi.ss.transfer.domain.enums.TransferStatus; import com.ruoyi.ss.transfer.service.TransferConverter; import com.ruoyi.ss.transferDetail.domain.TransferDetailVO; import com.ruoyi.ss.transferDetail.domain.enums.TransferDetailStatus; +import com.ruoyi.ss.user.domain.SmUserVO; +import com.ruoyi.ss.user.service.ISmUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -26,6 +28,9 @@ public class TransferConverterImpl implements TransferConverter { @Autowired private ChannelWithdrawService channelWithdrawService; + @Autowired + private ISmUserService userService; + /** * 提现转为转账单VO @@ -39,6 +44,10 @@ public class TransferConverterImpl implements TransferConverter { // 渠道 ChannelWithdrawVO channel = channelWithdrawService.selectChannelWithdrawByChannelId(bill.getChannelId()); + // 用户 + SmUserVO user = userService.selectSimpleById(bill.getUserId()); + + // 拼接数据 TransferVO vo = new TransferVO(); // 渠道转为账户类型 @@ -62,6 +71,9 @@ public class TransferConverterImpl implements TransferConverter { detail.setAmount(bill.getArrivalAmount()); detail.setAccountNo(bill.getAccountNo()); detail.setRemark(String.format("提现申请%s转账", bill.getBillNo())); + if (user != null) { + detail.setUserName(user.getRealName()); + } detailList.add(detail); vo.setDetailList(detailList); diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/mch/MchStoreStaffController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/mch/MchStoreStaffController.java new file mode 100644 index 00000000..672a3e0c --- /dev/null +++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/mch/MchStoreStaffController.java @@ -0,0 +1,97 @@ +package com.ruoyi.web.controller.mch; + +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.domain.ValidGroup; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.ss.store.service.StoreValidator; +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.service.StoreStaffService; +import com.ruoyi.ss.storeStaff.service.StoreStaffValidator; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author wjh + * 2024/11/13 + */ +@RestController +@RequestMapping("/mch/storeStaff") +public class MchStoreStaffController extends BaseController { + + @Autowired + private StoreStaffService storeStaffService; + + @Autowired + private StoreValidator storeValidator; + + @Autowired + private StoreStaffValidator storeStaffValidator; + + @ApiOperation("商户查询店铺员工列表") + @GetMapping("/list") + public TableDataInfo list(StoreStaffQuery query) { + startPage(); + startOrderBy(); + query.setMchId(getUserId()); + List list = storeStaffService.selectStoreStaffList(query); + return getDataTable(list); + } + + @ApiOperation("商户获取店铺员工详细信息") + @GetMapping(value = "/{employId}") + public AjaxResult getInfo(@PathVariable("employId") Long employId) + { + StoreStaffQuery query = new StoreStaffQuery(); + query.setMchId(getUserId()); + query.setEmployId(employId); + return success(storeStaffService.selectOne(query)); + } + + @ApiOperation("商户新增店铺员工") + @Log(title = "店铺员工", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody @Validated(ValidGroup.Create.class) StoreStaff storeStaff) { + // 校验店铺是否为本人的 + if (!storeValidator.isStoreBelongUser(storeStaff.getStoreId(), getUserId())) { + return error("您只能操作自己的店铺"); + } + + storeStaff.setCreateBy(getUsername()); + storeStaff.setCreateId(getUserId()); + return toAjax(storeStaffService.insertStoreStaff(storeStaff)); + } + + @ApiOperation("商户修改店铺员工") + @Log(title = "店铺员工", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody @Validated(ValidGroup.Update.class) StoreStaff storeStaff) { + if (storeStaff.getStoreId() != null) { + // 校验店铺是否为本人的 + if (!storeValidator.isStoreBelongUser(storeStaff.getStoreId(), getUserId())) { + return error("您只能操作自己的店铺"); + } + } + return toAjax(storeStaffService.updateStoreStaff(storeStaff)); + } + + @ApiOperation("商户删除店铺员工") + @Log(title = "店铺员工", businessType = BusinessType.DELETE) + @DeleteMapping("/{employIds}") + public AjaxResult remove(@PathVariable List employIds) { + if (!storeStaffValidator.isMch(employIds, getUserId())) { + return error("您只能操作自己的店铺"); + } + + return toAjax(storeStaffService.deleteStoreStaffByEmployIds(employIds)); + } + +} diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java index c435a5d2..e71c255c 100644 --- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java +++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java @@ -87,6 +87,7 @@ public class SmDeviceController extends BaseController public AjaxResult getInfo(@PathVariable("deviceId") Long deviceId) { DeviceVO device = deviceService.selectById(deviceId); deviceAssembler.assembleRealServiceRate(device); + deviceAssembler.assembleBonusList(device); return success(device); } diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/StoreStaffController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/StoreStaffController.java new file mode 100644 index 00000000..db60dbf6 --- /dev/null +++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/StoreStaffController.java @@ -0,0 +1,111 @@ +package com.ruoyi.web.controller.ss; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.core.domain.ValidGroup; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.ss.storeStaff.domain.StoreStaff; +import com.ruoyi.ss.storeStaff.domain.StoreStaffVO; +import com.ruoyi.ss.storeStaff.domain.StoreStaffQuery; +import com.ruoyi.ss.storeStaff.service.StoreStaffService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 店铺员工Controller + * + * @author ruoyi + * @date 2024-11-13 + */ +@RestController +@RequestMapping("/ss/storeStaff") +public class StoreStaffController extends BaseController +{ + @Autowired + private StoreStaffService storeStaffService; + + /** + * 查询店铺员工列表 + */ + @PreAuthorize("@ss.hasPermi('ss:storeStaff:list')") + @GetMapping("/list") + public TableDataInfo list(StoreStaffQuery query) + { + startPage(); + startOrderBy(); + List list = storeStaffService.selectStoreStaffList(query); + return getDataTable(list); + } + + /** + * 导出店铺员工列表 + */ + @PreAuthorize("@ss.hasPermi('ss:storeStaff:export')") + @Log(title = "店铺员工", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, StoreStaffQuery query) + { + List list = storeStaffService.selectStoreStaffList(query); + ExcelUtil util = new ExcelUtil(StoreStaffVO.class); + util.exportExcel(response, list, "店铺员工数据"); + } + + /** + * 获取店铺员工详细信息 + */ + @PreAuthorize("@ss.hasPermi('ss:storeStaff:query')") + @GetMapping(value = "/{employId}") + public AjaxResult getInfo(@PathVariable("employId") Long employId) + { + return success(storeStaffService.selectStoreStaffByEmployId(employId)); + } + + /** + * 新增店铺员工 + */ + @PreAuthorize("@ss.hasPermi('ss:storeStaff:add')") + @Log(title = "店铺员工", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody @Validated(ValidGroup.Create.class) StoreStaff storeStaff) + { + storeStaff.setCreateBy(getUsername()); + return toAjax(storeStaffService.insertStoreStaff(storeStaff)); + } + + /** + * 修改店铺员工 + */ + @PreAuthorize("@ss.hasPermi('ss:storeStaff:edit')") + @Log(title = "店铺员工", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody @Validated(ValidGroup.Update.class) StoreStaff storeStaff) + { + return toAjax(storeStaffService.updateStoreStaff(storeStaff)); + } + + /** + * 删除店铺员工 + */ + @PreAuthorize("@ss.hasPermi('ss:storeStaff:remove')") + @Log(title = "店铺员工", businessType = BusinessType.DELETE) + @DeleteMapping("/{employIds}") + public AjaxResult remove(@PathVariable List employIds) + { + return toAjax(storeStaffService.deleteStoreStaffByEmployIds(employIds)); + } +}