ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDataGeneratorController.java
New file @@ -0,0 +1,44 @@ package com.ruoyi.web.controller.api; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.system.dto.OrderMealGeneratorDTO; import com.ruoyi.system.service.TDataGeneratorService; import com.ruoyi.system.service.TOrderMealService; 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; /** * <p> * 营业数据生成 前端控制器 * </p> * * @author xiaochen * @since 2024-08-27 */ @RestController @RequestMapping("/t-data-generator") public class TDataGeneratorController { private final TOrderMealService orderMealService; private final TDataGeneratorService dataGeneratorService; @Autowired public TDataGeneratorController(TOrderMealService orderMealService, TDataGeneratorService dataGeneratorService) { this.orderMealService = orderMealService; this.dataGeneratorService = dataGeneratorService; } @ApiOperation( value = "餐饮数据生成") @PostMapping(value = "/dataGenerator") public AjaxResult<String> dataGenerator(@RequestBody OrderMealGeneratorDTO dto) { dataGeneratorService.dataGenerator(dto); return AjaxResult.success(); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TOrderMealController.java
@@ -74,11 +74,5 @@ return AjaxResult.success(); } @ApiOperation( value = "餐饮数据生成") @PostMapping(value = "/dataGenerator") public AjaxResult<String> dataGenerator(@RequestBody OrderMealGeneratorDTO dto) { orderMealService.dataGenerator(dto); return AjaxResult.success(); } } ruoyi-admin/src/main/resources/application-druid.yml
@@ -6,7 +6,7 @@ druid: # 主库数据源 master: url: jdbc:mysql://192.168.110.34:3306/hollywood?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.110.34:3306/cashier?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 # url: jdbc:mysql://8.137.10.192:3306/sys_config?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 ruoyi-system/src/main/java/com/ruoyi/system/domain/TDataGenerator.java
New file @@ -0,0 +1,64 @@ package com.ruoyi.system.domain; import com.baomidou.mybatisplus.annotation.*; 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.io.Serializable; import java.time.LocalDateTime; /** * <p> * 营业数据生成 * </p> * * @author xiaochen * @since 2024-08-27 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("t_data_generator") @ApiModel(value="TDataGenerator对象", description="营业数据生成") public class TDataGenerator extends BaseModel { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "操作人id") @TableField("userId") private Long userId; @ApiModelProperty(value = "操作人姓名") @TableField("userName") private String userName; @ApiModelProperty(value = "店铺id") @TableField("shopId") private Long shopId; @ApiModelProperty(value = "开始时间") @TableField("startTime") private LocalDateTime startTime; @ApiModelProperty(value = "结束时间") @TableField("endTime") private LocalDateTime endTime; @ApiModelProperty(value = "最小金额") @TableField("minMoney") private Double minMoney; @ApiModelProperty(value = "最大金额") @TableField("maxMoney") private Double maxMoney; @ApiModelProperty(value = "状态 1=生成中 2=待覆盖 3=已覆盖") @TableField("status") private Integer status; } ruoyi-system/src/main/java/com/ruoyi/system/domain/TOrderMeal.java
@@ -10,6 +10,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * <p> @@ -62,5 +63,9 @@ @TableField("status") private Integer status; @ApiModelProperty(value = "商品集合") @TableField(exist = false) private List<TOrderMealGoods> mealOrderGoods;; } ruoyi-system/src/main/java/com/ruoyi/system/dto/OrderMealGeneratorCountDTO.java
@@ -14,6 +14,9 @@ @ApiModel(value = "OrderMealGeneratorCountDTO对象", description = "餐饮数据生成订单数量") public class OrderMealGeneratorCountDTO implements Serializable { @ApiModelProperty(value = "餐桌id") private Long boardId; @ApiModelProperty(value = "桌号") private String boardName; ruoyi-system/src/main/java/com/ruoyi/system/dto/TOrderMealDTO.java
@@ -1,6 +1,7 @@ package com.ruoyi.system.dto; import com.ruoyi.system.domain.TOrderMeal; import com.ruoyi.system.domain.TOrderMealGoods; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; ruoyi-system/src/main/java/com/ruoyi/system/mapper/TDataGeneratorMapper.java
New file @@ -0,0 +1,17 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.system.domain.TDataGenerator; /** * <p> * 营业数据生成 Mapper 接口 * </p> * * @author xiaochen * @since 2024-08-27 */ public interface TDataGeneratorMapper extends BaseMapper<TDataGenerator> { } ruoyi-system/src/main/java/com/ruoyi/system/mapper/TFoundationConfigMapper.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.system.domain.TFoundationConfig; import com.ruoyi.system.vo.TFoundationConfigVO; import java.util.List; /** * <p> @@ -13,4 +16,10 @@ */ public interface TFoundationConfigMapper extends BaseMapper<TFoundationConfig> { /** * 查询所有的人数用餐标准 * @return */ List<TFoundationConfigVO> getList(); } ruoyi-system/src/main/java/com/ruoyi/system/service/TDataGeneratorService.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.domain.TDataGenerator; import com.ruoyi.system.dto.OrderMealGeneratorDTO; /** * <p> * 营业数据生成 服务类 * </p> * * @author xiaochen * @since 2024-08-27 */ public interface TDataGeneratorService extends IService<TDataGenerator> { /** * 餐饮数据生成 * @param dto */ void dataGenerator(OrderMealGeneratorDTO dto); } ruoyi-system/src/main/java/com/ruoyi/system/service/TFoundationConfigService.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.domain.TFoundationConfig; import com.ruoyi.system.vo.TFoundationConfigVO; import java.util.List; /** * <p> @@ -13,4 +16,10 @@ */ public interface TFoundationConfigService extends IService<TFoundationConfig> { /** * 查询所有的人数用餐标准 * @return */ List<TFoundationConfigVO> getList(); } ruoyi-system/src/main/java/com/ruoyi/system/service/TOrderMealService.java
@@ -36,9 +36,4 @@ */ void checkout(CheckoutDTO dto); /** * 餐饮数据生成 * @param dto */ void dataGenerator(OrderMealGeneratorDTO dto); } ruoyi-system/src/main/java/com/ruoyi/system/service/TShopService.java
@@ -24,15 +24,4 @@ */ PageInfo<TShopVO> pageList(TShopQuery query); /** * 添加店铺信息 * @param dto */ void add(TShopDTO dto); /** * 编辑店铺信息 * @param dto */ void edit(TShopDTO dto); } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDataGeneratorServiceImpl.java
New file @@ -0,0 +1,196 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.OrderNumConstants; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.CodeGenerateUtils; 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.mapper.TDataGeneratorMapper; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.TFoundationConfigVO; import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * <p> * 营业数据生成 服务实现类 * </p> * * @author xiaochen * @since 2024-08-27 */ @Service public class TDataGeneratorServiceImpl extends ServiceImpl<TDataGeneratorMapper, TDataGenerator> implements TDataGeneratorService { @Autowired private TBoardService boardService; @Autowired private TFoundationConfigService foundationConfigService; @Autowired private TGoodsService goodsService; @Autowired private TOrderMealService orderMealService; @Autowired private TOrderMealGoodsService orderMealGoodsService; @Override public void dataGenerator(OrderMealGeneratorDTO dto) { long start = System.currentTimeMillis(); // 查询所有的人数用餐标准 List<TFoundationConfigVO> foundationConfigs = foundationConfigService.getList(); // 查询所有桌子 List<TBoard> boards = boardService.list(); // 查询所有菜品 List<TGoods> goods = goodsService.list(); // 循环待生成订单列表,添加到集合中,批量插入 List<OrderMealGeneratorCountDTO> orderMealGeneratorCountDTOS = dto.getOrderMealGeneratorCountDTOS(); List<TOrderMeal> orderMeals = new ArrayList<>(); for (OrderMealGeneratorCountDTO orderMealGeneratorCountDTO : orderMealGeneratorCountDTOS) { TBoard board = boards.stream().filter(e -> e.getId().equals(orderMealGeneratorCountDTO.getBoardId())).findFirst().get(); Integer orderCount = orderMealGeneratorCountDTO.getOrderCount(); // 查询当前桌的用餐人数 for (int i = 1; i <= orderCount; i++) { int random = getRandom(board.getMinPerson(), board.getMaxPerson()); TOrderMeal orderMeal = new TOrderMeal(); orderMeal.setBoardId(board.getId()); orderMeal.setMealType(1); orderMeal.setMealPerson(random); orderMeal.setOrderNum(OrderNumConstants.MEAL + CodeGenerateUtils.generateOrderSn()); orderMeal.setStatus(2); List<TOrderMealGoods> orderMealGoods = new ArrayList<>(); List<TFoundationConfigVO> foundationConfigVOS = foundationConfigs.stream().filter(e -> e.getMealCount().equals(random)).collect(Collectors.toList()); foundationConfigVOS.forEach(e -> { int random1 = getRandom(e.getMinCount(), e.getMaxCount()); List<TGoods> typeGoods = goods.stream().filter(m -> e.getTypeId().equals(m.getTypeId())).collect(Collectors.toList()); typeGoods = randomSelection(typeGoods, random1); for (TGoods typeGood : typeGoods) { int count = 0; for (TOrderMealGoods good : orderMealGoods) { if (good.getGoodsNum().equals(typeGood.getGoodsNum())) { count+=1; good.setGoodsCount(good.getGoodsCount() + 1); break; // 找到后直接跳出循环 } } if (count==0) { TOrderMealGoods tOrderMealGoods = new TOrderMealGoods(); tOrderMealGoods.setGoodsNum(typeGood.getGoodsNum()); tOrderMealGoods.setGoodsName(typeGood.getGoodsName()); tOrderMealGoods.setGoodsPicture(typeGood.getGoodsPicture()); tOrderMealGoods.setGoodsSalePrice(typeGood.getSalePrice()); tOrderMealGoods.setGoodsCount(1); orderMealGoods.add(tOrderMealGoods); } } }); orderMeal.setMealOrderGoods(orderMealGoods); orderMeal.setOrderMoney(orderMealGoods.stream().map(TOrderMealGoods::getGoodsSalePrice).reduce(BigDecimal::add).get()); orderMeal.setPayMoney(orderMealGoods.stream().map(TOrderMealGoods::getGoodsSalePrice).reduce(BigDecimal::add).get()); orderMeals.add(orderMeal); } } BigDecimal sumMoney = orderMeals.stream().map(TOrderMeal::getPayMoney).reduce(BigDecimal::add).get(); if(sumMoney.compareTo(dto.getMinTurnover()) >= 0 || sumMoney.compareTo(dto.getMaxTurnover()) <= 0){ int weiXin = getRandomPayType(orderMeals.size(), dto.getWeiXinProportion()); int ali = getRandomPayType(orderMeals.size(), dto.getAliProportion()); int card = getRandomPayType(orderMeals.size(), dto.getCardProportion()); int money = getRandomPayType(orderMeals.size(), dto.getMoneyProportion()); int other = getRandomPayType(orderMeals.size(), dto.getOtherProportion()); switch (orderMeals.size()-(weiXin+ali+card+money+other)){ case 1: weiXin += 1; break; case 2: weiXin += 1; ali += 1; break; case 3: weiXin += 1; ali += 1; card += 1; break; case 4: weiXin += 1; ali += 1; card += 1; money += 1; break; case 5: weiXin += 1; ali += 1; card += 1; money += 1; other += 1; break; } List<TOrderMeal> weiXinOrderMeals = orderMeals.subList(0, weiXin); List<TOrderMeal> aliOrderMeals = orderMeals.subList(weiXin, weiXin+ali); List<TOrderMeal> cardOrderMeals = orderMeals.subList(weiXin+ali, weiXin+ali+card); List<TOrderMeal> moneyOrderMeals = orderMeals.subList(weiXin+ali+card, weiXin+ali+card+money); List<TOrderMeal> otherOrderMeals = orderMeals.subList(weiXin+ali+card+money, weiXin+ali+card+money+other); weiXinOrderMeals.forEach(e->e.setPayType(3)); aliOrderMeals.forEach(e->e.setPayType(2)); cardOrderMeals.forEach(e->e.setPayType(4)); moneyOrderMeals.forEach(e->e.setPayType(1)); otherOrderMeals.forEach(e->e.setPayType(5)); List<TOrderMeal> allOrderMeals = new ArrayList<>(); allOrderMeals.addAll(weiXinOrderMeals); allOrderMeals.addAll(aliOrderMeals); allOrderMeals.addAll(cardOrderMeals); allOrderMeals.addAll(moneyOrderMeals); allOrderMeals.addAll(otherOrderMeals); orderMealService.saveBatch(allOrderMeals); for (TOrderMeal weiXinOrderMeal : allOrderMeals) { weiXinOrderMeal.getMealOrderGoods().forEach(e->e.setOrderId(weiXinOrderMeal.getId())); } orderMealGoodsService.saveBatch(allOrderMeals.stream().map(TOrderMeal::getMealOrderGoods).flatMap(Collection::stream).collect(Collectors.toList())); long end = System.currentTimeMillis() - start; System.err.println("相差时间========="+end); }else { throw new ServiceException("数据生成不在营业额范围内"); } } 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()); } private int getRandom(int min,int max) { // 生成一个min到max之间的随机数 return new Random().nextInt(max - min + 1) + min; } private static <T> List<T> randomSelection(List<T> list, int size) { List<T> selected = new ArrayList<>(); int length = list.size(); for (int i = 0; i < size; i++) { Collections.shuffle(list); // 如果需求的大小超过了集合的长度,则只能取到集合的全部元素 int subListSize = Math.min(size - selected.size(), length); selected.addAll(list.subList(0, subListSize)); } return selected; } public static void main(String[] args) { // System.err.println(new Random().nextInt(1 - 0 + 1) + 0); List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); System.err.println(list.subList(1,2)); } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TFoundationConfigServiceImpl.java
@@ -4,7 +4,10 @@ import com.ruoyi.system.domain.TFoundationConfig; import com.ruoyi.system.mapper.TFoundationConfigMapper; import com.ruoyi.system.service.TFoundationConfigService; import com.ruoyi.system.vo.TFoundationConfigVO; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -17,4 +20,8 @@ @Service public class TFoundationConfigServiceImpl extends ServiceImpl<TFoundationConfigMapper, TFoundationConfig> implements TFoundationConfigService { @Override public List<TFoundationConfigVO> getList() { return this.baseMapper.getList(); } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderMealServiceImpl.java
@@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Random; import java.util.stream.Collectors; /** @@ -137,8 +138,4 @@ boardService.updateById(board); } @Override public void dataGenerator(OrderMealGeneratorDTO dto) { // 循环待生成订单列表,添加到集合中,批量插入 } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderSaleServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.OrderNumConstants; import com.ruoyi.common.utils.CodeGenerateUtils; import com.ruoyi.system.domain.TOrderSale; import com.ruoyi.system.domain.TOrderSaleGoods; @@ -31,7 +32,7 @@ @Override public void add(TOrderSaleDTO dto) { // 销售单号 dto.setOrderNum("XS" + CodeGenerateUtils.generateOrderSn()); dto.setOrderNum(OrderNumConstants.SALE + CodeGenerateUtils.generateOrderSn()); List<TOrderSaleGoods> orderSaleGoods = dto.getOrderSaleGoods(); BigDecimal sum = orderSaleGoods.stream().map(TOrderSaleGoods::getGoodsSalePrice).reduce(BigDecimal::add).get(); dto.setOrderMoney(sum); ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TOrderStockServiceImpl.java
@@ -3,6 +3,7 @@ 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.OrderNumConstants; import com.ruoyi.common.utils.CodeGenerateUtils; import com.ruoyi.system.domain.TOrderSaleGoods; import com.ruoyi.system.domain.TOrderStock; @@ -38,7 +39,7 @@ @Override public void add(TOrderStockDTO dto) { // 进货单号 dto.setStockNum("JH" + CodeGenerateUtils.generateOrderSn()); dto.setStockNum(OrderNumConstants.STOCK + CodeGenerateUtils.generateOrderSn()); List<TOrderStockGoods> orderStockGoods = dto.getOrderStockGoods(); BigDecimal sum = orderStockGoods.stream().map(TOrderStockGoods::getStockPrice).reduce(BigDecimal::add).get(); dto.setStockTotalPrice(sum); ruoyi-system/src/main/java/com/ruoyi/system/vo/TFoundationConfigVO.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.system.vo; import com.ruoyi.system.domain.TFoundationConfig; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "用餐人数VO") public class TFoundationConfigVO extends TFoundationConfig { @ApiModelProperty(value = "用餐人数") private Integer mealCount; } ruoyi-system/src/main/java/com/ruoyi/system/vo/TOrderMealVO.java
New file @@ -0,0 +1,10 @@ package com.ruoyi.system.vo; import com.ruoyi.system.domain.TOrderMeal; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "TOrderMealVO对象",description = "餐饮订单VO") public class TOrderMealVO extends TOrderMeal { } ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -302,8 +302,6 @@ <if test="loginDate != null">login_date = #{loginDate},</if> <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> <if test="remark != null">remark = #{remark},</if> <if test="ifBlack != null">ifBlack = #{ifBlack},</if> <if test="districtId != null">districtId = #{districtId},</if> update_time = sysdate() </set> where user_id = #{userId} ruoyi-system/src/main/resources/mapper/system/TDataGeneratorMapper.xml
New file @@ -0,0 +1,28 @@ <?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.TDataGeneratorMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.TDataGenerator"> <id column="id" property="id" /> <result column="userId" property="userId" /> <result column="userName" property="userName" /> <result column="shopId" property="shopId" /> <result column="startTime" property="startTime" /> <result column="endTime" property="endTime" /> <result column="minMoney" property="minMoney" /> <result column="maxMoney" property="maxMoney" /> <result column="status" property="status" /> <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, userId, userName, shopId, startTime, endTime, minMoney, maxMoney, status, createTime, updateTime, disabled, createBy, updateBy </sql> </mapper> ruoyi-system/src/main/resources/mapper/system/TFoundationConfigMapper.xml
@@ -15,5 +15,10 @@ <sql id="Base_Column_List"> id, personId,typeId, minCount, maxCount </sql> <select id="getList" resultType="com.ruoyi.system.vo.TFoundationConfigVO"> SELECT tfc.id, tfc.personId,tfc.typeId, tfc.minCount, tfc.maxCount,tfp.mealCount FROM t_foundation_config tfc LEFT JOIN t_foundation_person tfp ON tfp.id = tfc.personId </select> </mapper>