瀏覽代碼

Merge branch 'master' of http://49.4.53.36:3000/hotel/hotel-saas-backend

qh 2 年之前
父節點
當前提交
ce139fdb9a
共有 44 個文件被更改,包括 2659 次插入19 次删除
  1. 22 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketCouponsCashController.java
  2. 258 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketCouponsCashUsedController.java
  3. 16 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketCouponsUsedController.java
  4. 252 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMemberCardController.java
  5. 230 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusPrintTemplateController.java
  6. 1 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/ProvideCouponsUsedDto.java
  7. 12 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/UserGroupDto.java
  8. 12 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/UserLabelDto.java
  9. 20 5
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMarketCouponsCash.java
  10. 100 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMarketCouponsCashUsed.java
  11. 149 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMemberCard.java
  12. 108 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusPrintTemplate.java
  13. 3 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusMarketCouponsCashMapper.java
  14. 17 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusMarketCouponsCashUsedMapper.java
  15. 26 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusMemberCardMapper.java
  16. 17 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusPrintTemplateMapper.java
  17. 25 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusMarketCouponsCashMapper.xml
  18. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusMarketCouponsCashUsedMapper.xml
  19. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusMemberCardMapper.xml
  20. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusPrintTemplateMapper.xml
  21. 4 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMarketCouponsCashService.java
  22. 31 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMarketCouponsCashUsedService.java
  23. 7 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMarketCouponsUsedService.java
  24. 36 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMemberCardService.java
  25. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusPrintTemplateService.java
  26. 10 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMarketCouponsCashServiceImpl.java
  27. 272 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMarketCouponsCashUsedServiceImpl.java
  28. 98 5
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMarketCouponsUsedServiceImpl.java
  29. 85 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMemberCardServiceImpl.java
  30. 19 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusPrintTemplateServiceImpl.java
  31. 24 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/MemberCardStatVo.java
  32. 8 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CesGoodsDelDto.java
  33. 12 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CesGoodsDto.java
  34. 11 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CesGoodsSearchDto.java
  35. 13 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Vo/CesGoodsVo.java
  36. 149 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodsController.java
  37. 216 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoods.java
  38. 90 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoodsSpecs.java
  39. 16 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesGoodsMapper.java
  40. 16 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesGoodsSpecsMapper.java
  41. 191 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsServiceImpl.java
  42. 26 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsSpecsServiceImpl.java
  43. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsUnitServiceImpl.java
  44. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesStockTypeServiceImpl.java

+ 22 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketCouponsCashController.java

@@ -10,9 +10,14 @@ import java.net.URLDecoder;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
 import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.business.entity.BusHotel;
 import org.jeecg.modules.business.entity.BusMarketCouponsCash;
