Explorar el Código

添加库存和商品销售报表。修改pos结账,房间消费扣减库存问题。修改入住时的会员扣费问题

许智捷 hace 2 años
padre
commit
c85eec2887
Se han modificado 36 ficheros con 1255 adiciones y 629 borrados
  1. 35 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusHousePriceSchemeLayoutController.java
  2. 27 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusMarketAgreementUnitController.java
  3. 45 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusOrderFeeController.java
  4. 0 25
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusRoomBookingOrdersController.java
  5. 3 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusSchemeLayoutDailyPriceController.java
  6. 6 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusHousePriceSchemeLayout.java
  7. 6 4
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMarketAgreementUnit.java
  8. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusOrderFee.java
  9. 9 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusRoomsLivingOrder.java
  10. 5 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IBusSchemeLayoutDailyPriceService.java
  11. 59 18
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusOrderFeeServiceImpl.java
  12. 241 170
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusRoomBookingOrdersServiceImpl.java
  13. 98 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusSchemeLayoutDailyPriceServiceImpl.java
  14. 57 2
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/controller/FwLivingJxController.java
  15. 76 45
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/controller/KcDepositoryInGoodsController.java
  16. 2 174
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/controller/KcStockController.java
  17. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcDepository.java
  18. 18 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcDepositoryInGoods.java
  19. 3 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcStock.java
  20. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcStockDetail.java
  21. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcSupplier.java
  22. 10 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/mapper/KcDepositoryInGoodsMapper.java
  23. 111 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/mapper/xml/KcDepositoryInGoodsMapper.xml
  24. 13 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/IKcDepositoryInGoodsService.java
  25. 3 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/IKcStockService.java
  26. 78 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/impl/KcDepositoryInGoodsServiceImpl.java
  27. 221 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/impl/KcStockServiceImpl.java
  28. 39 51
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/order/controller/CesOrderLeaseGoodsController.java
  29. 4 3
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/controller/PosOrderGoodsController.java
  30. 22 42
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/controller/PosOrderGoodsPaymentController.java
  31. 14 40
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/controller/PosSellClearGoodsController.java
  32. 1 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/entity/PosThali.java
  33. 20 7
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/service/impl/PosOrderGoodsServiceImpl.java
  34. 4 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/LivingRoomOrderFeeJob.java
  35. 0 9
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodsController.java
  36. 17 15
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsServiceImpl.java

+ 35 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusHousePriceSchemeLayoutController.java

@@ -27,11 +27,9 @@ 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.BusHousePriceSchemeLayout;
-import org.jeecg.modules.business.entity.BusNightTrial;
-import org.jeecg.modules.business.entity.BusSalesPerson;
-import org.jeecg.modules.business.entity.BusSalesPersonPost;
+import org.jeecg.modules.business.entity.*;
 import org.jeecg.modules.business.service.IBusHousePriceSchemeLayoutService;
+import org.jeecg.modules.business.service.IBusSchemeLayoutDailyPriceService;
 import org.jeecg.modules.rooms.entity.CesRoomLayout;
 import org.jeecg.modules.rooms.service.CesRoomLayoutServiceImpl;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
@@ -65,6 +63,8 @@ public class BusHousePriceSchemeLayoutController extends JeecgController<BusHous
 	@Autowired
 	private IBusHousePriceSchemeLayoutService busHousePriceSchemeLayoutService;
 
+	@Resource
+	IBusSchemeLayoutDailyPriceService schemeLayoutDailyPriceService;
 	 @Resource
 	 private CesRoomLayoutServiceImpl cesRoomLayoutService;
 	/**
@@ -97,6 +97,37 @@ public class BusHousePriceSchemeLayoutController extends JeecgController<BusHous
 	}
 
 	 /**
+	  * 分页列表查询
+	  *
+	  * @param busHousePriceSchemeLayout
+	  * @param pageNo
+	  * @param pageSize
+	  * @param req
+	  * @return
+	  */
+	 //@AutoLog(value = "房价方案-房型关联表-分页列表查询")
+	 @ApiOperation(value="房价方案-房型关联表-分页列表查询", notes="房价方案-房型关联表-分页列表查询")
+	 @GetMapping(value = "/layoutPricePage")
+	 public Result<IPage<BusHousePriceSchemeLayout>> layoutPricePage(BusHousePriceSchemeLayout busHousePriceSchemeLayout,
+																   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																   HttpServletRequest req) {
+		 QueryWrapper<BusHousePriceSchemeLayout> queryWrapper = QueryGenerator.initQueryWrapper(busHousePriceSchemeLayout, req.getParameterMap());
+		 Page<BusHousePriceSchemeLayout> page = new Page<BusHousePriceSchemeLayout>(pageNo, pageSize);
+		 IPage<BusHousePriceSchemeLayout> pageList = busHousePriceSchemeLayoutService.page(page, queryWrapper);
+		 pageList.getRecords().forEach(item->{
+			 CesRoomLayout layout = cesRoomLayoutService.getById(item.getLayoutId());
+			 if (layout != null) {
+				 item.setLayoutName(layout.getName());
+				 item.setLayoutPrice(layout.getMarketPrice());
+				 List<BusSchemeLayoutDailyPrice> dailyPrice = schemeLayoutDailyPriceService.getDailyPrice(item.getId(), null);
+				 item.setSchemeLayoutDailyPriceList(dailyPrice);
+			 }
+		 });
+		 return Result.OK(pageList);
+	 }
+
+	 /**
 	  * 列表查询
 	  *
 	  * @param busHousePriceSchemeLayout

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

@@ -3,11 +3,14 @@ package org.jeecg.modules.business.controller;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.apache.commons.lang.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
@@ -37,6 +40,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.jeecg.common.aspect.annotation.AutoLog;
 
+import static kotlin.reflect.jvm.internal.impl.builtins.StandardNames.FqNames.list;
+
 /**
  * @Description: 协议单位
  * @Author: jeecg-boot
@@ -353,6 +358,28 @@ public class BusMarketAgreementUnitController extends JeecgController<BusMarketA
 		 return Result.OK(list);
 	 }
 
+	/**
+	 *
+	 */
+	@ApiOperation(value="所有协议单位-包含最新的方案", notes="所有协议单位-包含最新的方案")
+	@GetMapping(value = "/getAgreementUnitsDetail")
+	public Result<List<BusMarketAgreementUnit>> getAgreementUnitsDetail (BusMarketAgreementUnit busMarketAgreementUnit) {
+		QueryWrapper<BusMarketAgreementUnit> queryWrapper = new QueryWrapper<>();
+		LoginUser user = TokenUtils.getAuthUser();
+		if(user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")){
+			queryWrapper.eq("tenant_id",user.getRelTenantIds());
+		}
+		queryWrapper.eq("del_flag",0);
+		List<BusMarketAgreementUnit> agreementUnitList = busAgreementUnitService.list(queryWrapper);
+		agreementUnitList.forEach(e -> {
+			BusMarketAgreementCustomer firstAgreementCustomer = busMarketAgreementCustomerService.getOne(Wrappers
+					.<BusMarketAgreementCustomer>lambdaQuery().eq(BusMarketAgreementCustomer::getAgreementId, e.getId())
+					.orderByDesc(BusMarketAgreementCustomer::getCreateTime).last("LIMIT 1"));
+			e.setMarketAgreementCustomer(firstAgreementCustomer);
+		});
+		return Result.OK(agreementUnitList);
+	}
+
     /**
     * 导出excel
     *

+ 45 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/BusOrderFeeController.java

@@ -2,18 +2,23 @@ package org.jeecg.modules.business.controller;
 
 
 import java.util.*;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.business.entity.BusOrderFee;
 import org.jeecg.modules.business.enums.FeeType;
@@ -125,6 +130,27 @@ public class BusOrderFeeController extends JeecgController<BusOrderFee, IBusOrde
 	 @Transactional(rollbackFor = Exception.class)
 	 @PostMapping(value = "/refundBatch")
 	 public Result<Boolean> refundBatch(@RequestBody List<BusOrderFee> busOrderFeeList) {
+		 List<String> feeIds = busOrderFeeList.stream().map(BusOrderFee::getId).collect(Collectors.toList());
+		 if (feeIds.isEmpty()){
+			 return Result.OK();
+		 }
+		 // 被退款的收费订单
+		 List<BusOrderFee> originalFees = busOrderFeeService.listByIds(feeIds);
+		 if (originalFees.size() != feeIds.size()){
+			 throw new JeecgBootException("未找到收款单");
+		 }
+		 // 找出已结算的收款单对应的消费单id
+		 List<String> consumeFeeIds = originalFees.stream().filter(e -> ObjectUtil.equals(e.getPreferentialStatus(), 2))
+				 .map(BusOrderFee::getConsumeFeeId).collect(Collectors.toList());
+		 // 找出已结算的收款单id
+		 List<String> collectionFeeIds = originalFees.stream().filter(e -> ObjectUtil.equals(e.getPreferentialStatus(), 2))
+				 .map(BusOrderFee::getId).collect(Collectors.toList());
+		 // 将结算的订单改为未结算
+		 consumeFeeIds.addAll(collectionFeeIds);
+		 LambdaUpdateWrapper<BusOrderFee> wrapper = new LambdaUpdateWrapper<>();
+		 wrapper.set(BusOrderFee::getPreferentialStatus,1);
+		 wrapper.in(BusOrderFee::getId, consumeFeeIds);
+		 busOrderFeeService.update(wrapper);
 		 return Result.OK(busOrderFeeService.refundBatch(busOrderFeeList));
 	 }
 
@@ -190,7 +216,6 @@ public class BusOrderFeeController extends JeecgController<BusOrderFee, IBusOrde
 	 public Result<List<BusOrderFee>> refundList(@RequestBody List<String> livingOrderIds) {
 		 LambdaQueryWrapper<BusOrderFee> qw = new LambdaQueryWrapper<>();
 		 qw.eq(BusOrderFee::getFeeType, FeeType.COLLECTION.getKey());
-		 qw.eq(BusOrderFee::getPreferentialStatus, 1);
 		 qw.in(CollUtil.isNotEmpty(livingOrderIds), BusOrderFee::getLivingOrderId, livingOrderIds);
 		 List<BusOrderFee> orderFees = busOrderFeeService.list(qw);
 		 return Result.OK(orderFees);
@@ -198,6 +223,25 @@ public class BusOrderFeeController extends JeecgController<BusOrderFee, IBusOrde
 
 
 	 /**
+	  *  编辑
+	  *
+	  * @param
+	  * @return
+	  */
+	 @AutoLog(value = "bus_order_fee-冲账退款时根据消费单查收款单")
+	 @ApiOperation(value="bus_order_fee-冲账退款时根据消费单查收款单", notes="bus_order_fee-冲账退款时根据消费单查收款单")
+	 @PostMapping(value = "/refundsByFeeId")
+	 public Result<List<BusOrderFee>> refundsByFeeId(@RequestBody List<String> feeIds) {
+		 LambdaQueryWrapper<BusOrderFee> qw = new LambdaQueryWrapper<>();
+		 qw.eq(BusOrderFee::getFeeType, FeeType.COLLECTION.getKey());
+		 qw.eq(BusOrderFee::getPreferentialStatus, 1);
+		 qw.in(CollUtil.isNotEmpty(feeIds), BusOrderFee::getConsumeFeeId, feeIds);
+		 List<BusOrderFee> orderFees = busOrderFeeService.list(qw);
+		 return Result.OK(orderFees);
+	 }
+
+
+	 /**
 	 *   通过id删除
 	 *
 	 * @param id

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

@@ -1,26 +1,18 @@
 package org.jeecg.modules.business.controller;
 
-import java.math.BigDecimal;
 import java.util.*;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.business.dto.BatchOrderSavaDto;
 import org.jeecg.modules.business.dto.BookingOrderSaveDto;
 import org.jeecg.modules.business.dto.UpdateOrderInfoDto;
 import org.jeecg.modules.business.dto.UpdateOrderPriceDto;
 import org.jeecg.modules.business.entity.*;
-import org.jeecg.modules.business.service.IBusBookingRoomsService;
 import org.jeecg.modules.business.service.IBusRoomBookingOrdersService;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -29,29 +21,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
 
 import org.jeecg.modules.business.service.IBusRoomsLivingOrderService;
-import org.jeecg.modules.business.service.impl.BusBookingRoomsServiceImpl;
-import org.jeecg.modules.business.service.impl.BusOrderFeeServiceImpl;
 import org.jeecg.modules.business.vo.*;
 import org.jeecg.modules.rooms.Vo.LivingContinueVo;
-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.format.annotation.DateTimeFormat;
 import org.springframework.transaction.annotation.Transactional;
 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
@@ -65,9 +43,6 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 public class BusRoomBookingOrdersController extends JeecgController<BusRoomBookingOrders, IBusRoomBookingOrdersService> {
 
 	@Resource
-	private IBusRoomBookingOrdersService busRoomBookingOrdersService;
-
-	@Resource
 	private IBusRoomsLivingOrderService roomsLivingOrderService;
 	/**
 	 * 分页列表查询

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

@@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
@@ -47,6 +48,7 @@ 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.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartHttpServletRequest;
@@ -189,6 +191,7 @@ public class BusSchemeLayoutDailyPriceController extends JeecgController<BusSche
 		 return Result.OK(newList);
 	 }
 
+
 	 /**
 	  * 列表查询
 	  *

+ 6 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusHousePriceSchemeLayout.java

@@ -5,10 +5,9 @@ import java.io.UnsupportedEncodingException;
 import java.sql.Time;
 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 java.util.List;
+
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.apache.poi.hpsf.Decimal;
@@ -100,4 +99,7 @@ public class BusHousePriceSchemeLayout implements Serializable {
 
     private transient String layoutName;
     private transient BigDecimal layoutPrice;
+
+    @TableField(exist = false)
+    private List<BusSchemeLayoutDailyPrice> schemeLayoutDailyPriceList;
 }

+ 6 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusMarketAgreementUnit.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;
@@ -209,4 +207,8 @@ public class BusMarketAgreementUnit implements Serializable {
     @Excel(name = "离店时间", width = 15)
     @ApiModelProperty(value = "离店时间")
     private String leaveTime;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "关联的协议")
+    private BusMarketAgreementCustomer marketAgreementCustomer;
 }

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

@@ -155,7 +155,12 @@ public class BusOrderFee implements Serializable {
     @TableField(exist = false)
     @ApiModelProperty(value = "关联商品信息")
     private BusOrderFeeGoodsVo feeGoodVo;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "原价")
     private BigDecimal originalMoney;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "数量")
+    private Integer num;
 }

+ 9 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/BusRoomsLivingOrder.java

@@ -218,10 +218,8 @@ public class BusRoomsLivingOrder implements Serializable {
     @ApiModelProperty(value = "第三方用戶ID")
     private String thirdLoginUserId;
 
-    /**是否主房*/
     @ApiModelProperty(value = "免打扰")
     private Boolean ddisturb;
-    /**是否主房*/
 
     @ApiModelProperty(value = "免查询")
     private Boolean dquery;
