xuhy
2024-08-30 c22b895afe54ea30e395e00ed225883243fb8309
用户角色接口
9个文件已添加
23个文件已修改
927 ■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/pom.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TDataGenerator.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderMeal.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderSale.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TStockDataSet.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/OrderMealGeneratorDTO.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/OrderSaleGeneratorDTO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/StockDataSetDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/SysUserUpdateStatusDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDataGeneratorMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TStockDataSetMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TDataGeneratorService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TStockDataSetService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java 287 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TStockDataSetServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TDataGeneratorVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TDataGeneratorMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TStockDataSetMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java
@@ -1,16 +1,21 @@
package com.ruoyi.web.controller.api;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.TDataGenerator;
import com.ruoyi.system.dto.OrderMealGeneratorDTO;
import com.ruoyi.system.dto.OrderSaleGeneratorDTO;
import com.ruoyi.system.query.TDataGeneratorQuery;
import com.ruoyi.system.service.TDataGeneratorService;
import com.ruoyi.system.service.TOrderMealService;
import com.ruoyi.system.vo.TDataGeneratorVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
@@ -34,9 +39,29 @@
    }
    @ApiOperation( value = "餐饮数据生成")
    @PostMapping(value = "/dataGenerator")
    public AjaxResult<String> dataGenerator(@RequestBody OrderMealGeneratorDTO dto) {
        dataGeneratorService.dataGenerator(dto);
    @PostMapping(value = "/mealDataGenerator")
    public AjaxResult<String> mealDataGenerator(@RequestBody OrderMealGeneratorDTO dto) {
        dataGeneratorService.mealDataGenerator(dto);
        return AjaxResult.success();
    }
    @ApiOperation( value = "销售数据生成")
    @PostMapping(value = "/saleDataGenerator")
    public AjaxResult<String> saleDataGenerator(@RequestBody OrderSaleGeneratorDTO dto) {
        dataGeneratorService.saleDataGenerator(dto);
        return AjaxResult.success();
    }
    @ApiOperation( value = "数据生成分页")
    @PostMapping(value = "/pageList")
    public AjaxResult<PageInfo<TDataGeneratorVO>> pageList(@Validated @RequestBody TDataGeneratorQuery query) {
        return AjaxResult.success(dataGeneratorService.pageList(query));
    }
    @ApiOperation( value = "数据覆盖")
    @GetMapping(value = "/dataCoverage")
    public AjaxResult<String> dataCoverage(@RequestParam(value = "id") Long id) {
        dataGeneratorService.dataCoverage(id);
        return AjaxResult.success();
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -178,6 +178,10 @@
        if (flag){
            return error("修改角色'" + dto.getRoleName() + "'失败,角色名称已存在");
        }
        SysRole sysRole = roleService.selectRoleById(dto.getRoleId());
        if("meal".equals(sysRole.getRoleKey()) || "sale".equals(sysRole.getRoleKey()) || "admin".equals(sysRole.getRoleKey())){
            return error("当前角色无法修改");
        }
        if (roleService.editRole(dto) > 0)
        {
            // 更新缓存用户权限
@@ -215,6 +219,10 @@
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysRole role)
    {
        SysRole sysRole = roleService.selectRoleById(role.getRoleId());
        if("meal".equals(sysRole.getRoleKey()) || "sale".equals(sysRole.getRoleKey()) || "admin".equals(sysRole.getRoleKey())){
            return error("当前角色无法修改状态");
        }
        role.setUpdateBy(getUsername());
        roleService.updateStatus(role);
        return AjaxResult.success();
@@ -224,7 +232,23 @@
     * 删除角色
     */
    // @PreAuthorize("@ss.hasPermi('system:role:remove')")
    @ApiOperation(value = "删除角色")
    @ApiOperation(value = "批量删除角色")
    @Log(title = "角色信息-角色删除角色", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteById/{id}")
    public AjaxResult remove(@PathVariable(value = "id") Long id)
    {
        SysRole sysRole = roleService.selectRoleById(id);
        if("meal".equals(sysRole.getRoleKey()) || "sale".equals(sysRole.getRoleKey()) || "admin".equals(sysRole.getRoleKey())){
            return error("当前角色无法删除");
        }
        return AjaxResult.success(roleService.deleteRoleById(id));
    }
    /**
     * 删除角色
     */
    // @PreAuthorize("@ss.hasPermi('system:role:remove')")
    @ApiOperation(value = "批量删除角色")
    @Log(title = "角色信息-角色删除角色", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteById/{ids}")
    public AjaxResult remove(@PathVariable String ids)
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -82,105 +82,6 @@
//    }
    /**
     * 人员借用列表
     */
//    @ApiOperation(value = "人员借用列表")
//    @GetMapping("/userBorrowList")
//    public AjaxResult userBorrowList(@RequestParam(required = false) String name,
//                                     @RequestParam(required = false) Integer type)
//    {
//
//        UserAddListVO userAddListVO = new UserAddListVO();
//
//        Long companyId = tokenService.getLoginUser().getUser().getCompanyId();
//
//        List<TCompany> companyList = new ArrayList<>();
//        List<TDept> deptList = new ArrayList<>();
//        List<SysUser> userList = new ArrayList<>();
//        // 查询公司
//        if(Objects.nonNull(type) && type == 1){
//            companyList = companyService.userAddListByCompanyName(name);
//        }
//        // 查询部门
//        if(Objects.nonNull(type) && type == 2){
//            deptList = tDeptService.userAddListByDeptName(name);
//        }
//        // 查询用户
//        if(Objects.nonNull(type) && type == 3){
//            userList = userService.selectListByNamePhone(name);
//        }
//
//        if(Objects.isNull(type)){
//            companyList = companyService.userAddListByCompanyName(name);
//            deptList = tDeptService.userAddListByDeptName(name);
//            userList = userService.selectListByNamePhone(name);
//        }
//
//        List<Long> companyIds = companyList.stream().map(TCompany::getId).collect(Collectors.toList());
//        List<Long> deptCompanyIds = deptList.stream().map(TDept::getCompanyId).collect(Collectors.toList());
//        List<Long> userCompanyIds = userList.stream().map(SysUser::getCompanyId).collect(Collectors.toList());
//        companyIds.addAll(deptCompanyIds);
//        companyIds.addAll(userCompanyIds);
//
//        companyIds = companyIds.stream().distinct().collect(Collectors.toList());
//
//        if(CollectionUtils.isEmpty(companyIds)){
//            return AjaxResult.success(userAddListVO);
//        }
//        SysUser user1 = tokenService.getLoginUser().getUser();
//        if(!user1.isAdmin()){
//            companyIds = companyIds.stream().filter(e->!e.equals(companyId)).collect(Collectors.toList());
//        }
//
//        // 查询符合要求的公司
//        List<UserLevelVO> parent = companyService.userAddListByCompanyIds(companyIds);
//
//        List<TDept> depts = tDeptService.selectList();
//
//        List<SysUser> sysUsers = userService.selectList();
//
//        for (UserLevelVO userLevelVO : parent) {
//
//            // 找到公司下的部门
//            List<TDept> tDepts = depts.stream().filter(e -> userLevelVO.getKey().equals(e.getCompanyId())).collect(Collectors.toList());
//            List<UserLevelVO> children = new ArrayList<>();
//            // 封装部门
//            for (TDept dept : tDepts) {
//                userLevelVO.setChildren(children);
//                UserLevelVO userLevelVO1 = new UserLevelVO();
//                userLevelVO1.setKey(dept.getId());
//                userLevelVO1.setTitle(dept.getDeptName());
//                // 找到部门下的人员
//                List<SysUser> users;
//                if(StringUtils.isNotEmpty(name) && type == 3){
//                    users = sysUsers.stream().filter(e -> userLevelVO1.getKey().equals(e.getDeptId())
//                            && ((StringUtils.isNotEmpty(e.getNickName()) && e.getNickName().contains(name)))
//                            || (StringUtils.isNotEmpty(e.getPhonenumber()) && e.getPhonenumber().contains(name))).collect(Collectors.toList());
//                }else {
//                    users = sysUsers.stream().filter(e -> userLevelVO1.getKey().equals(e.getDeptId())).collect(Collectors.toList());
//                }
//                List<UserLevelVO> children1 = new ArrayList<>();
//                // 封装人员
//                for (SysUser user : users) {
//                    UserLevelVO userLevelVO2 = new UserLevelVO();
//                    userLevelVO2.setKey(user.getUserId());
//                    userLevelVO2.setTitle(user.getNickName());
//                    userLevelVO2.setAvatar(user.getAvatar());
//                    userLevelVO2.setFlag(true);
//                    children1.add(userLevelVO2);
//                }
//                userLevelVO1.setChildren(children1);
//
//                children.add(userLevelVO1);
//            }
//            userLevelVO.setChildren(children);
//        }
//        userAddListVO.setUserLevelVOS(parent);
//        userAddListVO.setUserList(sysUsers);
//        return AjaxResult.success(userAddListVO);
//    }
    /**
     * 获取用户详情
     */
    @ApiOperation(value = "获取用户详情")
@@ -270,7 +171,6 @@
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {
        user.setUserName(user.getPhonenumber());
        if (!userService.checkUserNameUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
@@ -279,6 +179,7 @@
        {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        user.setPassword("123456");
        user.setCreateBy(getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        userService.insertUser(user);
@@ -359,7 +260,7 @@
        SysUser user = new SysUser();
        user.setUserId(dto.getUserId());
        user.setStatus(String.valueOf(dto.getStatus()));
        user.setRemark(dto.getRemark());
        user.setDisableRemark(dto.getDisableRemark());
        user.setUpdateBy(getUsername());
        return AjaxResult.success(userService.updateUserStatus(user));
    }
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
@@ -112,11 +112,18 @@
    /** 角色ID */
    @ApiModelProperty(value = "角色ID")
    private Long roleId;
    @ApiModelProperty(value = "角色类型 1=平台 2=餐饮店铺 3=销售店铺")
    private Integer roleType;
    /**
     * 是否为黑名单 1是 0否
     */
    @ApiModelProperty(value = "是否为黑名单 1是 0否")
    private Integer ifBlack;
    /**
     * 禁用备注
     */
    @ApiModelProperty(value = "禁用备注")
    private String disableRemark;
    @TableField(exist = false)
    private String roleName;
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
@@ -60,6 +60,7 @@
     * 操作系统
     */
    private String os;
    private String nickName;
    /**
     * 权限列表
@@ -89,6 +90,14 @@
        this.permissions = permissions;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public Long getUserId()
    {
        return userId;
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -113,6 +113,7 @@
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        loginUser.setNickName(user.getNickName());
        recordLoginInfo(loginUser.getUserId());
        // 生成token
        return loginUser;
ruoyi-system/pom.xml
@@ -55,11 +55,11 @@
<!--            <version>4.3.2</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-test</artifactId>-->
<!--            <version>5.1.3.RELEASE</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
@@ -70,6 +70,11 @@
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
            <version>3.8.6</version>
        </dependency>
    </dependencies>
ruoyi-system/src/main/java/com/ruoyi/system/domain/TDataGenerator.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,8 @@
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -43,22 +46,43 @@
    @ApiModelProperty(value = "开始时间")
    @TableField("startTime")
    private LocalDateTime startTime;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间")
    @TableField("endTime")
    private LocalDateTime endTime;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endTime;
    @ApiModelProperty(value = "最小金额")
    @TableField("minMoney")
    private Double minMoney;
    private BigDecimal minMoney;
    @ApiModelProperty(value = "最大金额")
    @TableField("maxMoney")
    private Double maxMoney;
    private BigDecimal maxMoney;
    @ApiModelProperty(value = "状态 1=生成中 2=待覆盖 3=已覆盖")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "订单类型 1=餐饮 2=销售")
    @TableField("orderType")
    private Integer orderType;
    @ApiModelProperty(value = "微信支付占比")
    @TableField("weiXinPay")
    private BigDecimal weiXinPay;
    @ApiModelProperty(value = "支付宝支付占比")
    @TableField("aliPay")
    private BigDecimal aliPay;
    @ApiModelProperty(value = "支付宝支付占比")
    @TableField("cardPay")
    private BigDecimal cardPay;
    @ApiModelProperty(value = "现金支付占比")
    @TableField("moneyPay")
    private BigDecimal moneyPay;
    @ApiModelProperty(value = "其他支付")
    @TableField("otherPay")
    private BigDecimal otherPay;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderMeal.java
@@ -62,10 +62,19 @@
    @ApiModelProperty(value = "支付状态 1=待支付 2=已支付")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "是否覆盖 1=是 0=否")
    @TableField("isCover")
    private Integer isCover;
    @ApiModelProperty(value = "数据生成id")
    @TableField("generatorId")
    private Long generatorId;
    @ApiModelProperty(value = "店铺id")
    @TableField("shopId")
    private Long shopId;
    @ApiModelProperty(value = "商品集合")
    @TableField(exist = false)
    private List<TOrderMealGoods> mealOrderGoods;;
    private List<TOrderMealGoods> mealOrderGoods;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderSale.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -9,7 +10,9 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
@@ -31,8 +34,9 @@
    private Long id;
    @ApiModelProperty(value = "下单时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @TableField("orderTime")
    private LocalDateTime orderTime;
    private LocalDate orderTime;
    @ApiModelProperty(value = "备注说明")
    @TableField("remark")
@@ -53,6 +57,13 @@
    @ApiModelProperty(value = "支付状态 1=待支付 2=已支付")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "店铺id")
    @TableField("shopId")
    private Long shopId;
    @ApiModelProperty(value = "销售订单商品")
    @TableField(exist = false)
    private List<TOrderSaleGoods> orderSaleGoods;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderStock.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -9,7 +10,9 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
@@ -35,11 +38,28 @@
    private String stockNum;
    @ApiModelProperty(value = "进货日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @TableField("stockTime")
    private LocalDateTime stockTime;
    private LocalDate stockTime;
    @ApiModelProperty(value = "进货总价")
    @TableField("stockTotalPrice")
    private BigDecimal stockTotalPrice;
//    @ApiModelProperty(value = "进货总价")
//    @TableField("stockTotalPrice")
//    private BigDecimal stockTotalPrice;
    @ApiModelProperty(value = "是否覆盖 1=是 0=否")
    @TableField("isCover")
    private Integer isCover;
    @ApiModelProperty(value = "数据生成id")
    @TableField("generatorId")
    private Long generatorId;
    @ApiModelProperty(value = "店铺id")
    @TableField("shopId")
    private Long shopId;
//    @ApiModelProperty(value = "支付方式 1=现金 2=支付宝 3=微信 4=银行卡 5=其他")
//    @TableField("payType")
//    private Integer payType;
    @ApiModelProperty(value = "进货数据商品集合")
    @TableField(exist = false)
    private List<TOrderStockGoods> orderStockGoods;
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/TStockDataSet.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_stock_data_set")
@ApiModel(value="TStockDataSet对象", description="进货数据设置")
public class TStockDataSet extends BaseModel {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "进货日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @TableField("stockDate")
    private LocalDate stockDate;
    @ApiModelProperty(value = "损耗率")
    @TableField("lossRate")
    private BigDecimal lossRate;
    @ApiModelProperty(value = "数据生成id")
    @TableField("generatorId")
    private Long generatorId;
    @ApiModelProperty(value = "店铺id")
    @TableField("shopId")
    private Long shopId;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/OrderMealGeneratorDTO.java
@@ -6,6 +6,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
@Data
@@ -15,11 +16,17 @@
    @ApiModelProperty(value = "店铺id")
    private Long shopId;
    @ApiModelProperty(value = "开始时间")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间")
    private LocalDate endTime;
    @ApiModelProperty(value = "营业额小")
    private BigDecimal minTurnover;
    private BigDecimal minMoney;
    @ApiModelProperty(value = "营业额大")
    private BigDecimal maxTurnover;
    private BigDecimal maxMoney;
    @ApiModelProperty(value = "微信占比")
    private BigDecimal weiXinProportion;
ruoyi-system/src/main/java/com/ruoyi/system/dto/OrderSaleGeneratorDTO.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.system.dto;
import com.ruoyi.system.domain.TOrderSale;
import com.ruoyi.system.domain.TStockDataSet;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
@Data
@ApiModel(value = "销售数据生成DTO")
public class OrderSaleGeneratorDTO implements Serializable {
    @ApiModelProperty(value = "店铺id")
    private Long shopId;
    @ApiModelProperty(value = "开始时间")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间")
    private LocalDate endTime;
    @ApiModelProperty(value = "销售订单")
    private List<TOrderSale> orderSales;
    @ApiModelProperty(value = "进货数据设置")
    private List<TStockDataSet> stockDataSets;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/StockDataSetDTO.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
@ApiModel(value = "进货数据设置DTO")
public class StockDataSetDTO implements Serializable {
    @ApiModelProperty(value = "进货日期")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate stockDate;
    @ApiModelProperty(value = "损耗率")
    private BigDecimal lossRate;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/SysUserUpdateStatusDTO.java
@@ -16,7 +16,7 @@
    @ApiModelProperty(value = "状态 帐号状态(0正常 1停用)")
    private Integer status;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "禁用备注")
    private String disableRemark;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDataGeneratorMapper.java
@@ -2,7 +2,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.domain.TDataGenerator;
import com.ruoyi.system.query.TDataGeneratorQuery;
import com.ruoyi.system.vo.TDataGeneratorVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -14,4 +20,11 @@
 */
public interface TDataGeneratorMapper extends BaseMapper<TDataGenerator> {
    /**
     * 数据生成分页
     * @param query
     * @param pageInfo
     * @return
     */
    List<TDataGeneratorVO> pageList(@Param("query") TDataGeneratorQuery query, @Param("pageInfo")PageInfo<TDataGeneratorVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TStockDataSetMapper.java
New file
@@ -0,0 +1,8 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.TStockDataSet;
public interface TStockDataSetMapper extends BaseMapper<TStockDataSet> {
}
ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
@@ -5,18 +5,20 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "账户列表query")
public class SysUserQuery extends BasePage {
    @ApiModelProperty(value = "姓名")
    private String nickName;
    @ApiModelProperty(value = "姓名或者手机号")
    private String nickNameOrPhone;
    @ApiModelProperty(value = "角色id")
    private Integer roleId;
    private List<Integer> roleIds;
    @ApiModelProperty(value = "手机号")
    private String phonenumber;
//    @ApiModelProperty(value = "手机号")
//    private String phonenumber;
    @ApiModelProperty(value = "状态  0=正常 1=停用")
    private String status;
ruoyi-system/src/main/java/com/ruoyi/system/query/TDataGeneratorQuery.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.query;
import com.ruoyi.common.core.domain.model.TimeRangeQueryBody;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(value = "数据生成分页")
public class TDataGeneratorQuery extends TimeRangeQueryBody {
    @ApiModelProperty(value = "操作人姓名")
    private String userName;
    @ApiModelProperty(value = "店铺名称")
    private String shopName;
    @ApiModelProperty(value = "状态 1=生成中 2=待覆盖 3=已覆盖")
    private Integer status;
    @ApiModelProperty(value = "订单类型 1=餐饮 2=销售")
    @NotNull(message = "订单类型不能为空")
    private Integer orderType;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TDataGeneratorService.java
@@ -1,8 +1,12 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.domain.TDataGenerator;
import com.ruoyi.system.dto.OrderMealGeneratorDTO;
import com.ruoyi.system.dto.OrderSaleGeneratorDTO;
import com.ruoyi.system.query.TDataGeneratorQuery;
import com.ruoyi.system.vo.TDataGeneratorVO;
/**
 * <p>
@@ -17,5 +21,24 @@
     * 餐饮数据生成
     * @param dto
     */
    void dataGenerator(OrderMealGeneratorDTO dto);
    void mealDataGenerator(OrderMealGeneratorDTO dto);
    /**
     * 销售数据生成
     * @param dto
     */
    void saleDataGenerator(OrderSaleGeneratorDTO dto);
    /**
     * 数据生成分页
     * @param query
     */
    PageInfo<TDataGeneratorVO> pageList(TDataGeneratorQuery query);
    /**
     * 数据覆盖
     * @param id
     * @return
     */
    void dataCoverage(Long id);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TStockDataSetService.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.domain.TShop;
import com.ruoyi.system.domain.TStockDataSet;
import com.ruoyi.system.query.TShopQuery;
import com.ruoyi.system.vo.TShopVO;
/**
 * <p>
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-14
 */
public interface TStockDataSetService extends IService<TStockDataSet> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -646,9 +646,15 @@
        SysUser sysUser = new SysUser();
        sysUser.setUserName(dto.getAccount());
        sysUser.setNickName(dto.getShopHead());
        if(dto.getShopType() ==1){
            sysUser.setRoleType(2);
        }else {
            sysUser.setRoleType(3);
        }
        sysUser.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
        this.insertUser(sysUser);
        // TODO 自动绑定角色
    }
    @Override
@@ -659,6 +665,11 @@
        }
        sysUser.setUserName(dto.getAccount());
        sysUser.setNickName(dto.getShopHead());
        if(dto.getShopType() ==1){
            sysUser.setRoleType(2);
        }else {
            sysUser.setRoleType(3);
        }
        sysUser.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
        this.updateUser(sysUser);
    }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java
@@ -1,22 +1,30 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.OrderNumConstants;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.CodeGenerateUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.dto.OrderMealGeneratorCountDTO;
import com.ruoyi.system.dto.OrderMealGeneratorDTO;
import com.ruoyi.system.dto.TOrderMealDTO;
import com.ruoyi.system.dto.*;
import com.ruoyi.system.mapper.TDataGeneratorMapper;
import com.ruoyi.system.query.TDataGeneratorQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.SysUserVO;
import com.ruoyi.system.vo.TDataGeneratorVO;
import com.ruoyi.system.vo.TFoundationConfigVO;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
@@ -41,9 +49,38 @@
    private TOrderMealService orderMealService;
    @Autowired
    private TOrderMealGoodsService orderMealGoodsService;
    @Autowired
    private TOrderSaleService orderSaleService;
    @Autowired
    private TOrderSaleGoodsService orderSaleGoodsService;
    @Autowired
    private TOrderStockService orderStockService;
    @Autowired
    private TOrderStockGoodsService orderStockGoodsService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TStockDataSetService stockDataSetService;
    @Override
    public void dataGenerator(OrderMealGeneratorDTO dto) {
    public void mealDataGenerator(OrderMealGeneratorDTO dto) {
        // 存储数据生成数据
        TDataGenerator dataGenerator = new TDataGenerator();
        dataGenerator.setUserId(tokenService.getLoginUser().getUserId());
        dataGenerator.setUserName(tokenService.getLoginUser().getNickName());
        dataGenerator.setShopId(dataGenerator.getShopId());
        dataGenerator.setStartTime(dto.getStartTime());
        dataGenerator.setEndTime(dto.getEndTime());
        dataGenerator.setMinMoney(dto.getMinMoney());
        dataGenerator.setMaxMoney(dto.getMaxMoney());
        dataGenerator.setStatus(2);
        dataGenerator.setOrderType(1);
        dataGenerator.setWeiXinPay(dto.getWeiXinProportion());
        dataGenerator.setAliPay(dto.getAliProportion());
        dataGenerator.setCardPay(dto.getCardProportion());
        dataGenerator.setMoneyPay(dto.getMoneyProportion());
        dataGenerator.setOtherPay(dto.getOtherProportion());
        this.save(dataGenerator);
        long start = System.currentTimeMillis();
        // 查询所有的人数用餐标准
        List<TFoundationConfigVO> foundationConfigs = foundationConfigService.getList();
@@ -99,7 +136,7 @@
            }
        }
        BigDecimal sumMoney = orderMeals.stream().map(TOrderMeal::getPayMoney).reduce(BigDecimal::add).get();
        if(sumMoney.compareTo(dto.getMinTurnover()) >= 0 || sumMoney.compareTo(dto.getMaxTurnover()) <= 0){
        if(sumMoney.compareTo(dto.getMinMoney()) >= 0 || sumMoney.compareTo(dto.getMaxMoney()) <= 0){
            int weiXin = getRandomPayType(orderMeals.size(), dto.getWeiXinProportion());
            int ali = getRandomPayType(orderMeals.size(), dto.getAliProportion());
            int card = getRandomPayType(orderMeals.size(), dto.getCardProportion());
@@ -148,12 +185,17 @@
            allOrderMeals.addAll(cardOrderMeals);
            allOrderMeals.addAll(moneyOrderMeals);
            allOrderMeals.addAll(otherOrderMeals);
            allOrderMeals.forEach(e->{
                e.setIsCover(0);
                e.setGeneratorId(dataGenerator.getId());
            });
            orderMealService.saveBatch(allOrderMeals);
            for (TOrderMeal weiXinOrderMeal : allOrderMeals) {
                weiXinOrderMeal.getMealOrderGoods().forEach(e->e.setOrderId(weiXinOrderMeal.getId()));
            for (TOrderMeal orderMeal : allOrderMeals) {
                orderMeal.getMealOrderGoods().forEach(e->e.setOrderId(orderMeal.getId()));
            }
            orderMealGoodsService.saveBatch(allOrderMeals.stream().map(TOrderMeal::getMealOrderGoods).flatMap(Collection::stream).collect(Collectors.toList()));
            // 存储
            long end = System.currentTimeMillis() - start;
            System.err.println("相差时间========="+end);
        }else {
@@ -162,6 +204,237 @@
    }
    @Override
    public void saleDataGenerator(OrderSaleGeneratorDTO dto) {
        // 查询上一次的数据生成时间
        TDataGenerator lastDataGenerator = this.getOne(new LambdaQueryWrapper<TDataGenerator>().eq(TDataGenerator::getShopId, dto.getShopId()).orderByDesc(TDataGenerator::getCreateTime).last("limit 1"));
        if(Objects.nonNull(lastDataGenerator) && lastDataGenerator.getEndTime().isAfter(dto.getStartTime())){
            throw new ServiceException("数据生成时间不能小于上次生成时间");
        }
        // 查询上次生成最后一次的时间  后续涛哥不用这个类,可以改成TOrderStock的最后一条数据
        TStockDataSet stockDataSet = stockDataSetService.getOne(new LambdaQueryWrapper<TStockDataSet>()
                .eq(TStockDataSet::getShopId, dto.getShopId())
                .orderByDesc(TStockDataSet::getStockDate)
                .last("limit 1"));
        // 存储数据生成数据
        TDataGenerator dataGenerator = new TDataGenerator();
        dataGenerator.setUserId(tokenService.getLoginUser().getUserId());
        dataGenerator.setUserName(tokenService.getLoginUser().getNickName());
        dataGenerator.setShopId(dataGenerator.getShopId());
        dataGenerator.setStartTime(dto.getStartTime());
        dataGenerator.setEndTime(dto.getEndTime());
        dataGenerator.setStatus(2);
        dataGenerator.setOrderType(2);
        this.save(dataGenerator);
        // 存储进货数据设置
        List<TStockDataSet> stockDataSets = dto.getStockDataSets();
        stockDataSets.forEach(e->e.setGeneratorId(dataGenerator.getId()));
        stockDataSetService.saveBatch(stockDataSets);
        // 添加销售订单数
        List<TOrderSale> orderSales = dto.getOrderSales();
        orderSaleService.saveBatch(orderSales);
        for (TOrderSale orderSale : orderSales) {
            orderSale.getOrderSaleGoods().forEach(e->e.setOrderId(orderSale.getId()));
        }
        List<TOrderSaleGoods> orderSaleGoods = orderSales.stream().map(TOrderSale::getOrderSaleGoods).flatMap(Collection::stream).collect(Collectors.toList());
        orderSaleGoodsService.saveBatch(orderSaleGoods);
        // 生成进货数据
        List<TOrderStock> stockList = new ArrayList<>();
        stockDataSets.stream().sorted(Comparator.comparing(TStockDataSet::getStockDate));
        for (int i = 0; i < stockDataSets.size(); i++) {
            TStockDataSet start = stockDataSets.get(i);
            LocalDate startTime = start.getStockDate();
            if(i==stockDataSets.size()-1){
                // 最后一次
                LocalDate endTime = LocalDate.now();
                List<Long> saleIds = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) >= 0 && e.getOrderTime().compareTo(endTime) <= 0).map(TOrderSale::getId).collect(Collectors.toList());
                List<TOrderSaleGoods> orderSaleGoodsList = orderSaleGoods.stream().filter(e -> saleIds.contains(e.getOrderId())).collect(Collectors.toList());
                // 根据商品新生成一条数据
                TOrderStock orderStock = new TOrderStock();
                orderStock.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn());
                orderStock.setStockTime(startTime);
                orderStock.setIsCover(0);
                orderStock.setGeneratorId(dataGenerator.getId());
                orderStock.setShopId(dto.getShopId());
                Map<String, List<TOrderSaleGoods>> goodsList = orderSaleGoodsList.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName));
                List<TOrderStockGoods> orderStockGoods = new ArrayList<>();
                goodsList.forEach((k,v)->{
                    TOrderStockGoods tOrderStockGoods = new TOrderStockGoods();
                    tOrderStockGoods.setGoodsName(k);
                    tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum());
                    tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice());
                    tOrderStockGoods.setSalePrice(v.get(0).getSalePrice());
                    tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture());
                    tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum());
                    orderStockGoods.add(tOrderStockGoods);
                });
                orderStock.setOrderStockGoods(orderStockGoods);
                stockList.add(orderStock);
            }else if(i==0 && Objects.nonNull(stockDataSet)){
                // 第一次 第一次的进货时间为上一次的结束时间  开始时间为上一次的开始时间
                LocalDate startTime1 = stockDataSet.getStockDate();
                List<Long> saleIds = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) < 0).map(TOrderSale::getId).collect(Collectors.toList());
                List<TOrderSaleGoods> orderSaleGoodsList = orderSaleGoods.stream().filter(e -> saleIds.contains(e.getOrderId())).collect(Collectors.toList());
                // 查询上一次开始之后的订单数据
                List<TOrderSale> orderSales1 = orderSaleService.list(new LambdaQueryWrapper<TOrderSale>().gt(TOrderSale::getOrderTime, startTime1));
                List<Long> saleIds1 = orderSales1.stream().map(TOrderSale::getId).collect(Collectors.toList());
                // 查询上一次的商品
                List<TOrderSaleGoods> list = orderSaleGoodsService.list(new LambdaQueryWrapper<TOrderSaleGoods>().in(TOrderSaleGoods::getOrderId, saleIds1));
                // 结合上次最后一次的数据
                list.addAll(orderSaleGoodsList);
                // 删除上一次的数据生成   新生成一条数据
                TOrderStock orderStock = new TOrderStock();
                orderStock.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn());
                orderStock.setStockTime(startTime);
                orderStock.setIsCover(0);
                orderStock.setGeneratorId(dataGenerator.getId());
                orderStock.setShopId(dto.getShopId());
                Map<String, List<TOrderSaleGoods>> goodsList = list.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName));
                List<TOrderStockGoods> orderStockGoods = new ArrayList<>();
                goodsList.forEach((k,v)->{
                    TOrderStockGoods tOrderStockGoods = new TOrderStockGoods();
                    tOrderStockGoods.setGoodsName(k);
                    tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum());
                    tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice());
                    tOrderStockGoods.setSalePrice(v.get(0).getSalePrice());
                    tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture());
                    tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum());
                    orderStockGoods.add(tOrderStockGoods);
                });
                orderStock.setOrderStockGoods(orderStockGoods);
                stockList.add(orderStock);
                // 处理第一次到下一次的数据
                TStockDataSet end = stockDataSets.get(i + 1);
                LocalDate endTime = end.getStockDate();
                List<Long> saleIds2 = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) >= 0 && e.getOrderTime().compareTo(endTime) < 0).map(TOrderSale::getId).collect(Collectors.toList());
                List<TOrderSaleGoods> orderSaleGoodsList2 = orderSaleGoods.stream().filter(e -> saleIds2.contains(e.getOrderId())).collect(Collectors.toList());
                // 根据商品新生成一条数据
                TOrderStock orderStock1 = new TOrderStock();
                orderStock1.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn());
                orderStock1.setStockTime(startTime);
                orderStock1.setIsCover(0);
                orderStock1.setGeneratorId(dataGenerator.getId());
                orderStock1.setShopId(dto.getShopId());
                Map<String, List<TOrderSaleGoods>> goodsList1 = orderSaleGoodsList2.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName));
                List<TOrderStockGoods> orderStockGoods1 = new ArrayList<>();
                goodsList1.forEach((k,v)->{
                    TOrderStockGoods tOrderStockGoods = new TOrderStockGoods();
                    tOrderStockGoods.setGoodsName(k);
                    tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum());
                    tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice());
                    tOrderStockGoods.setSalePrice(v.get(0).getSalePrice());
                    tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture());
                    tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum());
                    orderStockGoods1.add(tOrderStockGoods);
                });
                orderStock1.setOrderStockGoods(orderStockGoods1);
                stockList.add(orderStock1);
            }else {
                TStockDataSet end = stockDataSets.get(i + 1);
                LocalDate endTime = end.getStockDate();
                List<Long> saleIds = orderSales.stream().filter(e -> e.getOrderTime().compareTo(startTime) >= 0 && e.getOrderTime().compareTo(endTime) < 0).map(TOrderSale::getId).collect(Collectors.toList());
                List<TOrderSaleGoods> orderSaleGoodsList = orderSaleGoods.stream().filter(e -> saleIds.contains(e.getOrderId())).collect(Collectors.toList());
                // 根据商品新生成一条数据
                TOrderStock orderStock = new TOrderStock();
                orderStock.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateVolumeSn());
                orderStock.setStockTime(startTime);
                orderStock.setIsCover(0);
                orderStock.setGeneratorId(dataGenerator.getId());
                orderStock.setShopId(dto.getShopId());
                Map<String, List<TOrderSaleGoods>> goodsList = orderSaleGoodsList.stream().collect(Collectors.groupingBy(TOrderSaleGoods::getGoodsName));
                List<TOrderStockGoods> orderStockGoods = new ArrayList<>();
                goodsList.forEach((k,v)->{
                    TOrderStockGoods tOrderStockGoods = new TOrderStockGoods();
                    tOrderStockGoods.setGoodsName(k);
                    tOrderStockGoods.setGoodsNum(v.get(0).getGoodsNum());
                    tOrderStockGoods.setCostPrice(v.get(0).getGoodsCostPrice());
                    tOrderStockGoods.setSalePrice(v.get(0).getSalePrice());
                    tOrderStockGoods.setGoodsPicture(v.get(0).getGoodsPicture());
                    tOrderStockGoods.setStockCount(v.stream().mapToInt(TOrderSaleGoods::getGoodsCount).sum());
                    orderStockGoods.add(tOrderStockGoods);
                });
                orderStock.setOrderStockGoods(orderStockGoods);
                stockList.add(orderStock);
            }
        }
        // 删除上一次的数据生成
        TOrderStock orderStock = orderStockService.getOne(Wrappers.lambdaQuery(TOrderStock.class)
                .eq(TOrderStock::getShopId, dto.getShopId())
                .orderByDesc(TOrderStock::getStockTime)
                .last("LIMIT 1"));
        if(Objects.nonNull(orderStock)){
            orderStockService.removeById(orderStock);
        }
        // 添加数据
        orderStockService.saveBatch(stockList);
        for (TOrderStock stock : stockList) {
            stock.getOrderStockGoods().forEach(e->e.setOrderId(stock.getId()));
        }
        List<TOrderStockGoods> orderStockGoods = stockList.stream().map(TOrderStock::getOrderStockGoods).flatMap(Collection::stream).collect(Collectors.toList());
        orderStockGoodsService.saveBatch(orderStockGoods);
    }
    @Override
    public PageInfo<TDataGeneratorVO> pageList(TDataGeneratorQuery query) {
        PageInfo<TDataGeneratorVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TDataGeneratorVO> list = this.baseMapper.pageList(query,pageInfo);
        List<Long> ids = list.stream().map(TDataGeneratorVO::getId).collect(Collectors.toList());
        if(query.getOrderType() == 1){
            List<TOrderMeal> orderMeals = orderMealService.list(Wrappers.lambdaQuery(TOrderMeal.class)
                    .in(TOrderMeal::getGeneratorId, ids));
            List<Long> mealIds = orderMeals.stream().map(TOrderMeal::getId).collect(Collectors.toList());
            List<TOrderMealGoods> mealGoods = orderMealGoodsService.list(Wrappers.lambdaQuery(TOrderMealGoods.class)
                    .in(TOrderMealGoods::getOrderId, mealIds));
            for (TDataGeneratorVO tDataGeneratorVO : list) {
                List<Long> collect = orderMeals.stream().filter(e -> e.getGeneratorId().equals(tDataGeneratorVO.getId())).map(TOrderMeal::getId).collect(Collectors.toList());
                BigDecimal money = mealGoods.stream().filter(e -> collect.contains(e.getOrderId()))
                        .reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getGoodsSalePrice().multiply(new BigDecimal(y.getGoodsCount()))), BigDecimal::add);
                tDataGeneratorVO.setTotalRevenue(money);
            }
        }else {
            List<TOrderStock> orderStocks = orderStockService.list(Wrappers.lambdaQuery(TOrderStock.class)
                    .in(TOrderStock::getGeneratorId, ids));
            List<Long> stockIds = orderStocks.stream().map(TOrderStock::getId).collect(Collectors.toList());
            List<TOrderStockGoods> stockGoods = orderStockGoodsService.list(Wrappers.lambdaQuery(TOrderStockGoods.class)
                    .in(TOrderStockGoods::getOrderId, stockIds));
            for (TDataGeneratorVO tDataGeneratorVO : list) {
                List<Long> collect = orderStocks.stream().filter(e -> e.getGeneratorId().equals(tDataGeneratorVO.getId())).map(TOrderStock::getId).collect(Collectors.toList());
                BigDecimal money = stockGoods.stream().filter(e -> collect.contains(e.getOrderId()))
                        .reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getStockPrice().multiply(new BigDecimal(y.getStockCount()))), BigDecimal::add);
                tDataGeneratorVO.setTotalRevenue(money);
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public void dataCoverage(Long id) {
        TDataGenerator dataGenerator = this.getOne(Wrappers.lambdaQuery(TDataGenerator.class)
                .eq(TDataGenerator::getId, id));
        if(dataGenerator.getOrderType() == 1){
            // 删除时间段的数据
            orderMealService.remove(Wrappers.lambdaQuery(TOrderMeal.class)
                    .gt(TOrderMeal::getCreateTime, dataGenerator.getStartTime())
                    .lt(TOrderMeal::getCreateTime, dataGenerator.getEndTime()));
            // 修改覆盖类型为已覆盖
            orderMealService.update(Wrappers.lambdaUpdate(TOrderMeal.class).set(TOrderMeal::getIsCover, 1).eq(TOrderMeal::getGeneratorId, id));
        }else {
            // 修改覆盖类型为已覆盖
            orderStockService.update(Wrappers.lambdaUpdate(TOrderStock.class).set(TOrderStock::getIsCover, 1).eq(TOrderStock::getGeneratorId, id));
        }
    }
    private int getRandomPayType(Integer size,BigDecimal count) {
        BigDecimal bigDecimal = new BigDecimal(size).multiply(count.divide(new BigDecimal(100))).setScale(0, RoundingMode.HALF_UP);
        return Integer.parseInt(bigDecimal.toString());
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TStockDataSetServiceImpl.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.domain.TShop;
import com.ruoyi.system.domain.TStockDataSet;
import com.ruoyi.system.mapper.TShopMapper;
import com.ruoyi.system.mapper.TStockDataSetMapper;
import com.ruoyi.system.query.TShopQuery;
import com.ruoyi.system.service.TShopService;
import com.ruoyi.system.service.TStockDataSetService;
import com.ruoyi.system.vo.TShopVO;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-14
 */
@Service
public class TStockDataSetServiceImpl extends ServiceImpl<TStockDataSetMapper, TStockDataSet> implements TStockDataSetService {
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/TDataGeneratorVO.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.vo;
import com.ruoyi.system.domain.TDataGenerator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "数据生成VO")
public class TDataGeneratorVO extends TDataGenerator {
    @ApiModelProperty(value = "店铺名称")
    private String shopName;
    @ApiModelProperty(value = "营业额合计")
    private BigDecimal totalRevenue;
}
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -228,14 +228,15 @@
        left join sys_user_role ur on u.user_id = ur.user_id
        left join sys_role r on r.role_id = ur.role_id
        WHERE u.del_flag = 0
        <if test="query.nickName != null and query.nickName != ''">
            AND u.nick_name LIKE concat('%',#{query.nickName},'%')
        <if test="query.nickNameOrPhone != null and query.nickNameOrPhone != ''">
            AND (u.nick_name LIKE concat('%',#{query.nickNameOrPhone},'%')
                 OR u.phonenumber LIKE concat('%',#{query.nickNameOrPhone},'%'))
        </if>
        <if test="query.roleId != null">
            AND r.role_id = #{query.roleId}
        </if>
        <if test="query.phonenumber != null and query.phonenumber != ''">
            AND u.phonenumber LIKE concat('%',#{query.phonenumber},'%')
        <if test="query.roleIds != null and query.roleIds.size()>0">
            AND r.role_id in
            <foreach collection="query.roleIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.status != null and query.status != ''">
            AND u.status = #{query.status}
ruoyi-system/src/main/resources/mapper/system/TDataGeneratorMapper.xml
@@ -18,11 +18,44 @@
        <result column="disabled" property="disabled" />
        <result column="createBy" property="createBy" />
        <result column="updateBy" property="updateBy" />
        <result column="orderType" property="orderType" />
        <result column="weiXinPay" property="weiXinPay" />
        <result column="aliPay"    property="aliPay" />
        <result column="cardPay"   property="cardPay" />
        <result column="moneyPay"  property="moneyPay" />
        <result column="otherPay"  property="otherPay" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, userId, userName, shopId, startTime, endTime, minMoney, maxMoney, status, createTime, updateTime, disabled, createBy, updateBy
        id, userId, userName, shopId, startTime, endTime, minMoney, maxMoney, status, createTime, updateTime, disabled, createBy, updateBy,orderType,weiXinPay,
        aliPay,cardPay,moneyPay,otherPay
    </sql>
    <select id="pageList" resultType="com.ruoyi.system.vo.TDataGeneratorVO">
        select tdg.id, tdg.userId, tdg.userName, tdg.shopId, tdg.startTime, tdg.endTime, tdg.minMoney, tdg.maxMoney, tdg.status, tdg.createTime,
               tdg.updateTime, tdg.disabled, tdg.createBy, tdg.updateBy,tdg.orderType,tdg.weiXinPay,tdg.aliPay,tdg.cardPay,tdg.moneyPay,tdg.otherPay,
               ts.shopName
        from t_data_generator tdg
        left join t_shop ts on tdg.shopId = ts.id
        <where>
            <if test="query.shopName != null and query.shopName != ''">
                and ts.shopName like concat('%', #{query.shopName}, '%')
            </if>
            <if test="query.userName != null and query.userName != ''">
                and tdg.shopName like concat('%', #{query.userName}, '%')
            </if>
            <if test="query.status != null">
                and tdg.status = #{query.status}
            </if>
            <if test="query.orderType != null">
                and tdg.orderType = #{query.orderType}
            </if>
            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
                AND DATE_FORMAT(tdg.createTime, '%Y-%m-%d %H:%i:%s') BETWEEN #{query.startTime}
                AND #{query.endTime}
            </if>
            AND tdg.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TOrderMealMapper.xml
@@ -18,11 +18,13 @@
        <result column="updateBy" property="updateBy" />
        <result column="orderNum" property="orderNum" />
        <result column="status" property="status" />
        <result column="isCover" property="isCover" />
        <result column="shopId" property="shopId" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, boardId, mealType, mealPerson, orderMoney, payMoney, payType, createTime, updateTime, disabled, createBy, updateBy, orderNum, status
        id, boardId, mealType, mealPerson, orderMoney, payMoney, payType, createTime, updateTime, disabled, createBy, updateBy, orderNum, status,isCover,shopId
    </sql>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TOrderSaleMapper.xml
@@ -16,11 +16,12 @@
        <result column="status" property="status" />
        <result column="orderMoney" property="orderMoney" />
        <result column="payMoney" property="payMoney" />
        <result column="shopId" property="shopId" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, orderTime, remark, createTime, updateTime, disabled, createBy, updateBy, orderNum, status,orderMoney,payMoney
        id, orderTime, remark, createTime, updateTime, disabled, createBy, updateBy, orderNum, status,orderMoney,payMoney,shopId
    </sql>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TOrderStockMapper.xml
@@ -7,17 +7,18 @@
        <id column="id" property="id" />
        <result column="stockNum" property="stockNum" />
        <result column="stockTime" property="stockTime" />
        <result column="stockTotalPrice" property="stockTotalPrice" />
        <result column="createTime" property="createTime" />
        <result column="updateTime" property="updateTime" />
        <result column="disabled" property="disabled" />
        <result column="createBy" property="createBy" />
        <result column="updateBy" property="updateBy" />
        <result column="isCover" property="isCover" />
        <result column="shopId" property="shopId" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, stockNum, stockTime, stockTotalPrice, createTime, updateTime, disabled, createBy, updateBy
        id, stockNum, stockTime, createTime, updateTime, disabled, createBy, updateBy,isCover,shopId
    </sql>
    <select id="pageList" resultType="com.ruoyi.system.vo.TOrderStockVO">
        SELECT <include refid="Base_Column_List"></include>
ruoyi-system/src/main/resources/mapper/system/TStockDataSetMapper.xml
New file
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.TStockDataSetMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.TStockDataSet">
        <id column="id" property="id" />
        <result column="stockDate" property="stockDate" />
        <result column="lossRate" property="lossRate" />
        <result column="generatorId" property="generatorId" />
        <result column="shopId" property="shopId" />
        <result column="createTime" property="createTime" />
        <result column="updateTime" property="updateTime" />
        <result column="disabled" property="disabled" />
        <result column="createBy" property="createBy" />
        <result column="updateBy" property="updateBy" />
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id,generatorId, stockDate, lossRate,shopId, createTime, updateTime, disabled, createBy, updateBy
    </sql>
</mapper>