+import org.jeecg.modules.business.service.IBusHotelService;
 import org.jeecg.modules.business.service.IBusMarketCouponsCashService;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -50,7 +55,10 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 public class BusMarketCouponsCashController extends JeecgController<BusMarketCouponsCash, IBusMarketCouponsCashService> {
 	@Autowired
 	private IBusMarketCouponsCashService busMarketCouponsCashService;
-	
+
+	 @Autowired
+	 private IBusHotelService busHotelService;
+
 	/**
 	 * 分页列表查询
 	 *
@@ -67,9 +75,14 @@ public class BusMarketCouponsCashController extends JeecgController<BusMarketCou
 								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
 								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
 								   HttpServletRequest req) {
-		QueryWrapper<BusMarketCouponsCash> queryWrapper = QueryGenerator.initQueryWrapper(busMarketCouponsCash, req.getParameterMap());
 		Page<BusMarketCouponsCash> page = new Page<BusMarketCouponsCash>(pageNo, pageSize);
-		IPage<BusMarketCouponsCash> pageList = busMarketCouponsCashService.page(page, queryWrapper);
+		IPage<BusMarketCouponsCash> pageList = busMarketCouponsCashService.pageList(page, busMarketCouponsCash);
+		pageList.getRecords().forEach(item -> {
+			BusHotel hotle = busHotelService.getById(item.getHotelId());
+			if (hotle != null) {
+				item.setHotelName(hotle.getName());
+			}
+		});
 		return Result.OK(pageList);
 	}
 	
@@ -84,6 +97,12 @@ public class BusMarketCouponsCashController extends JeecgController<BusMarketCou
 	//@RequiresPermissions("business:bus_market_coupons_cash_info:add")
 	@PostMapping(value = "/add")
 	public Result<String> add(@RequestBody BusMarketCouponsCash busMarketCouponsCash) {
+		LoginUser user = TokenUtils.getAuthUser();
+		if (user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")) {
+			busMarketCouponsCash.setTenantId(user.getRelTenantIds());
+		} else {
+			throw new JeecgBootException("当前登录人租户信息错误");
+		}
 		busMarketCouponsCashService.save(busMarketCouponsCash);
 		return Result.OK("添加成功!");
 	}

+ 258 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketCouponsCashUsedController.java

@@ -0,0 +1,258 @@
+package org.jeecg.modules.business.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.business.dto.CouponsGenerateDto;
+import org.jeecg.modules.business.dto.PostDataDto;
+import org.jeecg.modules.business.dto.ProvideCouponsUsedDto;
+import org.jeecg.modules.business.entity.BusMarketCoupons;
+import org.jeecg.modules.business.entity.BusMarketCouponsCashUsed;
+import org.jeecg.modules.business.entity.BusMarketCouponsUsed;
+import org.jeecg.modules.business.enums.CouponsStatusEnum;
+import org.jeecg.modules.business.service.IBusMarketCouponsCashUsedService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.business.service.IBusMarketCouponsService;
+import org.jeecg.modules.business.service.IBusMarketCouponsUsedService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: bus_market_coupons_cash_used
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+@Api(tags="bus_market_coupons_cash_used")
+@RestController
+@RequestMapping("/business/busMarketCouponsCashUsed")
+@Slf4j
+public class BusMarketCouponsCashUsedController extends JeecgController<BusMarketCouponsCashUsed, IBusMarketCouponsCashUsedService> {
+	@Autowired
+	private IBusMarketCouponsCashUsedService busMarketCouponsCashUsedService;
+	 @Autowired
+	 private IBusMarketCouponsService busMarketCouponsService;
+	/**
+	 * 分页列表查询
+	 *
+	 * @param busMarketCouponsCashUsed
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "bus_market_coupons_cash_used-分页列表查询")
+	@ApiOperation(value="bus_market_coupons_cash_used-分页列表查询", notes="bus_market_coupons_cash_used-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BusMarketCouponsCashUsed>> queryPageList(BusMarketCouponsCashUsed busMarketCouponsCashUsed,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<BusMarketCouponsCashUsed> queryWrapper = QueryGenerator.initQueryWrapper(busMarketCouponsCashUsed, req.getParameterMap());
+		Page<BusMarketCouponsCashUsed> page = new Page<BusMarketCouponsCashUsed>(pageNo, pageSize);
+		IPage<BusMarketCouponsCashUsed> pageList = busMarketCouponsCashUsedService.page(page, queryWrapper);
+		pageList.getRecords().forEach(item -> {
+			BusMarketCoupons coupons = busMarketCouponsService.getById(item.getCouponsId());
+			if (coupons != null) {
+				item.setConponsName(coupons.getName());
+			}
+			CouponsStatusEnum couponsStatusEnum = CouponsStatusEnum.val(item.getStatus());
+			if (couponsStatusEnum != null) {
+				item.setStatusName(couponsStatusEnum.getTitle());
+			}
+		});
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param busMarketCouponsCashUsed
+	 * @return
+	 */
+	@AutoLog(value = "bus_market_coupons_cash_used-添加")
+	@ApiOperation(value="bus_market_coupons_cash_used-添加", notes="bus_market_coupons_cash_used-添加")
+	//@RequiresPermissions("business:bus_market_coupons_cash_used:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody BusMarketCouponsCashUsed busMarketCouponsCashUsed) {
+		busMarketCouponsCashUsedService.save(busMarketCouponsCashUsed);
+		return Result.OK("添加成功!");
+	}
+
+	 /**
+	  *   生成优惠券
+	  *
+	  * @param dto
+	  * @return
+	  */
+	 @AutoLog(value = "优惠券领取使用表-生成")
+	 @ApiOperation(value="优惠券领取使用表-生成", notes="优惠券领取使用表-生成")
+	 @PostMapping(value = "/generate")
+	 public Result<String> generate(@RequestBody CouponsGenerateDto dto) {
+		 Result res = busMarketCouponsCashUsedService.generate(dto);
+		 return res;
+	 }
+
+	 /**
+	  *   优惠券发放给非会员
+	  *
+	  * @param dto
+	  * @return
+	  */
+	 @AutoLog(value = "优惠券领取使用表-优惠券发放给非会员")
+	 @ApiOperation(value="优惠券领取使用表-优惠券发放给非会员", notes="优惠券领取使用表-优惠券发放给非会员")
+	 @PostMapping(value = "/gainCouponsCashUsedToNoMember")
+	 public Result<String> gainCouponsCashUsedToNoMember(@RequestBody ProvideCouponsUsedDto dto) {
+		 Result res = busMarketCouponsCashUsedService.gainCouponsCashUsedToNoMember(dto);
+		 return res;
+	 }
+
+	 /**
+	  *   优惠券发放给会员
+	  *
+	  * @param dto
+	  * @return
+	  */
+	 @AutoLog(value = "优惠券领取使用表-优惠券发放给会员")
+	 @ApiOperation(value="优惠券领取使用表-优惠券发放给会员", notes="优惠券领取使用表-优惠券发放给会员")
+	 @PostMapping(value = "/gainCouponsCashUsedToMember")
+	 public Result<String> gainCouponsCashUsedToMember(@RequestBody ProvideCouponsUsedDto dto) {
+		 Result res = busMarketCouponsCashUsedService.gainCouponsCashUsedToMember(dto);
+		 return res;
+	 }
+
+	 /**
+	  * 作废
+	  * @param dto
+	  * @return
+	  */
+	 @AutoLog(value = "优惠券领取使用表-作废")
+	 @ApiOperation(value="优惠券领取使用表-作废", notes="优惠券领取使用表-作废")
+	 @RequestMapping(value = "/voided", method = {RequestMethod.PUT,RequestMethod.POST})
+	 public Result<String> voided(@RequestBody PostDataDto dto) {
+		 LambdaUpdateWrapper<BusMarketCouponsCashUsed> updateWrapper = new UpdateWrapper().lambda();
+		 updateWrapper.set(BusMarketCouponsCashUsed::getStatus, CouponsStatusEnum.voided.getKey());
+		 updateWrapper.eq(BusMarketCouponsCashUsed::getId, dto.getId());
+		 busMarketCouponsCashUsedService.update(updateWrapper);
+		 return Result.OK("编辑成功!");
+	 }
+	
+	/**
+	 *  编辑
+	 *
+	 * @param busMarketCouponsCashUsed
+	 * @return
+	 */
+	@AutoLog(value = "bus_market_coupons_cash_used-编辑")
+	@ApiOperation(value="bus_market_coupons_cash_used-编辑", notes="bus_market_coupons_cash_used-编辑")
+	//@RequiresPermissions("business:bus_market_coupons_cash_used:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody BusMarketCouponsCashUsed busMarketCouponsCashUsed) {
+		busMarketCouponsCashUsedService.updateById(busMarketCouponsCashUsed);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "bus_market_coupons_cash_used-通过id删除")
+	@ApiOperation(value="bus_market_coupons_cash_used-通过id删除", notes="bus_market_coupons_cash_used-通过id删除")
+	//@RequiresPermissions("business:bus_market_coupons_cash_used:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		busMarketCouponsCashUsedService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "bus_market_coupons_cash_used-批量删除")
+	@ApiOperation(value="bus_market_coupons_cash_used-批量删除", notes="bus_market_coupons_cash_used-批量删除")
+	//@RequiresPermissions("business:bus_market_coupons_cash_used:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.busMarketCouponsCashUsedService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "bus_market_coupons_cash_used-通过id查询")
+	@ApiOperation(value="bus_market_coupons_cash_used-通过id查询", notes="bus_market_coupons_cash_used-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BusMarketCouponsCashUsed> queryById(@RequestParam(name="id",required=true) String id) {
+		BusMarketCouponsCashUsed busMarketCouponsCashUsed = busMarketCouponsCashUsedService.getById(id);
+		if(busMarketCouponsCashUsed==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(busMarketCouponsCashUsed);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param busMarketCouponsCashUsed
+    */
+    //@RequiresPermissions("business:bus_market_coupons_cash_used:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, BusMarketCouponsCashUsed busMarketCouponsCashUsed) {
+        return super.exportXls(request, busMarketCouponsCashUsed, BusMarketCouponsCashUsed.class, "bus_market_coupons_cash_used");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("business:bus_market_coupons_cash_used:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, BusMarketCouponsCashUsed.class);
+    }
+
+}

+ 16 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketCouponsUsedController.java

@@ -138,9 +138,8 @@ public class BusMarketCouponsUsedController extends JeecgController<BusMarketCou
 	  * @param dto
 	  * @return
 	  */
-	 @AutoLog(value = "免房券领取使用表-生成")
-	 @ApiOperation(value="免房券领取使用表-生成", notes="免房券领取使用表-生成")
-	 //@RequiresPermissions("business:bus_market_coupons_used:generate")
+	 @AutoLog(value = "免房券领取使用表-免房券发放给非会员")
+	 @ApiOperation(value="免房券领取使用表-免房券发放给非会员", notes="免房券领取使用表-免房券发放给非会员")
 	 @PostMapping(value = "/gainCouponsUsedToNoMember")
 	 public Result<String> gainCouponsUsedToNoMember(@RequestBody ProvideCouponsUsedDto dto) {
 		 Result res = busMarketCouponsUsedService.gainCouponsUsedToNoMember(dto);
@@ -148,6 +147,20 @@ public class BusMarketCouponsUsedController extends JeecgController<BusMarketCou
 	 }
 
 	 /**
+	  *   免房券发放给会员
+	  *
+	  * @param dto
+	  * @return
+	  */
+	 @AutoLog(value = "免房券领取使用表-免房券发放给会员")
+	 @ApiOperation(value="免房券领取使用表-免房券发放给会员", notes="免房券领取使用表-免房券发放给会员")
+	 @PostMapping(value = "/gainCouponsUsedToMember")
+	 public Result<String> gainCouponsUsedToMember(@RequestBody ProvideCouponsUsedDto dto) {
+		 Result res = busMarketCouponsUsedService.gainCouponsUsedToMember(dto);
+		 return res;
+	 }
+
+	 /**
 	  * 作废
 	  * @param dto
 	  * @return

+ 252 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMemberCardController.java

@@ -0,0 +1,252 @@
+package org.jeecg.modules.business.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.commons.lang3.ObjectUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.dto.UserGroupDto;
+import org.jeecg.modules.business.dto.UserLabelDto;
+import org.jeecg.modules.business.entity.*;
+import org.jeecg.modules.business.service.*;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.business.vo.MemberCardStatVo;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+/**
+ * @Description: bus_member_card
+ * @Author: jeecg-boot
+ * @Date:   2023-03-10
+ * @Version: V1.0
+ */
+@Api(tags="bus_member_card")
+@RestController
+@RequestMapping("/business/busMemberCard")
+@Slf4j
+public class BusMemberCardController extends JeecgController<BusMemberCard, IBusMemberCardService> {
+	@Autowired
+	private IBusMemberCardService busMemberCardService;
+	 @Autowired
+	 private IBusHotelService busHotelService;
+	 @Autowired
+	 private IBusMarketMemberService busMarketMemberService;
+	 @Autowired
+	 private IBusMarketMemberGroupService busMarketMemberGroupService;
+	 @Autowired
+	 private IBusMarketMemberLableService busMarketMemberLableService;
+	/**
+	 * 分页列表查询
+	 *
+	 * @param busMemberCard
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "bus_member_card-分页列表查询")
+	@ApiOperation(value="bus_member_card-分页列表查询", notes="bus_member_card-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BusMemberCard>> queryPageList(BusMemberCard busMemberCard,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+													  @RequestParam(name="startTime",required = false) String startTime,
+													  @RequestParam(name="endTime",required = false) String endTime,
+								   HttpServletRequest req) {
+		LambdaQueryWrapper<BusMemberCard> queryWrapper = QueryGenerator.initQueryWrapper(busMemberCard, req.getParameterMap()).lambda();
+		if (ObjectUtils.isNotEmpty(startTime)) {
+			queryWrapper.ge(BusMemberCard::getCreateTime, DateUtil.parseDate(startTime));
+		}
+		if (ObjectUtils.isNotEmpty(endTime)) {
+			queryWrapper.le(BusMemberCard::getCreateTime, DateUtil.parseDate(endTime));
+		}
+		Page<BusMemberCard> page = new Page<BusMemberCard>(pageNo, pageSize);
+		IPage<BusMemberCard> pageList = busMemberCardService.page(page, queryWrapper);
+		pageList.getRecords().forEach(item -> {
+			BusHotel hotle = busHotelService.getById(item.getHotelId());
+			if (hotle != null) {
+				item.setHotelName(hotle.getName());
+			}
+			BusMarketMember busMarketMember = busMarketMemberService.getById(item.getGradeId());
+			if (busMarketMember != null) {
+				item.setGradeName(busMarketMember.getName());
+			}
+			if (ObjectUtils.isNotEmpty(item.getGroupId())) {
+				BusMarketMemberGroup busMarketMemberGroup = busMarketMemberGroupService.getById(item.getGroupId());
+				if (busMarketMemberGroup != null) {
+					item.setGroupName(busMarketMemberGroup.getName());
+				}
+			}
+			if (ObjectUtils.isNotEmpty(item.getLabelId())) {
+				BusMarketMemberLable busMarketMemberLable = busMarketMemberLableService.getById(item.getLabelId());
+				if (busMarketMemberLable != null) {
+					item.setLabelName(busMarketMemberLable.getName());
+				}
+			}
+		});
+		return Result.OK(pageList);
+	}
+
+	 @GetMapping(value = "/stat")
+	 public Result stat(@RequestParam(name="hotelId") String hotelId) {
+		 MemberCardStatVo vo = busMemberCardService.stat(hotelId);
+		 return Result.OK(vo);
+	 }
+	
+	/**
+	 *   添加
+	 *
+	 * @param busMemberCard
+	 * @return
+	 */
+	@AutoLog(value = "bus_member_card-添加")
+	@ApiOperation(value="bus_member_card-添加", notes="bus_member_card-添加")
+	//@RequiresPermissions("business:bus_member_card:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody BusMemberCard busMemberCard) {
+		LoginUser user = TokenUtils.getAuthUser();
+		if (user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")) {
+			busMemberCard.setTenantId(user.getRelTenantIds());
+		} else {
+			throw new JeecgBootException("当前登录人租户信息错误");
+		}
+		LambdaQueryWrapper<BusMemberCard> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BusMemberCard::getMobile, busMemberCard.getMobile());
+		queryWrapper.eq(BusMemberCard::getHotelId,busMemberCard.getHotelId()).last("limit 1");
+		BusMemberCard memeber = busMemberCardService.getOne(queryWrapper);
+		if (memeber != null) {
+			return Result.error("该手机号已存在!");
+		}
+		busMemberCardService.getOne(queryWrapper);
+		busMemberCardService.save(busMemberCard);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param busMemberCard
+	 * @return
+	 */
+	@AutoLog(value = "bus_member_card-编辑")
+	@ApiOperation(value="bus_member_card-编辑", notes="bus_member_card-编辑")
+	//@RequiresPermissions("business:bus_member_card:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody BusMemberCard busMemberCard) {
+		LambdaQueryWrapper<BusMemberCard> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(BusMemberCard::getMobile, busMemberCard.getMobile());
+		queryWrapper.eq(BusMemberCard::getHotelId,busMemberCard.getHotelId());
+		queryWrapper.ne(BusMemberCard::getId,busMemberCard.getId()).last("limit 1");
+		BusMemberCard memeber = busMemberCardService.getOne(queryWrapper);
+		if (memeber != null) {
+			return Result.error("该手机号已存在!");
+		}
+		busMemberCardService.updateById(busMemberCard);
+		return Result.OK("编辑成功!");
+	}
+
+	 @AutoLog(value = "用户批量分组")
+	 @ApiOperation(value="用户批量分组", notes="用户批量分组")
+	 @RequestMapping(value = "/groupBatch", method = {RequestMethod.PUT,RequestMethod.POST})
+	 public Result<String> groupBatch(@RequestBody UserGroupDto dto) {
+		 Result res = busMemberCardService.groupBatch(dto);
+		 return res;
+	 }
+
+	 @AutoLog(value = "用户批量标签")
+	 @ApiOperation(value="用户批量标签", notes="用户批量标签")
+	 @RequestMapping(value = "/lableBatch", method = {RequestMethod.PUT,RequestMethod.POST})
+	 public Result<String> lableBatch(@RequestBody UserLabelDto dto) {
+		 Result res = busMemberCardService.lableBatch(dto);
+		 return res;
+	 }
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "bus_member_card-通过id删除")
+	@ApiOperation(value="bus_member_card-通过id删除", notes="bus_member_card-通过id删除")
+	//@RequiresPermissions("business:bus_member_card:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		busMemberCardService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "bus_member_card-批量删除")
+	@ApiOperation(value="bus_member_card-批量删除", notes="bus_member_card-批量删除")
+	//@RequiresPermissions("business:bus_member_card:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.busMemberCardService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "bus_member_card-通过id查询")
+	@ApiOperation(value="bus_member_card-通过id查询", notes="bus_member_card-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BusMemberCard> queryById(@RequestParam(name="id",required=true) String id) {
+		BusMemberCard busMemberCard = busMemberCardService.getById(id);
+		if(busMemberCard==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(busMemberCard);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param busMemberCard
+    */
+    //@RequiresPermissions("business:bus_member_card:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, BusMemberCard busMemberCard) {
+        return super.exportXls(request, busMemberCard, BusMemberCard.class, "bus_member_card");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("business:bus_member_card:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, BusMemberCard.class);
+    }
+
+}

+ 230 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusPrintTemplateController.java

@@ -0,0 +1,230 @@
+package org.jeecg.modules.business.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.common.util.oConvertUtils;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.modules.business.entity.BusPrintTemplate;
+import org.jeecg.modules.business.entity.BusRoomPayType;
+import org.jeecg.modules.business.entity.BusWaiter;
+import org.jeecg.modules.business.service.IBusPrintTemplateService;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 打印模板
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+@Api(tags="打印模板")
+@RestController
+@RequestMapping("/business/busPrintTemplate")
+@Slf4j
+public class BusPrintTemplateController extends JeecgController<BusPrintTemplate, IBusPrintTemplateService> {
+	@Autowired
+	private IBusPrintTemplateService busPrintTemplateService;
+
+	/**
+	 * 分页列表查询
+	 *
+	 * @param busPrintTemplate
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "打印模板-分页列表查询")
+	@ApiOperation(value="打印模板-分页列表查询", notes="打印模板-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BusPrintTemplate>> queryPageList(BusPrintTemplate busPrintTemplate,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+		QueryWrapper<BusPrintTemplate> queryWrapper = QueryGenerator.initQueryWrapper(busPrintTemplate, req.getParameterMap());
+		Page<BusPrintTemplate> page = new Page<BusPrintTemplate>(pageNo, pageSize);
+		IPage<BusPrintTemplate> pageList = busPrintTemplateService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	/**
+	 *   添加
+	 *
+	 * @param busPrintTemplate
+	 * @return
+	 */
+	@AutoLog(value = "打印模板-添加")
+	@ApiOperation(value="打印模板-添加", notes="打印模板-添加")
+	//@RequiresPermissions("business:bus_print_template_info:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody BusPrintTemplate busPrintTemplate) {
+		busPrintTemplate.setDelFlag(CommonConstant.DEL_FLAG_0);
+		if(busPrintTemplate.getTenantId() == null || busPrintTemplate.getTenantId().equals("")){
+			LoginUser user = TokenUtils.getAuthUser();
+			if(user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")){
+				busPrintTemplate.setTenantId(user.getRelTenantIds());
+			} else {
+				throw new JeecgBootException("当前登录人租户信息错误");
+			}
+		}
+		busPrintTemplateService.save(busPrintTemplate);
+		return Result.OK("添加成功!");
+	}
+
+	/**
+	 *  编辑
+	 *
+	 * @param busPrintTemplate
+	 * @return
+	 */
+	@AutoLog(value = "打印模板-编辑")
+	@ApiOperation(value="打印模板-编辑", notes="打印模板-编辑")
+	//@RequiresPermissions("business:bus_print_template_info:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody BusPrintTemplate busPrintTemplate) {
+		if(busPrintTemplate.getTenantId() == null || busPrintTemplate.getTenantId().equals("")){
+			LoginUser user = TokenUtils.getAuthUser();
+			if(user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")){
+				busPrintTemplate.setTenantId(user.getRelTenantIds());
+			} else {
+				throw new JeecgBootException("当前登录人租户信息错误");
+			}
+		}
+		BusPrintTemplate editModel = busPrintTemplateService.getById(busPrintTemplate.getId());
+		editModel.setName(busPrintTemplate.getName());
+		editModel.setSpecs(busPrintTemplate.getSpecs());
+		editModel.setRemarks(busPrintTemplate.getRemarks());
+		editModel.setPreview(busPrintTemplate.getPreview());
+		editModel.setDefaultPrint(busPrintTemplate.getDefaultPrint());
+		editModel.setPrintType(busPrintTemplate.getPrintType());
+		editModel.setIsShowRefund(busPrintTemplate.getIsShowRefund());
+		editModel.setPrintSum(busPrintTemplate.getPrintSum());
+		editModel.setPrintContentOffset(busPrintTemplate.getPrintContentOffset());
+		editModel.setPrintPaperOffset(busPrintTemplate.getPrintPaperOffset());
+		busPrintTemplateService.updateById(editModel);
+//		busPrintTemplateService.updateById(busPrintTemplate);
+		return Result.OK("编辑成功!");
+	}
+
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "打印模板-通过id删除")
+	@ApiOperation(value="打印模板-通过id删除", notes="打印模板-通过id删除")
+	//@RequiresPermissions("business:bus_print_template_info:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		busPrintTemplateService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "打印模板-批量删除")
+	@ApiOperation(value="打印模板-批量删除", notes="打印模板-批量删除")
+	//@RequiresPermissions("business:bus_print_template_info:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.busPrintTemplateService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "打印模板-通过id查询")
+	@ApiOperation(value="打印模板-通过id查询", notes="打印模板-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BusPrintTemplate> queryById(@RequestParam(name="id",required=true) String id) {
+		BusPrintTemplate busPrintTemplate = busPrintTemplateService.getById(id);
+		if(busPrintTemplate==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(busPrintTemplate);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param busPrintTemplate
+    */
+    //@RequiresPermissions("business:bus_print_template_info:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, BusPrintTemplate busPrintTemplate) {
+        return super.exportXls(request, busPrintTemplate, BusPrintTemplate.class, "打印模板");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    //@RequiresPermissions("business:bus_print_template_info:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, BusPrintTemplate.class);
+    }
+	 /**
+	  * 通过hotelId查询
+	  *
+	  * @param hotelId
+	  * @return
+	  */
+	 //@AutoLog(value = "打印模板-通过hotelId查询")
+	 @ApiOperation(value="打印模板-通过hotelId查询", notes="打印模板-通过hotelId查询")
+	 @GetMapping(value = "/queryByHotelId")
+	 public Result<BusPrintTemplate> queryByHotelId(@RequestParam(name="hotelId",required=true) String hotelId) {
+		 QueryWrapper<BusPrintTemplate> queryWrapper = new QueryWrapper<BusPrintTemplate>();
+		 queryWrapper.eq("hotel_id", hotelId);
+		 BusPrintTemplate resultModel = busPrintTemplateService.getOne(queryWrapper);
+		 if(resultModel==null) {
+			 return Result.error("");
+		 }
+		 return Result.OK(resultModel);
+	 }
+}

