From 5653bb9d4d32d2686245f3a1f0272e7a301e88a5 Mon Sep 17 00:00:00 2001 From: wangfukang <15630117759@163.com> Date: Sat, 30 Mar 2024 09:52:02 +0800 Subject: [PATCH] =?UTF-8?q?AI=E9=9B=86=E6=88=90=20BUG=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 24 +- .../cc/hiver/core/base/HiverBaseEntity.java | 1 + .../core/common/constant/ProductConstant.java | 14 ++ .../core/common/constant/SaleConstant.java | 9 +- .../cc/hiver/core/entity/LogiticsCompany.java | 3 + hiver-modules/hiver-mall/pom.xml | 11 + .../controller/CheckStockController.java | 73 +++++- .../CheckStockDetailController.java | 49 ++++- .../mapper/CheckStockDetailMapper.java | 11 + .../checkstock/mapper/CheckStockMapper.java | 4 + .../checkstock/pojo/CheckStockPageQuery.java | 30 +++ .../service/CheckStockDetailService.java | 13 ++ .../checkstock/service/CheckStockService.java | 17 +- .../impl/CheckStockDetailServiceImpl.java | 203 +++++++++++++++++ .../service/impl/CheckStockServiceImpl.java | 160 +++++++++++--- .../checkstock/vo/CheckStockAttributeVo.java | 6 + .../checkstock/vo/CheckStockDetailVo.java | 13 ++ .../mall/checkstock/vo/CheckStockPageVo.java | 27 +++ .../common/constant/PurchaseConstant.java | 20 ++ .../mall/config/aliocr/AliOcrConfig.java | 12 + .../mall/config/thread/ThreadConfig.java | 22 ++ .../thread/ThreadPoolConfiguration.java | 51 +++++ .../hiver/mall/config/thread/TimerThread.java | 65 ++++++ .../mall/controller/OrderController.java | 38 ++-- .../controller/ProductCategoryController.java | 13 ++ .../mall/controller/ProductController.java | 12 +- .../mall/controller/PurchaseController.java | 1 + .../ReturnCommissionController.java | 12 +- .../mall/controller/ReturnSaleController.java | 11 + .../hiver/mall/controller/SaleController.java | 10 + .../mall/controller/StockController.java | 15 ++ .../mall/dao/mapper/PurchaseDetailMapper.java | 2 +- .../cc/hiver/mall/dao/mapper/SaleMapper.java | 5 +- .../hiver/mall/dao/mapper/StockLogMapper.java | 2 +- .../cc/hiver/mall/dao/mapper/StockMapper.java | 3 + .../service/impl/DeductLogServiceImpl.java | 101 +++++---- .../java/cc/hiver/mall/entity/Customer.java | 4 + .../java/cc/hiver/mall/entity/OrderXd.java | 6 + .../cc/hiver/mall/entity/ProductCategory.java | 18 +- .../java/cc/hiver/mall/entity/ReturnSale.java | 3 + .../main/java/cc/hiver/mall/entity/Sale.java | 5 +- .../main/java/cc/hiver/mall/entity/Share.java | 3 + .../mapper/OperatingAreaMapper.java | 1 + .../impl/OperatingAreaServiceImpl.java | 29 +-- .../operatingarea/vo/OperatingAreaPageVO.java | 6 + .../mall/pojo/query/ProductPageQuery.java | 3 + .../hiver/mall/pojo/query/SalePageQuery.java | 9 + .../hiver/mall/pojo/query/StockPageQuery.java | 6 + .../mall/pojo/vo/ProductAttributeOfAddVo.java | 24 ++ .../mall/pojo/vo/ProductAttributeValueVo.java | 20 ++ .../hiver/mall/pojo/vo/ProductCategoryVo.java | 26 +++ .../hiver/mall/pojo/vo/StockAttributeVo.java | 15 ++ .../cc/hiver/mall/pojo/vo/StockProductVo.java | 32 +++ .../PurchaseOcrPictureController.java | 54 +++++ .../entity/PurchaseOcrPicture.java | 42 ++++ .../mapper/PurchaseOcrPictureMapper.java | 13 ++ .../service/PurchaseOcrPictureService.java | 20 ++ .../impl/PurchaseOcrPictureServiceImpl.java | 111 ++++++++++ .../vo/PurchaseOciPictureAddVo.java | 17 ++ .../mybatis/ProductCategoryService.java | 2 + .../mybatis/PurchaseDetailService.java | 2 +- .../mall/service/mybatis/SaleService.java | 2 + .../mall/service/mybatis/StockLogService.java | 2 +- .../mall/service/mybatis/StockService.java | 4 + .../mall/serviceimpl/OrderServiceImpl.java | 16 +- .../serviceimpl/ProductShareServiceImpl.java | 9 + .../serviceimpl/RushOrderServiceImpl.java | 17 +- .../SalesAndDetailsServiceImpl.java | 54 +++-- .../SalesCalculateServiceImpl.java | 4 +- .../mybatis/ProductCategoryServiceImpl.java | 73 ++++++ .../mybatis/PurchaseDetailServiceImpl.java | 4 +- .../mybatis/PurchaseServiceImpl.java | 4 +- .../mybatis/SaleDetailServiceImpl.java | 6 - .../serviceimpl/mybatis/SaleServiceImpl.java | 17 +- .../mybatis/StockLogServiceImpl.java | 4 +- .../serviceimpl/mybatis/StockServiceImpl.java | 52 ++++- .../java/cc/hiver/mall/utils/AliOcrUtil.java | 208 ++++++++++++++++++ .../mapper/CheckStockDetailMapper.xml | 49 ++++- .../resources/mapper/CheckStockMapper.xml | 10 + .../main/resources/mapper/CustomerMapper.xml | 23 +- .../resources/mapper/OperatingAreaMapper.xml | 33 ++- .../mapper/ProductAttributeMapper.xml | 7 +- .../main/resources/mapper/ProductMapper.xml | 14 +- .../resources/mapper/PurchaseDetailMapper.xml | 3 +- .../main/resources/mapper/PurchaseMapper.xml | 1 + .../mapper/PurchaseOcrPictureMapper.xml | 106 +++++++++ .../resources/mapper/ReturnSaleMapper.xml | 2 +- .../src/main/resources/mapper/SaleMapper.xml | 42 +++- .../main/resources/mapper/StockLogMapper.xml | 3 +- .../src/main/resources/mapper/StockMapper.xml | 39 +++- 90 files changed, 2113 insertions(+), 229 deletions(-) create mode 100644 hiver-core/src/main/java/cc/hiver/core/common/constant/ProductConstant.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/pojo/CheckStockPageQuery.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockPageVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/common/constant/PurchaseConstant.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/aliocr/AliOcrConfig.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadConfig.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadPoolConfiguration.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/TimerThread.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeOfAddVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeValueVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockAttributeVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockProductVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/controller/PurchaseOcrPictureController.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/entity/PurchaseOcrPicture.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/mapper/PurchaseOcrPictureMapper.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/PurchaseOcrPictureService.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/vo/PurchaseOciPictureAddVo.java create mode 100644 hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java create mode 100644 hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseOcrPictureMapper.xml diff --git a/hiver-admin/src/main/resources/application.yml b/hiver-admin/src/main/resources/application.yml index 497f077e..259fd286 100644 --- a/hiver-admin/src/main/resources/application.yml +++ b/hiver-admin/src/main/resources/application.yml @@ -11,7 +11,7 @@ server: uri-encoding: UTF-8 threads: # 工作线程的最大数量 io密集型建议10倍的cpu数,cpu密集型建议cpu数+1,绝大部分应用都是io密集型 - max: 1000 + max: 2000 # 工作线程的最小数量,初始化时创建的线程数 min-spare: 30 # 最大吞吐量不限制 @@ -133,6 +133,17 @@ spring: # - org.activiti.spring.boot.SecurityAutoConfiguration # 暂未使用ES 排除client自动装配类 - org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration + task: + execution: + pool: + # 线程池创建时的初始化线程数,默认为8 + core-size: 10 + # 线程池的最大线程数,默认为int最大值 + max-size: 100 + # 用来缓冲执行任务的队列,默认为int最大值 + queue-capacity: 200 + # 非核心线程的存活时间,线程终止前允许保持空闲的时间 + keep-alive: 60 hiver: # 全局限流 @@ -310,6 +321,12 @@ ignored: - /hiver/app/sale/getCustomerBuyProductLog - /hiver/app/sale/getSupplierBuyProductLog - /hiver/app/sale/getSaleByCompanyId + - /hiver/order/app/getAllStatus/** + - /hiver/app/productCategory/batchSaveCategoryAndAttribute + - /hiver/app/stock/getTailWarnProduct + - /hiver/purchaseOcrPicture/batchSave + - /hiver/purchaseOcrPicture/invoicingAi + - /hiver/purchaseOcrPicture/multiRoundConversationCall # 限流及黑名单不拦截的路径 limitUrls: @@ -379,3 +396,8 @@ logging: jpush: appKey: 130f556e8473c9b558777fe3 masterSecret: 2b4e5196dfc40a78db36480d +aliyun: + openapi: + accessKeyId: 56640 + # 阿里云秘钥 + accessKeySecret: sk-bcfa4865b89548acb8225f910f13d682 diff --git a/hiver-core/src/main/java/cc/hiver/core/base/HiverBaseEntity.java b/hiver-core/src/main/java/cc/hiver/core/base/HiverBaseEntity.java index dd1f603d..4ab63df4 100644 --- a/hiver-core/src/main/java/cc/hiver/core/base/HiverBaseEntity.java +++ b/hiver-core/src/main/java/cc/hiver/core/base/HiverBaseEntity.java @@ -48,6 +48,7 @@ public abstract class HiverBaseEntity implements Serializable { @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) private Date createTime; @ApiModelProperty(value = "更新者") diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/ProductConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/ProductConstant.java new file mode 100644 index 00000000..93712ac1 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/common/constant/ProductConstant.java @@ -0,0 +1,14 @@ +package cc.hiver.core.common.constant; + +/** + * 订单常量类 + * @author 王富康 + * @date 2023/10/21 + */ +public interface ProductConstant { + /** + 商品状态:0:下架;1:上架:2删除 + */ + String[] DEL_FLAG = {"0", "1", "2"}; + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/SaleConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/SaleConstant.java index 8c04aa6a..7740cc9a 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/constant/SaleConstant.java +++ b/hiver-core/src/main/java/cc/hiver/core/common/constant/SaleConstant.java @@ -24,14 +24,21 @@ public interface SaleConstant { 分享页提交订单:6:待配货 挂单页提交订单:7:挂单 + 挂单页提交订单:8:物流公司上门取货(待取货) + 挂单页提交订单:9:物流公司上门取货(已取货) */ - String[] SALE_STATUS = {"0", "1", "2", "3", "4", "5", "00", "01", "02", "03", "04","6","7"}; + String[] SALE_STATUS = {"0", "1", "2", "3", "4", "5", "00", "01", "02", "03", "04","6","7","8","9"}; /** * 物流类别 0-物流 1-快递 2-自提 3-拼单 4-送车 5-大巴 */ String[] TRANSPORT_TYPE = {"0","1","2","3","4","5"}; + /** + * 配送方式 0-平台配送 1-自送 2-物流自提 + */ + String[] MODE_OF_SERVICE = {"0","1","2"}; + /** * 收款状态 0-未收款 1-已收款 2-部分收款 */ diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/LogiticsCompany.java b/hiver-core/src/main/java/cc/hiver/core/entity/LogiticsCompany.java index 6dd46bf5..c2e53ee9 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/LogiticsCompany.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/LogiticsCompany.java @@ -102,4 +102,7 @@ public class LogiticsCompany extends HiverBaseEntity { @ApiModelProperty(value = "公司扣减固定金额") private BigDecimal fixedAmount; + @ApiModelProperty(value = "是否支持上门取货:0:否;1:是") + private Integer canToDoor = 0; + } diff --git a/hiver-modules/hiver-mall/pom.xml b/hiver-modules/hiver-mall/pom.xml index 89e00e2b..00cd6ca2 100644 --- a/hiver-modules/hiver-mall/pom.xml +++ b/hiver-modules/hiver-mall/pom.xml @@ -17,6 +17,17 @@ hiver-app 1.0-SNAPSHOT + + com.alibaba + dashscope-sdk-java + 2.12.0 + + + org.slf4j + slf4j-simple + + + \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockController.java index 20e22c94..72cc3316 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockController.java @@ -2,11 +2,16 @@ package cc.hiver.mall.checkstock.controller; import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.vo.Result; +import cc.hiver.mall.checkstock.entity.CheckStock; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; import cc.hiver.mall.checkstock.service.CheckStockService; -import cc.hiver.mall.checkstock.vo.CheckStockDetailVo; +import cc.hiver.mall.checkstock.vo.CheckStockPageVo; +import cc.hiver.mall.checkstock.vo.CheckStockVo; +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.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; @@ -14,10 +19,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - /** * 盘点接口 + * * @author 王富康 * @date 2024/3/10 */ @@ -31,11 +35,66 @@ public class CheckStockController { @Autowired private CheckStockService checkStockService; - @RequestMapping(value = "/saveOrUpdateOperatingArea", method = RequestMethod.POST) + @RequestMapping(value = "/addCheckStock", method = RequestMethod.POST) @ApiOperation("新增盘点信息") - public Result addCheckStock(@RequestBody List checkStockDetailVos){ + public Result addCheckStock(@RequestBody CheckStockVo checkStockVo) { + + final CheckStock saveCheckStock = checkStockService.addCheckStock(checkStockVo); + return new ResultUtil().setData(saveCheckStock); + } + + @RequestMapping(value = "/getCheckStockList", method = RequestMethod.POST) + @ApiOperation("获取盘点信息列表") + public Result getCheckStockList(@RequestBody CheckStockPageQuery checkStockPageQuery) { + final Page checkStockList = checkStockService.getCheckStockList(checkStockPageQuery); + return new ResultUtil<>().setData(checkStockList); + } + + /** + * 根据盘点id获取盘点及商品详细信息 + * + * @param id + * @return Result + * @author 王富康 + * @date 2024/3/17 + */ + @RequestMapping(value = "/getCheckStock", method = RequestMethod.POST) + @ApiOperation("根据盘点id获取盘点及商品详细信息") + public Result getCheckStock(@RequestBody CheckStockPageQuery checkStockPageQuery) { + + if (StringUtils.isEmpty(checkStockPageQuery.getCheckStockId())) { + return ResultUtil.error("盘点id不能为空"); + } + final CheckStockPageVo checkStockVo = checkStockService.getCheckStock(checkStockPageQuery); + return new ResultUtil().setData(checkStockVo); + } + + /** + * 确认完成盘点 + * + * @param id + * @return Result + * @author 王富康 + * @date 2024/3/17 + */ + + @RequestMapping(value = "/submitToStock", method = RequestMethod.POST) + @ApiOperation("确认完成盘点") + public Result submitToStock(String id) { + if (StringUtils.isEmpty(id)) { + return ResultUtil.error("盘点id不能为空"); + } + checkStockService.submitToStock(id); + return ResultUtil.success("已完成库存更新操作!"); + } - checkStockService.addCheckStock(checkStockDetailVos); - return ResultUtil.success("盘点成功!"); + @RequestMapping(value = "/deleteCheckStock", method = RequestMethod.POST) + @ApiOperation("删除盘点(假删除,delflag=3)") + public Result deleteCheckStock(String id) { + if (StringUtils.isEmpty(id)) { + return ResultUtil.error("盘点id不能为空"); + } + checkStockService.deleteCheckStock(id); + return ResultUtil.success("删除成功!"); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockDetailController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockDetailController.java index 010a141a..0ae160a7 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockDetailController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockDetailController.java @@ -1,26 +1,67 @@ package cc.hiver.mall.checkstock.controller; +import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.vo.Result; import cc.hiver.mall.checkstock.service.CheckStockDetailService; -import cc.hiver.mall.checkstock.vo.CheckStockVo; +import cc.hiver.mall.checkstock.vo.CheckStockDetailVo; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + +/** + * 盘点商品明细 + * @author 王富康 + * @date 2024/3/22 + */ @Slf4j @RestController @Api(tags = "盘点商品明细接口") -@RequestMapping("/hiver/app/checkStock/") +@RequestMapping("/hiver/app/checkStockDetail/") @Transactional public class CheckStockDetailController { @Autowired private CheckStockDetailService checkStockDetailService; - public Result addCheckStockDetail(CheckStockVo checkStockVo){ - return null; + /** + * 增加盘点明细 + * + * @param checkStockDetailVos 商品明细 + * @return Result + * @author 王富康 + * @date 2024/3/17 + */ + @RequestMapping(value = "/addCheckStockDetail", method = RequestMethod.POST) + @ApiOperation("盘点-新增商品详细信息") + public Result addCheckStockDetail(@RequestBody List checkStockDetailVos) { + checkStockDetailService.addCheckStockDetail(checkStockDetailVos); + return ResultUtil.success("新增商品信息成功!"); + } + + /** + * 删除盘点明细 + * + * @param id 盘点id + * @return Result + * @author 王富康 + * @date 2024/3/17 + */ + @RequestMapping(value = "/deleteCheckStockDetail", method = RequestMethod.POST) + @ApiOperation("盘点-删除商品详细信息") + public Result deleteCheckStockDetail(String id) { + if (StringUtils.isEmpty(id)) { + ResultUtil.error("盘点明细id不能为空!"); + } + checkStockDetailService.deleteCheckStockDetail(id); + return ResultUtil.success("删除成功!"); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java index 87134aca..b5ace345 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java @@ -1,7 +1,10 @@ package cc.hiver.mall.checkstock.mapper; import cc.hiver.mall.checkstock.entity.CheckStockDetail; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; +import cc.hiver.mall.deductlog.vo.WorkerDeductLogVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -10,4 +13,12 @@ import java.util.List; @Repository public interface CheckStockDetailMapper extends BaseMapper { void batchInsertCheckStock(@Param("checkStockDetailList") List checkStockDetailList); + + List getByCheckStockDetailByCheckId(@Param("checkStockId")String checkStockId); + + void deleteByProductId(@Param("shopId")String shopId,@Param("checkStockId")String checkStockId,@Param("productId") String productId); + + List getByCheckStockDetailByCheckIdOfPage(@Param("checkStockPageQuery")CheckStockPageQuery checkStockPageQuery); + + Page getByCheckStockProductByCheckId(Page page, @Param("checkStockPageQuery")CheckStockPageQuery checkStockPageQuery); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockMapper.java index 7bc3d51e..ebe4996a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockMapper.java @@ -1,9 +1,13 @@ package cc.hiver.mall.checkstock.mapper; import cc.hiver.mall.checkstock.entity.CheckStock; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @Repository public interface CheckStockMapper extends BaseMapper { + Page getCheckStockList(Page page,@Param("deductLogPageQuery") CheckStockPageQuery checkStockPageQuery); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/pojo/CheckStockPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/pojo/CheckStockPageQuery.java new file mode 100644 index 00000000..c83bcb98 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/pojo/CheckStockPageQuery.java @@ -0,0 +1,30 @@ +package cc.hiver.mall.checkstock.pojo; + +import cc.hiver.core.base.HiverBasePageQuery; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class CheckStockPageQuery extends HiverBasePageQuery { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "店铺id") + private String shopId; + + @ApiModelProperty(value = "盘点id") + private String checkStockId; + + @ApiModelProperty(value = "开始时间") + private String startDate; + + @ApiModelProperty(value = "结束时间") + private String endDate; + + @ApiModelProperty(value = "商品id") + private List productIdList; + + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java index 0db78f4b..e43890b0 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java @@ -1,7 +1,20 @@ package cc.hiver.mall.checkstock.service; import cc.hiver.mall.checkstock.entity.CheckStockDetail; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; +import cc.hiver.mall.checkstock.vo.CheckStockDetailVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + public interface CheckStockDetailService extends IService { + + void addCheckStockDetail(List checkStockDetailVos); + + void deleteCheckStockDetail(String id); + + List getByCheckStockDetailByCheckId(String checkStockId); + + Page getByCheckStockDetailByCheckIdOfPage(CheckStockPageQuery checkStockPageQuery); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockService.java index 746e1159..dbd58d36 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockService.java @@ -1,11 +1,20 @@ package cc.hiver.mall.checkstock.service; import cc.hiver.mall.checkstock.entity.CheckStock; -import cc.hiver.mall.checkstock.vo.CheckStockDetailVo; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; +import cc.hiver.mall.checkstock.vo.CheckStockPageVo; +import cc.hiver.mall.checkstock.vo.CheckStockVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; - public interface CheckStockService extends IService { - void addCheckStock(List checkStockDetailVos); + CheckStock addCheckStock(CheckStockVo checkStockVo); + + CheckStockPageVo getCheckStock(CheckStockPageQuery checkStockPageQuery); + + void submitToStock(String id); + + Page getCheckStockList( CheckStockPageQuery checkStockPageQuery); + + void deleteCheckStock(String id); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java index 42ad4647..893dfef5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java @@ -1,11 +1,214 @@ package cc.hiver.mall.checkstock.service.impl; +import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.mall.checkstock.entity.CheckStockDetail; import cc.hiver.mall.checkstock.mapper.CheckStockDetailMapper; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; import cc.hiver.mall.checkstock.service.CheckStockDetailService; +import cc.hiver.mall.checkstock.vo.CheckStockAttributeVo; +import cc.hiver.mall.checkstock.vo.CheckStockDetailVo; +import cc.hiver.mall.deductlog.vo.WorkerDeductLogVo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 盘点商品实现类 + * + * @author 王富康 + * @date 2024/3/22 + */ @Service public class CheckStockDetailServiceImpl extends ServiceImpl implements CheckStockDetailService { + + @Autowired + private SecurityUtil securityUtil; + + @Autowired + private CheckStockDetailMapper checkStockDetailMapper; + + /** + * 添加盘点详情信息 + * + * @param checkStockDetailVos 盘点详情视图对象列表,包含需要添加的盘点细节 + */ + @Override + public void addCheckStockDetail(List checkStockDetailVos) { + if (checkStockDetailVos == null || checkStockDetailVos.isEmpty()) { + return; // 处理边界条件,输入参数为空的情况 + } + + // 获取当前店铺ID + final String shopId = securityUtil.getShopId(); + + // 初始化盘点详情列表 + final List checkStockDetailList = new ArrayList<>(); + for (CheckStockDetailVo checkStockDetailVo : checkStockDetailVos) { + // 获取商品ID和盘点ID + final String productId = checkStockDetailVo.getProductId(); + final String checkStockId = checkStockDetailVo.getCheckStockId(); + try { + // 先根据商品ID删除原有的盘点明细 + checkStockDetailMapper.deleteByProductId(shopId, checkStockId, productId); + + // 遍历并新增盘点的商品明细 + final List checkStockAttributeVos = checkStockDetailVo.getCheckStockAttributeVos(); + for (CheckStockAttributeVo checkStockAttributeVo : checkStockAttributeVos) { + checkStockDetailList.addAll(buildCheckStockDetailList(checkStockDetailVo, checkStockAttributeVo, shopId, checkStockId, productId)); + } + } catch (Exception e) { + // 日志记录异常,可以进行相应的异常处理逻辑 + log.error("添加盘点详情信息失败", e); + } + } + + // 批量插入盘点详情信息 + try { + checkStockDetailMapper.batchInsertCheckStock(checkStockDetailList); + } catch (Exception e) { + // 日志记录异常,可以进行相应的异常处理逻辑 + log.error("批量插入盘点详情信息失败", e); + } + } + + /** + * 构建盘点详情信息列表 + */ + private static List buildCheckStockDetailList(CheckStockDetailVo checkStockDetailVo, + CheckStockAttributeVo checkStockAttributeVo, + String shopId, + String checkStockId, + String productId) { + final List details = new ArrayList<>(); + final String attributeList = checkStockAttributeVo.getAttributeList(); + final Integer pdNum = checkStockAttributeVo.getPdNum(); + final Integer stockCount = checkStockAttributeVo.getStockCount(); + + // 可为负数 + final int changeCount = pdNum - stockCount; + + final CheckStockDetail checkStockDetail = new CheckStockDetail(); + checkStockDetail.setCheckStockId(checkStockId); + checkStockDetail.setShopId(shopId); + checkStockDetail.setProductId(productId); + checkStockDetail.setProductName(checkStockDetailVo.getProductName()); + checkStockDetail.setProductSn(checkStockDetailVo.getProductSn()); + checkStockDetail.setProductPicture(checkStockDetailVo.getProductPicture()); + checkStockDetail.setPdNum(pdNum); + checkStockDetail.setChangeCount(changeCount); + checkStockDetail.setStockCount(stockCount); + checkStockDetail.setAttributeList(attributeList); + + details.add(checkStockDetail); + return details; + } + + + @Override + public void deleteCheckStockDetail(String id) { + // 删除明细 + checkStockDetailMapper.deleteById(id); + } + + @Override + public List getByCheckStockDetailByCheckId(String checkStockId) { + + // 查询明细 + final List checkStockDetailList = checkStockDetailMapper.getByCheckStockDetailByCheckId(checkStockId); + + // 封装至返回结果中 + final Map checkStockDetailVoMap = new HashMap<>(); + for (CheckStockDetail checkStockDetail : checkStockDetailList) { + final String productId = checkStockDetail.getProductId(); + if (checkStockDetailVoMap.containsKey(productId)) { + // 直接放规格即可 + final CheckStockAttributeVo checkStockAttributeVo = new CheckStockAttributeVo(); + checkStockAttributeVo.setAttributeList(checkStockDetail.getAttributeList()); + checkStockAttributeVo.setStockCount(checkStockDetail.getStockCount()); + checkStockAttributeVo.setPdNum(checkStockDetail.getPdNum()); + checkStockDetailVoMap.get(productId).getCheckStockAttributeVos().add(checkStockAttributeVo); + } else { + // 新增对象 + final CheckStockDetailVo checkStockDetailVo = new CheckStockDetailVo(); + checkStockDetailVo.setCheckStockId(checkStockDetail.getCheckStockId()); + checkStockDetailVo.setProductId(productId); + checkStockDetailVo.setProductName(checkStockDetail.getProductName()); + checkStockDetailVo.setProductPicture(checkStockDetail.getProductPicture()); + checkStockDetailVo.setProductSn(checkStockDetail.getProductSn()); + final List checkStockAttributeVos = new ArrayList<>(); + final CheckStockAttributeVo checkStockAttributeVo = new CheckStockAttributeVo(); + checkStockAttributeVo.setAttributeList(checkStockDetail.getAttributeList()); + checkStockAttributeVo.setStockCount(checkStockDetail.getStockCount()); + checkStockAttributeVo.setPdNum(checkStockDetail.getPdNum()); + checkStockAttributeVos.add(checkStockAttributeVo); + checkStockDetailVo.setCheckStockAttributeVos(checkStockAttributeVos); + checkStockDetailVoMap.put(productId, checkStockDetailVo); + } + } + return new ArrayList<>(checkStockDetailVoMap.values()); + } + + @Override + public Page getByCheckStockDetailByCheckIdOfPage(CheckStockPageQuery checkStockPageQuery) { + // 校验分页参数 + if (checkStockPageQuery.getPageNum() <= 0 || checkStockPageQuery.getPageSize() <= 0) { + throw new IllegalArgumentException("分页参数异常!"); + } + + final Page page = new Page<>(checkStockPageQuery.getPageNum(), checkStockPageQuery.getPageSize()); + final Page returnData = new Page<>(); + try { + // 查询商品id集合 + // 查询明细,这里假设底层已经做了SQL注入等安全防护 + final Page checkStockDetailListOfProduct = checkStockDetailMapper.getByCheckStockProductByCheckId(page, checkStockPageQuery); + if (checkStockDetailListOfProduct.getRecords() == null) { + // 避免空指针异常 + checkStockDetailListOfProduct.setRecords(new ArrayList<>()); + } + checkStockPageQuery.setProductIdList(checkStockDetailListOfProduct.getRecords()); + + + if (!checkStockPageQuery.getProductIdList().isEmpty()) { + final List checkStockDetailList = checkStockDetailMapper.getByCheckStockDetailByCheckIdOfPage(checkStockPageQuery); + + // 封装至返回结果中,使用Map和computeIfAbsent简化逻辑 + final Map checkStockDetailVoMap = checkStockDetailList.stream() + .collect(Collectors.toMap(CheckStockDetail::getProductId, detail -> { + final CheckStockDetailVo vo = new CheckStockDetailVo(); + vo.setCheckStockId(detail.getCheckStockId()); + vo.setProductId(detail.getProductId()); + vo.setProductName(detail.getProductName()); + vo.setProductPicture(detail.getProductPicture()); + vo.setProductSn(detail.getProductSn()); + vo.setCheckStockAttributeVos(new ArrayList<>()); + final CheckStockAttributeVo attributeVo = new CheckStockAttributeVo(); + attributeVo.setAttributeList(detail.getAttributeList()); + attributeVo.setStockCount(detail.getStockCount()); + attributeVo.setPdNum(detail.getPdNum()); + vo.getCheckStockAttributeVos().add(attributeVo); + return vo; + }, (vo1, vo2) -> { + vo2.getCheckStockAttributeVos().addAll(vo1.getCheckStockAttributeVos()); + return vo2; + })); + returnData.setCountId(checkStockDetailListOfProduct.getCountId()); + returnData.setCurrent(checkStockDetailListOfProduct.getCurrent()); + returnData.setTotal(checkStockDetailListOfProduct.getTotal()); + returnData.setRecords(new ArrayList<>(checkStockDetailVoMap.values())); + + } + return returnData; + } catch (Exception e) { + // 异常处理,建议加上更详细的日志记录 + throw new RuntimeException("获取盘点信息出错!", e); + } + } + } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java index 2f134ac0..40b194f7 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java @@ -1,21 +1,39 @@ package cc.hiver.mall.checkstock.service.impl; +import cc.hiver.core.common.utils.BeanUtils; import cc.hiver.core.common.utils.SecurityUtil; +import cc.hiver.core.entity.User; import cc.hiver.mall.checkstock.entity.CheckStock; -import cc.hiver.mall.checkstock.mapper.CheckStockDetailMapper; import cc.hiver.mall.checkstock.mapper.CheckStockMapper; +import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery; +import cc.hiver.mall.checkstock.service.CheckStockDetailService; import cc.hiver.mall.checkstock.service.CheckStockService; +import cc.hiver.mall.checkstock.vo.CheckStockAttributeVo; import cc.hiver.mall.checkstock.vo.CheckStockDetailVo; +import cc.hiver.mall.checkstock.vo.CheckStockPageVo; +import cc.hiver.mall.checkstock.vo.CheckStockVo; import cc.hiver.mall.entity.Shop; +import cc.hiver.mall.entity.Stock; +import cc.hiver.mall.entity.StockLog; import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.mybatis.StockLogService; import cc.hiver.mall.service.mybatis.StockService; +import cc.hiver.mall.utils.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +/** + * 盘点服务实现类 + * + * @author 王富康 + * @date 2024/3/22 + */ @Service public class CheckStockServiceImpl extends ServiceImpl implements CheckStockService { @@ -26,7 +44,7 @@ public class CheckStockServiceImpl extends ServiceImpl checkStockDetailVos) { - // 设置店铺id为缓存中的内容 - // shopId从缓存中设置 + public CheckStock addCheckStock(CheckStockVo checkStockVo) { + // 获取当前登录店铺的ID final String shopId = securityUtil.getShopId(); + // 根据店铺ID获取店铺信息 final Shop shop = shopService.get(shopId); - - // 1. 新增盘点信息 + // 获取当前登录用户 + final User user = securityUtil.getCurrUser(); + // 新增盘点信息 final CheckStock checkStock = new CheckStock(); - // 创建的新对象是有id的 - // final String checkStockId = checkStock.getId(); + // 设置创建人名称 + checkStock.setCreateByName(user.getNickname()); + // 设置店铺ID checkStock.setShopId(shopId); + // 设置店铺名称 checkStock.setShopName(shop.getShopName()); + // 将新的盘点信息插入数据库 checkStockMapper.insert(checkStock); - /*final List checkStockDetailList = new ArrayList<>(); + return checkStock; + } + + /** + * 根据查询条件获取检查库存的页面视图对象。 + * + * @param checkStockPageQuery 包含查询条件的查询对象,其中包含了检查库存的ID。 + * @return 返回一个CheckStockPageVo对象,该对象包含了查询到的检查库存的详细信息及其明细。 + */ + @Override + public CheckStockPageVo getCheckStock(CheckStockPageQuery checkStockPageQuery) { + // 通过ID查询检查库存实体 + final CheckStock checkStock = checkStockMapper.selectById(checkStockPageQuery.getCheckStockId()); + // 创建一个检查库存的页面视图对象 + final CheckStockPageVo checkStockVo = new CheckStockPageVo(); + // 将实体对象的属性值复制到视图对象中 + BeanUtils.copyBeanProp(checkStockVo, checkStock); + // 获取检查库存的明细信息 + final Page checkStockDetailVos = checkStockDetailService.getByCheckStockDetailByCheckIdOfPage(checkStockPageQuery); + // 将明细信息设置到视图对象中 + checkStockVo.setCheckStockDetailVoList(checkStockDetailVos); + return checkStockVo; + } + + + /** + * 提交盘点信息到库存系统 + * + * @param id 盘点任务的唯一标识符 + */ + @Override + public void submitToStock(String id) { + + // 更新盘点状态为已完成 + final CheckStock checkStock = checkStockMapper.selectById(id); + // 标记为已删除,表示盘点已完成 + checkStock.setDelFlag(1); + checkStockMapper.updateById(checkStock); + + // 获取当前店铺ID + final String shopId = securityUtil.getShopId(); + + // 获取盘点详情信息 + final List checkStockDetailVos = checkStockDetailService.getByCheckStockDetailByCheckId(id); for (CheckStockDetailVo checkStockDetailVo : checkStockDetailVos) { final List checkStockAttributeVos = checkStockDetailVo.getCheckStockAttributeVos(); + final String productId = checkStockDetailVo.getProductId(); + final String checkStockId = checkStockDetailVo.getCheckStockId(); + + // 遍历产品属性,更新库存信息 for (CheckStockAttributeVo checkStockAttributeVo : checkStockAttributeVos) { - // 2. 新增盘点的商品明细 - final CheckStockDetail checkStockDetail = new CheckStockDetail(); - final String productId = checkStockDetailVo.getProductId(); final String attributeList = checkStockAttributeVo.getAttributeList(); - checkStockDetail.setCheckStockId(checkStockId); - checkStockDetail.setShopId(shopId); - checkStockDetail.setProductId(productId); - checkStockDetail.setProductName(checkStockDetailVo.getProductName()); - checkStockDetail.setProductSn(checkStockDetailVo.getProductSn()); - checkStockDetail.setProductPicture(checkStockDetailVo.getProductPicture()); final Integer pdNum = checkStockAttributeVo.getPdNum(); - final Integer stockCount = checkStockAttributeVo.getStockCount(); - checkStockDetail.setPdNum(pdNum); - final int changeCount = pdNum - stockCount; - checkStockDetail.setChangeCount(changeCount); - checkStockDetail.setStockCount(stockCount); - checkStockDetail.setAttributeList(attributeList); - checkStockDetailList.add(checkStockDetail); - final QueryWrapper stockQueryWrapper = new QueryWrapper<>(); stockQueryWrapper.eq("product_id", productId); stockQueryWrapper.eq("attribute_list", attributeList); - //存在库存则修改库存数量 + + // 查询库存信息,如果存在则更新库存数量 final Stock stock = stockService.getOne(stockQueryWrapper); - // 计算并更新库存 + // 获取更新前的库存数量 + final Integer stockCount = stock.getStockCount(); + // 计算库存数量变化 + final Integer changeCount = stockCount - pdNum; + // 更新库存数量为盘点数量 stock.setStockCount(pdNum); stockService.saveOrUpdate(stock); - //2.记录库存履历 + // 记录库存变动历史 final StockLog stockLog = new StockLog(); - //出库 + // 盘点出库 stockLog.setChangeType("2"); stockLog.setOrderId(checkStockId); stockLog.setProductId(productId); stockLog.setAttributeList(attributeList); - //出库前数量 + // 更新前库存数量 stockLog.setStock(stockCount); - //出库数量 + // 出库数量(库存减少量) stockLog.setProductCount(changeCount); stockLog.setShopId(shopId); stockLogService.save(stockLog); } } - checkStockDetailMapper.batchInsertCheckStock(checkStockDetailList);*/ } + + /** + * 获取盘点商品信息(分页) + * + * @param checkStockPageQuery 查询条件,包含分页信息和库存检查的条件。 + * @return 返回库存检查结果的分页列表。 + */ + @Override + public Page getCheckStockList(CheckStockPageQuery checkStockPageQuery) { + // 获取当前店铺ID,并设置到查询条件中 + final String shopId = securityUtil.getShopId(); + checkStockPageQuery.setShopId(shopId); + + // 初始化分页参数 + final Page page = new Page<>(checkStockPageQuery.getPageNum(), checkStockPageQuery.getPageSize()); + + // 如果查询条件中包含结束日期,则将其设置为结束日期的次日,确保查询范围完整 + if (StringUtils.isNotEmpty(checkStockPageQuery.getEndDate())) { + checkStockPageQuery.setEndDate(DateUtil.addDay(checkStockPageQuery.getEndDate(), 1)); + } + + // 执行查询,并返回结果 + return checkStockMapper.getCheckStockList(page, checkStockPageQuery); + } + + @Override + public void deleteCheckStock(String id) { + checkStockMapper.deleteById(id); + } + } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockAttributeVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockAttributeVo.java index e65930fc..8f5681bf 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockAttributeVo.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockAttributeVo.java @@ -1,11 +1,17 @@ package cc.hiver.mall.checkstock.vo; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class CheckStockAttributeVo { + @ApiModelProperty(value = "规格") private String attributeList; + + @ApiModelProperty(value = "盘点的数量") private Integer pdNum; + + @ApiModelProperty(value = "盘点前库存数量") private Integer stockCount; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockDetailVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockDetailVo.java index 7fba9686..e0e113e1 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockDetailVo.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockDetailVo.java @@ -1,5 +1,6 @@ package cc.hiver.mall.checkstock.vo; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @@ -7,9 +8,21 @@ import java.util.List; @Data public class CheckStockDetailVo { + @ApiModelProperty(value = "盘点表ID") + private String checkStockId; + + @ApiModelProperty(value = "商品id") private String productId; + + @ApiModelProperty(value = "商品名称") private String productName; + + @ApiModelProperty(value = "商品图片") private String productPicture; + + @ApiModelProperty(value = "商品货号") private String productSn; + + @ApiModelProperty(value = "商品规格明细") private List checkStockAttributeVos; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockPageVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockPageVo.java new file mode 100644 index 00000000..db50ead5 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockPageVo.java @@ -0,0 +1,27 @@ +package cc.hiver.mall.checkstock.vo; + +import cc.hiver.core.base.HiverBaseEntity; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class CheckStockPageVo extends HiverBaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "盘点人姓名") + private String createByName; + + @ApiModelProperty(value = "店铺id") + private String shopId; + + @ApiModelProperty(value = "店铺名称") + private String shopName; + + @ApiModelProperty(value = "备注") + private String remark; + + private Page checkStockDetailVoList; + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/common/constant/PurchaseConstant.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/common/constant/PurchaseConstant.java new file mode 100644 index 00000000..351d211e --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/common/constant/PurchaseConstant.java @@ -0,0 +1,20 @@ +package cc.hiver.mall.common.constant; + +/** + * 店铺常量 + * + * @author cc + */ +public interface PurchaseConstant { + + /** + * 入库状态:0:待入库(未维护对应的采购价信息);1:已入库;2:ocr入库(未识别)3:ocr入库(已识别); + */ + int[] IN_STORAGE_STATUS = {0, 1, 2, 3}; + + /** + * ocr识别状态 0:(未识别)1:(已识别); + */ + int[] OCR_STATUS = {0, 1}; + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/aliocr/AliOcrConfig.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/aliocr/AliOcrConfig.java new file mode 100644 index 00000000..25c8f895 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/aliocr/AliOcrConfig.java @@ -0,0 +1,12 @@ +package cc.hiver.mall.config.aliocr; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "aliyun.openapi") +public class AliOcrConfig { + private String apiKey; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadConfig.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadConfig.java new file mode 100644 index 00000000..a686257e --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadConfig.java @@ -0,0 +1,22 @@ +package cc.hiver.mall.config.thread; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Data +@Component +public class ThreadConfig { + + @Value("${spring.task.execution.pool.core-size}") + private int corePoolSize; + + @Value("${spring.task.execution.pool.max-size}") + private int maxPoolSize; + + @Value("${spring.task.execution.pool.queue-capacity}") + private int queueCapacity; + + @Value("${spring.task.execution.pool.keep-alive}") + private int keepAliveSeconds; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadPoolConfiguration.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadPoolConfiguration.java new file mode 100644 index 00000000..74d83671 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadPoolConfiguration.java @@ -0,0 +1,51 @@ +package cc.hiver.mall.config.thread; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池bean + * + * @author 王富康 + * @date 2023/3/24 10:03 + **/ +@Configuration +@Component +public class ThreadPoolConfiguration { + + /** + * 核心线程池大小-32 + **/ + private int corePoolSize = 10; + /** + * 最大可创建的线程数-50 + **/ + private int maxPoolSize = 50; + /** + * 线程池维护线程所允许的空闲时间-60 + **/ + private int keepAliveTime = 60; + /** + * 队列最大长度-100 + **/ + private int queueCapacity = 100; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveTime); + //配置线程池中的线程的名称前缀 + executor.setThreadNamePrefix("ocr-"); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/TimerThread.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/TimerThread.java new file mode 100644 index 00000000..42830c09 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/TimerThread.java @@ -0,0 +1,65 @@ +package cc.hiver.mall.config.thread; + +import cc.hiver.core.common.utils.ResultUtil; +import cc.hiver.core.common.vo.Result; +import cc.hiver.mall.common.constant.PurchaseConstant; +import cc.hiver.mall.purchaseocr.entity.PurchaseOcrPicture; +import cc.hiver.mall.purchaseocr.service.PurchaseOcrPictureService; +import cc.hiver.mall.utils.AliOcrUtil; +import cn.hutool.json.JSONObject; +import com.alibaba.dashscope.exception.NoApiKeyException; +import com.alibaba.dashscope.exception.UploadFileException; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.concurrent.Callable; + +/** + * 请详细描述方法 + * @author 王富康 + * @date 2024/3/24 + */ +@Data +@Slf4j +public class TimerThread implements Callable { + + private PurchaseOcrPictureService purchaseOcrPictureService; + private List purchaseOcrPictureAddList; + + public TimerThread() { + } + + public TimerThread(List purchaseOcrPictureAddList,PurchaseOcrPictureService purchaseOcrPictureService) { + this.purchaseOcrPictureAddList = purchaseOcrPictureAddList; + this.purchaseOcrPictureService = purchaseOcrPictureService; + } + /** + * 每个线程拿到数据后如何去处理 + * + * @return + */ + public Result call() { + try { + log.info("当前线程名称:------------>>>>>"+Thread.currentThread().getName()); + for (PurchaseOcrPicture purchaseOcrPicture : purchaseOcrPictureAddList) { + try { + log.info("正在ocr识别:" + purchaseOcrPicture.getOcrPicture() + "
线程池名称:"+Thread.currentThread().getName()); + final JSONObject jsonObject = AliOcrUtil.simpleMultiModalConversationCall(purchaseOcrPicture.getOcrPicture()); + // 得到处理结果之后,开始新增库存的详细信息 + log.info("识别结果:" + jsonObject); + purchaseOcrPicture.setOcrMsg(jsonObject.get("msg").toString()); + purchaseOcrPicture.setOcrStatus(PurchaseConstant.OCR_STATUS[1]); + } catch (NoApiKeyException e) { + throw new RuntimeException(e); + } catch (UploadFileException e) { + throw new RuntimeException(e); + } + } + purchaseOcrPictureService.batchUpdate(purchaseOcrPictureAddList); + } catch (Exception e) { + log.error("timerThread出错,线程------>" + Thread.currentThread().getName(), e); + } + return ResultUtil.success(); + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java index b82aac4d..c676db63 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java @@ -77,7 +77,7 @@ public class OrderController { public Result> getByCondition(OrderXd order, SearchVo searchVo, PageVo pageVo) { - final Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); + final Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); return new ResultUtil>().setData(page); } @@ -135,6 +135,11 @@ public class OrderController { // 更新订单状态为待取货 orderxd.setOrderStatus(OrderConstant.ORDER_STATUS[1]); orderxd.setGetTime(new Date()); + // 增加配送人员的联系方式 + // 获取拉包工信息 + final Worker worker = workerService.findByWorkerId(orderXd.getOrderByWorker()); + final String workerMobile = worker.getMobile(); + orderxd.setWorkerMobile(workerMobile); orderService.update(orderxd); // 更新订单状态为待取货 final String orderId = orderxd.getOrderId(); @@ -151,6 +156,11 @@ public class OrderController { orderxd.setOrderByWorker(orderXd.getOrderByWorker()); // 更新订单状态为待取货 orderxd.setOrderStatus(OrderConstant.ORDER_STATUS[7]); + // 增加配送人员的联系方式 + // 获取拉包工信息 + final Worker worker = workerService.findByWorkerId(orderXd.getOrderByWorker()); + final String workerMobile = worker.getMobile(); + orderxd.setWorkerMobile(workerMobile); orderService.update(orderxd); // 更新订单状态为待取货 final String orderId = orderxd.getOrderId(); @@ -342,10 +352,10 @@ public class OrderController { saleService.saveOrUpdate(sale); // 扣减配送人员、配送公司的押金、增加店铺返佣 - String workId = orderQueryVO.getOrderByWorker(); - String transCompanyId = sale.getTransCompany(); - String shopId = sale.getShopId(); - String saleId = sale.getId(); + final String workId = orderQueryVO.getOrderByWorker(); + final String transCompanyId = sale.getTransCompany(); + final String shopId = sale.getShopId(); + final String saleId = sale.getId(); deductLogService.updateRebateAmount(workId, transCompanyId, shopId, saleId); } @@ -384,10 +394,11 @@ public class OrderController { /** * 后台管理系统获取订单信息 + * + * @param orderQueryVO + * @return Result> * @author 王富康 * @date 2024/2/27 - * @param orderQueryVO - * @return Result> */ @RequestMapping(value = "/ow/getOrderList", method = RequestMethod.POST) @ApiOperation("后台管理系统获取订单信息") @@ -398,24 +409,25 @@ public class OrderController { /** * 转单接口 - * @author 王富康 - * @date 2024/2/27 + * * @param orderXd * @return Result + * @author 王富康 + * @date 2024/2/27 */ @RequestMapping(value = "/ow/transferOrder", method = RequestMethod.POST) @ApiOperation("转单接口") public Result transferOrder(@RequestBody OrderVO orderVO) { - if(StringUtils.isEmpty(orderVO.getOrderId())){ + if (StringUtils.isEmpty(orderVO.getOrderId())) { return ResultUtil.error("订单信息不能为空!"); } - if(StringUtils.isEmpty(orderVO.getOrderByWorker())){ + if (StringUtils.isEmpty(orderVO.getOrderByWorker())) { return ResultUtil.error("转单人员不能为空!"); } - try{ + try { orderService.transferOrder(orderVO); return ResultUtil.success("转单成功"); - }catch (Exception e){ + } catch (Exception e) { return ResultUtil.error("转单失败"); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java index 969a8328..892d075a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java @@ -4,6 +4,7 @@ import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.vo.Result; import cc.hiver.mall.entity.ProductCategory; +import cc.hiver.mall.pojo.vo.ProductCategoryVo; import cc.hiver.mall.service.mybatis.ProductCategoryService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; @@ -11,6 +12,7 @@ import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -80,4 +82,15 @@ public class ProductCategoryController { return new ResultUtil>().setData(list); } + + @RequestMapping(value = "/batchSaveCategoryAndAttribute", method = RequestMethod.POST) + @ApiOperation(value = "一键新增类别及分类信息") + public Result batchSaveCategoryAndAttribute(@RequestBody ProductCategoryVo productCategoryVo) { + boolean result = productCategoryService.batchSaveCategoryAndAttribute(productCategoryVo); + if (result) { + return ResultUtil.success("添加成功"); + } else { + return ResultUtil.error("添加失败"); + } + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java index 18791e7c..238c2019 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java @@ -2,6 +2,7 @@ package cc.hiver.mall.controller; import cc.hiver.core.common.annotation.RateLimiter; import cc.hiver.core.common.constant.CommonConstant; +import cc.hiver.core.common.constant.ProductConstant; import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.vo.Result; @@ -66,7 +67,7 @@ public class ProductController { @ApiOperation(value = "根据货品id上架货品") public Result up(String id) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("del_flag", 1); + updateWrapper.set("del_flag", ProductConstant.DEL_FLAG[1]); updateWrapper.eq("id", id); boolean result = productService.update(updateWrapper); if (result) { @@ -80,7 +81,7 @@ public class ProductController { @ApiOperation(value = "根据货品id下架货品") public Result down(String id) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("del_flag", 0); + updateWrapper.set("del_flag", ProductConstant.DEL_FLAG[0]); updateWrapper.eq("id", id); boolean result = productService.update(updateWrapper); if (result) { @@ -92,8 +93,11 @@ public class ProductController { @RequestMapping(value = "/delById", method = RequestMethod.POST) @ApiOperation(value = "根据id删除货品") - public Result delete(@RequestBody Product product) { - boolean result = productService.removeById(product); + public Result delete(String id) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("del_flag", ProductConstant.DEL_FLAG[2]); + updateWrapper.eq("id", id); + boolean result = productService.update(updateWrapper); if (result) { return ResultUtil.success("删除成功"); } else { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PurchaseController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PurchaseController.java index a5de184d..19e99a89 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PurchaseController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PurchaseController.java @@ -51,6 +51,7 @@ public class PurchaseController { final Purchase purchase = purchaseVo.getPurchase(); final List purchaseDetails = purchaseVo.getPurchaseDetails(); final Random random = new Random(); + // 生成条码 for (PurchaseDetail purchaseDetail : purchaseDetails) { final StringBuilder sb = new StringBuilder(); for (int i = 0; i < 20; i++) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java index 9ed44bed..9fdf9612 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java @@ -25,7 +25,7 @@ import java.util.List; @Slf4j @RestController -@Api(tags = "店铺返佣接口") +@Api(tags = "店铺提现接口") @RequestMapping("/hiver/app/returnCommission/") @Transactional public class ReturnCommissionController { @@ -39,7 +39,7 @@ public class ReturnCommissionController { private SecurityUtil securityUtil; @RequestMapping(value = "/save", method = RequestMethod.POST) - @ApiOperation("新增店铺返佣") + @ApiOperation("新增店铺提现") public Result save(ReturnCommission returnCommission) { final boolean result = returnCommissionService.save(returnCommission); if (result) { @@ -72,7 +72,7 @@ public class ReturnCommissionController { } @RequestMapping(value = "/listWithNoReturn", method = RequestMethod.GET) - @ApiOperation(value = "查询商铺未处理的返佣记录", httpMethod = "GET") + @ApiOperation(value = "查询商铺未处理的提现记录", httpMethod = "GET") public Result listWithNoReturn(@ApiParam(value = "商铺id", required = true) @RequestParam(value = "shopId", required = true) String shopId) { final QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("shop_id", shopId); @@ -96,7 +96,7 @@ public class ReturnCommissionController { @Transactional @RequestMapping(value = "/handleReturn", method = RequestMethod.POST) - @ApiOperation("返佣处理") + @ApiOperation("提现处理") public Result handleReturn(@RequestBody ReturnCommission returnCommission) { final String shopId = securityUtil.getShopId(); @@ -156,12 +156,12 @@ public class ReturnCommissionController { returnCommission.setRemark(e.getErrMsg()); aliResult = "支付宝转账失败,请联系管理员!"; } - //2.修改返佣记录 + //2.修改提现记录 result = returnCommissionService.save(returnCommission); if (result) { return ResultUtil.success("处理完成," + aliResult); } else { - return ResultUtil.error("修改返佣数据失败," + aliResult); + return ResultUtil.error("修改提现数据失败," + aliResult); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnSaleController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnSaleController.java index 12bd505a..3b4e580d 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnSaleController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnSaleController.java @@ -425,4 +425,15 @@ public class ReturnSaleController { final long waitReturnCount = returnSaleService.count(querySaleWrapper); return ResultUtil.data(waitReturnCount); } + + @RequestMapping(value = "/cancelOrder", method = RequestMethod.POST) + @ApiOperation("取消配送") + public Result cancelOrder(String orderId) { + final ReturnSale returnSale = returnSaleService.getById(orderId); + returnSale.setStatus(SaleConstant.SALE_STATUS[4]); + returnSaleService.saveOrUpdate(returnSale); + // 同时取消订单 + orderService.delete(orderId); + return ResultUtil.success("取消配送成功"); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java index 06f74416..760b307c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java @@ -898,4 +898,14 @@ public class SaleController { final Page saleNoWorkerVOPage = saleService.getSaleByCompanyId(salePageQuery); return ResultUtil.data(saleNoWorkerVOPage); } + + @RequestMapping(value = "/companyGetSale", method = RequestMethod.POST) + @ApiOperation("物流公司-确认取货") + public Result companyGetSale(String saleId) { + if(StringUtils.isEmpty(saleId)){ + ResultUtil.error("订单id不能为空"); + } + saleService.companyGetSale(saleId); + return ResultUtil.success("取货成功!"); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/StockController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/StockController.java index 90341766..80f30daa 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/StockController.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/StockController.java @@ -4,9 +4,11 @@ import cc.hiver.core.common.utils.ResultUtil; import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.vo.Result; import cc.hiver.mall.entity.Stock; +import cc.hiver.mall.pojo.query.StockPageQuery; import cc.hiver.mall.pojo.vo.ProductCategoryStockVo; import cc.hiver.mall.pojo.vo.PurchaseVo; import cc.hiver.mall.pojo.vo.ShopStockVo; +import cc.hiver.mall.pojo.vo.StockProductVo; import cc.hiver.mall.service.mybatis.StockService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.swagger.annotations.Api; @@ -169,5 +171,18 @@ public class StockController { return ResultUtil.data(list); } + /** + * 获取店铺所有达到库存预警的商品信息 + * @author 王富康 + * @date 2024/3/18 + * @param stockPageQuery + * @return Result + */ + @RequestMapping(value = "/getTailWarnProduct", method = RequestMethod.POST) + @ApiOperation(value = "获取店铺所有达到库存预警的商品信息") + public Result getTailWarnProduct(StockPageQuery stockPageQuery){ + final List checkStockList = stockService.getTailWarnProduct(stockPageQuery); + return new ResultUtil>().setData(checkStockList); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/PurchaseDetailMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/PurchaseDetailMapper.java index 9e9a5ad7..5b597a37 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/PurchaseDetailMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/PurchaseDetailMapper.java @@ -33,5 +33,5 @@ public interface PurchaseDetailMapper extends BaseMapper { List getByPurchaseId(String id); - List getByPurchaseIdList(@Param("purchaseIds") List purchaseIds); + List getByPurchaseIdList(@Param("purchaseIds") List purchaseIds, @Param("productId") String productId); } \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java index 42b97756..2e38c507 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java @@ -3,6 +3,7 @@ package cc.hiver.mall.dao.mapper; import cc.hiver.mall.entity.Sale; import cc.hiver.mall.entity.SaleExample; import cc.hiver.mall.pojo.dto.ShopRevenue; +import cc.hiver.mall.pojo.query.SalePageQuery; import cc.hiver.mall.pojo.query.SalesRankingQueryCriteria; import cc.hiver.mall.pojo.vo.*; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -73,5 +74,7 @@ public interface SaleMapper extends BaseMapper { Page getSupplierBuyProductLog(Page page, @Param("supplierId") String supplierId, @Param("shopId") String shopId); - Page getSaleByCompanyId(Page page, @Param("companyId") String companyId); + Page getSaleByCompanyId(Page page, @Param("salePageQuery") SalePageQuery salePageQuery); + + void companyGetSale(@Param("saleId")String saleId); } \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockLogMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockLogMapper.java index 6baae65d..e418f0b7 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockLogMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockLogMapper.java @@ -33,5 +33,5 @@ public interface StockLogMapper extends BaseMapper { int updateByPrimaryKey(StockLog record); - List getByPurchaseIds(@Param("purchaseIds") List purchaseIds); + List getByPurchaseIds(@Param("purchaseIds") List purchaseIds,@Param("productId")String productId); } \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockMapper.java index d91d5b2b..08850d99 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockMapper.java @@ -2,6 +2,7 @@ package cc.hiver.mall.dao.mapper; import cc.hiver.mall.entity.Stock; import cc.hiver.mall.entity.StockExample; +import cc.hiver.mall.pojo.query.StockPageQuery; import cc.hiver.mall.pojo.vo.ProductCategoryStockVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; @@ -37,4 +38,6 @@ public interface StockMapper extends BaseMapper { String productCount(@Param("productId")String productId, @Param("attributeList")String attributeList); List getlistByAttributeList(@Param("id")String id, @Param("shopId")String shopId, @Param("attributeList")String attributeList); + + List getTailWarnProduct(@Param("stockPageQuery") StockPageQuery stockPageQuery); } \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/deductlog/service/impl/DeductLogServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/deductlog/service/impl/DeductLogServiceImpl.java index ab8b222a..956dc7cf 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/deductlog/service/impl/DeductLogServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/deductlog/service/impl/DeductLogServiceImpl.java @@ -128,7 +128,11 @@ public class DeductLogServiceImpl extends ServiceImpl0){ + // 固定扣减金额大于0,才去更新,否则,没变化不用更新 + workerService.update(worker); + } + } // 获取物流公司信息 @@ -143,58 +147,61 @@ public class DeductLogServiceImpl extends ServiceImpl0){ + companyService.update(logiticsCompany); + } } - // 获取店铺信息 - final Shop shop = shopService.findById(shopId); - final String shopName = shop.getShopName(); - // 返佣金额 - final BigDecimal shopBefRebateAmount = shop.getRebateAmount() == null ? BigDecimal.valueOf(0) : shop.getRebateAmount(); - - // 本次返佣金额 - final BigDecimal shopRebateAmount = companyRebateAmount.add(workerRebateAmount); - // 返佣后金额 - final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.add(shopRebateAmount); - // 更新返佣金额 - shop.setRebateAmount(shopAfterRebateAmount); - shopService.update(shop); - - // 保存押金扣减记录表 - final DeductLog deductLog = new DeductLog(); - deductLog.setCreateTime(new Date()); - deductLog.setSaleId(saleId); - deductLog.setCompanyId(transCompanyId); - deductLog.setCompanyName(companyName); - deductLog.setCompanyFixedAmount(companyFixedAmount); - deductLog.setCompanyRebateAmount(companyRebateAmount); - deductLog.setCompanyBefDepoBal(companyDepoBal); - deductLog.setCompanyAfterDepoBal(companyAfterDepoBal); - - if (StringUtils.isNotEmpty(workId) && worker != null) { - // 选择了拉包工,那么就需要返佣 - deductLog.setWorkerId(worker.getWorkerId()); - deductLog.setWorkerName(worker.getWorkerName()); - deductLog.setWorkerFixedAmount(workerFixedAmount); - deductLog.setWorkerRebateAmount(workerRebateAmount); - deductLog.setWorkerBefDepoBal(workerBefDepoBal); - deductLog.setWorkerAfterDepoBal(workerAfterDepoBal); + // 如果拉包工的返佣金额或者物流公司的返佣金额任意之一大于0,才去更新,店铺返佣金额,及更新记录 + if(companyRebateAmount.compareTo(BigDecimal.valueOf(0))>0 ||workerRebateAmount.compareTo(BigDecimal.valueOf(0))>0){ + // 获取店铺信息 + final Shop shop = shopService.findById(shopId); + final String shopName = shop.getShopName(); + // 返佣金额 + final BigDecimal shopBefRebateAmount = shop.getRebateAmount() == null ? BigDecimal.valueOf(0) : shop.getRebateAmount(); + // 本次返佣金额 + final BigDecimal shopRebateAmount = companyRebateAmount.add(workerRebateAmount); + // 返佣后金额 + final BigDecimal shopAfterRebateAmount = shopBefRebateAmount.add(shopRebateAmount); + // 更新返佣金额 + shop.setRebateAmount(shopAfterRebateAmount); + shopService.update(shop); + + // 保存押金扣减记录表 + final DeductLog deductLog = new DeductLog(); + deductLog.setCreateTime(new Date()); + deductLog.setSaleId(saleId); + deductLog.setCompanyId(transCompanyId); + deductLog.setCompanyName(companyName); + deductLog.setCompanyFixedAmount(companyFixedAmount); + deductLog.setCompanyRebateAmount(companyRebateAmount); + deductLog.setCompanyBefDepoBal(companyDepoBal); + deductLog.setCompanyAfterDepoBal(companyAfterDepoBal); + + if (StringUtils.isNotEmpty(workId) && worker != null) { + // 选择了拉包工,那么就需要返佣 + deductLog.setWorkerId(worker.getWorkerId()); + deductLog.setWorkerName(worker.getWorkerName()); + deductLog.setWorkerFixedAmount(workerFixedAmount); + deductLog.setWorkerRebateAmount(workerRebateAmount); + deductLog.setWorkerBefDepoBal(workerBefDepoBal); + deductLog.setWorkerAfterDepoBal(workerAfterDepoBal); + } + + deductLog.setShopId(shopId); + deductLog.setShopName(shopName); + deductLog.setShopBefRebateAmount(shopBefRebateAmount); + deductLog.setShopAfterRebateAmount(shopAfterRebateAmount); + deductLog.setShopRebateAmount(shopRebateAmount); + if (shopBefRebateAmount.compareTo(BigDecimal.valueOf(0)) > 0) { + // 返佣金额大于0的时候再保存返佣记录 + saveDeductLog(deductLog); + } } - - deductLog.setShopId(shopId); - deductLog.setShopName(shopName); - deductLog.setShopBefRebateAmount(shopBefRebateAmount); - deductLog.setShopAfterRebateAmount(shopAfterRebateAmount); - deductLog.setShopRebateAmount(shopRebateAmount); - if (shopBefRebateAmount.compareTo(BigDecimal.valueOf(0)) > 0) { - // 返佣金额大于0的时候再保存返佣记录 - saveDeductLog(deductLog); - } - } @Override diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Customer.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Customer.java index 16e633cc..041fd592 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Customer.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Customer.java @@ -60,4 +60,8 @@ public class Customer implements Serializable { @ApiModelProperty(value = "登录账号") private String userName; + @TableField(exist = false) + @ApiModelProperty(value = "欠款") + private String noEarn; + } \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/OrderXd.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/OrderXd.java index a7b7cdf1..fe325d37 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/OrderXd.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/OrderXd.java @@ -215,6 +215,12 @@ public class OrderXd implements Serializable { @Column(name = "transCompany") private String transCompany; + /** + * 运送公司名称 + */ + @ApiModelProperty("运送公司名称") + private String companyName; + /** * 乐观锁 */ diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ProductCategory.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ProductCategory.java index 649ca18d..e629cde7 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ProductCategory.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ProductCategory.java @@ -1,29 +1,15 @@ package cc.hiver.mall.entity; -import cc.hiver.core.common.utils.SnowFlakeUtil; +import cc.hiver.core.base.HiverBaseEntity; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import java.io.Serializable; -import java.util.Date; - @Data @ApiModel(value = "商品类别表") @TableName(value = "t_product_category", autoResultMap = true) -public class ProductCategory implements Serializable { - private String id = SnowFlakeUtil.nextId().toString(); - - private String createBy; - - private Date createTime; - - private Integer delFlag; - - private String updateBy; - - private Date updateTime; +public class ProductCategory extends HiverBaseEntity { @ApiModelProperty(value = "商品类别名称") private String categoryName; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnSale.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnSale.java index 4c283c4f..12abd1e4 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnSale.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnSale.java @@ -94,6 +94,9 @@ public class ReturnSale implements Serializable { @ApiModelProperty(value = "物流公司") private String transCompany; + @ApiModelProperty(value = "物流公司") + private String transCompanyName; + @ApiModelProperty(value = "下单总件数") private int productCount; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java index fd5bc290..f7f72d1a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java @@ -99,7 +99,7 @@ public class Sale implements Serializable { @ApiModelProperty(value = "订单状态 1-拣货中 2-已预定 3-已作废 4-已取货 5-已送达") private String status; - @ApiModelProperty(value = "物流类别 1-物流 2-自提 3-快递 4-拼单") + @ApiModelProperty(value = "物流类别 1-物流 2-自提 3-快递 4-拼单 8-物流上门(待取货) 9-物流上门(已取货)") private String transportType; @ApiModelProperty(value = "拼单店铺地址 为拼单类别时手动输入") @@ -138,6 +138,9 @@ public class Sale implements Serializable { @ApiModelProperty(value="其他费用") private BigDecimal otherExpense; + @ApiModelProperty(value="配送方式 0-平台配送 1-自送 2-物流自提") + private String modeOfService; + @Transient @TableField(exist = false) @ApiModelProperty(value="商品详情") diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Share.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Share.java index eca2d02b..805ea58a 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Share.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Share.java @@ -76,6 +76,9 @@ public class Share extends HiverBaseEntity { @ApiModelProperty(value = "商铺id") private String shopId; + @ApiModelProperty(value = "商铺名称") + private String shopName; + @ApiModelProperty(value = "勾选分享时,存的商品主键") private String shareProductId; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/mapper/OperatingAreaMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/mapper/OperatingAreaMapper.java index eb9983c7..81f4182b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/mapper/OperatingAreaMapper.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/mapper/OperatingAreaMapper.java @@ -14,6 +14,7 @@ import java.util.List; public interface OperatingAreaMapper extends BaseMapper { List getByArea(@Param("province") String province, @Param("city") String city, @Param("area") String area, @Param("shippingType") String shippingType, @Param("seachParams") String seachParams); + List getByAreaOfCompany(@Param("province") String province, @Param("city") String city, @Param("area") String area, @Param("shippingType") String shippingType, @Param("seachParams") String seachParams); List getOperatingAreaList(Page page, @Param("queryParams") OperatingAreaPageQuery operatingAreaPageQuery); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/service/impl/OperatingAreaServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/service/impl/OperatingAreaServiceImpl.java index b4b4e4a5..bef52597 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/service/impl/OperatingAreaServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/service/impl/OperatingAreaServiceImpl.java @@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -48,21 +49,23 @@ public class OperatingAreaServiceImpl extends ServiceImpl resultMap = new HashMap<>(); // 当输入搜索条件时不需要查询线路相关的,只需要返回符合条件的物流公司信息即可 - // if(StringUtils.isEmpty(seachParams)){ + if(StringUtils.isEmpty(seachParams)){ // 根据区域获取物流公司 - final List operatingAreaList = operatingAreaMapper.getByArea(province, city, area, shippingType, seachParams); + final List operatingAreaList = operatingAreaMapper.getByAreaOfCompany(province, city, area, shippingType, seachParams); resultMap.put("operatingAreaList", operatingAreaList); - // } - - // 获取所有已上线、未删除的物流公司 - final LogiticsCompanyQueryVo logiticsCompany = new LogiticsCompanyQueryVo(); - // 根据公司名称模糊查询的 - logiticsCompany.setSeachParams(seachParams); - logiticsCompany.setDelFlag(CommonConstant.DEL_FLAG_FALSE); - logiticsCompany.setIsOnLine(CommonConstant.ON_LINE); - logiticsCompany.setSignCompany(shippingType); - final List logiticsCompanyList = logiticsCompanyService.findByCondition(logiticsCompany); - resultMap.put("logiticsCompanyList", logiticsCompanyList); + // 获取所有已上线、未删除的物流公司 + final LogiticsCompanyQueryVo logiticsCompany = new LogiticsCompanyQueryVo(); + // 根据公司名称模糊查询的 + logiticsCompany.setSeachParams(seachParams); + logiticsCompany.setDelFlag(CommonConstant.DEL_FLAG_FALSE); + logiticsCompany.setIsOnLine(CommonConstant.ON_LINE); + logiticsCompany.setSignCompany(shippingType); + final List logiticsCompanyList = logiticsCompanyService.findByCondition(logiticsCompany); + resultMap.put("logiticsCompanyList", logiticsCompanyList); + }else{ + final List operatingAreaList = operatingAreaMapper.getByAreaOfCompany(province, city, area, shippingType, seachParams); + resultMap.put("operatingAreaList", operatingAreaList); + } return resultMap; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/vo/OperatingAreaPageVO.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/vo/OperatingAreaPageVO.java index f0d76a7d..3b640e09 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/vo/OperatingAreaPageVO.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/vo/OperatingAreaPageVO.java @@ -60,4 +60,10 @@ public class OperatingAreaPageVO { @ApiModelProperty("返佣金额") private String rebateAmount; + + @ApiModelProperty("上线状态") + private String isOnLine; + + @ApiModelProperty(value = "是否支持上门取货") + private Integer canToDoor; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java index 79a453f5..e9e93891 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java @@ -61,6 +61,9 @@ public class ProductPageQuery extends HiverBasePageQuery { @ApiModelProperty("排序规则(asc:升序;desc:降序)") private String sort; + @ApiModelProperty("根据商品状态查询,这里暂时只有分享页使用到了,传1,只查询上架状态的数据") + private Integer delFlag; + @ApiModelProperty("查询条件") private String searchStr; } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/SalePageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/SalePageQuery.java index f340a1b6..48e002f5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/SalePageQuery.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/SalePageQuery.java @@ -42,4 +42,13 @@ public class SalePageQuery extends HiverBasePageQuery { @ApiModelProperty("物流公司id") private String companyId; + @ApiModelProperty("配送方式") + private String transportType; + + @ApiModelProperty(value="配送方式 0-平台配送 1-自送 2-物流自提") + private String modeOfService; + + @ApiModelProperty("订单状态") + private String status; + } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/StockPageQuery.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/StockPageQuery.java index 03abbe96..4495ed1e 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/StockPageQuery.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/StockPageQuery.java @@ -32,5 +32,11 @@ public class StockPageQuery extends HiverBasePageQuery { @ApiModelProperty("商品ID") private String productId; + @ApiModelProperty("商品ID") + private String shopId; + + @ApiModelProperty("查询条件") + private String searchStr; + } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeOfAddVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeOfAddVo.java new file mode 100644 index 00000000..39911b2e --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeOfAddVo.java @@ -0,0 +1,24 @@ +package cc.hiver.mall.pojo.vo; + +import cc.hiver.core.base.HiverBaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "商品规格属性") +public class ProductAttributeOfAddVo extends HiverBaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品类别ID") + private String categoryId; + + @ApiModelProperty(value = "属性名称") + private String attributeName; + + private List productAttributeValueVoList; + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeValueVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeValueVo.java new file mode 100644 index 00000000..a0d11ec5 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeValueVo.java @@ -0,0 +1,20 @@ +package cc.hiver.mall.pojo.vo; + +import cc.hiver.core.base.HiverBaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "商品属性值表") +public class ProductAttributeValueVo extends HiverBaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品属性ID") + private String attributeId; + + @ApiModelProperty(value = "属性值") + private String value; + +} \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo.java new file mode 100644 index 00000000..e0993129 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo.java @@ -0,0 +1,26 @@ +package cc.hiver.mall.pojo.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel(value = "类别Vo") +public class ProductCategoryVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品类别名称") + private String categoryName; + + @ApiModelProperty(value = "店铺id") + private String shopId; + + @ApiModelProperty(value = "分类列表") + private List productAttributeOfAddVos; + + +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockAttributeVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockAttributeVo.java new file mode 100644 index 00000000..7c9ee92d --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockAttributeVo.java @@ -0,0 +1,15 @@ +package cc.hiver.mall.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class StockAttributeVo { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品规格") + private String attributeList; + + @ApiModelProperty(value = "库存数") + private Integer stockCount; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockProductVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockProductVo.java new file mode 100644 index 00000000..04867474 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockProductVo.java @@ -0,0 +1,32 @@ +package cc.hiver.mall.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class StockProductVo { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品名称") + private String productName; + + @ApiModelProperty(value = "货号") + private String productSn; + + @ApiModelProperty(value = "货品图片") + private String productPicture; + + @ApiModelProperty(value = "条码") + private String barcode; + + @ApiModelProperty(value = "尾货预警") + private Integer tailWarn; + + @ApiModelProperty(value = "商品总库存(某一规格库存为负数的按0计算总数)") + private Integer stockCount; + + @ApiModelProperty(value = "商品规格") + private List stockAttributeVoList; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/controller/PurchaseOcrPictureController.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/controller/PurchaseOcrPictureController.java new file mode 100644 index 00000000..30f30783 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/controller/PurchaseOcrPictureController.java @@ -0,0 +1,54 @@ +package cc.hiver.mall.purchaseocr.controller; + +import cc.hiver.core.common.utils.ResultUtil; +import cc.hiver.core.common.vo.Result; +import cc.hiver.mall.purchaseocr.service.PurchaseOcrPictureService; +import cc.hiver.mall.purchaseocr.vo.PurchaseOciPictureAddVo; +import cn.hutool.json.JSONObject; +import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult; +import com.alibaba.dashscope.exception.InputRequiredException; +import com.alibaba.dashscope.exception.NoApiKeyException; +import com.alibaba.dashscope.exception.UploadFileException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Slf4j +@RestController +@Api(tags = "问题反馈接口") +@RequestMapping("/hiver/purchaseOcrPicture/") +@Transactional +public class PurchaseOcrPictureController { + + @Autowired + private PurchaseOcrPictureService purchaseOcrPictureService; + + @RequestMapping(value = "/batchSave", method = RequestMethod.POST) + @ApiOperation("新增或编辑OCR识别信息") + public Result batchSave(@RequestBody PurchaseOciPictureAddVo purchaseOciPictureAddVo) { + JSONObject jsonObject = purchaseOcrPictureService.batchSave(purchaseOciPictureAddVo); + return new ResultUtil().setData(jsonObject); + } + + @RequestMapping(value = "/invoicingAi", method = RequestMethod.POST) + @ApiOperation("AI开单") + public Result invoicingAi(String questionMsg) throws NoApiKeyException, InputRequiredException { + JSONObject jsonObject = purchaseOcrPictureService.invoicingAi(questionMsg); + return new ResultUtil().setData(jsonObject); + } + + @RequestMapping(value = "/multiRoundConversationCall", method = RequestMethod.POST) + @ApiOperation("图片识别-多轮对话") + public List multiRoundConversationCall(String picturePath, String firstQuestionMsg, String secondQuestionMsg) throws NoApiKeyException, InputRequiredException, UploadFileException { + List multiModalConversationResults = purchaseOcrPictureService.multiRoundConversationCall(picturePath,firstQuestionMsg, secondQuestionMsg); + return multiModalConversationResults; + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/entity/PurchaseOcrPicture.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/entity/PurchaseOcrPicture.java new file mode 100644 index 00000000..a034e88c --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/entity/PurchaseOcrPicture.java @@ -0,0 +1,42 @@ +package cc.hiver.mall.purchaseocr.entity; + +import cc.hiver.core.base.HiverBaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * ai图片表 + * @author 王富康 + * @date 2024/3/23 + */ +@Data +@ApiModel(value = "ai图片表") +@TableName(value = "t_purchase_ocr_picture", autoResultMap = true) +public class PurchaseOcrPicture extends HiverBaseEntity { + + @ApiModelProperty(value = "创建人名称") + private String createByName; + + @ApiModelProperty(value = "采购单id") + private String orderId; + + @ApiModelProperty(value = "图片路径") + private String ocrPicture; + + @ApiModelProperty(value = "图片顺序") + private String ocrPictureOrder; + + @ApiModelProperty(value = "识别标识:0:未识别;1:识别成功;2:识别失败") + private Integer ocrStatus; + + @ApiModelProperty(value = "识别结果") + private String ocrMsg; + + @ApiModelProperty(value = "店铺ID") + private String shopId; + + @ApiModelProperty(value = "店铺名称") + private String shopName; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/mapper/PurchaseOcrPictureMapper.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/mapper/PurchaseOcrPictureMapper.java new file mode 100644 index 00000000..f28afbff --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/mapper/PurchaseOcrPictureMapper.java @@ -0,0 +1,13 @@ +package cc.hiver.mall.purchaseocr.mapper; + +import cc.hiver.mall.purchaseocr.entity.PurchaseOcrPicture; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface PurchaseOcrPictureMapper extends BaseMapper { + void batchSave(@Param("purchaseOcrPictureList") List purchaseOcrPictureList); + + void batchUpdate(@Param("purchaseOcrPictureList") List purchaseOcrPictureAddList); +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/PurchaseOcrPictureService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/PurchaseOcrPictureService.java new file mode 100644 index 00000000..0c7813c5 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/PurchaseOcrPictureService.java @@ -0,0 +1,20 @@ +package cc.hiver.mall.purchaseocr.service; + +import cc.hiver.mall.purchaseocr.entity.PurchaseOcrPicture; +import cc.hiver.mall.purchaseocr.vo.PurchaseOciPictureAddVo; +import cn.hutool.json.JSONObject; +import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult; +import com.alibaba.dashscope.exception.InputRequiredException; +import com.alibaba.dashscope.exception.NoApiKeyException; +import com.alibaba.dashscope.exception.UploadFileException; + +import java.util.List; + +public interface PurchaseOcrPictureService { + JSONObject batchSave(PurchaseOciPictureAddVo purchaseOciPictureAddVo); + void batchUpdate(List purchaseOcrPictureList); + + JSONObject invoicingAi(String questionMsg) throws NoApiKeyException, InputRequiredException; + + List multiRoundConversationCall(String picturePath,String firstQuestionMsg, String secondQuestionMsg) throws NoApiKeyException, InputRequiredException, UploadFileException; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java new file mode 100644 index 00000000..979a6339 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java @@ -0,0 +1,111 @@ +package cc.hiver.mall.purchaseocr.service.impl; + +import cc.hiver.core.common.utils.SecurityUtil; +import cc.hiver.core.common.vo.Result; +import cc.hiver.mall.common.constant.PurchaseConstant; +import cc.hiver.mall.config.thread.TimerThread; +import cc.hiver.mall.entity.Purchase; +import cc.hiver.mall.purchaseocr.entity.PurchaseOcrPicture; +import cc.hiver.mall.purchaseocr.mapper.PurchaseOcrPictureMapper; +import cc.hiver.mall.purchaseocr.service.PurchaseOcrPictureService; +import cc.hiver.mall.purchaseocr.vo.PurchaseOciPictureAddVo; +import cc.hiver.mall.service.mybatis.PurchaseService; +import cc.hiver.mall.utils.AliOcrUtil; +import cn.hutool.json.JSONObject; +import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult; +import com.alibaba.dashscope.exception.InputRequiredException; +import com.alibaba.dashscope.exception.NoApiKeyException; +import com.alibaba.dashscope.exception.UploadFileException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.CompletionService; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.Future; + +@Slf4j +@Service +public class PurchaseOcrPictureServiceImpl implements PurchaseOcrPictureService { + + @Autowired + private PurchaseOcrPictureMapper purchaseOcrPictureMapper; + + @Autowired + private SecurityUtil securityUtil; + + @Autowired + private PurchaseService purchaseService; + + @Autowired + private PurchaseOcrPictureService purchaseOcrPictureService; + + @Autowired + ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Override + public JSONObject batchSave(PurchaseOciPictureAddVo purchaseOciPictureAddVo) { + final JSONObject jsonObject = new JSONObject(); + // shopId从缓存中设置 + final String shopId = "wfkde"; + // 如果采购单位空,那么就需要新增采购单信息 + if (StringUtils.isEmpty(purchaseOciPictureAddVo.getOrderId())) { + final Purchase purchase = new Purchase(); + // 新增的对象会有id,将新增的id放到参数中取 + purchaseOciPictureAddVo.setOrderId(purchase.getId()); + purchase.setShopId(shopId); + // 设置为ocr识别(未识别)状态 + purchase.setInStorageStatus(PurchaseConstant.IN_STORAGE_STATUS[2]); + final boolean save = purchaseService.save(purchase); + } + // 然后批量新增图片 + final List purchaseOcrPictureList = purchaseOciPictureAddVo.getPurchaseOcrPictureList(); + final CopyOnWriteArrayList purchaseOcrPictureAddList = new CopyOnWriteArrayList<>(); + + for (PurchaseOcrPicture purchaseOcrPicture : purchaseOcrPictureList) { + // todo 如果前台传了id,后台会覆盖么 + final String id = purchaseOcrPicture.getId(); + final PurchaseOcrPicture oldPurchaseOcrPicture = purchaseOcrPictureMapper.selectById(id); + if(oldPurchaseOcrPicture ==null ){ + final PurchaseOcrPicture addPurchaseOcrPicture = new PurchaseOcrPicture(); + // 如果是修改新增的图片,需要增加图片信息 + addPurchaseOcrPicture.setShopId(shopId); + addPurchaseOcrPicture.setOcrPicture(purchaseOcrPicture.getOcrPicture()); + addPurchaseOcrPicture.setOrderId(purchaseOciPictureAddVo.getOrderId()); + addPurchaseOcrPicture.setOcrStatus(PurchaseConstant.OCR_STATUS[0]); + purchaseOcrPictureAddList.add(addPurchaseOcrPicture); + } + } + purchaseOcrPictureMapper.batchSave(purchaseOcrPictureAddList); + // 异步处理ocr识别 + try { + CompletionService> service = new ExecutorCompletionService<>(threadPoolTaskExecutor); + TimerThread timerThread = new TimerThread(purchaseOcrPictureAddList,purchaseOcrPictureService); + // 这里可以使用线程池,也可以使用CompletionService处理,运行任务需要是callable的,需要最终结果。 + final Future submit = service.submit(timerThread); + } catch (Exception e) { + log.error("异步处理ocr识别失败", e); + } + jsonObject.set("msg", "success"); + return jsonObject; + } + + @Override + public void batchUpdate(List purchaseOcrPictureList) { + purchaseOcrPictureMapper.batchUpdate(purchaseOcrPictureList); + } + + @Override + public JSONObject invoicingAi(String questionMsg) throws NoApiKeyException, InputRequiredException { + return AliOcrUtil.callWithMessage(questionMsg); + } + + @Override + public List multiRoundConversationCall(String picturePath,String firstQuestionMsg, String secondQuestionMsg) throws NoApiKeyException, InputRequiredException, UploadFileException { + return AliOcrUtil.multiRoundConversationCall(picturePath,firstQuestionMsg,secondQuestionMsg); + } +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/vo/PurchaseOciPictureAddVo.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/vo/PurchaseOciPictureAddVo.java new file mode 100644 index 00000000..66ced0d1 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/vo/PurchaseOciPictureAddVo.java @@ -0,0 +1,17 @@ +package cc.hiver.mall.purchaseocr.vo; + +import cc.hiver.mall.purchaseocr.entity.PurchaseOcrPicture; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class PurchaseOciPictureAddVo { + + @ApiModelProperty(value = "采购单id") + private String orderId; + + @ApiModelProperty(value = "Oci图片信息") + private List purchaseOcrPictureList; +} diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductCategoryService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductCategoryService.java index 5c04412e..d508453b 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductCategoryService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductCategoryService.java @@ -1,7 +1,9 @@ package cc.hiver.mall.service.mybatis; import cc.hiver.mall.entity.ProductCategory; +import cc.hiver.mall.pojo.vo.ProductCategoryVo; import com.baomidou.mybatisplus.extension.service.IService; public interface ProductCategoryService extends IService { + boolean batchSaveCategoryAndAttribute(ProductCategoryVo productCategoryVo); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/PurchaseDetailService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/PurchaseDetailService.java index 7a35a41b..dc9ea94c 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/PurchaseDetailService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/PurchaseDetailService.java @@ -9,5 +9,5 @@ public interface PurchaseDetailService extends IService { List getByPurchaseId(String id); - List getByPurchaseIdList(List purchaseIds); + List getByPurchaseIdList(List purchaseIds, String productId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java index 333b4236..81e9c1fb 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java @@ -47,4 +47,6 @@ public interface SaleService extends IService { Page getSupplierBuyProductLog(SalePageQuery salePageQuery); Page getSaleByCompanyId(SalePageQuery salePageQuery); + + void companyGetSale(String saleId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockLogService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockLogService.java index f4e393ed..5091dfb9 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockLogService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockLogService.java @@ -8,5 +8,5 @@ import java.util.List; public interface StockLogService extends IService { List getByPurchaseId(String id); - List getByPurchaseIds(List purchaseIdList); + List getByPurchaseIds(List purchaseIdList, String productId); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockService.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockService.java index 6b9ab3b9..89e30dab 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockService.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockService.java @@ -2,9 +2,11 @@ package cc.hiver.mall.service.mybatis; import cc.hiver.core.common.vo.Result; import cc.hiver.mall.entity.Stock; +import cc.hiver.mall.pojo.query.StockPageQuery; import cc.hiver.mall.pojo.vo.ProductCategoryStockVo; import cc.hiver.mall.pojo.vo.PurchaseVo; import cc.hiver.mall.pojo.vo.ShopStockVo; +import cc.hiver.mall.pojo.vo.StockProductVo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -42,4 +44,6 @@ public interface StockService extends IService { String productCount(String productId,String attributeList); List getlistByAttributeList(String id, String attributeList); + + List getTailWarnProduct(StockPageQuery stockPageQuery); } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/OrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/OrderServiceImpl.java index a71dbd02..b979e2b1 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/OrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/OrderServiceImpl.java @@ -13,6 +13,7 @@ import cc.hiver.mall.service.OrderService; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -126,6 +127,10 @@ public class OrderServiceImpl implements OrderService { //抢单时间 final Path createTimeField = root.get("orderByWorkertime"); final Path regionField = root.get("region"); + //配送员姓名 + final Path workerNameField = root.get("workerName"); + // 配送公司名称 + final Path companyNameField = root.get("companyName"); final List list = new ArrayList<>(); @@ -162,7 +167,7 @@ public class OrderServiceImpl implements OrderService { } // 状态 - if (order.getOrderStatus() != null) { + if (StringUtils.isNotEmpty(order.getOrderStatus())) { list.add(cb.equal(orderStatusdField, order.getOrderStatus())); } @@ -182,10 +187,19 @@ public class OrderServiceImpl implements OrderService { list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end))); } + if (CharSequenceUtil.isNotBlank(order.getWorkerName())) { + list.add(cb.like(workerNameField, order.getWorkerName())); + } + + if (CharSequenceUtil.isNotBlank(order.getCompanyName())) { + list.add(cb.like(companyNameField, order.getCompanyName())); + } + // 数据权限 final Predicate[] arr = new Predicate[list.size()]; cq.where(list.toArray(arr)); + cq.orderBy(cb.asc(root.get("orderByWorkertime"))); return null; } }, pageable); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ProductShareServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ProductShareServiceImpl.java index 62908690..83ec1430 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ProductShareServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ProductShareServiceImpl.java @@ -1,14 +1,17 @@ package cc.hiver.mall.serviceimpl; +import cc.hiver.core.common.constant.CommonConstant; import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.entity.User; import cc.hiver.mall.dao.ProductShareDao; import cc.hiver.mall.entity.Share; +import cc.hiver.mall.entity.Shop; import cc.hiver.mall.pojo.query.ProductPageQuery; import cc.hiver.mall.pojo.query.SharetPageQuery; import cc.hiver.mall.pojo.vo.ProductPageVO; import cc.hiver.mall.pojo.vo.ShareVO; import cc.hiver.mall.service.ProductShareService; +import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.mybatis.ProductService; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.commons.lang3.StringUtils; @@ -29,6 +32,9 @@ public class ProductShareServiceImpl implements ProductShareService { @Autowired private SecurityUtil securityUtil; + @Autowired + private ShopService shopService; + /** * 新增分享链接 * @@ -41,6 +47,8 @@ public class ProductShareServiceImpl implements ProductShareService { public Share save(Share share) { // shopId从缓存中设置 final String shopId = securityUtil.getShopId(); + final Shop shop = shopService.get(shopId); + share.setShopName(shop.getShopName()); final User user = securityUtil.getCurrUser(); share.setShopId(shopId); // 保存销售员id(当前登录人为销售员) @@ -67,6 +75,7 @@ public class ProductShareServiceImpl implements ProductShareService { // 查询项 productPageQuery.setCategoryId(sharetPageQuery.getCategoryId()); productPageQuery.setSupplierName(sharetPageQuery.getSupplierName()); + productPageQuery.setDelFlag(CommonConstant.DEL_FLAG_TRUE); // 商铺id(全推) 和商品id(勾选推送) productPageQuery.setShopId(share.getShopId()); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java index 1878a3a3..604ad116 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java @@ -58,6 +58,7 @@ public class RushOrderServiceImpl implements RushOrderService { orderXd.setOrderStatus(sale.getStatus()); orderXd.setOrderByWorker(CharSequenceUtil.isNotEmpty(saleDTO.getOrderByWorker()) ? saleDTO.getOrderByWorker() : null); orderXd.setTransCompany(saleDTO.getTransCompany()); + orderXd.setCompanyName(sale.getCompanyName()); orderXd.setOrderByWorkertime(sale.getCreateTime()); orderXd.setTimeout(2); // 补充客户信息 @@ -99,6 +100,7 @@ public class RushOrderServiceImpl implements RushOrderService { orderXd.setOrderAddress(orderAddress); orderXd.setShopName(sale.getShopName()); orderXd.setTransCompanyPhone(sale.getCompanyPhone()); + orderXd.setCompanyName(sale.getCompanyName()); // 取货地址 // shopId从缓存中设置 final String shopId = securityUtil.getShopId(); @@ -131,6 +133,7 @@ public class RushOrderServiceImpl implements RushOrderService { } orderXd.setTransCompany(saleQueryDTO.getSale().getTransCompany()); + orderXd.setCompanyName(saleQueryDTO.getSale().getCompanyName()); orderXd.setTimeout(OrderConstant.IS_TIMEOUT[0]); // 补充客户信息 @@ -175,16 +178,20 @@ public class RushOrderServiceImpl implements RushOrderService { if (StringUtils.isNotEmpty(saleReturnDTO.getOrderByWorker())) { // 指定了拉包工,直接为待取货 orderXd.setOrderStatus(OrderConstant.ORDER_STATUS[7]); + + orderXd.setOrderByWorker(saleReturnDTO.getOrderByWorker()); + // 指定了拉包工,这里插入抢单时间 + orderXd.setOrderByWorkertime(returnSale.getCreateTime()); + // 获取拉包工信息 + final Worker worker = workerService.findByWorkerId(saleReturnDTO.getOrderByWorker()); + orderXd.setWorkerName(worker.getWorkerName()); + orderXd.setWorkerMobile(worker.getMobile()); } else { orderXd.setOrderStatus(OrderConstant.ORDER_STATUS[6]); } - orderXd.setOrderByWorker(CharSequenceUtil.isNotEmpty(saleReturnDTO.getOrderByWorker()) ? saleReturnDTO.getOrderByWorker() : null); orderXd.setTransCompany(saleReturnDTO.getTransCompany()); - // 指定了拉包工,这里插入抢单时间 - if (CharSequenceUtil.isNotEmpty(saleReturnDTO.getOrderByWorker())) { - orderXd.setOrderByWorkertime(returnSale.getCreateTime()); - } + orderXd.setCompanyName(returnSale.getTransCompanyName()); orderXd.setTimeout(OrderConstant.IS_TIMEOUT[0]); // 补充客户信息 final String userId = returnSale.getUserId(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java index d939c967..7cc595a4 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java @@ -3,6 +3,7 @@ package cc.hiver.mall.serviceimpl; import cc.hiver.core.common.constant.CommonConstant; import cc.hiver.core.common.constant.SaleConstant; import cc.hiver.core.common.constant.UserConstant; +import cc.hiver.core.common.sms.SmsUtil; import cc.hiver.core.common.utils.*; import cc.hiver.core.common.vo.PageVo; import cc.hiver.core.entity.LogiticsCompany; @@ -19,6 +20,7 @@ import cc.hiver.mall.operatingarea.service.OperatingAreaService; import cc.hiver.mall.pojo.dto.*; import cc.hiver.mall.service.ProductShareService; import cc.hiver.mall.service.SalesAndDetailsService; +import cc.hiver.mall.service.ShopService; import cc.hiver.mall.service.mybatis.*; import cn.hutool.core.text.CharSequenceUtil; import lombok.extern.slf4j.Slf4j; @@ -80,6 +82,12 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService { @Autowired private DeductLogService deductLogService; + @Autowired + private ShopService shopService; + + @Autowired + private SmsUtil smsUtil; + @Override public Sale handleSalesAndDetails(SaleDTO saleDTO) { @@ -197,6 +205,21 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService { } else { sale.setPayStatus("0"); } + // 物流公司联系电话 + String transCompanyPhone = ""; + if(StringUtils.isNotEmpty(sale.getTransCompany())){ + // + LogiticsCompany logiticsCompany = logiticsCompanyService.findById(sale.getTransCompany()); + if(logiticsCompany == null ){ + // 选取的是运营区域 + // 获取运营商id + transCompanyPhone = operatingAreaService.getOperatingAreaById(sale.getTransCompany()); + sale.setCompanyPhone(transCompanyPhone); + }else{ + transCompanyPhone = logiticsCompany.getMobile(); + sale.setCompanyPhone(transCompanyPhone); + } + } // 如果是自送,状态为完成,其他使用平台的则为待取货 if (SaleConstant.TRANSPORT_TYPE[2].equals(sale.getTransportType())) { sale.setStatus(SaleConstant.SALE_STATUS[4]); @@ -205,7 +228,16 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService { if(StringUtils.isNotEmpty(sale.getTransCompany())){ deductLogService.updateRebateAmount("", sale.getTransCompany(), sale.getShopId(), sale.getId()); } - } else { + } else if(SaleConstant.MODE_OF_SERVICE[2].equals(sale.getModeOfService())){ + // 物流自提 + sale.setStatus(SaleConstant.SALE_STATUS[13]); + // 给物流公司发送一个短信 + // shopId从缓存中设置 + final String shopId = securityUtil.getShopId(); + final Shop shop = shopService.get(shopId); + final String shopAddress = shop.getShopAddress(); + smsUtil.sendCode(transCompanyPhone, "{shopAddress:" + shopAddress + "}", "SMS_465402378"); + }else{ //0:待抢单 1:待取货 2:已作废 3:待送达 4:已完成 //退货: //5:下游客户待退货 00:退货待抢单 01:退货待取货 02:退货已作废 03:退货待送达 04:待确认退货 4:已完成 @@ -216,10 +248,6 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService { sale.setStatus(SaleConstant.SALE_STATUS[0]); } } - // 销售员 - // final User user = securityUtil.getCurrUser(); - // sale.setCreateBy(user.getId()); - // sale.setCreateByName(user.getNickname()); // 获取销售员的手机号 User user = userService.get(sale.getCreateBy()); sale.setCreateByPhone(user.getMobile()); @@ -227,20 +255,8 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService { sale.setDelFlag(CommonConstant.DEL_FLAG_FALSE); // 客户id // sale.setUserId(); - // 物流公司联系电话 - if(StringUtils.isNotEmpty(sale.getTransCompany())){ - // - LogiticsCompany logiticsCompany = logiticsCompanyService.findById(sale.getTransCompany()); - if(logiticsCompany == null ){ - // 选取的是运营区域 - // 获取运营商id - String transCompanyPhone = operatingAreaService.getOperatingAreaById(sale.getTransCompany()); - sale.setCompanyPhone(transCompanyPhone); - }else{ - String transCompanyPhone = logiticsCompany.getMobile(); - sale.setCompanyPhone(transCompanyPhone); - } - } + + sale.setCompanyPhone(transCompanyPhone); saleService.save(sale); final String saleId = sale.getId(); diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java index 59d1581d..d78ea419 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java @@ -71,6 +71,8 @@ public class SalesCalculateServiceImpl implements SalesCalculateService { } else { startDate = DateUtil.COMMON_FULL.getTextDate(startTime + " 00:00:00"); endDate = DateUtil.COMMON_FULL.getTextDate(endTime + " 23:59:59"); + // 如果根据时间查询,那么结束时间加1天, + endTime = DateUtil.addDay(endTime, 1); } }catch (Exception e){ log.error("日期转换出错!"); @@ -176,7 +178,7 @@ public class SalesCalculateServiceImpl implements SalesCalculateService { saleAllVO.setTotalCCount(0); } - //获取当日门店下单客户数 + //获取今日实收 final BigDecimal totalAlreadyEarn = saleMapper.queryTotalAlreadyEarn(shopId,startTime,endTime); saleAllVO.setTotalAlreadyEarn(totalAlreadyEarn); return saleAllVO; diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductCategoryServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductCategoryServiceImpl.java index aeb43546..b62f9bbd 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductCategoryServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductCategoryServiceImpl.java @@ -1,11 +1,84 @@ package cc.hiver.mall.serviceimpl.mybatis; +import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.mall.dao.mapper.ProductCategoryMapper; +import cc.hiver.mall.entity.ProductAttribute; +import cc.hiver.mall.entity.ProductAttributeValue; import cc.hiver.mall.entity.ProductCategory; +import cc.hiver.mall.pojo.vo.ProductAttributeOfAddVo; +import cc.hiver.mall.pojo.vo.ProductAttributeValueVo; +import cc.hiver.mall.pojo.vo.ProductCategoryVo; +import cc.hiver.mall.service.mybatis.ProductAttributeService; +import cc.hiver.mall.service.mybatis.ProductAttributeValueService; import cc.hiver.mall.service.mybatis.ProductCategoryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; + +@Slf4j @Service public class ProductCategoryServiceImpl extends ServiceImpl implements ProductCategoryService { + + @Autowired + private SecurityUtil securityUtil; + + @Autowired + private ProductCategoryMapper productCategoryMapper; + + @Autowired + private ProductAttributeService productAttributeService; + + @Autowired + private ProductAttributeValueService productAttributeValueService; + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean batchSaveCategoryAndAttribute(ProductCategoryVo productCategoryVo) { + + try { + // 新增类别信息 + final ProductCategory productCategory = new ProductCategory(); + final String shopId = securityUtil.getShopId(); + productCategory.setShopId(shopId); + productCategory.setCategoryName(productCategoryVo.getCategoryName()); + productCategoryMapper.insert(productCategory); + + // 新增类别 + final List productAttributeOfAddVos = productCategoryVo.getProductAttributeOfAddVos(); + // 需要新增的类别集合 + final List productAttributes = new ArrayList<>(); + // 需要新增的属性值集合 + final List productAttributeValues = new ArrayList<>(); + for (ProductAttributeOfAddVo productAttributeOfAddVo : productAttributeOfAddVos) { + final ProductAttribute productAttribute = new ProductAttribute(); + productAttribute.setCategoryId(productCategory.getId()); + productAttribute.setAttributeName(productAttributeOfAddVo.getAttributeName()); + productAttributes.add(productAttribute); + final List productAttributeValueVoList = productAttributeOfAddVo.getProductAttributeValueVoList(); + for (ProductAttributeValueVo productAttributeValueVo : productAttributeValueVoList) { + final ProductAttributeValue productAttributeValue = new ProductAttributeValue(); + productAttributeValue.setAttributeId(productAttribute.getId()); + productAttributeValue.setValue(productAttributeValueVo.getValue()); + productAttributeValues.add(productAttributeValue); + } + } + // 批量插入分类 + if (!productAttributes.isEmpty()) { + productAttributeService.saveBatch(productAttributes, productAttributes.size()); + } + //批量插入属性值 + if (!productAttributeValues.isEmpty()) { + productAttributeValueService.saveBatch(productAttributeValues, productAttributeValues.size()); + } + return true; + } catch (Exception e) { + log.error(e.getMessage(), e); + return false; + } + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseDetailServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseDetailServiceImpl.java index 9b736990..c6c444a9 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseDetailServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseDetailServiceImpl.java @@ -21,7 +21,7 @@ public class PurchaseDetailServiceImpl extends ServiceImpl getByPurchaseIdList(List purchaseIds) { - return purchaseDetailMapper.getByPurchaseIdList(purchaseIds); + public List getByPurchaseIdList(List purchaseIds,String productId) { + return purchaseDetailMapper.getByPurchaseIdList(purchaseIds,productId); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java index 8d0e68c5..fe189e41 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java @@ -168,7 +168,7 @@ public class PurchaseServiceImpl extends ServiceImpl i final Map> purchaseDetailMap = new HashMap<>(); if(!purchaseIdList.isEmpty()){ // 获取采购单明细 - final List byPurchaseIdList = purchaseDetailService.getByPurchaseIdList(purchaseIdList); + final List byPurchaseIdList = purchaseDetailService.getByPurchaseIdList(purchaseIdList,productId); for (PurchaseDetail purchaseDetail : byPurchaseIdList) { final String purchaseId = purchaseDetail.getPurchaseId(); if (purchaseDetailMap.containsKey(purchaseId)) { @@ -182,7 +182,7 @@ public class PurchaseServiceImpl extends ServiceImpl i // 获取规格及数量 // 获取规格信息 - final List stockLogList = stockLogService.getByPurchaseIds(purchaseIdList); + final List stockLogList = stockLogService.getByPurchaseIds(purchaseIdList,productId); final Map> stockLogMap = new HashMap<>(); // 封装规格属性 for (StockLog stockLog : stockLogList) { diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleDetailServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleDetailServiceImpl.java index b147f474..834d8efd 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleDetailServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleDetailServiceImpl.java @@ -1,11 +1,9 @@ package cc.hiver.mall.serviceimpl.mybatis; -import cc.hiver.core.common.utils.StringUtils; import cc.hiver.mall.dao.mapper.SaleDetailMapper; import cc.hiver.mall.entity.SaleDetail; import cc.hiver.mall.entity.SaleDetailExample; import cc.hiver.mall.service.mybatis.SaleDetailService; -import cc.hiver.mall.utils.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; @@ -43,10 +41,6 @@ public class SaleDetailServiceImpl extends ServiceImpl listOfShopAll(String shopId, String startDate, String endDate) { - // 如果根据时间查询,那么结束时间加1天, - if(StringUtils.isNotEmpty(endDate)){ - endDate = DateUtil.addDay(endDate, 1); - } return saleDetailMapper.listOfShopAll(shopId, startDate, endDate); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java index 6b73dd9e..e3fd2121 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java @@ -7,6 +7,7 @@ import cc.hiver.core.common.utils.StringUtils; import cc.hiver.core.entity.User; import cc.hiver.mall.common.constant.StockConstant; import cc.hiver.mall.dao.mapper.SaleMapper; +import cc.hiver.mall.deductlog.service.DeductLogService; import cc.hiver.mall.entity.*; import cc.hiver.mall.pojo.dto.SaleDetailDTO; import cc.hiver.mall.pojo.dto.SaleDetailQueryDTO; @@ -52,6 +53,9 @@ public class SaleServiceImpl extends ServiceImpl implements Sa @Autowired private PurchaseService purchaseService; + @Autowired + private DeductLogService deductLogService; + @Override public void editPayPrice(String id, BigDecimal price, String dealingsWay) { @@ -296,7 +300,7 @@ public class SaleServiceImpl extends ServiceImpl implements Sa @Override public Page getCustomerBuyProductLog(SalePageQuery salePageQuery) { - final String shopId = "1739537306278301696";// securityUtil.getShopId(); + final String shopId = securityUtil.getShopId(); // 先拿到该客户购买的所有商品信息 final Page page = new Page<>(salePageQuery.getPageNum(), salePageQuery.getPageSize()); final String userId = salePageQuery.getUserId(); @@ -449,7 +453,16 @@ public class SaleServiceImpl extends ServiceImpl implements Sa @Override public Page getSaleByCompanyId(SalePageQuery salePageQuery) { final Page page = new Page<>(salePageQuery.getPageNum(), salePageQuery.getPageSize()); - final Page saleNoWorkerVOPage = saleMapper.getSaleByCompanyId(page, salePageQuery.getCompanyId()); + final Page saleNoWorkerVOPage = saleMapper.getSaleByCompanyId(page, salePageQuery); return saleNoWorkerVOPage; } + + @Override + public void companyGetSale(String saleId) { + + saleMapper.companyGetSale(saleId); + final Sale sale = saleMapper.selectById(saleId); + // 处理返佣 + deductLogService.updateRebateAmount("", sale.getTransCompany(), sale.getShopId(), saleId); + } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockLogServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockLogServiceImpl.java index 849ffb1e..3071ea06 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockLogServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockLogServiceImpl.java @@ -21,8 +21,8 @@ public class StockLogServiceImpl extends ServiceImpl i } @Override - public List getByPurchaseIds(List purchaseIds) { - return stockLogMapper.getByPurchaseIds(purchaseIds); + public List getByPurchaseIds(List purchaseIds,String productId) { + return stockLogMapper.getByPurchaseIds(purchaseIds, productId); } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java index 7ad95876..179023b5 100644 --- a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java @@ -7,9 +7,8 @@ import cc.hiver.core.entity.User; import cc.hiver.mall.common.constant.StockConstant; import cc.hiver.mall.dao.mapper.StockMapper; import cc.hiver.mall.entity.*; -import cc.hiver.mall.pojo.vo.ProductCategoryStockVo; -import cc.hiver.mall.pojo.vo.PurchaseVo; -import cc.hiver.mall.pojo.vo.ShopStockVo; +import cc.hiver.mall.pojo.query.StockPageQuery; +import cc.hiver.mall.pojo.vo.*; import cc.hiver.mall.service.mybatis.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -527,7 +526,7 @@ public class StockServiceImpl extends ServiceImpl implements for (Product product : productListOfShop) { final Date salesWeek = product.getSalesWeek(); // 商品的尾货预警可为空了,这里判断下,为空就不统计尾货预警 - if(salesWeek != null ){ + if (salesWeek != null) { final boolean after = salesWeek.before(new Date()); if (after) { //超过尾货预警日期,数量加1 @@ -595,7 +594,50 @@ public class StockServiceImpl extends ServiceImpl implements public List getlistByAttributeList(String id, String attributeList) { // shopId从缓存中设置 final String shopId = securityUtil.getShopId(); - return stockMapper.getlistByAttributeList(id,shopId, attributeList); + return stockMapper.getlistByAttributeList(id, shopId, attributeList); + } + + @Override + public List getTailWarnProduct(StockPageQuery stockPageQuery) { + // shopId从缓存中设置 + final String shopId = securityUtil.getShopId(); + stockPageQuery.setShopId(shopId); + final List records = stockMapper.getTailWarnProduct(stockPageQuery); + // final List records = result.getRecords(); + final Map stringStockProductVoMap = new HashMap<>(); + for (Stock record : records) { + final String productId = record.getProductId(); + final Integer stockCount = record.getStockCount(); + final Integer productStockCount = record.getStockCount() < 0?0:record.getStockCount(); + + //存在,增加规格信息 + final StockAttributeVo stockAttributeVo = new StockAttributeVo(); + stockAttributeVo.setAttributeList(record.getAttributeList()); + stockAttributeVo.setStockCount(stockCount); + if(stringStockProductVoMap.containsKey(productId)){ + final Integer count = stringStockProductVoMap.get(productId).getStockCount(); + // 计算商品的总库存 + stringStockProductVoMap.get(productId).setStockCount(count+productStockCount); + // 增加规格信息 + stringStockProductVoMap.get(productId).getStockAttributeVoList().add(stockAttributeVo); + }else{ + // 不存在,先增加商品信息 + final StockProductVo stockProductVo = new StockProductVo(); + stockProductVo.setProductName(record.getProductName()); + stockProductVo.setProductSn(record.getProductSn()); + stockProductVo.setProductPicture(record.getProductPicture()); + stockProductVo.setTailWarn(record.getTailWarn()); + stockProductVo.setBarcode(record.getBarcode()); + // 这里计算一下该商品的总库存 + stockProductVo.setStockCount(productStockCount); + final List stockAttributeVoList = new ArrayList<>(); + stockAttributeVoList.add(stockAttributeVo); + stockProductVo.setStockAttributeVoList(stockAttributeVoList); + stringStockProductVoMap.put(productId,stockProductVo); + } + } + List stockProductVos = new ArrayList<>(stringStockProductVoMap.values()); + return stockProductVos; } } diff --git a/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java new file mode 100644 index 00000000..91d710c2 --- /dev/null +++ b/hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java @@ -0,0 +1,208 @@ +package cc.hiver.mall.utils;// Copyright (c) Alibaba, Inc. and its affiliates. + +import cc.hiver.mall.config.aliocr.AliOcrConfig; +import cn.hutool.core.date.StopWatch; +import cn.hutool.json.JSONObject; +import com.alibaba.dashscope.aigc.generation.Generation; +import com.alibaba.dashscope.aigc.generation.GenerationParam; +import com.alibaba.dashscope.aigc.generation.GenerationResult; +import com.alibaba.dashscope.aigc.generation.models.QwenParam; +import com.alibaba.dashscope.aigc.multimodalconversation.*; +import com.alibaba.dashscope.common.Message; +import com.alibaba.dashscope.common.MessageManager; +import com.alibaba.dashscope.common.MultiModalMessage; +import com.alibaba.dashscope.common.Role; +import com.alibaba.dashscope.exception.ApiException; +import com.alibaba.dashscope.exception.InputRequiredException; +import com.alibaba.dashscope.exception.NoApiKeyException; +import com.alibaba.dashscope.exception.UploadFileException; +import com.alibaba.dashscope.utils.Constants; +import com.alibaba.dashscope.utils.JsonUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; + +@Slf4j +@Component +public class AliOcrUtil { + + @Autowired + private static AliOcrConfig aliOcrConfig; + + /** + * 图片识别 + * @author 王富康 + * @date 2024/3/24 + * @param picturePath + * @return JSONObject + */ + public static JSONObject simpleMultiModalConversationCall(String picturePath) + throws ApiException, NoApiKeyException, UploadFileException { + final JSONObject jsonObject = new JSONObject(); + final StopWatch stopWatch = new StopWatch("Ai回答计时"); + Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; + final MultiModalConversation conv = new MultiModalConversation(); + final MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue()) + .content(Arrays.asList(Collections.singletonMap("image", picturePath), + Collections.singletonMap("text", "这是一个入库小票,请帮我把图片中所有内容封装为json,必须一次性列出所有json数据,json格式为:{ \"productSn\": \"货号\", \"productName\": \"商品名称\",\"price\": \"单价\", \"productCount\": \"数量\", \"attributeList\": \"{\"颜色\":\"红色\",\"尺码\":\"均码\"}\" }"))).build(); + stopWatch.start("开始回答:"); + final MultiModalConversationParam param = MultiModalConversationParam.builder() + .model("qwen-vl-max") + .message(userMessage) + .temperature(1F) + .topP(0.1) + .topK(1) + .seed(500) + .build(); + final MultiModalConversationResult result = conv.call(param); + stopWatch.stop(); + log.info(String.valueOf(result)); + log.info(stopWatch.prettyPrint()); + final Map stringObjectMap = result.getOutput().getChoices().get(0).getMessage().getContent().get(0); + jsonObject.set("msg", stringObjectMap); + return jsonObject; + } + + public static List multiRoundConversationCall(String picturePath,String firstQuestionMsg,String secondQuestionMsg) throws ApiException, NoApiKeyException, UploadFileException { + final StopWatch stopWatch = new StopWatch("Ai回答计时"); + Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; + List multiModalConversationResults = new ArrayList<>(); + final MultiModalConversation conv = new MultiModalConversation(); + final MultiModalMessageItemText systemText = new MultiModalMessageItemText("You are a helpful assistant."); + final MultiModalConversationMessage systemMessage = MultiModalConversationMessage.builder() + .role(Role.SYSTEM.getValue()).content(Collections.singletonList(systemText)).build(); + final MultiModalMessageItemImage userImage = new MultiModalMessageItemImage(picturePath); + // "这是一个入库小票,请帮我把图片中所有内容封装为json,必须一次性列出所有json数据,json格式为:{ \"productSn\": \"货号\", \"productName\": \"商品名称\",\"price\": \"单价\", \"productCount\": \"数量\", \"attributeList\": \"{\"颜色\":\"红色\",\"尺码\":\"均码\"}\" }" + MultiModalMessageItemText userText = new MultiModalMessageItemText(firstQuestionMsg); + final MultiModalConversationMessage userMessage = + MultiModalConversationMessage.builder().role(Role.USER.getValue()) + .content(Arrays.asList(userImage, userText)).build(); + final List messages = new ArrayList<>(); + messages.add(systemMessage); + messages.add(userMessage); + final MultiModalConversationParam param = MultiModalConversationParam.builder() + .model("qwen-vl-max") + .messages(messages) + .temperature(1F) + .topP(0.1) + .topK(1) + .seed(500) + .build(); + stopWatch.start("一轮会话"); + MultiModalConversationResult result = conv.call(param); + stopWatch.stop(); + multiModalConversationResults.add(result); + System.out.println(result); + // 我会在这里对结果进行解析,然后,判断要不要走第二次回话 + if(StringUtils.isNotEmpty(secondQuestionMsg)){ + + final MultiModalMessageItemText assistentText = new MultiModalMessageItemText( + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text").toString()); + final MultiModalConversationMessage assistentMessage = MultiModalConversationMessage.builder() + .role(Role.ASSISTANT.getValue()).content(Collections.singletonList(assistentText)).build(); + messages.add(assistentMessage); + userText = new MultiModalMessageItemText(secondQuestionMsg); + messages.add(MultiModalConversationMessage.builder().role(Role.USER.getValue()) + .content(Collections.singletonList(userText)).build()); + param.setMessages(new ArrayList(messages)); + stopWatch.start("二轮会话"); + result = conv.call(param); + multiModalConversationResults.add(result); + stopWatch.stop(); + System.out.print(result); + log.info(stopWatch.prettyPrint()); + } + return multiModalConversationResults; + } + + public static JSONObject callWithMessage(String questionMsg) + throws NoApiKeyException, ApiException, InputRequiredException { + final JSONObject jsonObject = new JSONObject(); + Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; + final StopWatch stopWatch = new StopWatch("Ai回答计时"); + final Generation gen = new Generation(); + final MessageManager msgManager = new MessageManager(10); + final Message systemMsg = + Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build(); + final Message userMsg = Message.builder().role(Role.USER.getValue()).content(questionMsg).build(); + msgManager.add(systemMsg); + msgManager.add(userMsg); + stopWatch.start("开始回答"); + final QwenParam param = + QwenParam.builder().model(Generation.Models.QWEN_PLUS).messages(msgManager.get()) + .resultFormat(QwenParam.ResultFormat.MESSAGE) + .temperature(1F) + .topP(0.1) + .topK(1) + .seed(500) + .build(); + final GenerationResult result = gen.call(param); + stopWatch.stop(); + log.info(stopWatch.prettyPrint()); + System.out.println(result); + jsonObject.set("msg", result.getOutput().getChoices().get(0).getMessage().getContent()); + return jsonObject; + } + + public static void callWithMessageOfMany(String questionMsg,int count) + throws NoApiKeyException, ApiException, InputRequiredException { + final Generation gen = new Generation(); + Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682"; + final Message systemMsg = + Message.builder().role(Role.SYSTEM.getValue()).content("You are a helpful assistant.").build(); + Message userMsg = Message.builder().role(Role.USER.getValue()).content(questionMsg).build(); + final List messages = new ArrayList<>(); + messages.add(systemMsg); + messages.add(userMsg); + final GenerationParam param = + GenerationParam.builder().model(Generation.Models.QWEN_PLUS).messages(messages) + .resultFormat(GenerationParam.ResultFormat.MESSAGE) + .topP(0.8) + .build(); + GenerationResult result = gen.call(param); + System.out.println(result); + // 添加assistant返回到messages列表,user/assistant消息必须交替出现 + messages.add(result.getOutput().getChoices().get(0).getMessage()); + // new message + userMsg = Message.builder().role(Role.USER.getValue()).content("请全部返回").build(); + messages.add(userMsg); + result = gen.call(param); + System.out.println(result); + System.out.println(JsonUtils.toJson(result)); + } + + public static void main(String[] args) { + try { + /*final String questionMsg = "货号87654321,S码黑色30件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654322,S码粉红色40件,M码儿,玫瑰色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654323,S码奶奶灰50件,M码儿,绿色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654324,S码卡其色60件,M码儿,王浩伟色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654325,S码天空蓝70件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654326,S码所有颜色80件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654327,S码黑色30件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654328,S码粉红色40件,M码儿,玫瑰色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654329,S码奶奶灰50件,M码儿,绿色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654330,S码卡其色60件,M码儿,王浩伟色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654331,S码天空蓝70件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654332,S码所有颜色80件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654333,S码黑色30件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654334,S码粉红色40件,M码儿,玫瑰色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654335,S码奶奶灰50件,M码儿,绿色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654336,S码卡其色60件,M码儿,王浩伟色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654337,S码天空蓝70件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654338,S码天空蓝70件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654339,S码天空蓝70件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。\n" + + "货号87654340,S码天空蓝70件,M码儿,白色50件儿,XL码儿,天蓝色50件儿。 \n" + + "这是客户要货信息,请帮我把所有内容封装为json,必须一次性列出所有json数据,json格式为:[{ \"productSn\": \"货号\", \"attributeList\": \"[{\"颜色\":\"红色\",\"尺码\":\"均码\",\"productCount\": \"数量\"}]\" }]"; + callWithMessage(questionMsg);*/ + + // multiRoundConversationCall("https://jewel-shop.oss-cn-beijing.aliyuncs.com/abcbafd10e1b40c082bc1fb271b08da1.jpg"); + }catch (Exception e){ + log.error(e.getMessage()); + } + } + +} \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml index b9a739d0..610434a0 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml @@ -88,12 +88,51 @@ product_picture, product_sn, shop_id, attribute_list, pd_num, change_count, stoc insert into t_check_stock_detail (id, create_by, create_time, del_flag, update_by, update_time, check_stock_id, product_id, product_name, product_picture, product_sn, shop_id, attribute_list, pd_num, change_count, stock_count) values - - (#{checkStockDetailList.id},#{checkStockDetailList.createBy},#{checkStockDetailList.createTime},#{checkStockDetailList.delFlag}, - #{checkStockDetailList.updateBy},#{checkStockDetailList.updateTime},#{checkStockDetailList.checkStockId},#{checkStockDetailList.productId},#{checkStockDetailList.productName}, - #{checkStockDetailList.productPicture},#{checkStockDetailList.productSn},#{checkStockDetailList.shopId},#{checkStockDetailList.attributeList},#{checkStockDetailList.pdNum}, - #{checkStockDetailList.changeCount},#{checkStockDetailList.stockCount}) + + (#{checkStockDetail.id},#{checkStockDetail.createBy},#{checkStockDetail.createTime},#{checkStockDetail.delFlag}, + #{checkStockDetail.updateBy},#{checkStockDetail.updateTime},#{checkStockDetail.checkStockId},#{checkStockDetail.productId},#{checkStockDetail.productName}, + #{checkStockDetail.productPicture},#{checkStockDetail.productSn},#{checkStockDetail.shopId},#{checkStockDetail.attributeList},#{checkStockDetail.pdNum}, + #{checkStockDetail.changeCount},#{checkStockDetail.stockCount}) + + + + + + + + + delete + from t_check_stock_detail + where shop_id = #{shopId,jdbcType=VARCHAR} + and check_stock_id = #{checkStockId,jdbcType=VARCHAR} + and product_id = #{productId,jdbcType=VARCHAR} + \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockMapper.xml index 392d5bea..f40d5946 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockMapper.xml @@ -75,4 +75,14 @@ id, create_by, create_by_name, create_time, del_flag, update_by, update_time, remark, shop_id, shop_name + + \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/CustomerMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/CustomerMapper.xml index 47d39d7a..f5ef9578 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/CustomerMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/CustomerMapper.xml @@ -379,7 +379,7 @@ and a.pay_status != 1 and a.status != '6' -- 待配货 and a.status != '7' -- 挂单 - and a.status != '3' -- 取消订单 + and a.status != '2' -- 取消订单 and a.shop_id = #{queryParams.shopId} group by a.user_id,a.user_name order by no_earn desc @@ -387,16 +387,31 @@ diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/OperatingAreaMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/OperatingAreaMapper.xml index 564c58fc..d5099458 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/OperatingAreaMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/OperatingAreaMapper.xml @@ -171,7 +171,7 @@ select t.id, t.shipping_type, t.shipping_method, t.shipping_method_id, t.province, t.city, t.area, t.charging_standard, - s.mobile,s.rebate_amount + s.mobile,s.rebate_amount,s.is_on_line from t_operating_area t left join t_lcompany s @@ -192,6 +192,35 @@ or t.network like concat('%',#{seachParams,jdbcType=VARCHAR},'%') ) + order by s.is_on_line desc,t.shipping_method + + + \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml index 5bad2de2..f8dc73dd 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml @@ -558,11 +558,15 @@ and ss.shop_id = t.shop_id - 1 = 1 + AND t.del_flag != '2' AND t.shop_id = #{queryParams.shopId} + + + AND t.del_flag = #{queryParams.delFlag} + AND t.category_id =#{queryParams.categoryId} @@ -597,7 +601,7 @@ #{queryParams.sortField} #{queryParams.sort} , - t.create_time desc, in_storage_status,t.del_flag asc + t.in_storage_status asc, t.del_flag desc,t.create_time desc - select IFNULL(Sum(real_amount),0) as totalAmount,count(1) as totalCount,IFNULL(SUM(product_count),0) as totalJCount from t_return_sale + select IFNULL(Sum(total_amount),0) as totalAmount,count(1) as totalCount,IFNULL(SUM(product_count),0) as totalJCount from t_return_sale diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml index 9d3566f9..4447080b 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml @@ -36,6 +36,7 @@ + @@ -98,7 +99,7 @@ id, create_by, create_by_name, create_time, del_flag, update_by, update_by_name, update_time, user_id, user_name, shop_id, shop_name, total_amount, discount, discount_amount, real_amount, already_earn, no_earn, pay_status, status, other_expense, transport_type, share_address, receive_address, province, city, area, -trans_company, company_name, product_count, remark, sale_name, company_phone, create_by_phone +trans_company, company_name, product_count, remark, sale_name, company_phone, create_by_phone,mode_of_service @@ -631,6 +643,7 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr from t_sale where id in (select sale_id from t_sale_detail where product_id =#{productId}) + order by create_time desc + + + + update t_sale + set + status = '9' + where id = #{saleId,jdbcType=VARCHAR} + \ No newline at end of file diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/StockLogMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/StockLogMapper.xml index 5aeea3ac..8fd124fa 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/StockLogMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/StockLogMapper.xml @@ -391,7 +391,8 @@ select from t_stock_log - where order_id in + where product_id = #{productId,jdbcType=VARCHAR} + and order_id in #{listItem} diff --git a/hiver-modules/hiver-mall/src/main/resources/mapper/StockMapper.xml b/hiver-modules/hiver-mall/src/main/resources/mapper/StockMapper.xml index 78be907a..2b10a8b0 100644 --- a/hiver-modules/hiver-mall/src/main/resources/mapper/StockMapper.xml +++ b/hiver-modules/hiver-mall/src/main/resources/mapper/StockMapper.xml @@ -558,13 +558,19 @@ + + \ No newline at end of file