@@ -229,12 +227,21 @@ public class BusRoomsLivingOrder implements Serializable {
     @ApiModelProperty(value = "保密房")
     private Boolean secrecy;
 
+    @ApiModelProperty(value = "续住")
+    private Boolean isStayOver;
+
+    @ApiModelProperty(value = "换房")
+    private Boolean isChangeRoom;
+
     @TableField(exist = false)
     private BigDecimal xiaoFei;
 
     @TableField(exist = false)
     private BigDecimal shouKuan;
 
+    @TableField(exist = false)
+    private BigDecimal deposit;
+
     // 已住几晚
     @TableField(exist = false)
     private Integer liveDayCount;

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

@@ -3,6 +3,9 @@ package org.jeecg.modules.business.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.business.entity.BusSchemeLayoutDailyPrice;
 
+import java.util.Date;
+import java.util.List;
+
 /**
  * @Description: 房价方案-每日房价表
  * @Author: jeecg-boot
@@ -11,4 +14,6 @@ import org.jeecg.modules.business.entity.BusSchemeLayoutDailyPrice;
  */
 public interface IBusSchemeLayoutDailyPriceService extends IService<BusSchemeLayoutDailyPrice> {
 
+    List<BusSchemeLayoutDailyPrice> getDailyPrice(String schemeLayoutId, Date realDate);
+
 }

+ 59 - 18
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusOrderFeeServiceImpl.java

@@ -3,6 +3,7 @@ package org.jeecg.modules.business.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -20,6 +21,9 @@ import org.jeecg.modules.business.mapper.BusOrderFeeMapper;
 import org.jeecg.modules.business.service.*;
 import org.jeecg.modules.business.vo.BusOrderFeeGoodsVo;
 import org.jeecg.modules.business.vo.RoomOrderFeeVo;
+import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
+import org.jeecg.modules.rooms.entity.CesGoods;
+import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -48,6 +52,8 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
     @Resource
     IBusOrderFeeGoodsService orderFeeGoodsService;
     @Resource
+    CesGoodsServiceImpl goodsService;
+    @Resource
     BusMarketMarketAgreementUnitServiceImpl marketAgreementUnitService;
     @Resource
     IBusAgreementOrderFeeService agreementOrderFeeService;
@@ -66,11 +72,14 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
         busOrderFeeList.forEach(orderFee ->{
             Optional<BusOrderFee> findFee = findBusOrderFees.stream().filter(fee -> fee.getId().equals(orderFee.getId())).findFirst();
             findFee.ifPresent(e -> {
+                if (ObjectUtil.equals(e.getPreferentialStatus(),2)){
+                    throw new JeecgBootException("结算的账单不能冲账,请先退款再冲账");
+                }
                 // 冲账单
                 BusOrderFee newOrderFee = BeanUtil.copyProperties(e, BusOrderFee.class);
                 newOrderFee.setReturnFeeId(e.getId());
                 newOrderFee.setReturnItem(true);
-                newOrderFee.setId(null);
+                newOrderFee.setId(String.valueOf(IdWorker.getId()));
                 newOrderFee.setCreateTime(new Date());
                 newOrderFee.setSubjectType(FeeSubjectType.TUI_DAN_JIE_ZHANG_SHOU_KUAN.getKey());
                 newOrderFee.setPayTime(new Date());
@@ -78,21 +87,35 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
                 newOrderFee.setRemark(orderFee.getRemark());
                 // orderFee.getMoney()前端需要传入为负数的差价
                 newOrderFee.setMoney(orderFee.getMoney());
+                // 冲账退款分开操作,不需要了
                 // 冲账时如果勾选退款,将冲账单设置为已结算,生成未结算且为负的收款单
-                if (orderFee.getFeeType().equals(FeeType.CONSUME.getKey()) && orderFee.getReturnItem()){
-                    if (orderFee.getPreferentialStatus() == 1){
-                        throw new JeecgBootException("未结账的订单不能退款");
+//                if (orderFee.getFeeType().equals(FeeType.CONSUME.getKey()) && orderFee.getReturnItem()){
+//                    if (orderFee.getPreferentialStatus() == 1){
+//                        throw new JeecgBootException("未结账的订单不能退款");
+//                    }
+//                    newOrderFee.setPreferentialStatus(2);
+//                    // TODO: 2023/10/12 负金额的收款单
+//                    BusOrderFee retrunOrderFee = BeanUtil.copyProperties(newOrderFee, BusOrderFee.class);;
+//                    retrunOrderFee.setConsumeFeeId(orderFee.getId());
+//                    retrunOrderFee.setRemark("冲账产生退款单");
+//                    retrunOrderFee.setPreferentialStatus(2);
+//                    retrunOrderFee.setFeeType(2);
+//                    retrunOrderFee.setReturnItem(null);
+//                    retrunOrderFee.setReturnFeeId(null);
+//                    orderFeeList.add(retrunOrderFee);
+//                }
+                // 商品冲账
+                if (FeeSubjectType.SHANG_PIN.getKey().equals(e.getSubjectType())){
+                    List<BusOrderFeeGoods> orderFeeGoods = orderFeeGoodsService.list(Wrappers.<BusOrderFeeGoods>lambdaQuery().eq(BusOrderFeeGoods::getOrderFeeId, e.getId()));
+                    if (orderFeeGoods.size() != 1){
+                        throw new JeecgBootException("查找费用商品详情失败");
                     }
-                    newOrderFee.setPreferentialStatus(2);
-                    // TODO: 2023/10/12 负金额的收款单
-                    BusOrderFee retrunOrderFee = BeanUtil.copyProperties(newOrderFee, BusOrderFee.class);;
-                    retrunOrderFee.setConsumeFeeId(orderFee.getId());
-                    retrunOrderFee.setRemark("冲账产生退款单");
-                    retrunOrderFee.setPreferentialStatus(2);
-                    retrunOrderFee.setFeeType(2);
-                    retrunOrderFee.setReturnItem(null);
-                    retrunOrderFee.setReturnFeeId(null);
-                    orderFeeList.add(retrunOrderFee);
+                    // 前端需要传入需要冲掉的数量
+                    orderFeeGoods.get(0).setNum(orderFee.getNum());
+                    orderFeeGoods.get(0).setOrderFeeId(newOrderFee.getId());
+                    // 添加仓库销售退货,修改商品库存
+                    KcDepositoryInGoods depositoryInGood = addDepositoryInGood(orderFeeGoods.get(0));
+                    goodsService.saleReturn(depositoryInGood);
                 }
                 orderFeeList.add(newOrderFee);
             });
@@ -101,6 +124,16 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
         return saveBatch(orderFeeList);
     }
 
+    public KcDepositoryInGoods addDepositoryInGood(BusOrderFeeGoods feeGood){
+        KcDepositoryInGoods depositoryInGoods = new KcDepositoryInGoods();
+        depositoryInGoods.setGoodsId(feeGood.getGoodsId());
+        depositoryInGoods.setNum(feeGood.getNum());
+        depositoryInGoods.setFeeId(feeGood.getOrderFeeId());
+        depositoryInGoods.setHotelId(feeGood.getHotelId());
+        depositoryInGoods.setCreateTime(new Date());
+        return depositoryInGoods;
+    }
+
     @Override
     public Boolean refundBatch(List<BusOrderFee> busOrderFeeList) {
         List<BusRoomPayType> payTypeList = payTypeService.list();
@@ -171,12 +204,17 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
 
     @Override
     public Boolean collectionBatch(List<BusOrderFee> busOrderFeeList, String hotelId) {
+        if (CollUtil.isEmpty(busOrderFeeList)){
+            return true;
+        }
         List<BusRoomPayType> payTypeList = payTypeService.list();
         payTypeList.stream().filter(e -> "会员卡".equals(e.getName())).findFirst().ifPresent(type -> {
             //找出会员支付的账单,将会员支付的账单中的会员id去重
-            List<BusOrderFee> MemberPayFee = busOrderFeeList.stream().filter(fee -> type.getId().equals(fee.getPayType())).collect(Collectors.toList());
-            List<String> cardIds = MemberPayFee.stream().map(BusOrderFee::getVipCardId).filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList());
-//            List<BusMemberCard> busMemberCards;
+            List<BusOrderFee> memberPayFee = busOrderFeeList.stream().filter(fee -> type.getId().equals(fee.getPayType())).collect(Collectors.toList());
+            List<String> cardIds = memberPayFee.stream().map(BusOrderFee::getVipCardId).filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList());
+            if (memberPayFee.size() != cardIds.size()){
+                throw new JeecgBootException("会员卡支付的账单需要标识会员卡");
+            }
             if (CollUtil.isNotEmpty(cardIds)) {
                 List<BusMemberCard> busMemberCards = memberCardService.listByIds(cardIds);
                 if(CollUtil.isEmpty(busMemberCards) || cardIds.size() != busMemberCards.size()) {
@@ -184,7 +222,7 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
                 }
                 List<BusMemberBalanceLog> busMemberBalanceLogs = new ArrayList<>();
                 // 循环会员支付的账单,修改对应的会员卡余额,添加会员支付日志
-                MemberPayFee.forEach(fee -> {
+                memberPayFee.forEach(fee -> {
                     fee.setId(String.valueOf(IdWorker.getId()));
                     if (StrUtil.isEmpty(fee.getVipCardId())){
                         throw new JeecgBootException("支付方式为会员但没有会员id");
@@ -205,6 +243,9 @@ public class BusOrderFeeServiceImpl extends ServiceImpl<BusOrderFeeMapper, BusOr
                     .filter(fee -> type.getId().equals(fee.getPayType())).collect(Collectors.toList());
             List<String> agreementUnitIds = agreementUnitPayFee.stream().map(BusOrderFee::getAgreementUnitId)
                     .filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList());
+            if (agreementUnitPayFee.size() != agreementUnitIds.size()){
+                throw new JeecgBootException("会员卡支付的账单需要标识会员卡");
+            }
             if (CollUtil.isNotEmpty(agreementUnitIds)){
                 List<BusMarketAgreementUnit> marketAgreementUnitList = marketAgreementUnitService.listByIds(agreementUnitIds);
                 List<BusAgreementOrderFee> agreementOrderFeeList = new ArrayList<>();

+ 241 - 170
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/BusRoomBookingOrdersServiceImpl.java

@@ -36,6 +36,8 @@ import org.jeecg.modules.fw.service.IFwRoomLockService;
 import org.jeecg.modules.fw.service.IFwRoomRepairService;
 import org.jeecg.modules.fw.vo.FwRoomLockVo;
 import org.jeecg.modules.fw.vo.FwRoomRepairVo;
+import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
+import org.jeecg.modules.kc.service.IKcDepositoryInGoodsService;
 import org.jeecg.modules.rooms.Enum.RoomStatusEnum;
 import org.jeecg.modules.rooms.Enum.TimeOutRuleEnum;
 import org.jeecg.modules.rooms.Vo.BookingRealtimeVo;
@@ -159,6 +161,9 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
+    @Resource
+    private IKcDepositoryInGoodsService depositoryInGoodsService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String bookingOrderSave(BookingOrderSaveDto item, Boolean isTeam,Boolean isLiving,String hotelId) {
@@ -1138,16 +1143,32 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         if(ObjectUtils.isEmpty(cesAllDayPriceRule)) {
             throw new JeecgBootException("未找到超时收费规则");
         }
-
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(livingOrder.getDueOutTime());
-        calendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
+        Calendar calendar = getRemindTime(livingOrder, cesAllDayPriceRule, livingRoomOrderInfo.getBookingType());
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        System.out.println(format.format(calendar.getTime()));
         redisTemplate.opsForZSet().add("overTimerOrder", livingOrder.getId(), calendar.getTimeInMillis());
         roomsService.getReserveRoom();
         //</editor-fold>
         return livingOrder.getId();
     }
 
+    public Calendar getRemindTime(BusRoomsLivingOrder livingOrder, CesAllDayPriceRule cesAllDayPriceRule, Integer BookingType){
+        Calendar calendar = Calendar.getInstance();
+        if (ObjectUtil.equals(BookingType, 1)) {
+            calendar.setTime(livingOrder.getArrivalTime());
+            calendar.add(Calendar.DAY_OF_YEAR, 1);
+            Calendar overDate = Calendar.getInstance();
+            overDate.setTime(livingOrder.getDueOutTime());
+            calendar.set(Calendar.HOUR_OF_DAY, overDate.get(Calendar.HOUR_OF_DAY));
+            calendar.set(Calendar.MINUTE, overDate.get(Calendar.MINUTE));
+            calendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
+        }else if(ObjectUtil.equals(BookingType, 2)){
+            // TODO: 2023/10/24 钟点房超时时间
+            calendar.setTime(livingOrder.getDueOutTime());
+        }
+        return calendar;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String customerLiving(BookingOrderSaveDto livingData, Boolean isTeam, String hotelId) {
@@ -1267,6 +1288,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                  Map<String,BigDecimal> feeMap = getRoomOrderFees(livingOrder.getId());
                  livingOrder.setXiaoFei(feeMap.get("xf"));
                  livingOrder.setShouKuan(feeMap.get("sk"));
+                 livingOrder.setDeposit(feeMap.get("yj"));
                  // 获取入住天数
                  livingOrder.setLiveDayCount(getLivingDayCount(livingOrder));
                  // 设置居住单的团队联房标签
@@ -1311,17 +1333,23 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         .eq("living_order_id",livingOrderId).eq("preferential_status",1));
         List<BusOrderFee> xiaofeiList = fees.stream().filter(s->s.getFeeType().equals(1)).collect(Collectors.toList());
         List<BusOrderFee> shoukuanList = fees.stream().filter(s->s.getFeeType().equals(2)).collect(Collectors.toList());
+        List<BusOrderFee> depositList = shoukuanList.stream().filter(s->ObjectUtil.equals(s.getSubjectType(),"1")).collect(Collectors.toList());
         final BigDecimal[] xiaoFeiTotal = {new BigDecimal(0)};
         final BigDecimal[] shouKuanTotal = {new BigDecimal(0)};
+        final BigDecimal[] depositTotal = {new BigDecimal(0)};
         xiaofeiList.forEach(s->{
             xiaoFeiTotal[0] = xiaoFeiTotal[0].add(s.getMoney());
         });
         shoukuanList.forEach(s->{
             shouKuanTotal[0] = shouKuanTotal[0].add(s.getMoney());
         });
+        depositList.forEach(s->{
+            depositTotal[0] = depositTotal[0].add(s.getMoney());
+        });
         Map<String,BigDecimal> items = new HashMap<>();
         items.put("xf",xiaoFeiTotal[0]);
         items.put("sk",shouKuanTotal[0]);
+        items.put("yj",depositTotal[0]);
         return items;
     }
 
@@ -1547,148 +1575,153 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
 
     public Boolean syncRoomOverTimeOrder(String hotelId) {
         // 查询出当前时间内需要处理的超时订单
-        Set<Object> set = redisTemplate.opsForZSet().rangeByScore("overTimerOrder", 0, Calendar.getInstance().getTimeInMillis());
-        CesAllDayPriceRule cesAllDayPriceRule =  allDayPriceRuleService.getOne(Wrappers.<CesAllDayPriceRule>lambdaQuery().eq(CesAllDayPriceRule::getHotelId,hotelId).eq(CesAllDayPriceRule::getInvalid,false));
+        Set<Object> set = redisTemplate.opsForZSet().rangeByScore("overTimerOrder", 0, Calendar.getInstance().getTimeInMillis());CesAllDayPriceRule cesAllDayPriceRule =  allDayPriceRuleService.getOne(Wrappers.<CesAllDayPriceRule>lambdaQuery().eq(CesAllDayPriceRule::getHotelId,hotelId).eq(CesAllDayPriceRule::getInvalid,false));
         if(CollUtil.isEmpty(set)){
             return true;
         }
         if(ObjectUtils.isEmpty(cesAllDayPriceRule)) {
             throw new JeecgBootException("未找到超时收费规则");
         }
-        // 如果房间超时是按分钟加收费用
-        if (TimeOutRuleEnum.ADD_BY_MINUTE.getKey().equals(cesAllDayPriceRule.getTimeOutRule())){
-            addByMinute(set, cesAllDayPriceRule);
-        }else if (TimeOutRuleEnum.ADD_BY_DAY.getKey().equals(cesAllDayPriceRule.getTimeOutRule())){
-            addByDay(set, cesAllDayPriceRule);
-        }else if (TimeOutRuleEnum.NOT_ADD.getKey().equals(cesAllDayPriceRule.getTimeOutRule())) {
-            notAdd(set, cesAllDayPriceRule);
-        }
+        LambdaQueryWrapper<BusRoomsLivingOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(BusRoomsLivingOrder::getId,set);
+        List<BusRoomsLivingOrder> livingOrderList = roomsLivingOrderService.list(queryWrapper);
+        livingOrderList.forEach(e -> {
+            BusRoomBookingOrders roomBookingOrder = getById(e.getBookingOrderId());
+            if (ObjectUtil.isEmpty(roomBookingOrder)){
+                return;
+            }
+            // 全天房
+            if (ObjectUtil.equals(1,roomBookingOrder.getBookingType())){
+                // 如果房间超时是按分钟加收费用
+                if (TimeOutRuleEnum.ADD_BY_MINUTE.getKey().equals(cesAllDayPriceRule.getTimeOutRule())){
+                    addByMinute(e, cesAllDayPriceRule);
+                }else if (TimeOutRuleEnum.ADD_BY_DAY.getKey().equals(cesAllDayPriceRule.getTimeOutRule())){
+                    addByDay(e, cesAllDayPriceRule);
+                }else if (TimeOutRuleEnum.NOT_ADD.getKey().equals(cesAllDayPriceRule.getTimeOutRule())) {
+                    notAdd(e, cesAllDayPriceRule);
+                }
+                // 钟点房
+            } else if(ObjectUtil.equals(2,roomBookingOrder.getBookingType())){
+                // TODO: 2023/10/24 钟点房超时收费
+            }
+        });
+
+
+
         return null;
     }
 
     /**
      * 超时收费规则是按分钟
      */
-    public void addByMinute(Set<Object> set, CesAllDayPriceRule cesAllDayPriceRule){
+    public void addByMinute(BusRoomsLivingOrder livingOrder, CesAllDayPriceRule cesAllDayPriceRule){
         Date date = new Date();
         Calendar nextCalendar = Calendar.getInstance();
-        set.forEach(e -> {
-            nextCalendar.setTime(date);
-            BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(e.toString());
-            if(ObjectUtil.isNotEmpty(livingOrder)){
-                BusBookingRooms bookingroom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
-                if (ObjectUtil.isEmpty(bookingroom)){
-                    throw new JeecgBootException("未找到订单对应的房间");
-                }
-                // 查询当天房间超时消费
-                BusOrderFee fee = getOverTimeFee(livingOrder, bookingroom);
-                // 需要支付完整费用时间的最后时间
-                Date endTime = getFullFeeTime(date, cesAllDayPriceRule);
-                // 当前时间加上超时收费时间
-                nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
-                // 当前时间加上超时收费时间 < 按全天收费时间的标准
-                if (nextCalendar.getTime().compareTo(endTime) < 0){
-                    // 不满足的情况下,添加超时收费,设置下一次收费时间戳
-                    fee.setDayTime(date);
-                    fee.setMoney(fee.getMoney().add(cesAllDayPriceRule.getPrice()));
-                    redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
-
-                    // 如果下一次增加收费时间大于 全天收费时间 设置
-                }else {
-                    // 如果满足全天收费要求,预离时间增加1天
-                    CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
-                    fee.setMoney(layout.getMarketPrice());
-                    fee.setDayTime(date);
-                    nextCalendar.setTime(livingOrder.getDueOutTime());
-                    nextCalendar.add(Calendar.DAY_OF_YEAR,1);
-                    livingOrder.setDueOutTime(nextCalendar.getTime());
-                    roomsLivingOrderService.updateById(livingOrder);
-                    // 下一次收费时间戳
-                    nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
-                    // 添加每日房费
-                    addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
-                }
-                // 移除处理过的时间订单,添加订单下一次超时的时间戳
-                redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
-                redisTemplate.opsForZSet().add("overTimerOrder",livingOrder.getId(),nextCalendar.getTimeInMillis());
-                feeService.saveOrUpdate(fee);
-            }
-        });
+        nextCalendar.setTime(date);
+        BusBookingRooms bookingroom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
+        if (ObjectUtil.isEmpty(bookingroom)){
+            log.info("未找到订单{}对应的房间", livingOrder.getId());
+            return;
+        }
+        // 查询当天房间超时消费
+        BusOrderFee fee = getOverTimeFee(livingOrder, bookingroom);
+        // 需要支付完整费用时间的最后时间
+        Date endTime = getFullFeeTime(date, cesAllDayPriceRule);
+        // 当前时间加上超时收费时间
+        nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
+        // 当前时间加上超时收费时间 < 按全天收费时间的标准
+        if (nextCalendar.getTime().compareTo(endTime) < 0){
+            // 不满足的情况下,添加超时收费,设置下一次收费时间戳
+            fee.setDayTime(date);
+            fee.setMoney(fee.getMoney().add(cesAllDayPriceRule.getPrice()));
+            redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
+
+            // 如果下一次增加收费时间大于 全天收费时间 设置
+        }else {
+            // 如果满足全天收费要求,预离时间增加1天
+            CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
+            BusLivingLayoutDayPrice dayPrice = addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
+            fee.setMoney(dayPrice.getPrice());
+            fee.setDayTime(date);
+            nextCalendar.setTime(livingOrder.getDueOutTime());
+            nextCalendar.add(Calendar.DAY_OF_YEAR,1);
+            livingOrder.setDueOutTime(nextCalendar.getTime());
+            roomsLivingOrderService.updateById(livingOrder);
+            // 下一次收费时间戳
+            nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
+            // 添加每日房费
+        }
+        // 移除处理过的时间订单,添加订单下一次超时的时间戳
+        redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
+        redisTemplate.opsForZSet().add("overTimerOrder",livingOrder.getId(),nextCalendar.getTimeInMillis());
+        feeService.saveOrUpdate(fee);
     }
 
-    public void addByDay(Set<Object> set, CesAllDayPriceRule cesAllDayPriceRule){
+    public void addByDay(BusRoomsLivingOrder livingOrder, CesAllDayPriceRule cesAllDayPriceRule){
         Date date = new Date();
         Calendar nextCalendar = Calendar.getInstance();
-        set.forEach(e -> {
-            BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(e.toString());
-            if(ObjectUtil.isNotEmpty(livingOrder)) {
-                BusBookingRooms bookingroom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
-                if (ObjectUtil.isEmpty(bookingroom)) {
-                    log.info("未找到订单{}对应的房间", livingOrder.getId());
-                    return;
-                }
-                CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
-                // 查询当天房间超时消费
-                BusOrderFee fee = getOverTimeFee(livingOrder, bookingroom);
-                // 需要支付完整费用时间的最后时间
-                Date endTime = getFullFeeTime(date, cesAllDayPriceRule);
-                if (nextCalendar.getTime().compareTo(endTime) < 0){
-                    fee.setMoney(layout.getMarketPrice().divide(new BigDecimal(2)));
-                    nextCalendar.setTime(endTime);
-                } else {
-                    fee.setMoney(layout.getMarketPrice());
-                    nextCalendar.setTime(livingOrder.getDueOutTime());
-                    nextCalendar.add(Calendar.DAY_OF_YEAR,1);
-                    livingOrder.setDueOutTime(nextCalendar.getTime());
-                    roomsLivingOrderService.updateById(livingOrder);
-                    // 下一次收费时间戳
-                    nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
-                    // 添加每日房费
-                    addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
-                }
-                // 移除处理过的时间订单,添加订单下一次超时的时间戳
-                redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
-                redisTemplate.opsForZSet().add("overTimerOrder",livingOrder.getId(),nextCalendar.getTimeInMillis());
-                feeService.saveOrUpdate(fee);
-            }
-        });
+        BusBookingRooms bookingroom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
+        if (ObjectUtil.isEmpty(bookingroom)) {
+            log.info("未找到订单{}对应的房间", livingOrder.getId());
+            return;
+        }
+        CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
+        // 查询当天房间超时消费
+        BusOrderFee fee = getOverTimeFee(livingOrder, bookingroom);
+        // 需要支付完整费用时间的最后时间
+        Date endTime = getFullFeeTime(date, cesAllDayPriceRule);
+        if (nextCalendar.getTime().compareTo(endTime) < 0){
+            // 超时收取半天费用
+            fee.setMoney(layout.getMarketPrice().divide(new BigDecimal(2)));
+            nextCalendar.setTime(endTime);
+        } else {
+            // 添加每日房费
+            BusLivingLayoutDayPrice dayPrice = addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
+            fee.setMoney(dayPrice.getPrice());
+            nextCalendar.setTime(livingOrder.getDueOutTime());
+            nextCalendar.add(Calendar.DAY_OF_YEAR,1);
+            livingOrder.setDueOutTime(nextCalendar.getTime());
+            roomsLivingOrderService.updateById(livingOrder);
+            // 下一次收费时间戳
+            nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
+        }
+        // 移除处理过的时间订单,添加订单下一次超时的时间戳
+        redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
+        redisTemplate.opsForZSet().add("overTimerOrder",livingOrder.getId(),nextCalendar.getTimeInMillis());
+        feeService.saveOrUpdate(fee);
     }
 
-    public void notAdd(Set<Object> set, CesAllDayPriceRule cesAllDayPriceRule){
+    public void notAdd(BusRoomsLivingOrder livingOrder, CesAllDayPriceRule cesAllDayPriceRule){
         Date date = new Date();
         Calendar nextCalendar = Calendar.getInstance();
-        set.forEach(e -> {
-            BusRoomsLivingOrder livingOrder = roomsLivingOrderService.getById(e.toString());
-            if(ObjectUtil.isNotEmpty(livingOrder)) {
-                BusBookingRooms bookingroom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
-                if (ObjectUtil.isEmpty(bookingroom)) {
-                    throw new JeecgBootException("未找到订单对应的房间");
-                }
-                CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
-                // 查询当天房间超时消费
-                BusOrderFee fee = getOverTimeFee(livingOrder, bookingroom);
-                // 需要支付完整费用时间的最后时间
-                Date endTime = getFullFeeTime(date, cesAllDayPriceRule);
-                if (nextCalendar.getTime().compareTo(endTime) >= 0){
-                    fee.setMoney(layout.getMarketPrice());
-                    nextCalendar.setTime(livingOrder.getDueOutTime());
-                    nextCalendar.add(Calendar.DAY_OF_YEAR,1);
-                    livingOrder.setDueOutTime(nextCalendar.getTime());
-                    roomsLivingOrderService.updateById(livingOrder);
-                    // 下一次收费时间戳
-                    nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
-                    // 添加每日房费
-                    addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
-                }
-                // 移除处理过的时间订单,添加订单下一次超时的时间戳
-                redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
-                redisTemplate.opsForZSet().add("overTimerOrder",livingOrder.getId(),nextCalendar.getTimeInMillis());
-                feeService.saveOrUpdate(fee);
-            }
-        });
+        BusBookingRooms bookingroom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
+        if (ObjectUtil.isEmpty(bookingroom)) {
+            log.info("未找到订单{}对应的房间", livingOrder.getId());
+            return;
+        }
+        CesRoomLayout layout = layoutService.getById(bookingroom.getRoomLayoutId());
+        // 查询当天房间超时消费
+        BusOrderFee fee = getOverTimeFee(livingOrder, bookingroom);
+        // 需要支付完整费用时间的最后时间
+        Date endTime = getFullFeeTime(date, cesAllDayPriceRule);
+        if (nextCalendar.getTime().compareTo(endTime) >= 0){
+            // 添加每日房费
+            BusLivingLayoutDayPrice dayPrice = addDayPrice(livingOrder, bookingroom, layout.getMarketPrice());
+            fee.setMoney(dayPrice.getPrice());
+            nextCalendar.setTime(livingOrder.getDueOutTime());
+            nextCalendar.add(Calendar.DAY_OF_YEAR,1);
+            livingOrder.setDueOutTime(nextCalendar.getTime());
+            roomsLivingOrderService.updateById(livingOrder);
+            // 下一次收费时间戳
+            nextCalendar.add(Calendar.MINUTE, Integer.parseInt(cesAllDayPriceRule.getDayTime()));
+        }
+        // 移除处理过的时间订单,添加订单下一次超时的时间戳
+        redisTemplate.opsForZSet().remove("overTimerOrder",livingOrder.getId());
+        redisTemplate.opsForZSet().add("overTimerOrder",livingOrder.getId(),nextCalendar.getTimeInMillis());
+        feeService.saveOrUpdate(fee);
     }
 
-    public void addDayPrice(BusRoomsLivingOrder livingOrder, BusBookingRooms bookingroom, BigDecimal money){
+    public BusLivingLayoutDayPrice addDayPrice(BusRoomsLivingOrder livingOrder, BusBookingRooms bookingroom, BigDecimal money){
         List<BusLivingLayoutDayPrice> dayPrices = livingLayoutDayPriceService.list(Wrappers.<BusLivingLayoutDayPrice>query()
                 .eq("living_order_id",livingOrder.getId()));
         Optional<BusLivingLayoutDayPrice> opPrice = dayPrices.stream().filter(a-> DateUtils.formatDate(a.getDayTime()).equals(DateUtils.formatDate(livingOrder.getDueOutTime()))).findFirst();
@@ -1706,19 +1739,27 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
             nPrice.setLivingOrderId(livingOrder.getId());
             nPrice.setLivingType(livingOrder.getLivingType());
             livingLayoutDayPriceService.save(nPrice);
+            return nPrice;
         }
+        return opPrice.get();
     }
 
     public BusOrderFee getOverTimeFee(BusRoomsLivingOrder livingOrder, BusBookingRooms bookingroom){
+        Calendar nowCalendar = Calendar.getInstance();
+        nowCalendar.set(Calendar.HOUR_OF_DAY, 0);
+        nowCalendar.set(Calendar.MINUTE, 0);
+        nowCalendar.set(Calendar.SECOND, 0);
+        nowCalendar.set(Calendar.MILLISECOND, 0);
         List<BusOrderFee> feeList = feeService.list(Wrappers.<BusOrderFee>lambdaQuery()
                 .eq(BusOrderFee::getLivingOrderId, livingOrder.getId()).eq(BusOrderFee::getPreferentialStatus, 1)
-                .eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey()).gt(BusOrderFee::getCreateTime, livingOrder.getDueOutTime()));
+                .eq(BusOrderFee::getSubjectType, FeeSubjectType.MEI_RI_FANG_FEI.getKey()).ge(BusOrderFee::getCreateTime, nowCalendar.getTime()));
         if (CollUtil.isNotEmpty(feeList)) {
             return feeList.get(0);
         }
         BusOrderFee fee = new BusOrderFee();
         fee.setMoney(new BigDecimal(0));
         fee.setCreateTime(new Date());
+        fee.setDayTime(new Date());
         fee.setSubjectType(FeeSubjectType.MEI_RI_FANG_FEI.getKey());
         fee.setLivingOrderId(livingOrder.getId());
         fee.setHotelId(livingOrder.getHotelId());
@@ -1793,6 +1834,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     // TODO: 2023/10/19 删除预约每日房价,还不确定要不要删
                 } else {
                     dayPrices.addAll(living.getLayoutDayPriceList());
+                    living.setIsStayOver(true);
                 }
                 
             });
@@ -2179,6 +2221,7 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         BusBookingRooms bookingRoom = bookingRoomsService.getById(livingOrder.getBookingRoomId());
         if(bookingRoom == null) throw new JeecgBootException("未找到房间关联");
         List<BusOrderFeeGoods> orderFeeGoodList = new ArrayList<>();
+        List<CesGoods> goodList = new ArrayList<>();
         fees.forEach(roomFee->{
             roomFee.setLivingOrderId(livingOrderId);
             roomFee.setRoomId(bookingRoom.getRoomId());
@@ -2193,12 +2236,35 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                 roomFee.getFeeGoodVo().setCreateTime(new Date());
                 roomFee.getFeeGoodVo().setHotelId(livingOrder.getHotelId());
                 orderFeeGoodList.add(roomFee.getFeeGoodVo());
+                CesGoods goods = cesGoodsServiceImpl.getById(roomFee.getFeeGoodVo().getGoodsId());
+                Integer newInventory = goods.getInventory() - roomFee.getFeeGoodVo().getNum();
+                if (newInventory < 0){
+                    throw new JeecgBootException("库存量不足");
+                }
+                goods.setInventory(newInventory);
+                goodList.add(goods);
+                KcDepositoryInGoods depositoryInGoods = addDepositoryInGood(roomFee.getFeeGoodVo());
+
+                depositoryInGoodsService.addSell(depositoryInGoods);
+
             }
         });
+        cesGoodsServiceImpl.updateBatchById(goodList);
         orderFeeGoodsService.saveBatch(orderFeeGoodList);
         return true;
     }
 
+    public KcDepositoryInGoods addDepositoryInGood(BusOrderFeeGoodsVo feeGood){
+        KcDepositoryInGoods depositoryInGoods = new KcDepositoryInGoods();
+        depositoryInGoods.setGoodsId(feeGood.getGoodsId());
+        depositoryInGoods.setNum(feeGood.getNum());
+        depositoryInGoods.setFeeId(feeGood.getOrderFeeId());
+        depositoryInGoods.setHotelId(feeGood.getHotelId());
+//        depositoryInGoods.setTenantId(user.getRelTenantIds());
+        depositoryInGoods.setCreateTime(new Date());
+        return depositoryInGoods;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean unionOrder(String roomId,String targetRoomId, String bookingOrderId, String hotelId) {
@@ -3052,57 +3118,59 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
                     s.setCreateTime(new Date());
                     s.setFeeType(2);// 收款
                     s.setHotelId(hotelId);
+                    s.setVipCardId(livingData.getOrderInfo().getVipCustomerId());
                     if(FeeSubjectType.val(s.getSubjectType()) == null) {
                         throw new JeecgBootException("收款项目不存在,请核对后操作");
                     }
-                    BusRoomPayType payType = payTypeService.getById(s.getPayType());
-                    if (payType == null){
-                        throw new JeecgBootException("支付方式不存在");
-                    }
-                    if("会员卡".equals(payType.getName())){
-                        BusMemberBalanceLog memberBalanceLog = new BusMemberBalanceLog();
-                        if (user.getRelTenantIds() != null && !user.getRelTenantIds().isEmpty()) {
-                            memberBalanceLog.setTenantId(user.getRelTenantIds());
-                        } else {
-                            throw new JeecgBootException("当前登录人租户信息错误");
-                        }
-                        memberBalanceLog.setWithhold(s.getMoney());
-                        memberBalanceLog.setMoney(BigDecimal.valueOf(0));
-                        memberBalanceLog.setMemberId(livingData.getOrderInfo().getVipCustomerId());
-                        memberBalanceLog.setHotelId(livingData.getOrderInfo().getHotelId());
-                        memberBalanceLog.setType(2);
-                        memberBalanceLog.setOrderFeeId(s.getId());
-                        memberBalanceLogService.saveBalance(memberBalanceLog);
-                    }
-                });
-                if(!findRoomFees.isEmpty()) feeService.saveBatch(findRoomFees);
-                // 处理协议单位记账
-                findRoomFees.forEach(s->{
-                    if(payTypes.stream().anyMatch(k->k.getId().equals(s.getPayType()) && k.getName().equals("单位记账")) ) {
-                        BusAgreementOrderFee agreementOrderFee = new BusAgreementOrderFee();
-                        if(s.getAgreementUnitId() == null || s.getAgreementUnitId().isEmpty()) throw new JeecgBootException("请选择协议单位");
-                        BusMarketAgreementUnit unit = marketAgreementUnitService.getById(s.getAgreementUnitId());
-                        if(unit == null) throw new JeecgBootException("协议单位未找到");
-                        if(unit.getBookkStatus() != null && unit.getBookkStatus().equals(1)) throw new JeecgBootException("不允许该单位记账");
-                        BigDecimal usedAmount;
-                        if(unit.getAmountUsed() == null) usedAmount = new BigDecimal(0);
-                        else usedAmount = unit.getAmountUsed();
-                        double incrementBalance = (usedAmount.add(s.getMoney())).doubleValue();
-                        // 记账限额超出,返回异常结果!
-                        if(unit.getBookkeeping() != null && !unit.getBookkeeping().equals(new BigDecimal(0)) && unit.getBookkeeping().doubleValue() < incrementBalance)
-                            throw new JeecgBootException("记账超额!记账单位限额为"+unit.getBookkeeping().doubleValue()+",已使用"+usedAmount.doubleValue());
-                        agreementOrderFee.setAgreementUnitId(s.getAgreementUnitId());
-                        agreementOrderFee.setOrderFeeId(s.getId());
-                        agreementOrderFee.setCreatedTime(new Date());
-                        agreementOrderFee.setCreateUserId(user != null ?user.getId():"");
-                        agreementOrderFee.setSettleStatus(1);
-                        agreementOrderFeeService.save(agreementOrderFee);
-                        // 更新已使用的记账
-                        unit.setAmountUsed(new BigDecimal(incrementBalance));
-                        unit.setUpdateTime(new Date());
-                        marketAgreementUnitService.updateById(unit);
-                    }
+//                    BusRoomPayType payType = payTypeService.getById(s.getPayType());
+//                    if (payType == null){
+//                        throw new JeecgBootException("支付方式不存在");
+//                    }
+//                    if("会员卡".equals(payType.getName())){
+//                        BusMemberBalanceLog memberBalanceLog = new BusMemberBalanceLog();
+//                        if (user.getRelTenantIds() != null && !user.getRelTenantIds().isEmpty()) {
+//                            memberBalanceLog.setTenantId(user.getRelTenantIds());
+//                        } else {
+//                            throw new JeecgBootException("当前登录人租户信息错误");
+//                        }
+//                        memberBalanceLog.setWithhold(s.getMoney());
+//                        memberBalanceLog.setMoney(BigDecimal.valueOf(0));
+//                        memberBalanceLog.setMemberId(livingData.getOrderInfo().getVipCustomerId());
+//                        memberBalanceLog.setHotelId(livingData.getOrderInfo().getHotelId());
+//                        memberBalanceLog.setType(2);
+//                        memberBalanceLog.setOrderFeeId(s.getId());
+//                        memberBalanceLogService.saveBalance(memberBalanceLog);
+//                    }
                 });
+//                if(!findRoomFees.isEmpty()) feeService.saveBatch(findRoomFees);
+//                // 处理协议单位记账
+//                findRoomFees.forEach(s->{
+//                    if(payTypes.stream().anyMatch(k->k.getId().equals(s.getPayType()) && k.getName().equals("单位记账")) ) {
+//                        BusAgreementOrderFee agreementOrderFee = new BusAgreementOrderFee();
+//                        if(s.getAgreementUnitId() == null || s.getAgreementUnitId().isEmpty()) throw new JeecgBootException("请选择协议单位");
+//                        BusMarketAgreementUnit unit = marketAgreementUnitService.getById(s.getAgreementUnitId());
+//                        if(unit == null) throw new JeecgBootException("协议单位未找到");
+//                        if(unit.getBookkStatus() != null && unit.getBookkStatus().equals(1)) throw new JeecgBootException("不允许该单位记账");
+//                        BigDecimal usedAmount;
+//                        if(unit.getAmountUsed() == null) usedAmount = new BigDecimal(0);
+//                        else usedAmount = unit.getAmountUsed();
+//                        double incrementBalance = (usedAmount.add(s.getMoney())).doubleValue();
+//                        // 记账限额超出,返回异常结果!
+//                        if(unit.getBookkeeping() != null && !unit.getBookkeeping().equals(new BigDecimal(0)) && unit.getBookkeeping().doubleValue() < incrementBalance)
+//                            throw new JeecgBootException("记账超额!记账单位限额为"+unit.getBookkeeping().doubleValue()+",已使用"+usedAmount.doubleValue());
+//                        agreementOrderFee.setAgreementUnitId(s.getAgreementUnitId());
+//                        agreementOrderFee.setOrderFeeId(s.getId());
+//                        agreementOrderFee.setCreatedTime(new Date());
+//                        agreementOrderFee.setCreateUserId(user != null ?user.getId():"");
+//                        agreementOrderFee.setSettleStatus(1);
+//                        agreementOrderFeeService.save(agreementOrderFee);
+//                        // 更新已使用的记账
+//                        unit.setAmountUsed(new BigDecimal(incrementBalance));
+//                        unit.setUpdateTime(new Date());
+//                        marketAgreementUnitService.updateById(unit);
+//                    }
+//                });
+                feeService.collectionBatch(findRoomFees, hotelId);
             }
             // 另外每个房间还要在入住时生成每日房费账单
             BusOrderFee roomFee = new BusOrderFee();
@@ -3414,6 +3482,9 @@ public class BusRoomBookingOrdersServiceImpl extends ServiceImpl<BusRoomBookingO
         });
         feeService.collectionBatch(param.getOrderFeeList(),livingOrder.getHotelId());
         livingLayoutDayPriceService.saveBatch(param.getLayoutDayPriceList());
+        LambdaUpdateWrapper<BusRoomsLivingOrder> updateWrapper = new LambdaUpdateWrapper<>();
+        livingOrder.setIsChangeRoom(true);
+        roomsLivingOrderService.updateById(livingOrder);
         return true;
     }
 

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

@@ -1,11 +1,27 @@
 package org.jeecg.modules.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.business.entity.BusHousePriceSchemeLayout;
 import org.jeecg.modules.business.entity.BusSchemeLayoutDailyPrice;
 import org.jeecg.modules.business.mapper.BusSchemeLayoutDailyPriceMapper;
+import org.jeecg.modules.business.service.IBusHousePriceSchemeLayoutService;
 import org.jeecg.modules.business.service.IBusSchemeLayoutDailyPriceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
 
 /**
  * @Description: 房价方案-每日房价表
@@ -16,4 +32,86 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class BusSchemeLayoutDailyPriceServiceImpl extends ServiceImpl<BusSchemeLayoutDailyPriceMapper, BusSchemeLayoutDailyPrice> implements IBusSchemeLayoutDailyPriceService {
 
+    @Autowired
+    private IBusHousePriceSchemeLayoutService busHousePriceSchemeLayoutService;
+
+    @Override
+    public List<BusSchemeLayoutDailyPrice> getDailyPrice(String schemeLayoutId, Date realDate) {
+        QueryWrapper<BusSchemeLayoutDailyPrice> queryWrapper = new QueryWrapper<>();
+        LoginUser user = TokenUtils.getAuthUser();
+        if(user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")){
+            queryWrapper.eq("tenant_id",user.getRelTenantIds());
+        }
+        queryWrapper.eq("del_flag",0);
+        List<BusSchemeLayoutDailyPrice> list = list(queryWrapper);
+        //获取从今天开始,两个月时间的数据
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date());
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Date startDate = calendar.getTime();
+        calendar.add(Calendar.DATE, 9);
+        Date endDate = calendar.getTime();
+
+        List<Date> lDate = findDates(startDate, endDate);
+        if (realDate != null){
+            lDate = findDates(realDate, endDate);
+        }
+        List<BusSchemeLayoutDailyPrice> newList = new ArrayList<>();
+        BusHousePriceSchemeLayout busHousePriceSchemeLayout = busHousePriceSchemeLayoutService.getById(schemeLayoutId);
+        if (list !=null && list.size() >= 0){
+            lDate.forEach(day->{
+                BusSchemeLayoutDailyPrice dayMoney = new BusSchemeLayoutDailyPrice();
+                dayMoney.setSchemeLayoutId(schemeLayoutId);
+                int flag = 0;
+                for(BusSchemeLayoutDailyPrice s: list){
+                    if(format.format(day).equals(format.format(s.getDate()))){
+                        flag= 1;
+                        dayMoney.setMoney(s.getMoney());
+                        dayMoney.setId(s.getId());
+                        dayMoney.setDate(s.getDate());
+                    }
+                }
+                if (flag == 0){
+                    dayMoney.setMoney(busHousePriceSchemeLayout.getMoney());
+                    dayMoney.setId("");
+                    dayMoney.setDate(day);
+                }
+                newList.add(dayMoney);
+            });
+        }else{
+            lDate.forEach(day->{
+                BusSchemeLayoutDailyPrice dayMoney = new BusSchemeLayoutDailyPrice();
+                dayMoney.setSchemeLayoutId(schemeLayoutId);
+                dayMoney.setMoney(busHousePriceSchemeLayout.getMoney());
+                dayMoney.setId("");
+                dayMoney.setDate(day);
+                newList.add(dayMoney);
+            });
+        }
+        return newList;
+    }
+
+    public static List<Date> findDates(Date dBegin, Date dEnd)
+    {
+        List lDate = new ArrayList();
+        lDate.add(dBegin);
+        Calendar calBegin = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calBegin.setTime(dBegin);
+        Calendar calEnd = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calEnd.setTime(dEnd);
+        // 测试此日期是否在指定日期之后
+        while (dEnd.after(calBegin.getTime()))
+        {
+            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+            calBegin.add(Calendar.DAY_OF_MONTH, 1);
+            lDate.add(calBegin.getTime());
+        }
+        return lDate;
+    }
+
 }

+ 57 - 2
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/fw/controller/FwLivingJxController.java

@@ -1,8 +1,10 @@
 package org.jeecg.modules.fw.controller;
 
-import java.util.Arrays;
+import java.awt.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
@@ -10,6 +12,8 @@ import java.net.URLDecoder;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.oConvertUtils;
@@ -176,6 +180,39 @@ private CesRoomsServiceImpl cesRoomsService;
 		return Result.OK(fwLivingJx);
 	}
 
+
+	 /**
+	  * 通过id查询
+	  *
+	  * @param hotelId 酒店id
+	  * @return List<CesRooms>
+	  */
+	 //@AutoLog(value = "fw_living_jx-通过id查询")
+	 @ApiOperation(value="getJxRooms-查询所有要叫醒的房间", notes="getJxRooms-查询所有要叫醒的房间")
+	 @GetMapping(value = "/getJxRooms")
+	 public Result<List<CesRooms>> getJxRooms(String hotelId) {
+		 Calendar calendar = Calendar.getInstance();
+		 calendar.set(Calendar.HOUR_OF_DAY, 0);
+		 calendar.set(Calendar.MINUTE, 0);
+		 calendar.set(Calendar.SECOND, 0);
+		 calendar.set(Calendar.MILLISECOND, 0);
+		 List<FwLivingJx> jxList = fwLivingJxService.list(Wrappers.<FwLivingJx>lambdaQuery().ge(FwLivingJx::getJxDate, calendar.getTime()));
+		 Date newDate = new Date();
+		 List<String> livingIds = new ArrayList<>();
+		 jxList.forEach(e -> {
+			 Calendar c = getDateTime(e.getJxTime());
+			 if (c.getTime().after(newDate)){
+				 livingIds.add(e.getLivingOrderId());
+			 }
+		 });
+		 if (livingIds.isEmpty()){
+			 return Result.OK(new ArrayList<>());
+		 }
+		 List<CesRooms> cesRooms = cesRoomsService.list(Wrappers.<CesRooms>lambdaQuery().eq(CesRooms::getHotelId,hotelId)
+				 .in(CesRooms::getLivingOrderId, livingIds));
+		 return Result.OK(cesRooms);
+	 }
+
     /**
     * 导出excel
     *
@@ -201,4 +238,22 @@ private CesRoomsServiceImpl cesRoomsService;
         return super.importExcel(request, response, FwLivingJx.class);
     }
 
+	public Calendar getDateTime(String timeStr){
+		SimpleDateFormat format = new SimpleDateFormat("HH:mm");
+		Date time;
+		try {
+			time = format.parse(timeStr);
+		} catch (ParseException ex) {
+			throw new RuntimeException(ex);
+		}
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(time);
+		Calendar lastCalendar = Calendar.getInstance();
+		lastCalendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR));
+		lastCalendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE));
+		lastCalendar.set(Calendar.SECOND, 0);
+		lastCalendar.set(Calendar.MILLISECOND, 0);
+		return lastCalendar;
+	}
+
 }

+ 76 - 45
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/controller/KcDepositoryInGoodsController.java

@@ -1,49 +1,25 @@
 package org.jeecg.modules.kc.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.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.modules.kc.entity.KcDepository;
 import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
-import org.jeecg.modules.kc.entity.KcGoods;
-import org.jeecg.modules.kc.entity.KcGoodsType;
 import org.jeecg.modules.kc.service.IKcDepositoryInGoodsService;
-
-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.kc.service.IKcDepositoryService;
-import org.jeecg.modules.kc.service.IKcGoodsService;
-import org.jeecg.modules.rooms.Vo.CesGoodsVo;
-import org.jeecg.modules.rooms.entity.CesGoods;
-import org.jeecg.modules.rooms.entity.CesGoodsUnit;
-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.jeecg.modules.kc.vo.GoodStorage;
 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;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
 
  /**
  * @Description: kc_depository_in_goods
@@ -56,8 +32,6 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
 @RequestMapping("/kc/kcDepositoryInGoods")
 @Slf4j
 public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryInGoods, IKcDepositoryInGoodsService> {
-	@Autowired
-	private IKcDepositoryInGoodsService kcDepositoryInGoodsService;
 
 	@Autowired
 	private IKcDepositoryService kcDepositoryService;
@@ -91,7 +65,6 @@ public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryI
 
 	/**
 	 *   添加
-	 *
 	 * @param kcDepositoryInGoods
 	 * @return
 	 */
@@ -100,11 +73,26 @@ public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryI
 	//@RequiresPermissions("kc:kc_depository_in_goods:add")
 	@PostMapping(value = "/add")
 	public Result<String> add(@RequestBody KcDepositoryInGoods kcDepositoryInGoods) {
-		kcDepositoryInGoodsService.save(kcDepositoryInGoods);
+		service.save(kcDepositoryInGoods);
 		return Result.OK("添加成功!");
 	}
 
-	/**
+	 /**
+	  *   添加
+	  * @param kcDepositoryInGoods
+	  * @return
+	  */
+//	 @AutoLog(value = "kc_depository_in_goods-添加")
+//	 @ApiOperation(value="kc_depository_in_goods-添加", notes="kc_depository_in_goods-添加")
+//	 //@RequiresPermissions("kc:kc_depository_in_goods:add")
+//	 @PostMapping(value = "/addSell")
+//	 public Result<String> addSell(@RequestBody KcDepositoryInGoods kcDepositoryInGoods) {
+//		 service.addSell(kcDepositoryInGoods);
+//		 return Result.OK("添加成功!");
+//	 }
+
+
+	 /**
 	 *  编辑
 	 *
 	 * @param kcDepositoryInGoods
@@ -115,7 +103,7 @@ public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryI
 	//@RequiresPermissions("kc:kc_depository_in_goods:edit")
 	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
 	public Result<String> edit(@RequestBody KcDepositoryInGoods kcDepositoryInGoods) {
-		kcDepositoryInGoodsService.updateById(kcDepositoryInGoods);
+		service.updateById(kcDepositoryInGoods);
 		return Result.OK("编辑成功!");
 	}
 
@@ -130,7 +118,7 @@ public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryI
 	//@RequiresPermissions("kc:kc_depository_in_goods:delete")
 	@DeleteMapping(value = "/delete")
 	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-		kcDepositoryInGoodsService.removeById(id);
+		service.removeById(id);
 		return Result.OK("删除成功!");
 	}
 
@@ -145,7 +133,7 @@ public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryI
 	//@RequiresPermissions("kc:kc_depository_in_goods:deleteBatch")
 	@DeleteMapping(value = "/deleteBatch")
 	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		this.kcDepositoryInGoodsService.removeByIds(Arrays.asList(ids.split(",")));
+		service.removeByIds(Arrays.asList(ids.split(",")));
 		return Result.OK("批量删除成功!");
 	}
 
@@ -159,13 +147,56 @@ public class KcDepositoryInGoodsController extends JeecgController<KcDepositoryI
 	@ApiOperation(value="kc_depository_in_goods-通过id查询", notes="kc_depository_in_goods-通过id查询")
 	@GetMapping(value = "/queryById")
 	public Result<KcDepositoryInGoods> queryById(@RequestParam(name="id",required=true) String id) {
-		KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getById(id);
+		KcDepositoryInGoods kcDepositoryInGoods = service.getById(id);
 		if(kcDepositoryInGoods==null) {
 			return Result.error("未找到对应数据");
 		}
 		return Result.OK(kcDepositoryInGoods);
 	}
 
+	 @ApiOperation(value="商品出入库汇总表分页查询", notes="商品出入库汇总表分页查询")
+	 @GetMapping(value = "/storagePage")
+	 public Result<IPage<GoodStorage>> storagePage(GoodStorage goodStorage,
+														   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														   HttpServletRequest req) {
+		 Page<GoodStorage> page = new Page<>(pageNo, pageSize);
+		 return Result.OK(service.storagePage(page, goodStorage));
+	 }
+
+
+	 @ApiOperation(value="商品出入库详情表分页查询", notes="商品出入库详情表分页查询")
+	 @GetMapping(value = "/storageDetailPage")
+	 public Result<IPage<GoodStorage>> storageDetailPage(GoodStorage goodStorage,
+												   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+												   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+												   HttpServletRequest req) {
+		 Page<GoodStorage> page = new Page<>(pageNo, pageSize);
+		 return Result.OK(service.storageDetailPage(page, goodStorage));
+	 }
+
+	 @ApiOperation(value="商品销售出入库详情表分页查询", notes="商品出入库详情表分页查询")
+	 @GetMapping(value = "/goodsSellDetailPage")
+	 public Result<IPage<GoodStorage>> goodsSellPage(GoodStorage goodStorage,
+												   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+												   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+												   HttpServletRequest req) {
+		 Page<GoodStorage> page = new Page<>(pageNo, pageSize);
+		 return Result.OK(service.goodsSellDetailPage(page, goodStorage));
+	 }
+
+	 @ApiOperation(value="商品销售出入库汇总表分页查询", notes="商品出入库详情表分页查询")
+	 @GetMapping(value = "/goodsSellCollect")
+	 public Result<IPage<GoodStorage>> goodsSellCollect(GoodStorage goodStorage,
+													 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+													 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+													 HttpServletRequest req) {
+		 Page<GoodStorage> page = new Page<>(pageNo, pageSize);
+		 return Result.OK(service.goodsSellCollect(page, goodStorage));
+	 }
+
+
+
     /**
     * 导出excel
     *

+ 2 - 174
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/controller/KcStockController.java

@@ -147,19 +147,6 @@ public class KcStockController extends JeecgController<KcStock, IKcStockService>
 		 return Result.OK(OutBoundEnum.getDictList());
 	 }
 
-	 /**
-	  * 生成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);
-	 }
 
 	/**
 	 *   出入库添加
@@ -175,59 +162,7 @@ public class KcStockController extends JeecgController<KcStock, IKcStockService>
 		if (ObjectUtils.isEmpty(kcStock.getStockDetailList())) {
 			return Result.error("请先选择商品");
 		}
-		kcStock.setTenantId(TokenUtils.currentTenantId());
-		kcStock.setStatus(0);
-		String prefix = "CK";
-		if (kcStock.getType().equals(2)) {
-			prefix = "RK";
-		} else if (kcStock.getType().equals(3)) {
-			prefix = "PD";
-		}
-		kcStock.setCode(randomNumber(prefix));
-		LoginUser user = TokenUtils.getAuthUser();
-		kcStock.setCreateAt(user.getRealname());
-		kcStock.setCreateTime(DateTime.now());
-		String stockInfo = "";
-		for (KcStockDetail kcStockDetail : kcStock.getStockDetailList()) {
-			if (kcStock.getType().equals(2)) {
-				KcSupplierInGoods kcSupplierInGoods = kcSupplierInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
-				if (kcSupplierInGoods != null) {
-					CesGoods cesGoods = cesGoodsService.getById(kcSupplierInGoods.getGoodsId());
-					if (cesGoods != null) {
-						kcStockDetail.setCesGoods(cesGoods);
-						kcStockDetail.setGoodId(cesGoods.getId());
-						CesGoodsUnit cesGoodsUnit = cesGoodsUnitService.getById(cesGoods.getGoodUnit());
-						if (cesGoodsUnit != null) {
-							stockInfo += cesGoods.getName() + kcStockDetail.getNum() + cesGoodsUnit.getName() + ",";
-						}
-					}
-				}
-			} else if (kcStock.getType().equals(1)||kcStock.getType().equals(3)) {
-
-				KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
-				if (kcDepositoryInGoods != null) {
-					CesGoods cesGoods = cesGoodsService.getById(kcDepositoryInGoods.getGoodsId());
-					if (cesGoods != null) {
-						kcStockDetail.setCesGoods(cesGoods);
-						kcStockDetail.setGoodId(cesGoods.getId());
-						CesGoodsUnit cesGoodsUnit = cesGoodsUnitService.getById(cesGoods.getGoodUnit());
-						if (cesGoodsUnit != null) {
-							stockInfo += cesGoods.getName() + kcStockDetail.getNum() + cesGoodsUnit.getName() + ",";
-						}
-					}
-				}
-			}
-		}
-		kcStock.setStockInfo(stockInfo);
-		kcStockService.save(kcStock);
-		for (KcStockDetail kcStockDetail : kcStock.getStockDetailList()) {
-			kcStockDetail.setHotelId(kcStock.getHotelId());
-			kcStockDetail.setTenantId(TokenUtils.currentTenantId());
-			kcStockDetail.setStockId(kcStock.getCode());
-			kcStockDetail.setId("");
-		}
-		kcStockDetailService.saveBatch(kcStock.getStockDetailList());
-
+		service.add(kcStock);
 		return Result.OK("添加成功!");
 	}
 
@@ -240,114 +175,7 @@ public class KcStockController extends JeecgController<KcStock, IKcStockService>
 	 @PostMapping(value = "/audit")
 	 @Transactional(rollbackFor = Exception.class)
 	 public Result<String> audit(@RequestBody KcStock kcStock) {
-		 kcStockService.updateById(kcStock);
-		 if (kcStock.getStatus().equals(1)) {
-			 if (kcStock.getType().equals(2)) {
-				 LambdaQueryWrapper<KcStockDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-				 lambdaQueryWrapper.eq(KcStockDetail::getStockId, kcStock.getCode());
-				 List<KcStockDetail> stockDetailList = kcStockDetailService.list(lambdaQueryWrapper);
-				 if (ObjectUtils.isNotEmpty(stockDetailList)) {
-					 List<KcDepositoryInGoods> depositoryInGoodsList = new ArrayList<>();
-					 List<CesGoods> goodsList = new ArrayList<>();
-					 for (KcStockDetail kcStockDetail : stockDetailList) {
-						 // 拿到当前仓库商品关联数据
-						 KcSupplierInGoods kcSupplierInGoods = kcSupplierInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
-						 if (kcSupplierInGoods != null) {
-							 CesGoods cesGoods = cesGoodsService.getById(kcSupplierInGoods.getGoodsId());
-							 if (cesGoods != null) {
-								 kcStockDetail.setCesGoods(cesGoods);
-							 }
-						 }
-						 if (ObjectUtils.isNotEmpty(kcStockDetail.getCesGoods())) {
-							 // 有商品入库后修改商品数量,成本价设置为最后一次的进价
-							 CesGoods cesGood = kcStockDetail.getCesGoods();
-							 cesGood.setBid(kcStockDetail.getPrice());
-							 cesGood.setInventory(cesGood.getInventory() + kcStockDetail.getNum());
-							 goodsList.add(cesGood);
-//							 LambdaQueryWrapper<KcDepositoryInGoods> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
-//							 lambdaQueryWrapper2.eq(KcDepositoryInGoods::getDepositoryId, kcStock.getDepositoryId());
-//							 lambdaQueryWrapper2.eq(KcDepositoryInGoods::getGoodsId, kcStockDetail.getCesGoods().getId());
-//							 KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getOne(lambdaQueryWrapper2);
-
-
-//							 if (kcDepositoryInGoods != null) {
-//								 kcDepositoryInGoods.setNum(kcDepositoryInGoods.getNum() + kcStockDetail.getNum());
-//							 } else {
-							 KcDepositoryInGoods kcDepositoryInGoods = new KcDepositoryInGoods();
-							 kcDepositoryInGoods.setTenantId(kcStock.getTenantId());
-							 kcDepositoryInGoods.setHotelId(kcStock.getHotelId());
-							 kcDepositoryInGoods.setDepositoryId(kcStock.getDepositoryId());
-							 kcDepositoryInGoods.setGoodsId(cesGood.getId());
-							 kcDepositoryInGoods.setNum(kcStockDetail.getNum());
-							 kcDepositoryInGoods.setStockDetailId(kcStockDetail.getId());
-//							 }
-							 depositoryInGoodsList.add(kcDepositoryInGoods);
-						 }
-					 }
-					 System.out.println(depositoryInGoodsList.toString());
-					 kcDepositoryInGoodsService.saveBatch(depositoryInGoodsList);
-					 cesGoodsService.updateBatchById(goodsList);
-				 }
-			 } else if (kcStock.getType().equals(1)) {
-				 LambdaQueryWrapper<KcStockDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-				 lambdaQueryWrapper.eq(KcStockDetail::getStockId, kcStock.getCode());
-				 // 循环的只会有一个仓库下的不同商品
-				 List<KcStockDetail> stockDetailList = kcStockDetailService.list(lambdaQueryWrapper);
-				 List<String> goodIds = stockDetailList.stream().map(KcStockDetail::getGoodId).collect(Collectors.toList());
-				 List<CesGoods> goodsList = cesGoodsService.listByIds(goodIds);
-				 List<KcDepositoryInGoods> depositoryInGoodsList = new ArrayList<>();
-				 if (ObjectUtils.isNotEmpty(stockDetailList)) {
-					 for (KcStockDetail kcStockDetail : stockDetailList) {
-					 QueryWrapper<KcDepositoryInGoods> queryWrapper = new QueryWrapper<>();
-					 queryWrapper.select("SUM(num) as num");
-					 queryWrapper.eq("depository_id", kcStock.getDepositoryId());
-					 queryWrapper.eq("goods_id", kcStockDetail.getGoodId());
-					 KcDepositoryInGoods kcDepositoryInGoodList = kcDepositoryInGoodsService.getOne(queryWrapper);
-					 if (kcDepositoryInGoodList.getNum() - kcStockDetail.getNum() < 0){
-						 throw new JeecgBootException("库存不足");
-					 }
-						 Optional<CesGoods> goodsOptional = goodsList.stream().filter(e -> e.getId().equals(kcStockDetail.getGoodId())).findFirst();
-						 if (goodsOptional.isPresent()){
-							 // 商品中库存是否足够
-							 int differ = goodsOptional.get().getInventory() - kcStockDetail.getNum();
-							 if (differ < 0){
-								 throw new JeecgBootException("库存不足");
-							 }
-							 goodsOptional.get().setInventory(differ);
-							 KcDepositoryInGoods kcDepositoryInGoods = new KcDepositoryInGoods();
-							 kcDepositoryInGoods.setTenantId(kcStock.getTenantId());
-							 kcDepositoryInGoods.setHotelId(kcStock.getHotelId());
-							 kcDepositoryInGoods.setDepositoryId(kcStock.getDepositoryId());
-							 kcDepositoryInGoods.setGoodsId(goodsOptional.get().getId());
-							 kcDepositoryInGoods.setNum(-kcStockDetail.getNum());
-							 kcDepositoryInGoods.setStockDetailId(kcStockDetail.getId());
-							 depositoryInGoodsList.add(kcDepositoryInGoods);
-						 }else {
-							 throw new JeecgBootException("未找到商品");
-						 }
-						 cesGoodsService.updateBatchById(goodsList);
-						 kcDepositoryInGoodsService.saveBatch(depositoryInGoodsList);
-					 }
-				 }
-			 } else if (kcStock.getType().equals(3)) {
-				 LambdaQueryWrapper<KcStockDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-				 lambdaQueryWrapper.eq(KcStockDetail::getStockId, kcStock.getCode());
-				 List<KcStockDetail> stockDetailList = kcStockDetailService.list(lambdaQueryWrapper);
-				 if (ObjectUtils.isNotEmpty(stockDetailList)) {
-					 for (KcStockDetail kcStockDetail : stockDetailList) {
-						 KcDepositoryInGoods depositoryInGoods = kcDepositoryInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
-						 if (depositoryInGoods != null) {
-							 if (depositoryInGoods != null) {
-								 Integer num = kcStockDetail.getNum();
-								 if (num < 0) num = 0;
-								 depositoryInGoods.setNum(num);
-								 kcDepositoryInGoodsService.updateById(depositoryInGoods);
-							 }
-						 }
-					 }
-				 }
-			 }
-		 }
+		 service.audit(kcStock);
 		 return Result.OK("审核成功!");
 	 }
 

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcDepository.java

@@ -28,7 +28,7 @@ import lombok.experimental.Accessors;
 @TableName("kc_depository")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="kc_depository对象", description="kc_depository")
+@ApiModel(value="kc_depository对象", description="仓库")
 public class KcDepository implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 18 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcDepositoryInGoods.java

@@ -55,11 +55,28 @@ public class KcDepositoryInGoods implements Serializable {
 	@Excel(name = "总数", width = 15)
     @ApiModelProperty(value = "总数")
     private Integer num;
-	/**总数*/
+	/**库存详情id*/
 	@Excel(name = "库存详情id", width = 15)
     @ApiModelProperty(value = "库存详情id")
     private String stockDetailId;
 
+	/**费用单id*/
+	@Excel(name = "创建时间", width = 15)
+	@ApiModelProperty(value = "创建时间")
+	private String feeId;
+
+	/**费用单id*/
+	@Excel(name = "创建时间", width = 15)
+	@ApiModelProperty(value = "创建时间")
+	private String feeGoodId;
+
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm")
+	@Excel(name = "创建时间", width = 15)
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
 	@TableField(exist = false)
 	private Decimal price;
 

+ 3 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcStock.java

@@ -27,7 +27,7 @@ import lombok.experimental.Accessors;
 @TableName("kc_stock")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="kc_stock对象", description="kc_stock")
+@ApiModel(value="kc_stock对象", description="库存记录")
 public class KcStock implements Serializable {
     private static final long serialVersionUID = 1L;
 
@@ -64,8 +64,8 @@ public class KcStock implements Serializable {
     @ApiModelProperty(value = "备注")
     private String remarks;
 	/**状态*/
-	@Excel(name = "状态", width = 15)
-    @ApiModelProperty(value = "状态")
+	@Excel(name = "状态 未审核0,审核通过1,审核未通过2", width = 15)
+    @ApiModelProperty(value = "状态 未审核0,审核通过1,审核未通过2")
     private Integer status;
 	/**入库内容*/
 	@Excel(name = "入库内容", width = 15)

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcStockDetail.java

@@ -27,7 +27,7 @@ import lombok.experimental.Accessors;
 @TableName("kc_stock_detail")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="kc_stock_detail对象", description="kc_stock_detail")
+@ApiModel(value="kc_stock_detail对象", description="库存记录详情")
 public class KcStockDetail implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/entity/KcSupplier.java

@@ -28,7 +28,7 @@ import lombok.experimental.Accessors;
 @TableName("kc_supplier")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="kc_supplier对象", description="kc_supplier")
+@ApiModel(value="kc_supplier对象", description="供应商")
 public class KcSupplier implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 10 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/mapper/KcDepositoryInGoodsMapper.java

@@ -2,12 +2,14 @@ package org.jeecg.modules.kc.mapper;
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.jeecg.modules.kc.entity.KcSupplierInGoods;
+import org.jeecg.modules.kc.vo.GoodStorage;
 
 /**
  * @Description: kc_depository_in_goods
@@ -36,4 +38,12 @@ public interface KcDepositoryInGoodsMapper extends BaseMapper<KcDepositoryInGood
             "<if test='goodsName != null and goodsName !=\"\"'> and g.name like concat('%',#{goodsName},'%') </if>"+
             "</script>")
     public List<KcDepositoryInGoods> depositoryInGoodsList(Page<KcDepositoryInGoods> page, String hotelId, String goodsName,String depositoryId,String goodId);
+
+    IPage<GoodStorage> storagePage(Page<GoodStorage> page,@Param("goodStorage") GoodStorage goodStorage);
+
+    IPage<GoodStorage> storageDetailPage(Page<GoodStorage> page, GoodStorage goodStorage);
+
+    IPage<GoodStorage> goodsSellDetailPage(Page<GoodStorage> page, GoodStorage goodStorage);
+
+    IPage<GoodStorage> goodsSellCollect(Page<GoodStorage> page, GoodStorage goodStorage);
 }

+ 111 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/mapper/xml/KcDepositoryInGoodsMapper.xml

@@ -2,4 +2,115 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.kc.mapper.KcDepositoryInGoodsMapper">
 
+    <select id="storagePage" resultType="org.jeecg.modules.kc.vo.GoodStorage">
+        SELECT kd.id AS depository_id, kd.name AS depository_name, SUM(kdig.num) AS num,
+        cg.name AS good_name, cg.id AS good_id, cg.stock_warning,
+        cgu.name AS good_unit_name,cst.id as good_type_id, cst.name as good_type_name
+        FROM kc_depository kd
+        LEFT JOIN kc_depository_in_goods kdig ON kdig.depository_id = kd.id
+        INNER JOIN ces_goods cg ON cg.id = kdig.goods_id
+        INNER JOIN ces_goods_unit cgu ON cgu.id = cg.good_unit
+        left join ces_stock_type cst on cst.id = cg.good_type
+        where 1=1
+        <if test='goodStorage.startTime != null'> and kdig.create_time &gt;= #{goodStorage.startTime} </if>
+        <if test='goodStorage.endTime != null'> and kdig.create_time &lt; #{goodStorage.endTime} </if>
+        <if test='goodStorage.isIn == true'> and kdig.num &gt; 0 </if>
+        <if test='goodStorage.isIn == false'> and kdig.num &lt; 0 </if>
+        <if test="goodStorage.goodName != null and goodStorage.goodName != ''">and cg.name like concat('%', #{goodStorage.goodName}, '%') </if>
+        <if test="goodStorage.depositoryId != null and goodStorage.depositoryId != ''">and kd.depository_id = #{goodStorage.depositoryId} </if>
+        <if test="goodStorage.goodTypeId != null and goodStorage.goodTypeId != ''">and cg.good_type = #{goodStorage.goodTypeId} </if>
+        GROUP BY kd.id, cg.id
+    </select>
+
+    <select id="storageDetailPage" resultType="org.jeecg.modules.kc.vo.GoodStorage">
+        SELECT kd.id AS depository_id, kd.name AS depository_name,
+        kdig.num,ksd.price,kdig.create_time,kdig.fee_id,kdig.fee_good_id,
+        cg.name AS good_name, cg.id AS good_id, cg.spec,
+        cgu.name AS good_unit_name, cst.id AS good_type_id, cst.name AS good_type_name,
+        ksd.stock_id as stock_code, ks.verify_at, ks.create_at, ks.stock_type
+        FROM kc_depository kd
+        LEFT JOIN kc_depository_in_goods kdig ON kdig.depository_id = kd.id
+        left JOIN kc_stock_detail ksd on ksd.id = kdig.stock_detail_id
+        left join kc_stock ks on ks.code = ksd.stock_id
+        INNER JOIN ces_goods cg ON cg.id = kdig.goods_id
+        INNER JOIN ces_goods_unit cgu ON cgu.id = cg.good_unit
+        inner JOIN ces_stock_type cst ON cst.id = cg.good_type
+        where 1=1
+        <if test='goodStorage.startTime != null'> and kdig.create_time &gt;= #{goodStorage.startTime} </if>
+        <if test='goodStorage.endTime != null'> and kdig.create_time &lt; #{goodStorage.endTime} </if>
+        <if test='goodStorage.isIn == true'> and kdig.num &gt; 0 </if>
+        <if test='goodStorage.isIn == false'> and kdig.num &lt; 0 </if>
+        <if test="goodStorage.goodName != null and goodStorage.goodName != ''">and cg.name like concat('%',#{goodStorage.goodName}),'%') </if>
+        <if test="goodStorage.depositoryId != null and goodStorage.depositoryId != ''">and cg.depository_Id == #{goodStorage.depositoryId} </if>
+        <if test="goodStorage.stockCode != null and goodStorage.stockCode != ''">and ks.code == #{goodStorage.stockCode} </if>
+<!--        <if test="goodStorage.goodTypeId != null and goodStorage.goodTypeId != ''">and cg.good_type == #{goodStorage.goodTypeId} ) </if>-->
+    </select>
+
+    <select id="goodsSellDetailPage" resultType="org.jeecg.modules.kc.vo.GoodStorage">
+        select * from (
+            SELECT cg.id as good_id, cg.name as good_name,kdig.num,kdig.create_time,kdig.fee_id,kdig.fee_good_id,
+                   bof.money,concat(cr.prefix,cr.name) as room_sign,
+                   cst.name AS good_type_name,'客房' as place_name, '1' as place_id
+            from kc_depository_in_goods kdig
+            inner join bus_order_fee bof on bof.id = kdig.fee_id
+            inner join ces_rooms cr on cr.id = bof.room_id
+            inner JOIN ces_goods cg ON cg.id = kdig.goods_id
+            inner JOIN ces_goods_unit cgu ON cgu.id = cg.good_unit
+            inner JOIN ces_stock_type cst ON cst.id = cg.good_type
+            where kdig.stock_detail_id is null
+            UNION ALL
+            SELECT cg.id as good_id,cg.name as good_name,kdig.num,kdig.create_time,kdig.fee_id,kdig.fee_good_id,
+                   pogd.money*pogd.num as money, pog.table_no as room_sign,
+                   cst.name AS good_type_name,pt.name as place_name, pt.id as place_id
+            from kc_depository_in_goods kdig
+            inner join pos_order_goods_detail pogd on pogd.id  = kdig.fee_good_id
+            inner join pos_order_goods pog on pog.code = pogd.order_id
+            inner join pos_type pt on pt.id = pog.pos_type
+            inner JOIN ces_goods cg ON cg.id = kdig.goods_id
+            inner JOIN ces_goods_unit cgu ON cgu.id = cg.good_unit
+            inner JOIN ces_stock_type cst ON cst.id = cg.good_type
+            where kdig.stock_detail_id is null) t
+        where 1=1
+        <if test='goodStorage.startTime != null'> and create_time &gt;= #{goodStorage.startTime} </if>
+        <if test='goodStorage.endTime != null'> and create_time &lt; #{goodStorage.endTime} </if>
+        <if test="goodStorage.placeId != null and goodStorage.placeId != ''">and place_id = #{goodStorage.placeId} </if>
+        <if test="goodStorage.goodId != null and goodStorage.goodId != ''">and good_id = #{goodStorage.goodId} </if>
+        <if test="goodStorage.roomSign != null and goodStorage.roomSign != ''">and room_sign like concat('%',#{goodStorage.roomSign},'%') </if>
+        order by create_time asc
+    </select>
+
+    <select id="goodsSellCollect" resultType="org.jeecg.modules.kc.vo.GoodStorage">
+        SELECT good_id, place_id,place_name, good_name, good_type_name,
+        sum(t.num) as num, sum(t.money) as money from(
+            SELECT cg.id as good_id, cg.name as good_name,
+                kdig.num as num,bof.money as money,concat(cr.prefix,cr.name) as room_sign,
+                cst.name AS good_type_name,'客房' as place_name, '1' as place_id
+                from kc_depository_in_goods kdig
+                inner join bus_order_fee bof on bof.id = kdig.fee_id
+                inner join ces_rooms cr on cr.id = bof.room_id
+                inner JOIN ces_goods cg ON cg.id = kdig.goods_id
+                --         inner JOIN ces_goods_unit cgu ON cgu.id = cg.good_unit
+                inner JOIN ces_stock_type cst ON cst.id = cg.good_type
+                where kdig.stock_detail_id is null
+                <if test='goodStorage.startTime != null'> and kdig.create_time &gt;= #{goodStorage.startTime} </if>
+                <if test='goodStorage.endTime != null'> and kdig.create_time &lt; #{goodStorage.endTime} </if>
+            UNION ALL
+            SELECT cg.id as good_id, cg.name as good_name,
+                kdig.num as num,pogd.money*pogd.num as money,pog.table_no as room_sign,
+                cst.name AS good_type_name,pt.name as place_name,pt.id as place_id
+                from kc_depository_in_goods kdig
+                inner join pos_order_goods_detail pogd on pogd.id  = kdig.fee_good_id
+                inner join pos_order_goods pog on pog.code = pogd.order_id
+                inner join pos_type pt on pt.id = pog.pos_type
+                inner JOIN ces_goods cg ON cg.id = kdig.goods_id
+                --         inner JOIN ces_goods_unit cgu ON cgu.id = cg.good_unit
+                inner JOIN ces_stock_type cst ON cst.id = cg.good_type
+                where kdig.stock_detail_id is null
+                <if test='goodStorage.startTime != null'> and kdig.create_time &gt;= #{goodStorage.startTime} </if>
+                <if test='goodStorage.endTime != null'> and kdig.create_time &lt; #{goodStorage.endTime} </if>
+        ) t
+        where 1=1
+        <if test="goodStorage.roomSign != null and goodStorage.roomSign != ''">and room_sign like concat('%',#{goodStorage.roomSign},'%') </if>
+        GROUP BY good_id,good_name, good_type_name,place_name,place_id
+    </select>
 </mapper>

+ 13 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/IKcDepositoryInGoodsService.java

@@ -1,8 +1,11 @@
 package org.jeecg.modules.kc.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.business.vo.BusOrderFeeGoodsVo;
 import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.kc.vo.GoodStorage;
 
 /**
  * @Description: kc_depository_in_goods
@@ -18,4 +21,14 @@ public interface IKcDepositoryInGoodsService extends IService<KcDepositoryInGood
      * @return
      */
     public Page<KcDepositoryInGoods> depositoryInGoodsList(Page<KcDepositoryInGoods> page, KcDepositoryInGoods kcDepositoryInGoods);
+
+    IPage<GoodStorage> storagePage(Page<GoodStorage> page, GoodStorage goodStorage);
+
+    IPage<GoodStorage> storageDetailPage(Page<GoodStorage> page, GoodStorage goodStorage);
+
+    void addSell(KcDepositoryInGoods depositoryInGoods);
+
+    IPage<GoodStorage> goodsSellDetailPage(Page<GoodStorage> page, GoodStorage goodStorage);
+
+    IPage<GoodStorage> goodsSellCollect(Page<GoodStorage> page, GoodStorage goodStorage);
 }

+ 3 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/IKcStockService.java

@@ -11,4 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IKcStockService extends IService<KcStock> {
 
+    void add(KcStock kcStock);
+
+    void audit(KcStock kcStock);
 }

+ 78 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/impl/KcDepositoryInGoodsServiceImpl.java

@@ -1,14 +1,29 @@
 package org.jeecg.modules.kc.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+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.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
 import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
+import org.jeecg.modules.kc.enums.StorageEnum;
 import org.jeecg.modules.kc.mapper.KcDepositoryInGoodsMapper;
 import org.jeecg.modules.kc.service.IKcDepositoryInGoodsService;
+import org.jeecg.modules.kc.vo.GoodStorage;
+import org.jeecg.modules.rooms.entity.CesGoods;
+import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * @Description: kc_depository_in_goods
@@ -18,8 +33,7 @@ import javax.annotation.Resource;
  */
 @Service
 public class KcDepositoryInGoodsServiceImpl extends ServiceImpl<KcDepositoryInGoodsMapper, KcDepositoryInGoods> implements IKcDepositoryInGoodsService {
-    @Resource
-    private KcDepositoryInGoodsMapper kcDepositoryInGoodsMapper;
+
 
     /**
      * 仓库库存商品列表
@@ -28,7 +42,68 @@ public class KcDepositoryInGoodsServiceImpl extends ServiceImpl<KcDepositoryInGo
      * @return
      */
     public Page<KcDepositoryInGoods> depositoryInGoodsList(Page<KcDepositoryInGoods> page, KcDepositoryInGoods kcDepositoryInGoods){
-        return page.setRecords(kcDepositoryInGoodsMapper.depositoryInGoodsList(page,kcDepositoryInGoods.getHotelId(),
+        return page.setRecords(baseMapper.depositoryInGoodsList(page,kcDepositoryInGoods.getHotelId(),
                 kcDepositoryInGoods.getGoodsName(), kcDepositoryInGoods.getDepositoryId(),kcDepositoryInGoods.getGoodsId()));
     }
+
+    @Override
+    public IPage<GoodStorage> storagePage(Page<GoodStorage> page, GoodStorage goodStorage) {
+        IPage<GoodStorage> storagePage = baseMapper.storagePage(page, goodStorage);
+        if (ObjectUtil.equals(goodStorage.getWarningState(),1)) {
+            List<GoodStorage> list = storagePage.getRecords().stream().filter(e -> e.getNum() > e.getStockWarning()).collect(Collectors.toList());
+            storagePage.setRecords(list);
+        } else if(ObjectUtil.equals(goodStorage.getWarningState(),2)){
+            List<GoodStorage> list = storagePage.getRecords().stream().filter(e -> e.getNum() < e.getStockWarning()).collect(Collectors.toList());
+            storagePage.setRecords(list);
+        }
+        return storagePage;
+    }
+
+    @Override
+    public IPage<GoodStorage> storageDetailPage(Page<GoodStorage> page, GoodStorage goodStorage) {
+        IPage<GoodStorage> storagePage = baseMapper.storageDetailPage(page, goodStorage);
+        storagePage.getRecords().forEach(e ->{
+            if (StrUtil.isNotEmpty(e.getStockType())){
+                e.setStockType(Objects.requireNonNull(StorageEnum.val(Integer.valueOf(e.getStockType()))).getTitle());
+            }
+        });
+        return storagePage;
+    }
+
+    @Override
+    public void addSell(KcDepositoryInGoods depositoryInGoods) {
+        LoginUser user = TokenUtils.getAuthUser();
+        LambdaQueryWrapper<KcDepositoryInGoods> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(KcDepositoryInGoods::getGoodsId,depositoryInGoods.getGoodsId());
+        queryWrapper.eq(KcDepositoryInGoods::getHotelId,depositoryInGoods.getHotelId());
+        List<KcDepositoryInGoods> depositoryInGoodsList = list(queryWrapper);
+        Map<String, List<KcDepositoryInGoods>> map = depositoryInGoodsList.stream().collect(Collectors.groupingBy(KcDepositoryInGoods::getDepositoryId));
+        // 按仓库分组,如果这个仓库商品没有了,就查下一个仓库
+        for (Map.Entry<String, List<KcDepositoryInGoods>> entry:map.entrySet()){
+            int sum = entry.getValue().stream().mapToInt(KcDepositoryInGoods::getNum).sum();
+            if (sum > depositoryInGoods.getNum()){
+                depositoryInGoods.setNum(-depositoryInGoods.getNum());
+                depositoryInGoods.setDepositoryId(entry.getKey());
+                depositoryInGoods.setTenantId(user.getRelTenantIds());
+                break;
+            }
+        }
+        if (depositoryInGoods.getDepositoryId() == null){
+            throw new JeecgBootException("商品在库存中已不足");
+        }
+        save(depositoryInGoods);
+    }
+
+
+    @Override
+    public IPage<GoodStorage> goodsSellDetailPage(Page<GoodStorage> page, GoodStorage goodStorage) {
+        IPage<GoodStorage> storagePage = baseMapper.goodsSellDetailPage(page, goodStorage);
+        return storagePage;
+    }
+
+    @Override
+    public IPage<GoodStorage> goodsSellCollect(Page<GoodStorage> page, GoodStorage goodStorage) {
+        IPage<GoodStorage> storagePage = baseMapper.goodsSellCollect(page, goodStorage);
+        return storagePage;
+    }
 }

+ 221 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/kc/service/impl/KcStockServiceImpl.java

@@ -1,12 +1,31 @@
 package org.jeecg.modules.kc.service.impl;
 
+import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.apache.commons.lang3.ObjectUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.TokenUtils;
+import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
 import org.jeecg.modules.kc.entity.KcStock;
+import org.jeecg.modules.kc.entity.KcStockDetail;
+import org.jeecg.modules.kc.entity.KcSupplierInGoods;
 import org.jeecg.modules.kc.mapper.KcStockMapper;
-import org.jeecg.modules.kc.service.IKcStockService;
+import org.jeecg.modules.kc.service.*;
+import org.jeecg.modules.rooms.entity.CesGoods;
+import org.jeecg.modules.rooms.entity.CesGoodsUnit;
+import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
+import org.jeecg.modules.rooms.service.CesGoodsUnitServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * @Description: kc_stock
  * @Author: jeecg-boot
@@ -16,4 +35,205 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 @Service
 public class KcStockServiceImpl extends ServiceImpl<KcStockMapper, KcStock> implements IKcStockService {
 
+
+    @Autowired
+    private IKcSupplierInGoodsService kcSupplierInGoodsService;
+    @Autowired
+    private IKcGoodsService kcGoodsService;
+    @Autowired
+    private CesGoodsUnitServiceImpl cesGoodsUnitService;
+    @Autowired
+    private IKcDepositoryService kcDepositoryService;
+    @Autowired
+    private IKcSupplierService kcSupplierService;
+    @Autowired
+    private IKcStockDetailService kcStockDetailService;
+    @Autowired
+    private  IKcDepositoryInGoodsService kcDepositoryInGoodsService;
+
+    @Autowired
+    private CesGoodsServiceImpl cesGoodsService;
+
+    @Override
+    public void add(KcStock kcStock) {
+        kcStock.setTenantId(TokenUtils.currentTenantId());
+        kcStock.setStatus(0);
+        String prefix = "CK";
+        if (kcStock.getType().equals(2)) {
+            prefix = "RK";
+        } else if (kcStock.getType().equals(3)) {
+            prefix = "PD";
+        }
+        kcStock.setCode(randomNumber(prefix));
+        LoginUser user = TokenUtils.getAuthUser();
+        kcStock.setCreateAt(user.getRealname());
+        kcStock.setCreateTime(DateTime.now());
+        String stockInfo = "";
+        for (KcStockDetail kcStockDetail : kcStock.getStockDetailList()) {
+            if (kcStock.getType().equals(2)) {
+                KcSupplierInGoods kcSupplierInGoods = kcSupplierInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
+                if (kcSupplierInGoods != null) {
+                    CesGoods cesGoods = cesGoodsService.getById(kcSupplierInGoods.getGoodsId());
+                    if (cesGoods != null) {
+                        kcStockDetail.setCesGoods(cesGoods);
+                        kcStockDetail.setGoodId(cesGoods.getId());
+                        CesGoodsUnit cesGoodsUnit = cesGoodsUnitService.getById(cesGoods.getGoodUnit());
+                        if (cesGoodsUnit != null) {
+                            stockInfo += cesGoods.getName() + kcStockDetail.getNum() + cesGoodsUnit.getName() + ",";
+                        }
+                    }
+                }
+            } else if (kcStock.getType().equals(1)||kcStock.getType().equals(3)) {
+
+                KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
+                if (kcDepositoryInGoods != null) {
+                    CesGoods cesGoods = cesGoodsService.getById(kcDepositoryInGoods.getGoodsId());
+                    if (cesGoods != null) {
+                        kcStockDetail.setCesGoods(cesGoods);
+                        kcStockDetail.setGoodId(cesGoods.getId());
+                        CesGoodsUnit cesGoodsUnit = cesGoodsUnitService.getById(cesGoods.getGoodUnit());
+                        if (cesGoodsUnit != null) {
+                            stockInfo += cesGoods.getName() + kcStockDetail.getNum() + cesGoodsUnit.getName() + ",";
+                        }
+                    }
+                }
+            }
+        }
+        kcStock.setStockInfo(stockInfo);
+        save(kcStock);
+        for (KcStockDetail kcStockDetail : kcStock.getStockDetailList()) {
+            kcStockDetail.setHotelId(kcStock.getHotelId());
+            kcStockDetail.setTenantId(TokenUtils.currentTenantId());
+            kcStockDetail.setStockId(kcStock.getCode());
+            kcStockDetail.setId("");
+        }
+        kcStockDetailService.saveBatch(kcStock.getStockDetailList());
+    }
+
+    @Override
+    public void audit(KcStock kcStock) {
+        updateById(kcStock);
+        if (kcStock.getStatus().equals(1)) {
+            if (kcStock.getType().equals(2)) {
+                LambdaQueryWrapper<KcStockDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(KcStockDetail::getStockId, kcStock.getCode());
+                List<KcStockDetail> stockDetailList = kcStockDetailService.list(lambdaQueryWrapper);
+                if (ObjectUtils.isNotEmpty(stockDetailList)) {
+                    List<KcDepositoryInGoods> depositoryInGoodsList = new ArrayList<>();
+                    List<CesGoods> goodsList = new ArrayList<>();
+                    for (KcStockDetail kcStockDetail : stockDetailList) {
+                        // 拿到当前仓库商品关联数据
+                        KcSupplierInGoods kcSupplierInGoods = kcSupplierInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
+                        if (kcSupplierInGoods != null) {
+                            CesGoods cesGoods = cesGoodsService.getById(kcSupplierInGoods.getGoodsId());
+                            if (cesGoods != null) {
+                                kcStockDetail.setCesGoods(cesGoods);
+                            }
+                        }
+                        if (ObjectUtils.isNotEmpty(kcStockDetail.getCesGoods())) {
+                            // 有商品入库后修改商品数量,成本价设置为最后一次的进价
+                            CesGoods cesGood = kcStockDetail.getCesGoods();
+                            cesGood.setBid(kcStockDetail.getPrice());
+                            cesGood.setInventory(cesGood.getInventory() + kcStockDetail.getNum());
+                            goodsList.add(cesGood);
+//							 LambdaQueryWrapper<KcDepositoryInGoods> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
+//							 lambdaQueryWrapper2.eq(KcDepositoryInGoods::getDepositoryId, kcStock.getDepositoryId());
+//							 lambdaQueryWrapper2.eq(KcDepositoryInGoods::getGoodsId, kcStockDetail.getCesGoods().getId());
+//							 KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getOne(lambdaQueryWrapper2);
+
+
+//							 if (kcDepositoryInGoods != null) {
+//								 kcDepositoryInGoods.setNum(kcDepositoryInGoods.getNum() + kcStockDetail.getNum());
+//							 } else {
+                            KcDepositoryInGoods kcDepositoryInGoods = new KcDepositoryInGoods();
+                            kcDepositoryInGoods.setTenantId(kcStock.getTenantId());
+                            kcDepositoryInGoods.setHotelId(kcStock.getHotelId());
+                            kcDepositoryInGoods.setDepositoryId(kcStock.getDepositoryId());
+                            kcDepositoryInGoods.setGoodsId(cesGood.getId());
+                            kcDepositoryInGoods.setNum(kcStockDetail.getNum());
+                            kcDepositoryInGoods.setStockDetailId(kcStockDetail.getId());
+//							 }
+                            depositoryInGoodsList.add(kcDepositoryInGoods);
+                        }
+                    }
+                    System.out.println(depositoryInGoodsList.toString());
+                    kcDepositoryInGoodsService.saveBatch(depositoryInGoodsList);
+                    cesGoodsService.updateBatchById(goodsList);
+                }
+            } else if (kcStock.getType().equals(1)) {
+                LambdaQueryWrapper<KcStockDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(KcStockDetail::getStockId, kcStock.getCode());
+                // 循环的只会有一个仓库下的不同商品
+                List<KcStockDetail> stockDetailList = kcStockDetailService.list(lambdaQueryWrapper);
+                List<String> goodIds = stockDetailList.stream().map(KcStockDetail::getGoodId).collect(Collectors.toList());
+                List<CesGoods> goodsList = cesGoodsService.listByIds(goodIds);
+                List<KcDepositoryInGoods> depositoryInGoodsList = new ArrayList<>();
+                if (ObjectUtils.isNotEmpty(stockDetailList)) {
+                    for (KcStockDetail kcStockDetail : stockDetailList) {
+                        QueryWrapper<KcDepositoryInGoods> queryWrapper = new QueryWrapper<>();
+                        queryWrapper.select("SUM(num) as num");
+                        queryWrapper.eq("depository_id", kcStock.getDepositoryId());
+                        queryWrapper.eq("goods_id", kcStockDetail.getGoodId());
+                        KcDepositoryInGoods kcDepositoryInGoodList = kcDepositoryInGoodsService.getOne(queryWrapper);
+                        if (kcDepositoryInGoodList.getNum() - kcStockDetail.getNum() < 0){
+                            throw new JeecgBootException("库存不足");
+                        }
+                        Optional<CesGoods> goodsOptional = goodsList.stream().filter(e -> e.getId().equals(kcStockDetail.getGoodId())).findFirst();
+                        if (goodsOptional.isPresent()){
+                            // 商品中库存是否足够
+                            int differ = goodsOptional.get().getInventory() - kcStockDetail.getNum();
+                            if (differ < 0){
+                                throw new JeecgBootException("库存不足");
+                            }
+                            goodsOptional.get().setInventory(differ);
+                            KcDepositoryInGoods kcDepositoryInGoods = new KcDepositoryInGoods();
+                            kcDepositoryInGoods.setTenantId(kcStock.getTenantId());
+                            kcDepositoryInGoods.setHotelId(kcStock.getHotelId());
+                            kcDepositoryInGoods.setDepositoryId(kcStock.getDepositoryId());
+                            kcDepositoryInGoods.setGoodsId(goodsOptional.get().getId());
+                            kcDepositoryInGoods.setNum(-kcStockDetail.getNum());
+                            kcDepositoryInGoods.setStockDetailId(kcStockDetail.getId());
+                            depositoryInGoodsList.add(kcDepositoryInGoods);
+                        }else {
+                            throw new JeecgBootException("未找到商品");
+                        }
+                        cesGoodsService.updateBatchById(goodsList);
+                        kcDepositoryInGoodsService.saveBatch(depositoryInGoodsList);
+                    }
+                }
+            } else if (kcStock.getType().equals(3)) {
+                LambdaQueryWrapper<KcStockDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(KcStockDetail::getStockId, kcStock.getCode());
+                List<KcStockDetail> stockDetailList = kcStockDetailService.list(lambdaQueryWrapper);
+                if (ObjectUtils.isNotEmpty(stockDetailList)) {
+                    for (KcStockDetail kcStockDetail : stockDetailList) {
+                        KcDepositoryInGoods depositoryInGoods = kcDepositoryInGoodsService.getById(kcStockDetail.getSupplierInGoodsId());
+                        if (depositoryInGoods != null) {
+                            if (depositoryInGoods != null) {
+                                Integer num = kcStockDetail.getNum();
+                                if (num < 0) num = 0;
+                                depositoryInGoods.setNum(num);
+                                kcDepositoryInGoodsService.updateById(depositoryInGoods);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 生成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);
+    }
 }

+ 39 - 51
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/order/controller/CesOrderLeaseGoodsController.java

@@ -1,69 +1,47 @@
 package org.jeecg.modules.order.controller;
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import io.swagger.annotations.Info;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
 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.dto.PostDataDto;
-import org.jeecg.modules.business.entity.*;
-import org.jeecg.modules.business.enums.CouponsStatusEnum;
-import org.jeecg.modules.business.enums.FeeSubjectType;
+import org.jeecg.modules.business.entity.BusDictItem;
+import org.jeecg.modules.business.entity.BusOrderFee;
 import org.jeecg.modules.business.enums.FeeType;
 import org.jeecg.modules.business.service.IBusDictItemService;
-import org.jeecg.modules.business.service.IBusHotelService;
 import org.jeecg.modules.business.service.IBusOrderFeeService;
 import org.jeecg.modules.order.entity.CesOrderLeaseGoods;
 import org.jeecg.modules.order.service.ICesOrderLeaseGoodsService;
 import org.jeecg.modules.rooms.entity.CesRooms;
 import org.jeecg.modules.rooms.service.CesRoomsServiceImpl;
-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.transaction.annotation.Transactional;
 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;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
  /**
  * @Description: ces_order_lease_goods
@@ -150,9 +128,8 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 
 	 /**
 	  * 检查物品是否归还
-	  * @param livingOrderId
-	  * @return
-	  */
+	  * @param livingOrderId 居住单id
+      */
 	 @ApiOperation(value="检查物品是否归还", notes="检查物品是否归还")
 	 @GetMapping(value = "/checkReturnGoods")
 	 public Result<Long> checkReturnGoods(@RequestParam(name="livingOrderId") String livingOrderId) {
@@ -170,8 +147,6 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 
 	 /**
 	  * 归还
-	  * @param dto
-	  * @return
 	  */
 	 @AutoLog(value = "归还")
 	 @ApiOperation(value="归还", notes="归还")
@@ -203,17 +178,16 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 	/**
 	 *   添加
 	 *
-	 * @param cesOrderLeaseGoods
-	 * @return
+	 * @param cesOrderLeaseGoods 借用物品
 	 */
 	@AutoLog(value = "ces_order_lease_goods-添加")
 	@ApiOperation(value="ces_order_lease_goods-添加", notes="ces_order_lease_goods-添加")
 	//@RequiresPermissions("order:ces_order_lease_goods:add")
 	@PostMapping(value = "/add")
 	public Result<String> add(@RequestBody CesOrderLeaseGoods cesOrderLeaseGoods) {
-		if (cesOrderLeaseGoods.getTenantId() == null || cesOrderLeaseGoods.getTenantId().equals("")) {
+		if (cesOrderLeaseGoods.getTenantId() == null || cesOrderLeaseGoods.getTenantId().isEmpty()) {
 			LoginUser user = TokenUtils.getAuthUser();
-			if (user.getRelTenantIds() != null && !user.getRelTenantIds().equals("")) {
+			if (user.getRelTenantIds() != null && !user.getRelTenantIds().isEmpty()) {
 				cesOrderLeaseGoods.setTenantId(user.getRelTenantIds());
 			} else {
 				throw new JeecgBootException("当前登录人租户信息错误");
@@ -252,8 +226,6 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 
 	 /**
 	  *   添加
-	  * @param cesOrderLeaseGoodlist
-	  * @return
 	  */
 	 @AutoLog(value = "ces_order_lease_goods-批量添加")
 	 @ApiOperation(value="ces_order_lease_goods-批量添加", notes="ces_order_lease_goods-批量添加")
@@ -287,8 +259,6 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 	/**
 	 *  编辑
 	 *
-	 * @param cesOrderLeaseGoods
-	 * @return
 	 */
 	@AutoLog(value = "ces_order_lease_goods-编辑")
 	@ApiOperation(value="ces_order_lease_goods-编辑", notes="ces_order_lease_goods-编辑")
@@ -346,6 +316,24 @@ public class CesOrderLeaseGoodsController extends JeecgController<CesOrderLeaseG
 		return Result.OK(cesOrderLeaseGoods);
 	}
 
+	 /**
+	  * 通过id查询
+	  * @param hotelId
+      */
+	 //@AutoLog(value = "ces_order_lease_goods-通过id查询")
+	 @ApiOperation(value="ces_order_lease_goods-通过id查询", notes="ces_order_lease_goods-通过id查询")
+	 @GetMapping(value = "/getLeaseRoom")
+	 public Result<List<CesRooms>> getLeaseRoom(String hotelId) {
+		 List<CesOrderLeaseGoods> leaseGoodList = cesOrderLeaseGoodsService.list(Wrappers.<CesOrderLeaseGoods>lambdaQuery()
+				 .eq(CesOrderLeaseGoods::getHotelId, hotelId).isNull(CesOrderLeaseGoods::getRevertDate));
+		 Set<String> roomIds = leaseGoodList.stream().map(CesOrderLeaseGoods::getRoomId).collect(Collectors.toSet());
+		 if (roomIds.isEmpty()){
+			 return Result.OK(new ArrayList<>());
+		 }
+		 List<CesRooms> cesRooms = cesRoomsService.list(Wrappers.<CesRooms>lambdaQuery().in(CesRooms::getId, roomIds));
+		 return Result.OK(cesRooms);
+	 }
+
     /**
     * 导出excel
     *

+ 4 - 3
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/controller/PosOrderGoodsController.java

@@ -126,9 +126,10 @@ public class PosOrderGoodsController extends JeecgController<PosOrderGoods, IPos
 	 //@RequiresPermissions("pos:pos_order_goods:add")
 	 @PostMapping(value = "/add")
 	 public Result<PosOrderGoods> add(@RequestBody PosOrderGoods posOrderGoods) {
-		 if (ObjectUtils.isEmpty(posOrderGoods.getPosOrderGoodsDetailList())) {
-			 return Result.error("请先选择商品");
-		 }
+		 // 如果是取单,不添加新商品,然后直接结算时PosOrderGoodsDetailList为空
+//		 if (ObjectUtils.isEmpty(posOrderGoods.getPosOrderGoodsDetailList())) {
+//			 return Result.error("请先选择商品");
+//		 }
 		 PosOrderGoods orderGoods = service.addOrder(posOrderGoods);
 		 return Result.OK("添加成功", orderGoods);
 	 }

+ 22 - 42
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/controller/PosOrderGoodsPaymentController.java

@@ -1,50 +1,46 @@
 package org.jeecg.modules.pos.controller;
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.business.entity.*;
 import org.jeecg.modules.business.service.*;
+import org.jeecg.modules.kc.service.IKcDepositoryInGoodsService;
 import org.jeecg.modules.pos.dto.OrderPaymentDto;
 import org.jeecg.modules.pos.entity.PosOrderGoods;
-import org.jeecg.modules.pos.entity.PosOrderGoodsDetail;
 import org.jeecg.modules.pos.entity.PosOrderGoodsPayment;
 import org.jeecg.modules.pos.entity.PosTable;
 import org.jeecg.modules.pos.service.IPosOrderGoodsDetailService;
 import org.jeecg.modules.pos.service.IPosOrderGoodsPaymentService;
-
-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.pos.service.IPosOrderGoodsService;
 import org.jeecg.modules.pos.service.IPosTableService;
-import org.jeecg.common.system.base.controller.JeecgController;
-import org.jeecg.modules.rooms.entity.CesGoods;
 import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
 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;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
  /**
  * @Description: pos_order_goods_payment
@@ -79,6 +75,9 @@ public class PosOrderGoodsPaymentController extends JeecgController<PosOrderGood
 	 IBusMarketAgreementUnitService marketAgreementUnitService;
 	 @Resource
 	 IBusAgreementOrderFeeService agreementOrderFeeService;
+
+	 @Resource
+	 private IKcDepositoryInGoodsService depositoryInGoodsService;
 	/**
 	 * 分页列表查询
 	 *
@@ -182,26 +181,7 @@ public class PosOrderGoodsPaymentController extends JeecgController<PosOrderGood
 			lambdaUpdateWrapper.eq(PosTable::getId, posOrderGoods.getPosTableId());
 			lambdaUpdateWrapper.set(PosTable::getState, 4);
 			posTableService.update(lambdaUpdateWrapper);
-		} else {
-			// 如果是大厅结账, 支付后减库存
-			List<PosOrderGoodsDetail> orderGoodsDetailList = posOrderGoodsDetailService.list(Wrappers.<PosOrderGoodsDetail>lambdaQuery()
-					.eq(PosOrderGoodsDetail::getOrderId,posOrderGoods.getCode()));
-			List<String> goodIds = orderGoodsDetailList.stream().map(PosOrderGoodsDetail::getGoodsId).collect(Collectors.toList());
-			List<CesGoods> goodsList = goodsService.listByIds(goodIds);
-			orderGoodsDetailList.forEach(detail -> {
-				Optional<CesGoods> goodsOptional = goodsList.stream().filter(good -> good.getId().equals(detail.getGoodsId())).findFirst();
-				goodsOptional.ifPresent(e -> {
-					int differ = e.getInventory() - detail.getNum();
-					if (differ < 0){
-						throw new JeecgBootException(e.getName() + "库存不足");
-					}
-					e.setInventory(differ);
-					// TODO: 2023/9/14 减少仓库库存操作
-				});
-			});
-			goodsService.updateBatchById(goodsList);
 		}
-
 		return Result.OK("添加成功!");
 	}
 

+ 14 - 40
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/controller/PosSellClearGoodsController.java

@@ -1,64 +1,38 @@
 package org.jeecg.modules.pos.controller;
 
-import java.util.ArrayList;
-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.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.lang.tree.Tree;
-import cn.hutool.core.lang.tree.TreeNode;
-import cn.hutool.core.lang.tree.TreeUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
 import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.base.controller.JeecgController;
 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.BusMemberCard;
 import org.jeecg.modules.pos.entity.PosSellClearGoods;
 import org.jeecg.modules.pos.entity.PosThali;
-import org.jeecg.modules.pos.entity.PosType;
 import org.jeecg.modules.pos.service.IPosSellClearGoodsService;
-
-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.pos.service.IPosThaliService;
-import org.jeecg.modules.pos.service.impl.PosThaliServiceImpl;
 import org.jeecg.modules.rooms.entity.CesGoods;
 import org.jeecg.modules.rooms.entity.CesStockType;
 import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
 import org.jeecg.modules.rooms.service.CesStockTypeServiceImpl;
-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;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
  /**
  * @Description: pos_sell_clear_goods

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/entity/PosThali.java

@@ -27,7 +27,7 @@ import lombok.experimental.Accessors;
 @TableName("pos_thali")
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@ApiModel(value="pos_thali对象", description="pos_thali")
+@ApiModel(value="pos_thali对象", description="大盘菜")
 public class PosThali implements Serializable {
     private static final long serialVersionUID = 1L;
 

+ 20 - 7
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/pos/service/impl/PosOrderGoodsServiceImpl.java

@@ -7,12 +7,10 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.TokenUtils;
 import org.jeecg.modules.business.entity.BusBookingRooms;
@@ -22,6 +20,8 @@ import org.jeecg.modules.business.entity.BusRoomsLivingOrder;
 import org.jeecg.modules.business.enums.FeeSubjectType;
 import org.jeecg.modules.business.enums.FeeType;
 import org.jeecg.modules.business.service.*;
+import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
+import org.jeecg.modules.kc.service.IKcDepositoryInGoodsService;
 import org.jeecg.modules.pos.entity.PosOrderGoods;
 import org.jeecg.modules.pos.entity.PosOrderGoodsDetail;
 import org.jeecg.modules.pos.entity.PosTable;
@@ -29,7 +29,6 @@ import org.jeecg.modules.pos.mapper.PosOrderGoodsMapper;
 import org.jeecg.modules.pos.service.*;
 import org.jeecg.modules.rooms.entity.CesGoods;
 import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -67,6 +66,9 @@ public class PosOrderGoodsServiceImpl extends ServiceImpl<PosOrderGoodsMapper, P
     @Resource
     private  IBusRoomBookingOrdersService busRoomBookingOrdersService;
 
+    @Resource
+    private IKcDepositoryInGoodsService depositoryInGoodsService;
+
     @Override
     public PosOrderGoods getOrderByTableId(String tableId) {
         LambdaQueryWrapper<PosOrderGoods> queryWrapper = new LambdaQueryWrapper<PosOrderGoods>()
@@ -149,7 +151,7 @@ public class PosOrderGoodsServiceImpl extends ServiceImpl<PosOrderGoodsMapper, P
     public PosOrderGoods addOrder(PosOrderGoods posOrderGoods) {
         // 直接点击结账时id为空
         if (ObjectUtils.isEmpty(posOrderGoods.getId())) {
-            // 点击结账,且不是桌台
+            // 点击结账,且不是桌台 就创建一个新订单
             if (ObjectUtils.isEmpty(posOrderGoods.getPosTableId())) {
                 // 找出今日最后的一个账单
                 LocalDateTime localDateTime = LocalDateTime.now().withNano(0).withSecond(0).withMinute(0).withHour(0);
@@ -218,9 +220,8 @@ public class PosOrderGoodsServiceImpl extends ServiceImpl<PosOrderGoodsMapper, P
         Boolean res = saveOrUpdate(posOrderGoods);
         if (res) {
             res = posOrderGoodsDetailService.saveBatch(posOrderGoods.getPosOrderGoodsDetailList());
-            if (res && (ObjectUtils.isNotEmpty(posOrderGoods.getPosTableId()) || BooleanUtil.isTrue(posOrderGoods.getIsPending())
-                    || StrUtil.isNotEmpty(posOrderGoods.getToRoomFeeOrderId()))) {
-                //桌台下单或者挂单时商品减库存   如果是大厅点击结账,支付后减库存
+            if (res && (ObjectUtils.isNotEmpty(posOrderGoods.getPosTableId()) || StrUtil.isNotEmpty(posOrderGoods.getToRoomFeeOrderId()))) {
+                //桌台下单或者挂单时商品减库存
                 for (PosOrderGoodsDetail posOrderGoodsDetail : posOrderGoods.getPosOrderGoodsDetailList()) {
                     CesGoods cesGoods = cesGoodsService.getById(posOrderGoodsDetail.getGoodsId());
                     if (ObjectUtils.isNotEmpty(cesGoods)) {
@@ -230,6 +231,8 @@ public class PosOrderGoodsServiceImpl extends ServiceImpl<PosOrderGoodsMapper, P
                         }
                         cesGoods.setInventory(c);
                         cesGoodsService.updateById(cesGoods);
+                        KcDepositoryInGoods depositoryInGoods = addDepositoryInGood(posOrderGoodsDetail);
+                        depositoryInGoodsService.addSell(depositoryInGoods);
                     }
                 }
             }
@@ -241,6 +244,16 @@ public class PosOrderGoodsServiceImpl extends ServiceImpl<PosOrderGoodsMapper, P
         return posOrderGoods;
     }
 
+    public KcDepositoryInGoods addDepositoryInGood(PosOrderGoodsDetail orderGoodsDetail){
+        KcDepositoryInGoods depositoryInGoods = new KcDepositoryInGoods();
+        depositoryInGoods.setGoodsId(orderGoodsDetail.getGoodsId());
+        depositoryInGoods.setNum(orderGoodsDetail.getNum());
+        depositoryInGoods.setFeeGoodId(orderGoodsDetail.getId());
+        depositoryInGoods.setHotelId(orderGoodsDetail.getHotelId());
+        depositoryInGoods.setCreateTime(new Date());
+        return depositoryInGoods;
+    }
+
 
     /**
      * 生成16位数字+prefix

+ 4 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/quartz/job/LivingRoomOrderFeeJob.java

@@ -27,7 +27,10 @@ class LivingRoomOrderFeeJob implements Job {
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         log.info("改房间费用订单");
+        Runnable runnable = () -> bookingOrdersService.syncRoomOverTimeOrder(parameter);
+        Thread thread = new Thread(runnable);
+        thread.start();
+
 //        bookingOrdersService.syncDayRoomOrder(parameter);
-        bookingOrdersService.syncRoomOverTimeOrder(parameter);
     }
 }

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

@@ -1,7 +1,6 @@
 package org.jeecg.modules.rooms.controller;
 
 
-import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -14,26 +13,18 @@ import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.Enum.ResultCode;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
-import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.base.controller.JeecgController;
 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.UUIDGenerator;
-import org.jeecg.modules.business.entity.BusMemberCard;
-import org.jeecg.modules.pos.entity.PosSellClearGoods;
 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.entity.CesGoods;
 import org.jeecg.modules.rooms.entity.CesStockType;
 import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
 import org.jeecg.modules.rooms.service.CesStockTypeServiceImpl;
 import org.springframework.web.bind.annotation.*;
 
-import org.springframework.stereotype.Controller;
-
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;

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

@@ -14,19 +14,17 @@ 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.exception.JeecgBootException;
 import org.jeecg.common.util.CommonUtils;
-import org.jeecg.modules.business.entity.BusAgreementOrderFee;
 import org.jeecg.modules.business.entity.BusHotel;
 import org.jeecg.modules.business.service.impl.BusHotelServiceImpl;
 import org.jeecg.modules.kc.entity.KcDepositoryInGoods;
 import org.jeecg.modules.kc.entity.KcGoods;
 import org.jeecg.modules.kc.service.impl.KcDepositoryInGoodsServiceImpl;
 import org.jeecg.modules.kc.service.impl.KcGoodsServiceImpl;
-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;
@@ -34,7 +32,6 @@ import org.jeecg.modules.rooms.mapper.CesGoodsMapper;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -84,13 +81,16 @@ private KcGoodsServiceImpl kcGoodsService;
         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<>();
@@ -98,17 +98,11 @@ private KcGoodsServiceImpl kcGoodsService;
             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());
-            }
+            busHotelOptional.ifPresent(busHotel -> vo.setHotelName(busHotel.getName()));
             Optional<CesStockType> typeOptional = typeList.stream().filter(c -> c.getId().equals(v.getGoodType())).findFirst();
-            if (typeOptional.isPresent()) {
-                vo.setTypeName(typeOptional.get().getName());
-            }
+            typeOptional.ifPresent(cesStockType -> vo.setTypeName(cesStockType.getName()));
             Optional<CesGoodsUnit> unitOptional = unitList.stream().filter(c -> c.getId().equals(v.getGoodUnit())).findFirst();
-            if (unitOptional.isPresent()) {
-                vo.setUnitName(unitOptional.get().getName());
-            }
+            unitOptional.ifPresent(cesGoodsUnit -> vo.setUnitName(cesGoodsUnit.getName()));
             if (v.getIsStock() && ObjectUtils.isNotEmpty(v.getDepositoryInGoodsId())) {
                 KcDepositoryInGoods kcDepositoryInGoods = kcDepositoryInGoodsService.getById(v.getDepositoryInGoodsId());
                 if (kcDepositoryInGoods != null) {
@@ -279,7 +273,15 @@ private KcGoodsServiceImpl kcGoodsService;
     }
 
 
-
+    public void saleReturn(KcDepositoryInGoods depositoryInGoods){
+        CesGoods goods = getById(depositoryInGoods.getGoodsId());
+        if (goods == null) {
+            throw new JeecgBootException("未找到商品");
+        }
+        goods.setInventory(goods.getInventory() + depositoryInGoods.getNum());
+        kcDepositoryInGoodsService.save(depositoryInGoods);
+        updateById(goods);
+    }