+ 1 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/ProvideCouponsUsedDto.java

@@ -9,5 +9,6 @@ public class ProvideCouponsUsedDto {
     private String couponsId;
     private Integer num;
     private List<MobileDto> mobiles;
+    private List<String> memberIds;
 }
 

+ 12 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/UserGroupDto.java

@@ -0,0 +1,12 @@
+package org.jeecg.modules.business.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserGroupDto {
+    private String groupId;
+    private List<String> ids;
+}
+

+ 12 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/dto/UserLabelDto.java

@@ -0,0 +1,12 @@
+package org.jeecg.modules.business.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserLabelDto {
+    private String labelId;
+    private List<String> ids;
+}
+

+ 20 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMarketCouponsCash.java

@@ -4,10 +4,8 @@ import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -63,7 +61,7 @@ public class BusMarketCouponsCash implements Serializable {
 	/**优惠限制*/
 	@Excel(name = "优惠限制", width = 15)
     @ApiModelProperty(value = "优惠限制")
-    private String type;
+    private Integer type;
 	/**可使用最低金额*/
 	@Excel(name = "可使用最低金额", width = 15)
     @ApiModelProperty(value = "可使用最低金额")
@@ -92,4 +90,21 @@ public class BusMarketCouponsCash implements Serializable {
 	@Excel(name = "使用说明", width = 15)
     @ApiModelProperty(value = "使用说明")
     private String ruleDec;
+
+    @TableField(exist = false)
+    private String hotelName;
+
+    @TableField(exist = false)
+    private Integer count;
+
+    @TableField(exist = false)
+    private Integer notClaimed;
+
+    @TableField(exist = false)
+    private Integer received;
+
+    @TableField(exist = false)
+    private Integer used;
+    @TableField(exist = false)
+    private Integer voided;
 }

+ 100 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMarketCouponsCashUsed.java

@@ -0,0 +1,100 @@
+package org.jeecg.modules.business.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: bus_market_coupons_cash_used
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("bus_market_coupons_cash_used")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="bus_market_coupons_cash_used对象", description="bus_market_coupons_cash_used")
+public class BusMarketCouponsCashUsed implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**关联租户*/
+	@Excel(name = "关联租户", width = 15)
+    @ApiModelProperty(value = "关联租户")
+    private String tenantId;
+	/**关联酒店*/
+	@Excel(name = "关联酒店", width = 15)
+    @ApiModelProperty(value = "关联酒店")
+    private String hotelId;
+	/**优惠券id*/
+	@Excel(name = "优惠券id", width = 15)
+    @ApiModelProperty(value = "优惠券id")
+    private String couponsId;
+	/**券号*/
+	@Excel(name = "券号", width = 15)
+    @ApiModelProperty(value = "券号")
+    private String code;
+	/**状态 0未领取 1已领取 2已使用 3已作废*/
+	@Excel(name = "状态 0未领取 1已领取 2已使用 3已作废", width = 15)
+    @ApiModelProperty(value = "状态 0未领取 1已领取 2已使用 3已作废")
+    private Integer status;
+	/**会员id*/
+	@Excel(name = "会员id", width = 15)
+    @ApiModelProperty(value = "会员id")
+    private String userid;
+	/**姓名*/
+	@Excel(name = "姓名", width = 15)
+    @ApiModelProperty(value = "姓名")
+    private String userName;
+	/**房间号*/
+	@Excel(name = "房间号", width = 15)
+    @ApiModelProperty(value = "房间号")
+    private String roomNumber;
+	/**入住单号*/
+	@Excel(name = "入住单号", width = 15)
+    @ApiModelProperty(value = "入住单号")
+    private String checkedInNo;
+	/**手机号*/
+	@Excel(name = "手机号", width = 15)
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+	/**领取时间*/
+	@Excel(name = "领取时间", width = 15, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "领取时间")
+    private Date gainTime;
+	/**使用时间*/
+	@Excel(name = "使用时间", width = 15, format = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "使用时间")
+    private Date usedTime;
+
+    @TableField(exist = false)
+    private String conponsName;
+
+    @TableField(exist = false)
+    private String statusName;
+}

+ 149 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMemberCard.java

@@ -0,0 +1,149 @@
+package org.jeecg.modules.business.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: bus_member_card
+ * @Author: jeecg-boot
+ * @Date:   2023-03-10
+ * @Version: V1.0
+ */
+@Data
+@TableName("bus_member_card")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="bus_member_card对象", description="bus_member_card")
+public class BusMemberCard implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**关联租户*/
+	@Excel(name = "关联租户", width = 15)
+    @ApiModelProperty(value = "关联租户")
+    private String tenantId;
+	/**关联酒店*/
+	@Excel(name = "关联酒店", width = 15)
+    @ApiModelProperty(value = "关联酒店")
+    private String hotelId;
+	/**手机号*/
+	@Excel(name = "手机号", width = 15)
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+	/**会员卡号*/
+	@Excel(name = "会员卡号", width = 15)
+    @ApiModelProperty(value = "会员卡号")
+    private String cardNo;
+	/**卡内码*/
+	@Excel(name = "卡内码", width = 15)
+    @ApiModelProperty(value = "卡内码")
+    private String cardInnerNo;
+	/**等级类型*/
+	@Excel(name = "等级类型", width = 15)
+    @ApiModelProperty(value = "等级类型")
+    private String gradeId;
+	/**会员费*/
+	@Excel(name = "会员费", width = 15)
+    @ApiModelProperty(value = "会员费")
+    private BigDecimal memberFee;
+	/**付款类型*/
+	@Excel(name = "付款类型", width = 15)
+    @ApiModelProperty(value = "付款类型")
+    private Integer payType;
+	/**付款方式*/
+	@Excel(name = "付款方式", width = 15)
+    @ApiModelProperty(value = "付款方式")
+    private String paymentMethod;
+	/**会员姓名*/
+	@Excel(name = "会员姓名", width = 15)
+    @ApiModelProperty(value = "会员姓名")
+    private String name;
+	/**头像*/
+	@Excel(name = "头像", width = 15)
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+	/**性别*/
+	@Excel(name = "性别", width = 15)
+    @ApiModelProperty(value = "性别")
+    private Integer sex;
+	/**证件类型*/
+	@Excel(name = "证件类型", width = 15)
+    @ApiModelProperty(value = "证件类型")
+    private Integer certificateType;
+	/**证件号*/
+	@Excel(name = "证件号", width = 15)
+    @ApiModelProperty(value = "证件号")
+    private String certificateNo;
+	/**地址*/
+	@Excel(name = "地址", width = 15)
+    @ApiModelProperty(value = "地址")
+    private String address;
+	/**消费密码*/
+	@Excel(name = "消费密码", width = 15)
+    @ApiModelProperty(value = "消费密码")
+    private String consumePassword;
+	/**有效期*/
+	@Excel(name = "有效期", width = 15)
+    @ApiModelProperty(value = "有效期")
+    private Integer validity;
+	/**有效期截止日期*/
+	@Excel(name = "有效期截止日期", width = 15, format = "yyyy-MM-dd")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "有效期截止日期")
+    private Date validityEndTime;
+	/**备注*/
+	@Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remark;
+	/**推荐员工*/
+	@Excel(name = "推荐员工", width = 15)
+    @ApiModelProperty(value = "推荐员工")
+    private String staffId;
+	/**可用积分*/
+	@Excel(name = "可用积分", width = 15)
+    @ApiModelProperty(value = "可用积分")
+    private Integer integral;
+	/**可用余额*/
+	@Excel(name = "可用余额", width = 15)
+    @ApiModelProperty(value = "可用余额")
+    private BigDecimal balance;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+    /**分组id*/
+    @Excel(name = "分组id", width = 15)
+    @ApiModelProperty(value = "分组id")
+    private String groupId;
+    /**标签id*/
+    @Excel(name = "标签id", width = 15)
+    @ApiModelProperty(value = "标签id")
+    private String labelId;
+
+	@TableField(exist = false)
+	private String hotelName;
+	@TableField(exist = false)
+    private String gradeName;
+    @TableField(exist = false)
+    private String groupName;
+    @TableField(exist = false)
+    private String labelName;
+}

+ 108 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusPrintTemplate.java

@@ -0,0 +1,108 @@
+package org.jeecg.modules.business.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 打印模板
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("bus_print_template_info")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="bus_print_template_info对象", description="打印模板")
+public class BusPrintTemplate implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**关联租户*/
+	@Excel(name = "关联租户", width = 15)
+    @ApiModelProperty(value = "关联租户")
+    private String tenantId;
+	/**关联酒店*/
+	@Excel(name = "关联酒店", width = 15)
+    @ApiModelProperty(value = "关联酒店")
+    private String hotelId;
+	/**打印模板名称*/
+	@Excel(name = "打印模板名称", width = 15)
+    @ApiModelProperty(value = "打印模板名称")
+    private String name;
+	/**规格*/
+	@Excel(name = "规格", width = 15)
+    @ApiModelProperty(value = "规格")
+    private String specs;
+	/**备注*/
+	@Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+	/**默认打印机*/
+	@Excel(name = "默认打印机", width = 15)
+    @ApiModelProperty(value = "默认打印机")
+    private String defaultPrint;
+	/**打印类型(1-明细;2-汇总)*/
+	@Excel(name = "打印类型(1-明细;2-汇总)", width = 15)
+    @ApiModelProperty(value = "打印类型(1-明细;2-汇总)")
+    private Integer printType;
+	/**打印份数*/
+	@Excel(name = "打印份数", width = 15)
+    @ApiModelProperty(value = "打印份数")
+    private Integer printSum;
+	/**打印预览*/
+	@Excel(name = "打印预览", width = 15)
+    @ApiModelProperty(value = "打印预览")
+    private Boolean preview;
+	/**打印时内容宽度偏差*/
+	@Excel(name = "打印时内容宽度偏差", width = 15)
+    @ApiModelProperty(value = "打印时内容宽度偏差")
+    private String printContentOffset;
+	/**打印时纸张宽度偏差*/
+	@Excel(name = "打印时纸张宽度偏差", width = 15)
+    @ApiModelProperty(value = "打印时纸张宽度偏差")
+    private String printPaperOffset;
+	/**是否显示退菜(0-是;1-否)*/
+	@Excel(name = "是否显示退菜(0-是;1-否)", width = 15)
+    @ApiModelProperty(value = "是否显示退菜(0-是;1-否)")
+    private Integer isShowRefund;
+    /**删除状态(0-正常,1-已删除)*/
+    @Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
+    @ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
+    @TableLogic
+    private Integer delFlag;
+    /**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+}

+ 3 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusMarketCouponsCashMapper.java

@@ -2,7 +2,9 @@ package org.jeecg.modules.business.mapper;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.business.entity.BusMarketCoupons;
 import org.jeecg.modules.business.entity.BusMarketCouponsCash;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
@@ -13,5 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @Version: V1.0
  */
 public interface BusMarketCouponsCashMapper extends BaseMapper<BusMarketCouponsCash> {
-
+    public List<BusMarketCouponsCash> getCouponsCashList(Page<BusMarketCouponsCash> page, @Param("busMarketCouponsCash") BusMarketCouponsCash model);
 }

+ 17 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusMarketCouponsCashUsedMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.business.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.business.entity.BusMarketCouponsCashUsed;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: bus_market_coupons_cash_used
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+public interface BusMarketCouponsCashUsedMapper extends BaseMapper<BusMarketCouponsCashUsed> {
+
+}

+ 26 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusMemberCardMapper.java

@@ -0,0 +1,26 @@
+package org.jeecg.modules.business.mapper;
+
+import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.business.entity.BusMemberCard;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.business.vo.MemberCardStatVo;
+
+/**
+ * @Description: bus_member_card
+ * @Author: jeecg-boot
+ * @Date:   2023-03-10
+ * @Version: V1.0
+ */
+public interface BusMemberCardMapper extends BaseMapper<BusMemberCard> {
+
+    /**
+     * 统计
+     * @param hotelId
+     * @return
+     */
+    @Select("select count(0) as count,sum(CASE WHEN DATEDIFF(create_time,now())=0 THEN 1 ELSE 0 END) as day_count,\n" +
+            "sum(CASE WHEN substring(certificate_no,11,4)=DATE_FORMAT(Now(),'%m%d') THEN 1 ELSE 0 END) as birthday_count,\n" +
+            "sum(CASE WHEN substring(certificate_no,11,2)=DATE_FORMAT(Now(),'%m') THEN 1 ELSE 0 END) as month_birthday_count\n" +
+            "from bus_member_card where hotel_id = #{hotelId}")
+    public MemberCardStatVo stat(String hotelId);
+}

+ 17 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/BusPrintTemplateMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.business.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.business.entity.BusPrintTemplate;
+
+/**
+ * @Description: 打印模板
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+public interface BusPrintTemplateMapper extends BaseMapper<BusPrintTemplate> {
+
+}

+ 25 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusMarketCouponsCashMapper.xml

@@ -1,5 +1,29 @@
 <?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="org.jeecg.modules.demo.business.mapper.BusMarketCouponsCashMapper">
+<mapper namespace="org.jeecg.modules.business.mapper.BusMarketCouponsCashMapper">
+    <select id="getCouponsCashList" parameterType="Object" resultType="org.jeecg.modules.business.entity.BusMarketCouponsCash">
+        select c.*,ifnull(u.count,0) as count,ifnull(u.not_claimed,0) as not_claimed,ifnull(u.received,0) as received,ifnull(u.used,0) as used,ifnull(u.voided,0) as voided from bus_market_coupons_cash_info c
+        left join (select coupons_id,count(0) as count
+        ,SUM(CASE WHEN `status`  = 0 then 1 else 0 end) as not_claimed
+        ,SUM(CASE WHEN `status`  = 1 then 1 else 0 end) as received
+        ,SUM(CASE WHEN `status`  = 2 then 1 else 0 end) as used
+        ,SUM(CASE WHEN `status`  = 3 then 1 else 0 end) as voided
+        from bus_market_coupons_cash_used  group by coupons_id) u
+        on u.coupons_id=c.id
+        where c.hotel_id = #{busMarketCouponsCash.hotelId}
+        <if test="busMarketCouponsCash.hotelId!= null">
+            <if test="busMarketCouponsCash.name !=null and busMarketCouponsCash.name != ''">
+                and c.name like CONCAT(CONCAT('%', #{busMarketCouponsCash.name}), '%')
+            </if>
 
+            <if test="busMarketCouponsCash.startTime !=null and busMarketCouponsCash.startTime != ''">
+                and c.start_time &gt;= #{busMarketCouponsCash.startTime}
+            </if>
+
+            <if test="busMarketCouponsCash.endTime !=null and busMarketCouponsCash.endTime != ''">
+                and c.end_time &lt;= #{busMarketCouponsCash.endTime}
+            </if>
+        </if>
+        ORDER BY c.id desc
+    </select>
 </mapper>

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusMarketCouponsCashUsedMapper.xml

@@ -0,0 +1,5 @@
+<?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="org.jeecg.modules.demo.business.mapper.BusMarketCouponsCashUsedMapper">
+
+</mapper>

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusMemberCardMapper.xml

@@ -0,0 +1,5 @@
+<?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="org.jeecg.modules.demo.business.mapper.BusMemberCardMapper">
+
+</mapper>

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/BusPrintTemplateMapper.xml

@@ -0,0 +1,5 @@
+<?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="org.jeecg.modules.demo.business.mapper.BusPrintTemplateMapper">
+
+</mapper>

+ 4 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMarketCouponsCashService.java

@@ -1,5 +1,8 @@
 package org.jeecg.modules.business.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.business.entity.BusMarketCoupons;
 import org.jeecg.modules.business.entity.BusMarketCouponsCash;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -10,5 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @Version: V1.0
  */
 public interface IBusMarketCouponsCashService extends IService<BusMarketCouponsCash> {
-
+    public Page<BusMarketCouponsCash> pageList(Page<BusMarketCouponsCash> page, @Param("busMarketCouponsCash") BusMarketCouponsCash model);
 }

+ 31 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMarketCouponsCashUsedService.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.business.service;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.business.dto.CouponsGenerateDto;
+import org.jeecg.modules.business.dto.ProvideCouponsUsedDto;
+import org.jeecg.modules.business.entity.BusMarketCouponsCashUsed;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: bus_market_coupons_cash_used
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+public interface IBusMarketCouponsCashUsedService extends IService<BusMarketCouponsCashUsed> {
+    public Result generate(CouponsGenerateDto dto);
+
+    /**
+     * 发放免房券给非会员
+     * @param dto
+     * @return
+     */
+    public Result gainCouponsCashUsedToNoMember(ProvideCouponsUsedDto dto);
+
+    /**
+     * 发放免房券给会员
+     * @param dto
+     * @return
+     */
+    public Result gainCouponsCashUsedToMember(ProvideCouponsUsedDto dto);
+}

+ 7 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMarketCouponsUsedService.java

@@ -34,4 +34,11 @@ public interface IBusMarketCouponsUsedService extends IService<BusMarketCouponsU
      * @return
      */
     public Result gainCouponsUsedToNoMember(ProvideCouponsUsedDto dto);
+
+    /**
+     * 发放免房券给会员
+     * @param dto
+     * @return
+     */
+    public Result gainCouponsUsedToMember(ProvideCouponsUsedDto dto);
 }

+ 36 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusMemberCardService.java

@@ -0,0 +1,36 @@
+package org.jeecg.modules.business.service;
+
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.business.dto.UserGroupDto;
+import org.jeecg.modules.business.dto.UserLabelDto;
+import org.jeecg.modules.business.entity.BusMemberCard;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.business.vo.MemberCardStatVo;
+
+/**
+ * @Description: bus_member_card
+ * @Author: jeecg-boot
+ * @Date:   2023-03-10
+ * @Version: V1.0
+ */
+public interface IBusMemberCardService extends IService<BusMemberCard> {
+    /**
+     * 设置用户分组
+     * @param dto
+     * @return
+     */
+    public Result groupBatch(UserGroupDto dto);
+
+    /**
+     * 设置用户标签
+     * @param dto
+     * @return
+     */
+    public Result lableBatch(UserLabelDto dto);
+
+    /**
+     * 统计
+     * @return
+     */
+    public MemberCardStatVo stat(String hotelId);
+}

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusPrintTemplateService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.business.entity.BusPrintTemplate;
+
+/**
+ * @Description: 打印模板
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+public interface IBusPrintTemplateService extends IService<BusPrintTemplate> {
+
+}

+ 10 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMarketCouponsCashServiceImpl.java

@@ -1,12 +1,17 @@
 package org.jeecg.modules.business.service.impl;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.business.entity.BusMarketCoupons;
 import org.jeecg.modules.business.entity.BusMarketCouponsCash;
 import org.jeecg.modules.business.mapper.BusMarketCouponsCashMapper;
+import org.jeecg.modules.business.mapper.BusMarketCouponsMapper;
 import org.jeecg.modules.business.service.IBusMarketCouponsCashService;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import javax.annotation.Resource;
+
 /**
  * @Description: bus_market_coupons_cash_info
  * @Author: jeecg-boot
@@ -15,5 +20,10 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  */
 @Service
 public class BusMarketCouponsCashServiceImpl extends ServiceImpl<BusMarketCouponsCashMapper, BusMarketCouponsCash> implements IBusMarketCouponsCashService {
+    @Resource
+    private BusMarketCouponsCashMapper busMarketCouponsCashMapper;
 
+    public Page<BusMarketCouponsCash> pageList(Page<BusMarketCouponsCash> page, BusMarketCouponsCash model) {
+        return page.setRecords(busMarketCouponsCashMapper.getCouponsCashList(page, model));
+    }
 }

+ 272 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMarketCouponsCashUsedServiceImpl.java

@@ -0,0 +1,272 @@
+package org.jeecg.modules.business.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.commons.lang3.ObjectUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.dto.CouponsGenerateDto;
+import org.jeecg.modules.business.dto.MobileDto;
+import org.jeecg.modules.business.dto.ProvideCouponsUsedDto;
+import org.jeecg.modules.business.entity.*;
+import org.jeecg.modules.business.enums.CouponsStatusEnum;
+import org.jeecg.modules.business.mapper.BusMarketCouponsCashMapper;
+import org.jeecg.modules.business.mapper.BusMarketCouponsCashUsedMapper;
+import org.jeecg.modules.business.mapper.BusMarketCouponsMapper;
+import org.jeecg.modules.business.service.IBusMarketCouponsCashUsedService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: bus_market_coupons_cash_used
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+@Service
+public class BusMarketCouponsCashUsedServiceImpl extends ServiceImpl<BusMarketCouponsCashUsedMapper, BusMarketCouponsCashUsed> implements IBusMarketCouponsCashUsedService {
+
+    @Resource
+    private BusMarketCouponsCashMapper busMarketCouponsCashMapper;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Resource
+    private BusMemberCardServiceImpl busMemberCardService;
+    /**
+     * 生成16位数字+prefix
+     * @param prefix
+     * @return
+     */
+    private String randomNumber(String prefix) {
+        int first = new Random(10).nextInt(8) + 1;
+        int hashCode = UUID.randomUUID().toString().hashCode();
+        if (hashCode < 0) {
+            hashCode = -hashCode;
+        }
+        return prefix + first + String.format("%015d", hashCode);
+    }
+    /**
+     * 生成优惠券领取使用
+     * @param dto
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result generate(CouponsGenerateDto dto){
+        if(ObjectUtils.isEmpty(dto.getCouponsId())) return Result.error("优惠券id不能为空");
+        if(dto.getNum()<=0) return Result.error("生成数量不能小于1!");
+        BusMarketCouponsCash coupons=busMarketCouponsCashMapper .selectById(dto.getCouponsId());
+        if(ObjectUtils.isEmpty(coupons)) {
+            return Result.error("优惠券活动不存在");
+        }
+        List<BusMarketCouponsCashUsed> busMarketCouponsUsedList = new ArrayList<>();
+        while (dto.getNum()>0){
+            BusMarketCouponsCashUsed busMarketCouponsCashUsed =new BusMarketCouponsCashUsed();
+            busMarketCouponsCashUsed.setTenantId(TokenUtils.currentTenantId());
+            busMarketCouponsCashUsed.setHotelId(coupons.getHotelId());
+            busMarketCouponsCashUsed.setCouponsId(dto.getCouponsId());
+            busMarketCouponsCashUsed.setCode(randomNumber("YHJ"));
+            busMarketCouponsCashUsed.setStatus(0);
+            busMarketCouponsCashUsed.setCreateTime(DateTime.now());
+            busMarketCouponsUsedList.add(busMarketCouponsCashUsed);
+            dto.setNum(dto.getNum()-1);
+        }
+        this.saveBatch(busMarketCouponsUsedList);
+        return Result.ok("创建成功");
+    }
+
+    /**
+     * 发放优惠券给非会员
+     * @param dto
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result gainCouponsCashUsedToNoMember(ProvideCouponsUsedDto dto) {
+        if (ObjectUtils.isEmpty(dto.getCouponsId())) return Result.error("优惠券id不能为空");
+        if (dto.getNum() <= 0) return Result.error("每人发放张数不能小于1!");
+        if (dto.getMobiles() == null || dto.getMobiles().size() <= 0) return Result.error("手机号不能为空!");
+        BusMarketCouponsCash coupons = busMarketCouponsCashMapper.selectById(dto.getCouponsId());
+        if (ObjectUtils.isEmpty(coupons)) {
+            return Result.error("优惠券活动不存在");
+        }
+        if (dto.getNum() > coupons.getKlqzs()) {
+            return Result.error("每人最多可领取" + coupons.getKlqzs());
+        }
+        int totalNum = dto.getMobiles().size() * dto.getNum();
+
+        LambdaQueryWrapper<BusMarketCouponsCashUsed> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(BusMarketCouponsCashUsed::getStatus, CouponsStatusEnum.notClaimed.getKey());
+        queryWrapper.eq(BusMarketCouponsCashUsed::getCouponsId, dto.getCouponsId());
+
+        Page<BusMarketCouponsCashUsed> page = new Page<BusMarketCouponsCashUsed>(1, totalNum);
+        IPage<BusMarketCouponsCashUsed> pageList = this.page(page, queryWrapper);
+        int count = pageList.getRecords().size();
+//        Long count= this.count(queryWrapper);
+        if (totalNum > count) {
+            return Result.error("待领取数量" + count + ",不够发放");
+        }
+        List<BusMarketCouponsCashUsed> list = pageList.getRecords();
+        int index = 0;
+//        AtomicReference<Boolean> isBreak = new AtomicReference<>(false);
+        String message = "创建成功";
+        try {
+//            for (int i = 0; i < dto.getMobiles().size(); i++) {
+//                int num = dto.getNum();
+            //以防手机号相同用分组实现
+            Map<String, List<MobileDto>> map = dto.getMobiles().stream().collect(Collectors.groupingBy(t -> t.getValue()));
+            for (String key : map.keySet()) {
+                int num = dto.getNum() * map.get(key).size();
+                if (num > coupons.getKlqzs()) {
+                    throw new JeecgBootException("每人最多可领取" + coupons.getKlqzs());
+                }
+                LambdaQueryWrapper<BusMemberCard> queryWrapper3 = new LambdaQueryWrapper<>();
+                queryWrapper3.eq(BusMemberCard::getMobile, key);
+                //查询手机号是否是会员
+                BusMemberCard memeberCard = busMemberCardService.getOne(queryWrapper3);
+                while (num > 0) {
+                    LambdaQueryWrapper<BusMarketCouponsCashUsed> queryWrapper2 = new LambdaQueryWrapper<>();
+                    queryWrapper2.eq(BusMarketCouponsCashUsed::getCouponsId, dto.getCouponsId());
+//                    queryWrapper2.eq(BusMarketCouponsCashUsed::getMobile, dto.getMobiles().get(i).getValue());
+                    queryWrapper2.eq(BusMarketCouponsCashUsed::getMobile, key);
+                    Long gainCount = this.count(queryWrapper2);
+                    if (gainCount > coupons.getKlqzs()) {
+                        throw new JeecgBootException("每人限领数量" + coupons.getKlqzs());
+                    }
+                    BusMarketCouponsCashUsed model = list.get(index);
+                    String keyString = String.format("sys:cache:couponscashused::%s", model.getId());
+                    if (redisUtil.hasKey(keyString)) {
+//                        isBreak.set(true);
+//                        break;
+                        throw new JeecgBootException("该优惠券已被领取,请勿同时操作该功能");
+                    } else {
+                        redisUtil.set(keyString, true);
+                    }
+                    //这里到时候要根据会员表查询一下是否存在会员信息,现在没有会员表
+//                    model.setMobile(dto.getMobiles().get(i).getValue());
+                    model.setMobile(key);
+                    if (memeberCard != null) {
+                        model.setUserName(memeberCard.getName());
+                        model.setUserid(memeberCard.getId());
+                    }
+                    model.setGainTime(DateTime.now());
+                    model.setStatus(CouponsStatusEnum.received.getKey());
+                    index++;
+                    num--;
+                }
+//                if (isBreak.get()) {
+//                    //删除redis缓存
+//                    list.forEach(item -> {
+//                        String keyString = String.format("sys:cache:couponscashused::%s", item.getId());
+//                        redisUtil.del(keyString);
+//                    });
+//                    return Result.error("该优惠券已被领取,请勿同时操作该功能");
+//                }
+            }
+
+            this.updateBatchById(list);
+        } catch (JeecgBootException ex) {
+            message = ex.getMessage();
+        } catch (Exception ex) {
+            message = "创建失败";
+        } finally {
+            //删除redis缓存,添加成功后也可不删除
+            list.forEach(item -> {
+                String keyString = String.format("sys:cache:couponscashused::%s", item.getId());
+                redisUtil.del(keyString);
+            });
+        }
+        return message == "创建成功" ? Result.ok(message) : Result.error(message);
+    }
+
+
+    /**
+     * 发放优惠券给会员
+     * @param dto
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result gainCouponsCashUsedToMember(ProvideCouponsUsedDto dto) {
+        if (ObjectUtils.isEmpty(dto.getCouponsId())) return Result.error("优惠券id不能为空");
+        if (dto.getNum() <= 0) return Result.error("每人发放张数不能小于1!");
+        if (dto.getMemberIds() == null || dto.getMemberIds().size() <= 0) return Result.error("会员不能为空!");
+        BusMarketCouponsCash coupons = busMarketCouponsCashMapper.selectById(dto.getCouponsId());
+        if (ObjectUtils.isEmpty(coupons)) {
+            return Result.error("优惠券活动不存在");
+        }
+        if (dto.getNum() > coupons.getKlqzs()) {
+            return Result.error("每人最多可领取" + coupons.getKlqzs());
+        }
+        int totalNum = dto.getMemberIds().size() * dto.getNum();
+
+        LambdaQueryWrapper<BusMarketCouponsCashUsed> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(BusMarketCouponsCashUsed::getStatus, CouponsStatusEnum.notClaimed.getKey());
+        queryWrapper.eq(BusMarketCouponsCashUsed::getCouponsId, dto.getCouponsId());
+
+        Page<BusMarketCouponsCashUsed> page = new Page<BusMarketCouponsCashUsed>(1, totalNum);
+        IPage<BusMarketCouponsCashUsed> pageList = this.page(page, queryWrapper);
+        int count = pageList.getRecords().size();
+        if (totalNum > count) {
+            return Result.error("待领取数量" + count + ",不够发放");
+        }
+        List<BusMarketCouponsCashUsed> list = pageList.getRecords();
+        int index = 0;
+        String message = "创建成功";
+        try {
+            //以防会员相同用分组实现
+            Map<String, List<String>> map=  dto.getMemberIds().stream().collect(Collectors.groupingBy(t->t));
+            for (String key:map.keySet()) {
+                int num = dto.getNum()*map.get(key).size();
+                if (num> coupons.getKlqzs()) {
+                    throw new JeecgBootException("每人最多可领取" + coupons.getKlqzs());
+                }
+                BusMemberCard memeberCard=busMemberCardService.getById(key);
+                while (num > 0) {
+                    LambdaQueryWrapper<BusMarketCouponsCashUsed> queryWrapper2 = new LambdaQueryWrapper<>();
+                    queryWrapper2.eq(BusMarketCouponsCashUsed::getCouponsId, dto.getCouponsId());
+                    queryWrapper2.and(i -> i.eq(BusMarketCouponsCashUsed::getUserid, key).or().eq(BusMarketCouponsCashUsed::getMobile, memeberCard.getMobile()));
+                    Long gainCount = this.count(queryWrapper2);
+                    if (gainCount > coupons.getKlqzs()) {
+                        throw new JeecgBootException("每人限领数量" + coupons.getKlqzs());
+                    }
+                    BusMarketCouponsCashUsed model = list.get(index);
+                    String keyString = String.format("sys:cache:couponscashused::%s", model.getId());
+                    if (redisUtil.hasKey(keyString)) {
+                        throw new JeecgBootException("该优惠券已被领取,请勿同时操作该功能");
+                    } else {
+                        redisUtil.set(keyString, true);
+                    }
+                    model.setUserid(memeberCard.getId());
+                    model.setUserName(memeberCard.getName());
+                    model.setMobile(memeberCard.getMobile());
+                    model.setGainTime(DateTime.now());
+                    model.setStatus(CouponsStatusEnum.received.getKey());
+                    index++;
+                    num--;
+                }
+            }
+
+            this.updateBatchById(list);
+        } catch (JeecgBootException ex) {
+            message = ex.getMessage();
+        } catch (Exception ex) {
+            message = "创建失败";
+        } finally {
+            //删除redis缓存,添加成功后也可不删除
+            list.forEach(item -> {
+                String keyString = String.format("sys:cache:couponscashused::%s", item.getId());
+                redisUtil.del(keyString);
+            });
+        }
+        return message == "创建成功" ? Result.ok(message) : Result.error(message);
+    }
+}

+ 98 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMarketCouponsUsedServiceImpl.java

@@ -15,10 +15,12 @@ import org.jeecg.modules.business.dto.MobileDto;
 import org.jeecg.modules.business.dto.ProvideCouponsUsedDto;
 import org.jeecg.modules.business.entity.BusMarketCoupons;
 import org.jeecg.modules.business.entity.BusMarketCouponsUsed;
+import org.jeecg.modules.business.entity.BusMemberCard;
 import org.jeecg.modules.business.enums.CouponsStatusEnum;
 import org.jeecg.modules.business.mapper.BusMarketCouponsMapper;
 import org.jeecg.modules.business.mapper.BusMarketCouponsUsedMapper;
 import org.jeecg.modules.business.service.IBusMarketCouponsUsedService;
+import org.jeecg.modules.system.entity.SysUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
@@ -46,6 +48,8 @@ public class BusMarketCouponsUsedServiceImpl extends ServiceImpl<BusMarketCoupon
     private BusMarketCouponsMapper busMarketCouponsMapper;
     @Autowired
     private RedisUtil redisUtil;
+    @Resource
+    private BusMemberCardServiceImpl busMemberCardService;
     /**
      * 生成16位数字+prefix
      * @param prefix
@@ -127,12 +131,16 @@ public class BusMarketCouponsUsedServiceImpl extends ServiceImpl<BusMarketCoupon
 //            for (int i = 0; i < dto.getMobiles().size(); i++) {
 //                int num = dto.getNum();
             //以防手机号相同用分组实现
-            Map<String, List<MobileDto>> map=  dto.getMobiles().stream().collect(Collectors.groupingBy(t->t.getValue()));
-            for (String key:map.keySet()) {
-                int num = dto.getNum()*map.get(key).size();
-                if (num> coupons.getKlqzs()) {
+            Map<String, List<MobileDto>> map = dto.getMobiles().stream().collect(Collectors.groupingBy(t -> t.getValue()));
+            for (String key : map.keySet()) {
+                int num = dto.getNum() * map.get(key).size();
+                if (num > coupons.getKlqzs()) {
                     throw new JeecgBootException("每人最多可领取" + coupons.getKlqzs());
                 }
+                LambdaQueryWrapper<BusMemberCard> queryWrapper3 = new LambdaQueryWrapper<>();
+                queryWrapper3.eq(BusMemberCard::getMobile, key);
+                //查询手机号是否是会员
+                BusMemberCard memeberCard = busMemberCardService.getOne(queryWrapper3);
                 while (num > 0) {
                     LambdaQueryWrapper<BusMarketCouponsUsed> queryWrapper2 = new LambdaQueryWrapper<>();
                     queryWrapper2.eq(BusMarketCouponsUsed::getCouponsId, dto.getCouponsId());
@@ -154,6 +162,10 @@ public class BusMarketCouponsUsedServiceImpl extends ServiceImpl<BusMarketCoupon
                     //这里到时候要根据会员表查询一下是否存在会员信息,现在没有会员表
 //                    model.setMobile(dto.getMobiles().get(i).getValue());
                     model.setMobile(key);
+                    if (memeberCard != null) {
+                        model.setUserName(memeberCard.getName());
+                        model.setUserid(memeberCard.getId());
+                    }
                     model.setGainTime(DateTime.now());
                     model.setStatus(CouponsStatusEnum.received.getKey());
                     index++;
@@ -175,7 +187,7 @@ public class BusMarketCouponsUsedServiceImpl extends ServiceImpl<BusMarketCoupon
         } catch (Exception ex) {
             message = "创建失败";
         } finally {
-            //删除redis缓存
+            //删除redis缓存,添加成功后也可不删除
             list.forEach(item -> {
                 String keyString = String.format("sys:cache:couponsused::%s", item.getId());
                 redisUtil.del(keyString);
@@ -184,4 +196,85 @@ public class BusMarketCouponsUsedServiceImpl extends ServiceImpl<BusMarketCoupon
         return message == "创建成功" ? Result.ok(message) : Result.error(message);
     }
 
+
+    /**
+     * 发放免房券给会员
+     * @param dto
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result gainCouponsUsedToMember(ProvideCouponsUsedDto dto) {
+        if (ObjectUtils.isEmpty(dto.getCouponsId())) return Result.error("免房券id不能为空");
+        if (dto.getNum() <= 0) return Result.error("每人发放张数不能小于1!");
+        if (dto.getMemberIds() == null || dto.getMemberIds().size() <= 0) return Result.error("会员不能为空!");
+        BusMarketCoupons coupons = busMarketCouponsMapper.selectById(dto.getCouponsId());
+        if (ObjectUtils.isEmpty(coupons)) {
+            return Result.error("免房券活动不存在");
+        }
+        if (dto.getNum() > coupons.getKlqzs()) {
+            return Result.error("每人最多可领取" + coupons.getKlqzs());
+        }
+        int totalNum = dto.getMemberIds().size() * dto.getNum();
+
+        LambdaQueryWrapper<BusMarketCouponsUsed> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(BusMarketCouponsUsed::getStatus, CouponsStatusEnum.notClaimed.getKey());
+        queryWrapper.eq(BusMarketCouponsUsed::getCouponsId, dto.getCouponsId());
+
+        Page<BusMarketCouponsUsed> page = new Page<BusMarketCouponsUsed>(1, totalNum);
+        IPage<BusMarketCouponsUsed> pageList = this.page(page, queryWrapper);
+        int count = pageList.getRecords().size();
+        if (totalNum > count) {
+            return Result.error("待领取数量" + count + ",不够发放");
+        }
+        List<BusMarketCouponsUsed> list = pageList.getRecords();
+        int index = 0;
+        String message = "创建成功";
+        try {
+            //以防会员相同用分组实现
+            Map<String, List<String>> map=  dto.getMemberIds().stream().collect(Collectors.groupingBy(t->t));
+            for (String key:map.keySet()) {
+                int num = dto.getNum()*map.get(key).size();
+                if (num> coupons.getKlqzs()) {
+                    throw new JeecgBootException("每人最多可领取" + coupons.getKlqzs());
+                }
+                BusMemberCard memeberCard=busMemberCardService.getById(key);
+                while (num > 0) {
+                    LambdaQueryWrapper<BusMarketCouponsUsed> queryWrapper2 = new LambdaQueryWrapper<>();
+                    queryWrapper2.eq(BusMarketCouponsUsed::getCouponsId, dto.getCouponsId());
+                    queryWrapper2.and(i -> i.eq(BusMarketCouponsUsed::getUserid, key).or().eq(BusMarketCouponsUsed::getMobile, memeberCard.getMobile()));
+                    Long gainCount = this.count(queryWrapper2);
+                    if (gainCount > coupons.getKlqzs()) {
+                        throw new JeecgBootException("每人限领数量" + coupons.getKlqzs());
+                    }
+                    BusMarketCouponsUsed model = list.get(index);
+                    String keyString = String.format("sys:cache:couponsused::%s", model.getId());
+                    if (redisUtil.hasKey(keyString)) {
+                        throw new JeecgBootException("该免房券已被领取,请勿同时操作该功能");
+                    } else {
+                        redisUtil.set(keyString, true);
+                    }
+                    model.setUserid(memeberCard.getId());
+                    model.setUserName(memeberCard.getName());
+                    model.setMobile(memeberCard.getMobile());
+                    model.setGainTime(DateTime.now());
+                    model.setStatus(CouponsStatusEnum.received.getKey());
+                    index++;
+                    num--;
+                }
+            }
+
+            this.updateBatchById(list);
+        } catch (JeecgBootException ex) {
+            message = ex.getMessage();
+        } catch (Exception ex) {
+            message = "创建失败";
+        } finally {
+            //删除redis缓存,添加成功后也可不删除
+            list.forEach(item -> {
+                String keyString = String.format("sys:cache:couponsused::%s", item.getId());
+                redisUtil.del(keyString);
+            });
+        }
+        return message == "创建成功" ? Result.ok(message) : Result.error(message);
+    }
 }

+ 85 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusMemberCardServiceImpl.java

@@ -0,0 +1,85 @@
+package org.jeecg.modules.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import org.apache.commons.lang3.ObjectUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.business.dto.UserGroupDto;
+import org.jeecg.modules.business.dto.UserLabelDto;
+import org.jeecg.modules.business.entity.*;
+import org.jeecg.modules.business.mapper.*;
+import org.jeecg.modules.business.service.IBusMemberCardService;
+import org.jeecg.modules.business.vo.MemberCardStatVo;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: bus_member_card
+ * @Author: jeecg-boot
+ * @Date:   2023-03-10
+ * @Version: V1.0
+ */
+@Service
+public class BusMemberCardServiceImpl extends ServiceImpl<BusMemberCardMapper, BusMemberCard> implements IBusMemberCardService {
+    @Resource
+    private BusMarketMemberGroupMapper busMarketMemberGroupMapper;
+    @Resource
+    private BusMarketMemberLableMapper busMarketMemberLableMapper;
+    @Resource
+    private BusMemberCardMapper busMemberCardMapper;
+    /**
+     * 设置用户分组
+     * @param dto
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result groupBatch(UserGroupDto dto) {
+        if (ObjectUtils.isEmpty(dto.getGroupId())) return Result.error("分组id不能为空");
+        if (dto.getIds() == null || dto.getIds().size() <= 0) return Result.error("会员不能为空!");
+        BusMarketMemberGroup group = busMarketMemberGroupMapper.selectById(dto.getGroupId());
+        if (ObjectUtils.isEmpty(group)) {
+            return Result.error("分组不存在");
+        }
+        dto.getIds().forEach(item -> {
+            LambdaUpdateWrapper<BusMemberCard> updateWrapper = new UpdateWrapper().lambda();
+            updateWrapper.set(BusMemberCard::getGroupId, dto.getGroupId());
+            updateWrapper.eq(BusMemberCard::getId, item);
+            this.update(updateWrapper);
+        });
+        return Result.ok("分组成功");
+    }
+
+    /**
+     * 设置用户分组
+     * @param dto
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Result lableBatch(UserLabelDto dto) {
+        if (ObjectUtils.isEmpty(dto.getLabelId())) return Result.error("标签id不能为空");
+        if (dto.getIds() == null || dto.getIds().size() <= 0) return Result.error("会员不能为空!");
+        BusMarketMemberLable lable = busMarketMemberLableMapper.selectById(dto.getLabelId());
+        if (ObjectUtils.isEmpty(lable)) {
+            return Result.error("标签不存在");
+        }
+        dto.getIds().forEach(item -> {
+            LambdaUpdateWrapper<BusMemberCard> updateWrapper = new UpdateWrapper().lambda();
+            updateWrapper.set(BusMemberCard::getLabelId, dto.getLabelId());
+            updateWrapper.eq(BusMemberCard::getId, item);
+            this.update(updateWrapper);
+        });
+        return Result.ok("标签成功");
+    }
+
+    /**
+     * 统计
+     * @return
+     */
+    public MemberCardStatVo stat(String hotelId) {
+        return busMemberCardMapper.stat(hotelId);
+    }
+}

+ 19 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusPrintTemplateServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.business.service.impl;
+
+import org.jeecg.modules.business.entity.BusPrintTemplate;
+import org.jeecg.modules.business.mapper.BusPrintTemplateMapper;
+import org.jeecg.modules.business.service.IBusPrintTemplateService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 打印模板
+ * @Author: jeecg-boot
+ * @Date:   2023-03-11
+ * @Version: V1.0
+ */
+@Service
+public class BusPrintTemplateServiceImpl extends ServiceImpl<BusPrintTemplateMapper, BusPrintTemplate> implements IBusPrintTemplateService {
+
+}

+ 24 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/MemberCardStatVo.java

@@ -0,0 +1,24 @@
+package org.jeecg.modules.business.vo;
+
+import lombok.Data;
+
+
+@Data
+public class MemberCardStatVo {
+    /**
+     * 会员总数
+     */
+    private Integer count;
+    /**
+     * 会员当天新增总数
+     */
+    private Integer dayCount;
+    /**
+     * 会员当天生日总数
+     */
+    private Integer birthdayCount;
+    /**
+     * 会员当月生日总数
+     */
+    private Integer monthBirthdayCount;
+}

+ 8 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CesGoodsDelDto.java

@@ -0,0 +1,8 @@
+package org.jeecg.modules.rooms.DTO;
+
+import lombok.Data;
+
+@Data
+public class CesGoodsDelDto {
+    private String idStr;
+}

+ 12 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CesGoodsDto.java

@@ -0,0 +1,12 @@
+package org.jeecg.modules.rooms.DTO;
+
+import lombok.Data;
+import org.jeecg.modules.rooms.entity.CesGoods;
+import org.jeecg.modules.rooms.entity.CesGoodsSpecs;
+
+import java.util.List;
+
+@Data
+public class CesGoodsDto  extends CesGoods {
+    List<CesGoodsSpecs> specsList;
+}

+ 11 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/DTO/CesGoodsSearchDto.java

@@ -0,0 +1,11 @@
+package org.jeecg.modules.rooms.DTO;
+
+import lombok.Data;
+import org.jeecg.common.api.dto.BasePage;
+
+@Data
+public class CesGoodsSearchDto  extends BasePage {
+    private String search;
+
+    private String hotelId;
+}

+ 13 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Vo/CesGoodsVo.java

@@ -0,0 +1,13 @@
+package org.jeecg.modules.rooms.Vo;
+
+import lombok.Data;
+import org.jeecg.modules.rooms.entity.CesGoods;
+
+@Data
+public class CesGoodsVo extends CesGoods {
+    private String hotelName;
+
+    private String typeName;
+
+    private String unitName;
+}

+ 149 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodsController.java

@@ -0,0 +1,149 @@
+package org.jeecg.modules.rooms.controller;
+
+
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.Enum.ResultCode;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.rooms.DTO.CesGoodsDelDto;
+import org.jeecg.modules.rooms.DTO.CesGoodsDto;
+import org.jeecg.modules.rooms.DTO.CesGoodsSearchDto;
+import org.jeecg.modules.rooms.DTO.CesGoodsUnitSearchDto;
+import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * <p>
+ * 商品表 前端控制器
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+@Controller
+@RequestMapping("/rooms/cesGoods")
+public class CesGoodsController {
+
+    @Resource
+    private CesGoodsServiceImpl goodsService;
+
+    /***
+     * 查询
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value="查询", notes="查询")
+    @GetMapping(value = "/list")
+    public Result list(CesGoodsSearchDto dto){
+        if(StringUtils.isBlank(dto.getHotelId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(dto.getPageNo().intValue() <= 0){
+            return Result.error("页数不能小于等于0");
+        }
+        if(dto.getPageSize().intValue() < 10){
+            return Result.error("分页条数不能小于10");
+        }
+        try{
+            return goodsService.fetchList(dto);
+        }catch (Exception e){
+            return Result.error(e.getMessage());
+        }
+    }
+
+
+    @ApiOperation(value="创建", notes="创建")
+    @PostMapping(value = "/create")
+    public Result create(CesGoodsDto dto){
+        if(StringUtils.isBlank(dto.getHotelId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getGoodType())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getGoodUnit())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getBarCode())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getName())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getBid().toString())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getSellingPrice().toString())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(dto.getPurchases().intValue() < 0){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(dto.getSalesVolume().intValue() < 0){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(dto.getInventory().intValue() < 0){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        try{
+            return goodsService.create(dto);
+        }catch (Exception e){
+            return Result.error(e.getMessage());
+        }
+    }
+
+
+    @ApiOperation(value="修改", notes="修改")
+    @PutMapping(value = "/modify")
+    public Result modify(@RequestBody CesGoodsDto dto){
+        if(StringUtils.isBlank(dto.getHotelId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        try{
+            return goodsService.modify(dto);
+        }catch (Exception e){
+            return Result.error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value="删除", notes="删除")
+    @DeleteMapping(value = "/delete")
+    public Result delete(String id,String hotelId){
+        if(StringUtils.isBlank(hotelId)){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(id)){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        try{
+            return goodsService.delete(id,hotelId);
+        }catch (Exception e){
+            return Result.error(e.getMessage());
+        }
+    }
+
+    @ApiOperation(value="删除", notes="删除")
+    @DeleteMapping(value = "/delBatch")
+    public Result delBatch(@RequestBody CesGoodsDelDto dto){
+        if(StringUtils.isBlank(dto.getIdStr())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        try{
+            List<String> ids = Stream.of(dto.getIdStr().split(",")).collect(Collectors.toList());
+            return goodsService.delBatch(ids);
+        }catch (Exception e){
+            return Result.error(e.getMessage());
+        }
+    }
+}
+

+ 216 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoods.java

@@ -0,0 +1,216 @@
+package org.jeecg.modules.rooms.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 商品表
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("ces_goods")
+public class CesGoods extends Model<CesGoods> {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    /**
+     * 酒店ID
+     */
+    private String hotelId;
+
+    /**
+     * 商品大图
+     */
+    private String cover;
+
+    /**
+     * 商品图片
+     */
+    private String images;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品口味IDS
+     */
+    private String foodTasteIds;
+
+    /**
+     * 加料IDs
+     */
+    private String reinforcedIds;
+
+    /**
+     * 是否捶打
+     */
+    private Boolean beat;
+
+    /**
+     * 是否记重
+     */
+    private Boolean weighDown;
+
+    /**
+     * 商品分类Id
+     */
+    private String goodType;
+
+    /**
+     * 商品单位
+     */
+    private String goodUnit;
+
+    /**
+     * 条码
+     */
+    private String barCode;
+
+    /**
+     * 进价
+     */
+    private BigDecimal bid;
+
+    /**
+     * 售价
+     */
+    private BigDecimal sellingPrice;
+
+    /**
+     * 进货量
+     */
+    private Integer purchases;
+
+    /**
+     * 销售量
+     */
+    private Integer salesVolume;
+
+    /**
+     * 库存量
+     */
+    private Integer inventory;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * app是否上架 0 否 1是
+     */
+    private Boolean appState;
+
+    /**
+     * 能否储值卡
+     */
+    private Boolean canStoreCard;
+
+    /**
+     * 能否积分支付
+     */
+    private Boolean canIntegralPay;
+
+    /**
+     * 积分价格
+     */
+    private BigDecimal integralPrice;
+
+    /**
+     * 描述
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @TableField("creatAt")
+    private LocalDateTime creatAt;
+
+    /**
+     * 修改时间
+     */
+    @TableField("updateAt")
+    private LocalDateTime updateAt;
+
+    /**
+     * 逻辑删除字段
+     */
+    private Boolean invalid;
+
+
+    public static final String ID = "id";
+
+    public static final String HOTEL_ID = "hotel_id";
+
+    public static final String COVER = "cover";
+
+    public static final String IMAGES = "images";
+
+    public static final String NAME = "name";
+
+    public static final String FOOD_TASTE_IDS = "food_taste_ids";
+
+    public static final String REINFORCED_IDS = "reinforced_ids";
+
+    public static final String BEAT = "beat";
+
+    public static final String WEIGH_DOWN = "weigh_down";
+
+    public static final String GOOD_TYPE = "good_type";
+
+    public static final String GOOD_UNIT = "good_unit";
+
+    public static final String BAR_CODE = "bar_code";
+
+    public static final String BID = "bid";
+
+    public static final String SELLING_PRICE = "selling_price";
+
+    public static final String PURCHASES = "purchases";
+
+    public static final String SALES_VOLUME = "sales_volume";
+
+    public static final String INVENTORY = "inventory";
+
+    public static final String SORT = "sort";
+
+    public static final String APP_STATE = "app_state";
+
+    public static final String CAN_STORE_CARD = "can_store_card";
+
+    public static final String CAN_INTEGRAL_PAY = "can_integral_pay";
+
+    public static final String INTEGRAL_PRICE = "integral_price";
+
+    public static final String REMARK = "remark";
+
+    public static final String CREATAT = "creatAt";
+
+    public static final String UPDATEAT = "updateAt";
+
+    public static final String INVALID = "invalid";
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 90 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoodsSpecs.java

@@ -0,0 +1,90 @@
+package org.jeecg.modules.rooms.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 商品规格存储表
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("ces_goods_specs")
+public class CesGoodsSpecs extends Model<CesGoodsSpecs> {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    /**
+     * 酒店ID
+     */
+    private String hotelId;
+
+    /**
+     * 商品ID
+     */
+    private String goodId;
+
+    /**
+     * 规格名称
+     */
+    private String name;
+
+    /**
+     * 价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 创建时间
+     */
+    @TableField("createAt")
+    private LocalDateTime createAt;
+
+    /**
+     * 修改时间
+     */
+    @TableField("updateAt")
+    private LocalDateTime updateAt;
+
+    /**
+     * 逻辑删除字段
+     */
+    private Boolean invalid;
+
+
+    public static final String ID = "id";
+
+    public static final String HOTEL_ID = "hotel_id";
+
+    public static final String GOOD_ID = "good_id";
+
+    public static final String NAME = "name";
+
+    public static final String PRICE = "price";
+
+    public static final String CREATEAT = "createAt";
+
+    public static final String UPDATEAT = "updateAt";
+
+    public static final String INVALID = "invalid";
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesGoodsMapper.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.rooms.mapper;
+
+import org.jeecg.modules.rooms.entity.CesGoods;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 商品表 Mapper 接口
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+public interface CesGoodsMapper extends BaseMapper<CesGoods> {
+
+}

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesGoodsSpecsMapper.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.rooms.mapper;
+
+import org.jeecg.modules.rooms.entity.CesGoodsSpecs;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 商品规格存储表 Mapper 接口
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+public interface CesGoodsSpecsMapper extends BaseMapper<CesGoodsSpecs> {
+
+}

+ 191 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsServiceImpl.java

@@ -0,0 +1,191 @@
+package org.jeecg.modules.rooms.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.CommonUtils;
+import org.jeecg.modules.business.entity.BusHotel;
+import org.jeecg.modules.business.service.impl.BusHotelServiceImpl;
+import org.jeecg.modules.rooms.DTO.CesGoodsDelDto;
+import org.jeecg.modules.rooms.DTO.CesGoodsDto;
+import org.jeecg.modules.rooms.DTO.CesGoodsSearchDto;
+import org.jeecg.modules.rooms.Vo.CesGoodsVo;
+import org.jeecg.modules.rooms.Vo.CesRoomLayoutVo;
+import org.jeecg.modules.rooms.entity.CesGoods;
+import org.jeecg.modules.rooms.entity.CesGoodsUnit;
+import org.jeecg.modules.rooms.entity.CesStockType;
+import org.jeecg.modules.rooms.mapper.CesGoodsMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 商品表 服务实现类
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+@Service
+public class CesGoodsServiceImpl extends ServiceImpl<CesGoodsMapper, CesGoods> implements IService<CesGoods> {
+    @Resource
+    private CesGoodsMapper goodsMapper;
+
+    @Resource
+    private BusHotelServiceImpl busHotelService;
+
+    @Resource
+    private CesStockTypeServiceImpl stockTypeService;
+
+    @Resource
+    private CesGoodsUnitServiceImpl goodsUnitService;
+
+
+    @Resource
+    private CesGoodsSpecsServiceImpl specsService;
+
+
+
+    /**
+     * 查询商品库存
+     * @param dto
+     * @return
+     */
+    public Result fetchList(CesGoodsSearchDto dto){
+        QueryWrapper<CesGoods> queryWrapper = new QueryWrapper<>();
+        if(!StringUtils.isBlank(dto.getSearch())){
+            String search = CommonUtils.escapeChar(dto.getSearch());
+            queryWrapper.like(CesGoods.BAR_CODE, search);
+            queryWrapper.like(CesGoods.NAME,search);
+        }
+        queryWrapper.eq(CesGoods.HOTEL_ID,dto.getHotelId());
+        queryWrapper.eq(CesGoods.INVALID,false);
+        queryWrapper.orderByDesc(CesGoods.CREATAT);
+
+        IPage<CesGoods> dataPage = goodsMapper.selectPage(new Page<>(dto.getPageNo().intValue(),dto .getPageSize().intValue()),queryWrapper);
+        List<CesGoods> result = dataPage.getRecords();
+        List<String> hotelIds = result.stream().map(v -> v.getHotelId()).collect(Collectors.toList());
+        List<BusHotel> hotels = busHotelService.findHotelsByIds(hotelIds);
+        List<String> typeIds = result.stream().map(v -> v.getGoodType()).collect(Collectors.toList());
+        List<CesStockType> typeList = stockTypeService.fetchByIds(typeIds);
+        List<String> unitIds = result.stream().map(v -> v.getGoodUnit()).collect(Collectors.toList());
+        List<CesGoodsUnit> unitList =  goodsUnitService.fetchByIds(unitIds);
+        List<CesGoodsVo> voList = new ArrayList<>();
+        result.forEach( v -> {
+            CesGoodsVo vo = new CesGoodsVo();
+            BeanUtil.copyProperties(v,vo);
+            Optional<BusHotel> busHotelOptional = hotels.stream().filter(c -> c.getId().equals(v.getHotelId())).findFirst();
+            if(busHotelOptional.isPresent()){
+                vo.setHotelName(busHotelOptional.get().getName());
+            }
+            Optional<CesStockType> typeOptional = typeList.stream().filter(c -> c.getId().equals(v.getGoodType())).findFirst();
+            if(typeOptional.isPresent()){
+                vo.setTypeName(typeOptional.get().getName());
+            }
+            Optional<CesGoodsUnit> unitOptional = unitList.stream().filter(c -> c.getId().equals(v.getGoodUnit())).findFirst();
+            if(unitOptional.isPresent()){
+                vo.setUnitName(unitOptional.get().getName());
+            }
+            voList.add(vo);
+        });
+        Map<String,Object> map = new HashedMap();
+        map.put("records",voList);
+        map.put("total",dataPage.getTotal());
+        return Result.OK(map);
+    }
+
+
+    /**
+     * 创建商品
+     * @param dto
+     * @return
+     */
+    public Result create(CesGoodsDto dto){
+        //不能有相同条码的数据
+        QueryWrapper<CesGoods> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(CesGoods.BAR_CODE,dto.getBarCode());
+        queryWrapper.eq(CesGoods.INVALID,false);
+        queryWrapper.eq(CesGoods.HOTEL_ID,dto.getHotelId());
+        //查询
+        CesGoods exitGoods = goodsMapper.selectOne(queryWrapper);
+        if(!ObjectUtils.isEmpty(exitGoods)) return Result.error("该条码已有!");
+
+        CesGoods goods = new CesGoods();
+        BeanUtil.copyProperties(dto,goods);
+        goods.setCreatAt(LocalDateTime.now());
+        goods.setUpdateAt(LocalDateTime.now());
+        goodsMapper.insert(goods);
+        return Result.OK("保存成功!");
+    }
+
+
+    /**
+     * 修改
+     * @param dto
+     * @return
+     */
+    public Result modify(CesGoodsDto dto){
+        CesGoods goods = goodsMapper.selectOne(Wrappers.<CesGoods>lambdaQuery().eq(CesGoods::getId,dto.getId()).eq(CesGoods::getInvalid,false));
+        if(ObjectUtils.isEmpty(goods)) return Result.error("商品数据未找到!");
+        //不能有相同条码的数据
+        QueryWrapper<CesGoods> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(CesGoods.BAR_CODE,dto.getBarCode());
+        queryWrapper.eq(CesGoods.INVALID,false);
+        queryWrapper.eq(CesGoods.HOTEL_ID,dto.getHotelId());
+        queryWrapper.ne(CesGoods.ID,dto.getId());
+        //查询
+        CesGoods exitGoods = goodsMapper.selectOne(queryWrapper);
+        if(!ObjectUtils.isEmpty(exitGoods)) return Result.error("该条码已有!");
+
+        BeanUtil.copyProperties(dto,goods,CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
+        goods.setUpdateAt(LocalDateTime.now());
+        goodsMapper.updateById(goods);
+        return Result.ok("修改成功!");
+    }
+
+
+    public Result delete(String id,String hotelId){
+        CesGoods goods = goodsMapper.selectOne(Wrappers.<CesGoods>lambdaQuery().eq(CesGoods::getId,id).eq(CesGoods::getHotelId,hotelId).eq(CesGoods::getInvalid,false));
+        if(ObjectUtils.isEmpty(goods)) return Result.error("商品数据未找到!");
+        goods.setUpdateAt(LocalDateTime.now());
+        goods.setInvalid(true);
+        goodsMapper.updateById(goods);
+        return Result.ok("删除成功!");
+    }
+
+    public Result delBatch(List<String> ids){
+        if(CollectionUtil.isEmpty(ids)) return Result.ok("删除成功!");
+        List<CesGoods> goods = goodsMapper.selectBatchIds(ids);
+        goods.forEach(good -> {
+            good.setUpdateAt(LocalDateTime.now());
+            good.setInvalid(true);
+        });
+        updateBatchById(goods);
+        return Result.ok("删除成功!");
+    }
+
+
+
+
+
+
+
+
+}

+ 26 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsSpecsServiceImpl.java

@@ -0,0 +1,26 @@
+package org.jeecg.modules.rooms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.rooms.entity.CesGoodsSpecs;
+import org.jeecg.modules.rooms.mapper.CesGoodsSpecsMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 商品规格存储表 服务实现类
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-13
+ */
+@Service
+public class CesGoodsSpecsServiceImpl extends ServiceImpl<CesGoodsSpecsMapper, CesGoodsSpecs> implements IService<CesGoodsSpecs> {
+
+    public boolean saveBatchSpecs(List<CesGoodsSpecs> specsList){
+
+        return false;
+    }
+}

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsUnitServiceImpl.java

@@ -17,11 +17,13 @@ import org.jeecg.common.util.CommonUtils;
 import org.jeecg.modules.rooms.DTO.CesGoodsUnitDto;
 import org.jeecg.modules.rooms.DTO.CesGoodsUnitSearchDto;
 import org.jeecg.modules.rooms.entity.CesGoodsUnit;
+import org.jeecg.modules.rooms.entity.CesStockType;
 import org.jeecg.modules.rooms.mapper.CesGoodsUnitMapper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -126,5 +128,17 @@ public class CesGoodsUnitServiceImpl extends ServiceImpl<CesGoodsUnitMapper, Ces
         return Result.OK("删除成功!");
     }
 
+    /**
+     * 根据IDS 查询单位数据
+     * @param ids
+     * @return
+     */
+    public List<CesGoodsUnit> fetchByIds(List<String> ids){
+        if(CollectionUtil.isEmpty(ids)) return new ArrayList<>();
+        List<CesGoodsUnit> list = cesGoodsUnitMapper.selectList(Wrappers.<CesGoodsUnit>lambdaQuery().eq(CesGoodsUnit::getInvalid,false).in(CesGoodsUnit::getId,ids));
+
+        return  list;
+    }
+
 }
 

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesStockTypeServiceImpl.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.rooms.service;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.lang.tree.TreeNode;
 import cn.hutool.core.lang.tree.TreeUtil;
@@ -20,6 +21,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -128,6 +130,18 @@ public class CesStockTypeServiceImpl extends ServiceImpl<CesStockTypeMapper, Ces
     }
 
 
+    /**
+     * 根据IDS 查询分类数据
+     * @param ids
+     * @return
+     */
+    public List<CesStockType> fetchByIds(List<String> ids){
+        if(CollectionUtil.isEmpty(ids)) return new ArrayList<>();
+        List<CesStockType> list = stockTypeMapper.selectList(Wrappers.<CesStockType>lambdaQuery().eq(CesStockType::getInvalid,false).in(CesStockType::getId,ids));
+
+        return  list;
+    }
+