Browse Source

AI集成

BUG修改
cangku
wangfukang 2 years ago
parent
commit
5653bb9d4d
  1. 24
      hiver-admin/src/main/resources/application.yml
  2. 1
      hiver-core/src/main/java/cc/hiver/core/base/HiverBaseEntity.java
  3. 14
      hiver-core/src/main/java/cc/hiver/core/common/constant/ProductConstant.java
  4. 9
      hiver-core/src/main/java/cc/hiver/core/common/constant/SaleConstant.java
  5. 3
      hiver-core/src/main/java/cc/hiver/core/entity/LogiticsCompany.java
  6. 11
      hiver-modules/hiver-mall/pom.xml
  7. 73
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockController.java
  8. 49
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/controller/CheckStockDetailController.java
  9. 11
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java
  10. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockMapper.java
  11. 30
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/pojo/CheckStockPageQuery.java
  12. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java
  13. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockService.java
  14. 203
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java
  15. 160
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java
  16. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockAttributeVo.java
  17. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockDetailVo.java
  18. 27
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockPageVo.java
  19. 20
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/common/constant/PurchaseConstant.java
  20. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/aliocr/AliOcrConfig.java
  21. 22
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadConfig.java
  22. 51
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/ThreadPoolConfiguration.java
  23. 65
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/config/thread/TimerThread.java
  24. 38
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java
  25. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductCategoryController.java
  26. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java
  27. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/PurchaseController.java
  28. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnCommissionController.java
  29. 11
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ReturnSaleController.java
  30. 10
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java
  31. 15
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/StockController.java
  32. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/PurchaseDetailMapper.java
  33. 5
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java
  34. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockLogMapper.java
  35. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockMapper.java
  36. 101
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/deductlog/service/impl/DeductLogServiceImpl.java
  37. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Customer.java
  38. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/OrderXd.java
  39. 18
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ProductCategory.java
  40. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/ReturnSale.java
  41. 5
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Sale.java
  42. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Share.java
  43. 1
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/mapper/OperatingAreaMapper.java
  44. 29
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/service/impl/OperatingAreaServiceImpl.java
  45. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/operatingarea/vo/OperatingAreaPageVO.java
  46. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java
  47. 9
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/SalePageQuery.java
  48. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/StockPageQuery.java
  49. 24
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeOfAddVo.java
  50. 20
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductAttributeValueVo.java
  51. 26
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo.java
  52. 15
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockAttributeVo.java
  53. 32
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/StockProductVo.java
  54. 54
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/controller/PurchaseOcrPictureController.java
  55. 42
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/entity/PurchaseOcrPicture.java
  56. 13
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/mapper/PurchaseOcrPictureMapper.java
  57. 20
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/PurchaseOcrPictureService.java
  58. 111
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java
  59. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/vo/PurchaseOciPictureAddVo.java
  60. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductCategoryService.java
  61. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/PurchaseDetailService.java
  62. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java
  63. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockLogService.java
  64. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/StockService.java
  65. 16
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/OrderServiceImpl.java
  66. 9
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ProductShareServiceImpl.java
  67. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/RushOrderServiceImpl.java
  68. 54
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java
  69. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesCalculateServiceImpl.java
  70. 73
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductCategoryServiceImpl.java
  71. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseDetailServiceImpl.java
  72. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java
  73. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleDetailServiceImpl.java
  74. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java
  75. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockLogServiceImpl.java
  76. 52
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java
  77. 208
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java
  78. 49
      hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml
  79. 10
      hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockMapper.xml
  80. 23
      hiver-modules/hiver-mall/src/main/resources/mapper/CustomerMapper.xml
  81. 33
      hiver-modules/hiver-mall/src/main/resources/mapper/OperatingAreaMapper.xml
  82. 7
      hiver-modules/hiver-mall/src/main/resources/mapper/ProductAttributeMapper.xml
  83. 14
      hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml
  84. 3
      hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseDetailMapper.xml
  85. 1
      hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseMapper.xml
  86. 106
      hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseOcrPictureMapper.xml
  87. 2
      hiver-modules/hiver-mall/src/main/resources/mapper/ReturnSaleMapper.xml
  88. 42
      hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml
  89. 3
      hiver-modules/hiver-mall/src/main/resources/mapper/StockLogMapper.xml
  90. 39
      hiver-modules/hiver-mall/src/main/resources/mapper/StockMapper.xml

24
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

1
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 = "更新者")

14
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"};
}

9
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-部分收款
*/

3
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;
}

11
hiver-modules/hiver-mall/pom.xml

@ -17,6 +17,17 @@
<artifactId>hiver-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<version>2.12.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

73
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<CheckStockDetailVo> checkStockDetailVos){
public Result addCheckStock(@RequestBody CheckStockVo checkStockVo) {
final CheckStock saveCheckStock = checkStockService.addCheckStock(checkStockVo);
return new ResultUtil<CheckStock>().setData(saveCheckStock);
}
@RequestMapping(value = "/getCheckStockList", method = RequestMethod.POST)
@ApiOperation("获取盘点信息列表")
public Result getCheckStockList(@RequestBody CheckStockPageQuery checkStockPageQuery) {
final Page<CheckStock> 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<CheckStockPageVo>().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("删除成功!");
}
}

49
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<CheckStockDetailVo> 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("删除成功!");
}
}

11
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<CheckStockDetail> {
void batchInsertCheckStock(@Param("checkStockDetailList") List<CheckStockDetail> checkStockDetailList);
List<CheckStockDetail> getByCheckStockDetailByCheckId(@Param("checkStockId")String checkStockId);
void deleteByProductId(@Param("shopId")String shopId,@Param("checkStockId")String checkStockId,@Param("productId") String productId);
List<CheckStockDetail> getByCheckStockDetailByCheckIdOfPage(@Param("checkStockPageQuery")CheckStockPageQuery checkStockPageQuery);
Page<String> getByCheckStockProductByCheckId(Page<WorkerDeductLogVo> page, @Param("checkStockPageQuery")CheckStockPageQuery checkStockPageQuery);
}

4
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<CheckStock> {
Page<CheckStock> getCheckStockList(Page<CheckStock> page,@Param("deductLogPageQuery") CheckStockPageQuery checkStockPageQuery);
}

30
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<String> productIdList;
}

13
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<CheckStockDetail> {
void addCheckStockDetail(List<CheckStockDetailVo> checkStockDetailVos);
void deleteCheckStockDetail(String id);
List<CheckStockDetailVo> getByCheckStockDetailByCheckId(String checkStockId);
Page<CheckStockDetailVo> getByCheckStockDetailByCheckIdOfPage(CheckStockPageQuery checkStockPageQuery);
}

17
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<CheckStock> {
void addCheckStock(List<CheckStockDetailVo> checkStockDetailVos);
CheckStock addCheckStock(CheckStockVo checkStockVo);
CheckStockPageVo getCheckStock(CheckStockPageQuery checkStockPageQuery);
void submitToStock(String id);
Page<CheckStock> getCheckStockList( CheckStockPageQuery checkStockPageQuery);
void deleteCheckStock(String id);
}

203
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<CheckStockDetailMapper, CheckStockDetail> implements CheckStockDetailService {
@Autowired
private SecurityUtil securityUtil;
@Autowired
private CheckStockDetailMapper checkStockDetailMapper;
/**
* 添加盘点详情信息
*
* @param checkStockDetailVos 盘点详情视图对象列表包含需要添加的盘点细节
*/
@Override
public void addCheckStockDetail(List<CheckStockDetailVo> checkStockDetailVos) {
if (checkStockDetailVos == null || checkStockDetailVos.isEmpty()) {
return; // 处理边界条件,输入参数为空的情况
}
// 获取当前店铺ID
final String shopId = securityUtil.getShopId();
// 初始化盘点详情列表
final List<CheckStockDetail> 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<CheckStockAttributeVo> 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<CheckStockDetail> buildCheckStockDetailList(CheckStockDetailVo checkStockDetailVo,
CheckStockAttributeVo checkStockAttributeVo,
String shopId,
String checkStockId,
String productId) {
final List<CheckStockDetail> 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<CheckStockDetailVo> getByCheckStockDetailByCheckId(String checkStockId) {
// 查询明细
final List<CheckStockDetail> checkStockDetailList = checkStockDetailMapper.getByCheckStockDetailByCheckId(checkStockId);
// 封装至返回结果中
final Map<String, CheckStockDetailVo> 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<CheckStockAttributeVo> 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<CheckStockDetailVo> getByCheckStockDetailByCheckIdOfPage(CheckStockPageQuery checkStockPageQuery) {
// 校验分页参数
if (checkStockPageQuery.getPageNum() <= 0 || checkStockPageQuery.getPageSize() <= 0) {
throw new IllegalArgumentException("分页参数异常!");
}
final Page<WorkerDeductLogVo> page = new Page<>(checkStockPageQuery.getPageNum(), checkStockPageQuery.getPageSize());
final Page<CheckStockDetailVo> returnData = new Page<>();
try {
// 查询商品id集合
// 查询明细,这里假设底层已经做了SQL注入等安全防护
final Page<String> checkStockDetailListOfProduct = checkStockDetailMapper.getByCheckStockProductByCheckId(page, checkStockPageQuery);
if (checkStockDetailListOfProduct.getRecords() == null) {
// 避免空指针异常
checkStockDetailListOfProduct.setRecords(new ArrayList<>());
}
checkStockPageQuery.setProductIdList(checkStockDetailListOfProduct.getRecords());
if (!checkStockPageQuery.getProductIdList().isEmpty()) {
final List<CheckStockDetail> checkStockDetailList = checkStockDetailMapper.getByCheckStockDetailByCheckIdOfPage(checkStockPageQuery);
// 封装至返回结果中,使用Map和computeIfAbsent简化逻辑
final Map<String, CheckStockDetailVo> 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);
}
}
}

160
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<CheckStockMapper, CheckStock> implements CheckStockService {
@ -26,7 +44,7 @@ public class CheckStockServiceImpl extends ServiceImpl<CheckStockMapper, CheckSt
private ShopService shopService;
@Autowired
private CheckStockDetailMapper checkStockDetailMapper;
private CheckStockDetailService checkStockDetailService;
@Autowired
private StockService stockService;
@ -37,68 +55,142 @@ public class CheckStockServiceImpl extends ServiceImpl<CheckStockMapper, CheckSt
@Autowired
private SecurityUtil securityUtil;
/**
* 添加盘点信息
*
* @param checkStockVo 盘点信息的视图对象
* @return 返回新增的盘点信息对象
*/
@Override
public void addCheckStock(List<CheckStockDetailVo> 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<CheckStockDetail> 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<CheckStockDetailVo> 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<CheckStockDetailVo> checkStockDetailVos = checkStockDetailService.getByCheckStockDetailByCheckId(id);
for (CheckStockDetailVo checkStockDetailVo : checkStockDetailVos) {
final List<CheckStockAttributeVo> 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<Stock> 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<CheckStock> getCheckStockList(CheckStockPageQuery checkStockPageQuery) {
// 获取当前店铺ID,并设置到查询条件中
final String shopId = securityUtil.getShopId();
checkStockPageQuery.setShopId(shopId);
// 初始化分页参数
final Page<CheckStock> 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);
}
}

6
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;
}

13
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<CheckStockAttributeVo> checkStockAttributeVos;
}

27
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<CheckStockDetailVo> checkStockDetailVoList;
}

20
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入库未识别3ocr入库已识别
*/
int[] IN_STORAGE_STATUS = {0, 1, 2, 3};
/**
* ocr识别状态 0:未识别1已识别
*/
int[] OCR_STATUS = {0, 1};
}

12
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;
}

22
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;
}

51
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;
}
}

65
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<PurchaseOcrPicture> purchaseOcrPictureAddList;
public TimerThread() {
}
public TimerThread(List<PurchaseOcrPicture> 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() + "<br/>线程池名称:"+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();
}
}

38
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java

@ -77,7 +77,7 @@ public class OrderController {
public Result<Page<OrderXd>> getByCondition(OrderXd order,
SearchVo searchVo,
PageVo pageVo) {
final Page<OrderXd> page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo));
final Page<OrderXd> page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo));
return new ResultUtil<Page<OrderXd>>().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<Page < OrderXd>>
* @author 王富康
* @date 2024/2/27
* @param orderQueryVO
* @return Result<Page<OrderXd>>
*/
@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("转单失败");
}

13
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<List<ProductCategory>>().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("添加失败");
}
}
}

12
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<Product> 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<Product> 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<Product> 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 {

1
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<PurchaseDetail> purchaseDetails = purchaseVo.getPurchaseDetails();
final Random random = new Random();
// 生成条码
for (PurchaseDetail purchaseDetail : purchaseDetails) {
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++) {

12
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<ReturnCommission> 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);
}
}

11
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("取消配送成功");
}
}

10
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java

@ -898,4 +898,14 @@ public class SaleController {
final Page<SaleNoWorkerVO> 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("取货成功!");
}
}

15
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<StockProductVo> checkStockList = stockService.getTailWarnProduct(stockPageQuery);
return new ResultUtil<List<StockProductVo>>().setData(checkStockList);
}
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/PurchaseDetailMapper.java

@ -33,5 +33,5 @@ public interface PurchaseDetailMapper extends BaseMapper<PurchaseDetail> {
List<PurchaseDetail> getByPurchaseId(String id);
List<PurchaseDetail> getByPurchaseIdList(@Param("purchaseIds") List<String> purchaseIds);
List<PurchaseDetail> getByPurchaseIdList(@Param("purchaseIds") List<String> purchaseIds, @Param("productId") String productId);
}

5
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<Sale> {
Page<SupplierBuyProductLogVo> getSupplierBuyProductLog(Page<SupplierBuyProductLogVo> page, @Param("supplierId") String supplierId, @Param("shopId") String shopId);
Page<SaleNoWorkerVO> getSaleByCompanyId(Page<SaleNoWorkerVO> page, @Param("companyId") String companyId);
Page<SaleNoWorkerVO> getSaleByCompanyId(Page<SaleNoWorkerVO> page, @Param("salePageQuery") SalePageQuery salePageQuery);
void companyGetSale(@Param("saleId")String saleId);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/StockLogMapper.java

@ -33,5 +33,5 @@ public interface StockLogMapper extends BaseMapper<StockLog> {
int updateByPrimaryKey(StockLog record);
List<StockLog> getByPurchaseIds(@Param("purchaseIds") List<String> purchaseIds);
List<StockLog> getByPurchaseIds(@Param("purchaseIds") List<String> purchaseIds,@Param("productId")String productId);
}

3
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<Stock> {
String productCount(@Param("productId")String productId, @Param("attributeList")String attributeList);
List<ProductCategoryStockVo> getlistByAttributeList(@Param("id")String id, @Param("shopId")String shopId, @Param("attributeList")String attributeList);
List<Stock> getTailWarnProduct(@Param("stockPageQuery") StockPageQuery stockPageQuery);
}

101
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/deductlog/service/impl/DeductLogServiceImpl.java

@ -128,7 +128,11 @@ public class DeductLogServiceImpl extends ServiceImpl<DeductLogMapper, DeductLog
workerAfterDepoBal = workerBefDepoBal.subtract(workerFixedAmount);
worker.setDepoBal(workerAfterDepoBal);
// 更新拉包工押金余额
workerService.update(worker);
if(workerFixedAmount.compareTo(BigDecimal.valueOf(0))>0){
// 固定扣减金额大于0,才去更新,否则,没变化不用更新
workerService.update(worker);
}
}
// 获取物流公司信息
@ -143,58 +147,61 @@ public class DeductLogServiceImpl extends ServiceImpl<DeductLogMapper, DeductLog
companyRebateAmount = logiticsCompany.getRebateAmount() == null ? BigDecimal.valueOf(0) : logiticsCompany.getRebateAmount();
companyFixedAmount = logiticsCompany.getFixedAmount() == null ? BigDecimal.valueOf(0) : logiticsCompany.getFixedAmount();
companyDepoBal = logiticsCompany.getDepoBal() == null ? BigDecimal.valueOf(0) : logiticsCompany.getDepoBal();
// 拉包工扣减后押金余额
// 物流公司扣减后押金余额
companyAfterDepoBal = companyDepoBal.subtract(companyFixedAmount);
logiticsCompany.setDepoBal(companyAfterDepoBal);
// 更新物流公司押金余额
companyService.update(logiticsCompany);
if(companyFixedAmount.compareTo(BigDecimal.valueOf(0))>0){
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

4
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;
}

6
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;
/**
* 乐观锁
*/

18
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;

3
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;

5
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="商品详情")

3
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;

1
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<OperatingArea> {
List<OperatingAreaPageVO> getByArea(@Param("province") String province, @Param("city") String city, @Param("area") String area, @Param("shippingType") String shippingType, @Param("seachParams") String seachParams);
List<OperatingAreaPageVO> getByAreaOfCompany(@Param("province") String province, @Param("city") String city, @Param("area") String area, @Param("shippingType") String shippingType, @Param("seachParams") String seachParams);
List<OperatingAreaPageVO> getOperatingAreaList(Page<OperatingAreaPageVO> page, @Param("queryParams") OperatingAreaPageQuery operatingAreaPageQuery);

29
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<OperatingAreaMapper, O
Map<String, Object> resultMap = new HashMap<>();
// 当输入搜索条件时不需要查询线路相关的,只需要返回符合条件的物流公司信息即可
// if(StringUtils.isEmpty(seachParams)){
if(StringUtils.isEmpty(seachParams)){
// 根据区域获取物流公司
final List<OperatingAreaPageVO> operatingAreaList = operatingAreaMapper.getByArea(province, city, area, shippingType, seachParams);
final List<OperatingAreaPageVO> 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<LogiticsCompany> 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<LogiticsCompany> logiticsCompanyList = logiticsCompanyService.findByCondition(logiticsCompany);
resultMap.put("logiticsCompanyList", logiticsCompanyList);
}else{
final List<OperatingAreaPageVO> operatingAreaList = operatingAreaMapper.getByAreaOfCompany(province, city, area, shippingType, seachParams);
resultMap.put("operatingAreaList", operatingAreaList);
}
return resultMap;
}

6
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;
}

3
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;
}

9
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;
}

6
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;
}

24
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<ProductAttributeValueVo> productAttributeValueVoList;
}

20
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;
}

26
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<ProductAttributeOfAddVo> productAttributeOfAddVos;
}

15
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;
}

32
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<StockAttributeVo> stockAttributeVoList;
}

54
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<JSONObject>().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<JSONObject>().setData(jsonObject);
}
@RequestMapping(value = "/multiRoundConversationCall", method = RequestMethod.POST)
@ApiOperation("图片识别-多轮对话")
public List<MultiModalConversationResult> multiRoundConversationCall(String picturePath, String firstQuestionMsg, String secondQuestionMsg) throws NoApiKeyException, InputRequiredException, UploadFileException {
List<MultiModalConversationResult> multiModalConversationResults = purchaseOcrPictureService.multiRoundConversationCall(picturePath,firstQuestionMsg, secondQuestionMsg);
return multiModalConversationResults;
}
}

42
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;
}

13
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<PurchaseOcrPicture> {
void batchSave(@Param("purchaseOcrPictureList") List<PurchaseOcrPicture> purchaseOcrPictureList);
void batchUpdate(@Param("purchaseOcrPictureList") List<PurchaseOcrPicture> purchaseOcrPictureAddList);
}

20
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<PurchaseOcrPicture> purchaseOcrPictureList);
JSONObject invoicingAi(String questionMsg) throws NoApiKeyException, InputRequiredException;
List<MultiModalConversationResult> multiRoundConversationCall(String picturePath,String firstQuestionMsg, String secondQuestionMsg) throws NoApiKeyException, InputRequiredException, UploadFileException;
}

111
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<PurchaseOcrPicture> purchaseOcrPictureList = purchaseOciPictureAddVo.getPurchaseOcrPictureList();
final CopyOnWriteArrayList<PurchaseOcrPicture> 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<CopyOnWriteArrayList<PurchaseOcrPicture>> service = new ExecutorCompletionService<>(threadPoolTaskExecutor);
TimerThread timerThread = new TimerThread(purchaseOcrPictureAddList,purchaseOcrPictureService);
// 这里可以使用线程池,也可以使用CompletionService处理,运行任务需要是callable的,需要最终结果。
final Future<Result> submit = service.submit(timerThread);
} catch (Exception e) {
log.error("异步处理ocr识别失败", e);
}
jsonObject.set("msg", "success");
return jsonObject;
}
@Override
public void batchUpdate(List<PurchaseOcrPicture> purchaseOcrPictureList) {
purchaseOcrPictureMapper.batchUpdate(purchaseOcrPictureList);
}
@Override
public JSONObject invoicingAi(String questionMsg) throws NoApiKeyException, InputRequiredException {
return AliOcrUtil.callWithMessage(questionMsg);
}
@Override
public List<MultiModalConversationResult> multiRoundConversationCall(String picturePath,String firstQuestionMsg, String secondQuestionMsg) throws NoApiKeyException, InputRequiredException, UploadFileException {
return AliOcrUtil.multiRoundConversationCall(picturePath,firstQuestionMsg,secondQuestionMsg);
}
}

17
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<PurchaseOcrPicture> purchaseOcrPictureList;
}

2
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<ProductCategory> {
boolean batchSaveCategoryAndAttribute(ProductCategoryVo productCategoryVo);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/PurchaseDetailService.java

@ -9,5 +9,5 @@ public interface PurchaseDetailService extends IService<PurchaseDetail> {
List<PurchaseDetail> getByPurchaseId(String id);
List<PurchaseDetail> getByPurchaseIdList(List<String> purchaseIds);
List<PurchaseDetail> getByPurchaseIdList(List<String> purchaseIds, String productId);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java

@ -47,4 +47,6 @@ public interface SaleService extends IService<Sale> {
Page<SupplierBuyProductLogVo> getSupplierBuyProductLog(SalePageQuery salePageQuery);
Page<SaleNoWorkerVO> getSaleByCompanyId(SalePageQuery salePageQuery);
void companyGetSale(String saleId);
}

2
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<StockLog> {
List<StockLog> getByPurchaseId(String id);
List<StockLog> getByPurchaseIds(List<String> purchaseIdList);
List<StockLog> getByPurchaseIds(List<String> purchaseIdList, String productId);
}

4
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<Stock> {
String productCount(String productId,String attributeList);
List<ProductCategoryStockVo> getlistByAttributeList(String id, String attributeList);
List<StockProductVo> getTailWarnProduct(StockPageQuery stockPageQuery);
}

16
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<Date> createTimeField = root.get("orderByWorkertime");
final Path<String> regionField = root.get("region");
//配送员姓名
final Path<String> workerNameField = root.get("workerName");
// 配送公司名称
final Path<String> companyNameField = root.get("companyName");
final List<Predicate> 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.<String>get("orderByWorkertime")));
return null;
}
}, pageable);

9
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());

17
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();

54
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();

4
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;

73
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<ProductCategoryMapper, ProductCategory> 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<ProductAttributeOfAddVo> productAttributeOfAddVos = productCategoryVo.getProductAttributeOfAddVos();
// 需要新增的类别集合
final List<ProductAttribute> productAttributes = new ArrayList<>();
// 需要新增的属性值集合
final List<ProductAttributeValue> 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<ProductAttributeValueVo> 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;
}
}
}

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseDetailServiceImpl.java

@ -21,7 +21,7 @@ public class PurchaseDetailServiceImpl extends ServiceImpl<PurchaseDetailMapper,
}
@Override
public List<PurchaseDetail> getByPurchaseIdList(List<String> purchaseIds) {
return purchaseDetailMapper.getByPurchaseIdList(purchaseIds);
public List<PurchaseDetail> getByPurchaseIdList(List<String> purchaseIds,String productId) {
return purchaseDetailMapper.getByPurchaseIdList(purchaseIds,productId);
}
}

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/PurchaseServiceImpl.java

@ -168,7 +168,7 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
final Map<String, List<PurchaseDetail>> purchaseDetailMap = new HashMap<>();
if(!purchaseIdList.isEmpty()){
// 获取采购单明细
final List<PurchaseDetail> byPurchaseIdList = purchaseDetailService.getByPurchaseIdList(purchaseIdList);
final List<PurchaseDetail> 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<PurchaseMapper, Purchase> i
// 获取规格及数量
// 获取规格信息
final List<StockLog> stockLogList = stockLogService.getByPurchaseIds(purchaseIdList);
final List<StockLog> stockLogList = stockLogService.getByPurchaseIds(purchaseIdList,productId);
final Map<String, List<StockLog>> stockLogMap = new HashMap<>();
// 封装规格属性
for (StockLog stockLog : stockLogList) {

6
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<SaleDetailMapper, SaleDet
@Override
public List<SaleDetail> listOfShopAll(String shopId, String startDate, String endDate) {
// 如果根据时间查询,那么结束时间加1天,
if(StringUtils.isNotEmpty(endDate)){
endDate = DateUtil.addDay(endDate, 1);
}
return saleDetailMapper.listOfShopAll(shopId, startDate, endDate);
}
}

17
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<SaleMapper, Sale> 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<SaleMapper, Sale> implements Sa
@Override
public Page<CustomerBuyProductLogVo> getCustomerBuyProductLog(SalePageQuery salePageQuery) {
final String shopId = "1739537306278301696";// securityUtil.getShopId();
final String shopId = securityUtil.getShopId();
// 先拿到该客户购买的所有商品信息
final Page<CustomerBuyProductLogVo> page = new Page<>(salePageQuery.getPageNum(), salePageQuery.getPageSize());
final String userId = salePageQuery.getUserId();
@ -449,7 +453,16 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
@Override
public Page<SaleNoWorkerVO> getSaleByCompanyId(SalePageQuery salePageQuery) {
final Page<SaleNoWorkerVO> page = new Page<>(salePageQuery.getPageNum(), salePageQuery.getPageSize());
final Page<SaleNoWorkerVO> saleNoWorkerVOPage = saleMapper.getSaleByCompanyId(page, salePageQuery.getCompanyId());
final Page<SaleNoWorkerVO> 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);
}
}

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockLogServiceImpl.java

@ -21,8 +21,8 @@ public class StockLogServiceImpl extends ServiceImpl<StockLogMapper, StockLog> i
}
@Override
public List<StockLog> getByPurchaseIds(List<String> purchaseIds) {
return stockLogMapper.getByPurchaseIds(purchaseIds);
public List<StockLog> getByPurchaseIds(List<String> purchaseIds,String productId) {
return stockLogMapper.getByPurchaseIds(purchaseIds, productId);
}
}

52
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<StockMapper, Stock> 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<StockMapper, Stock> implements
public List<ProductCategoryStockVo> 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<StockProductVo> getTailWarnProduct(StockPageQuery stockPageQuery) {
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
stockPageQuery.setShopId(shopId);
final List<Stock> records = stockMapper.getTailWarnProduct(stockPageQuery);
// final List<Stock> records = result.getRecords();
final Map<String,StockProductVo> 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<StockAttributeVo> stockAttributeVoList = new ArrayList<>();
stockAttributeVoList.add(stockAttributeVo);
stockProductVo.setStockAttributeVoList(stockAttributeVoList);
stringStockProductVoMap.put(productId,stockProductVo);
}
}
List<StockProductVo> stockProductVos = new ArrayList<>(stringStockProductVoMap.values());
return stockProductVos;
}
}

208
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<String, Object> stringObjectMap = result.getOutput().getChoices().get(0).getMessage().getContent().get(0);
jsonObject.set("msg", stringObjectMap);
return jsonObject;
}
public static List<MultiModalConversationResult> multiRoundConversationCall(String picturePath,String firstQuestionMsg,String secondQuestionMsg) throws ApiException, NoApiKeyException, UploadFileException {
final StopWatch stopWatch = new StopWatch("Ai回答计时");
Constants.apiKey = "sk-bcfa4865b89548acb8225f910f13d682";
List<MultiModalConversationResult> 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<MultiModalConversationMessage> 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<Object>(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<Message> 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());
}
}
}

49
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
<foreach collection="userList" item="user" separator=",">
(#{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})
<foreach collection="checkStockDetailList" item="checkStockDetail" separator=",">
(#{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})
</foreach>
</insert>
<select id="getByCheckStockDetailByCheckId" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from t_check_stock_detail
where check_stock_id = #{checkStockId,jdbcType=VARCHAR}
</select>
<select id="getByCheckStockDetailByCheckIdOfPage" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from t_check_stock_detail
where check_stock_id = #{checkStockPageQuery.checkStockId,jdbcType=VARCHAR}
and product_id in
<foreach item="productId" collection="checkStockPageQuery.productIdList" open="(" separator="," close=")">
#{productId}
</foreach>
</select>
<select id="getByCheckStockProductByCheckId" resultType="java.lang.String">
SELECT
product_id
FROM
t_check_stock_detail
WHERE
check_stock_id = #{checkStockPageQuery.checkStockId,jdbcType=VARCHAR}
GROUP BY
product_id
order by product_id
</select>
<delete id="deleteByProductId" parameterType="java.lang.String">
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}
</delete>
</mapper>

10
hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockMapper.xml

@ -75,4 +75,14 @@
<sql id="Base_Column_List">
id, create_by, create_by_name, create_time, del_flag, update_by, update_time, remark, shop_id, shop_name
</sql>
<select id="getCheckStockList" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from t_check_stock
where shop_id = #{deductLogPageQuery.shopId,jdbcType=VARCHAR}
<if test='deductLogPageQuery.startDate != null and deductLogPageQuery.startDate.trim() != "" and deductLogPageQuery.endDate != null and deductLogPageQuery.endDate.trim() != ""'>
and create_time between #{deductLogPageQuery.startDate,jdbcType=VARCHAR} and #{deductLogPageQuery.endDate,jdbcType=VARCHAR}
</if>
</select>
</mapper>

23
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 @@
<select id="getCustomerList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
a.id, a.name, a.sex, a.phone, a.address,
a.province, a.city, a.area, a.shop_id, a.user_id,s.no_earn
from t_customer a
left join (select a.user_id,a.user_name as nickname,sum(a.no_earn) as no_earn
from t_sale a
where 1=1
and a.del_flag = '0' -- 未删除
and a.pay_status != 1
and a.status != '6' -- 待配货
and a.status != '7' -- 挂单
and a.status != '2' -- 取消订单
and a.shop_id = #{queryParams.shopId}
group by a.user_id,a.user_name) s
on a.id = s.user_id
where a.shop_id = #{queryParams.shopId}
and del_flag = #{queryParams.delFlag}
<if test=" queryParams.searchStr != null and queryParams.searchStr != ''">
AND name like concat('%',#{queryParams.searchStr},'%')
</if>
ORDER BY CASE NAME
ORDER BY
CASE
name
WHEN '散客' THEN
1 ELSE 2 END
1 ELSE CONVERT( name USING gbk )
END COLLATE gbk_chinese_ci ASC
</select>
<update id="delById" parameterType="java.lang.String">

33
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},'%')
)
</if>
order by s.is_on_line desc,t.shipping_method
</select>
<select id="getByAreaOfCompany" parameterType="java.lang.String" resultType="cc.hiver.mall.operatingarea.vo.OperatingAreaPageVO">
select
t.shipping_method, t.shipping_method_id,s.mobile,s.rebate_amount,s.is_on_line,s.can_to_door
from t_operating_area t
left join
t_lcompany s
on t.shipping_method_id = s.id
and s.del_flag = '0'
where t.shipping_type = #{shippingType,jdbcType=VARCHAR}
<!--可根据物流公司名称或者网点 模糊查询-->
<if test='seachParams == null or seachParams.trim() eq ""'>
and t.province = #{province,jdbcType=VARCHAR}
and t.city = #{city,jdbcType=VARCHAR}
and t.area = #{area,jdbcType=VARCHAR}
</if>
<!--可根据物流公司名称或者网点 模糊查询-->
<if test='seachParams!=null and seachParams.trim() neq ""'>
AND (t.shipping_method like concat('%',#{seachParams,jdbcType=VARCHAR},'%')
or t.province like concat('%',#{seachParams,jdbcType=VARCHAR},'%')
or t.city like concat('%',#{seachParams,jdbcType=VARCHAR},'%')
or t.area like concat('%',#{seachParams,jdbcType=VARCHAR},'%')
or t.network like concat('%',#{seachParams,jdbcType=VARCHAR},'%')
)
</if>
group by t.shipping_method_id, t.shipping_method
order by s.is_on_line desc,t.shipping_method
</select>
<!--管理商品分页列表-->
<select id="getOperatingAreaList" resultType="cc.hiver.mall.operatingarea.vo.OperatingAreaPageVO">
@ -222,7 +251,7 @@
<if test='queryParams.sortField!=null and queryParams.sortField.trim() neq "" and queryParams.sortField !=null and queryParams.sort.trim() neq ""'>
#{queryParams.sortField} #{queryParams.sort} ,
</if>
t.shipping_type,shipping_method asc
t.province, t.city, t.area
</select>
<select id="getOperatingAreaById" resultType="cc.hiver.mall.operatingarea.vo.OperatingAreaPageVO">

7
hiver-modules/hiver-mall/src/main/resources/mapper/ProductAttributeMapper.xml

@ -269,6 +269,11 @@
t_product_attribute t
LEFT JOIN t_product_attribute_value s ON t.id = s.attribute_id
where t.category_id =#{categoryId,jdbcType=VARCHAR}
order by t.create_time ,s.create_time
order by
case
t.attribute_name
when '颜色' then 1
when '尺码' then 2
else 3 end ,t.create_time ,s.create_time
</select>
</mapper>

14
hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml

@ -558,11 +558,15 @@
and ss.shop_id = t.shop_id
<where>
<!--已上架的-->
1 = 1
AND t.del_flag != '2'
<!--店铺id-->
<if test='queryParams.shopId!=null and queryParams.shopId.trim() neq ""'>
AND t.shop_id = #{queryParams.shopId}
</if>
<!--上下架状态-->
<if test='queryParams.delFlag!=null and queryParams.delFlag.trim() neq ""'>
AND t.del_flag = #{queryParams.delFlag}
</if>
<!--分类id-->
<if test='queryParams.categoryId!=null and queryParams.categoryId.trim() neq ""'>
AND t.category_id =#{queryParams.categoryId}
@ -597,7 +601,7 @@
<if test='queryParams.sortField!=null and queryParams.sortField.trim() neq "" and queryParams.sortField !=null and queryParams.sort.trim() neq ""'>
#{queryParams.sortField} #{queryParams.sort} ,
</if>
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>
<select id="getProductList" resultType="cc.hiver.mall.entity.Product">
@ -619,6 +623,8 @@
<include refid="Base_Column_List"/>
from t_product
<where>
<!--查询为上架和未上架的-->
and del_flag != '2'
and shop_id = #{shopId,jdbcType=VARCHAR}
</where>
ORDER BY
@ -631,6 +637,8 @@
from t_product
where product_sn = #{productSn,jdbcType=VARCHAR}
and shop_id = #{shopId,jdbcType=VARCHAR}
<!--查询为上架和未上架的-->
and del_flag != '2'
</select>
<select id="getByBarcode" resultMap="BaseResultMap">
@ -639,6 +647,8 @@
from t_product
where barcode = #{barcode,jdbcType=VARCHAR}
and shop_id = #{shopId,jdbcType=VARCHAR}
<!--查询为上架和未上架的-->
and del_flag != '2'
</select>
<select id="getByUserIdAndProductId" resultType="cc.hiver.mall.pojo.vo.ProductLastBuyVo">

3
hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseDetailMapper.xml

@ -568,7 +568,8 @@
select
<include refid="Base_Column_List" />
from t_purchase_detail
where purchase_id in
where product_id = #{productId,jdbcType=VARCHAR}
and purchase_id in
<foreach close=")" collection="purchaseIds" item="listItem" open="(" separator=",">
#{listItem}
</foreach>

1
hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseMapper.xml

@ -433,6 +433,7 @@
<include refid="Base_Column_List" />
from t_purchase
where id in (select purchase_id from t_purchase_detail where product_id =#{productId})
order by create_time desc
</select>
<select id="getPurchasingCost" resultType="java.math.BigDecimal">

106
hiver-modules/hiver-mall/src/main/resources/mapper/PurchaseOcrPictureMapper.xml

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.hiver.mall.purchaseocr.mapper.PurchaseOcrPictureMapper">
<resultMap id="BaseResultMap" type="cc.hiver.mall.purchaseocr.entity.PurchaseOcrPicture">
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="create_by_name" jdbcType="VARCHAR" property="createByName" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="del_flag" jdbcType="INTEGER" property="delFlag" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="order_id" jdbcType="VARCHAR" property="orderId" />
<result column="ocr_picture" jdbcType="VARCHAR" property="ocrPicture" />
<result column="ocr_picture_order" jdbcType="INTEGER" property="ocrPictureOrder" />
<result column="ocr_status" jdbcType="INTEGER" property="ocrstatus" />
<result column="ocr_msg" jdbcType="VARCHAR" property="ocrMsg" />
<result column="shop_id" jdbcType="VARCHAR" property="shopId" />
<result column="shop_name" jdbcType="VARCHAR" property="shopName" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
<foreach collection="oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">
<trim prefix="(" prefixOverrides="and" suffix=")">
<foreach collection="criteria.criteria" item="criterion">
<choose>
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="("
separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Update_By_Example_Where_Clause">
<where>
<foreach collection="example.oredCriteria" item="criteria" separator="or">
<if test="criteria.valid">
<trim prefix="(" prefixOverrides="and" suffix=")">
<foreach collection="criteria.criteria" item="criterion">
<choose>
<when test="criterion.noValue">
and ${criterion.condition}
</when>
<when test="criterion.singleValue">
and ${criterion.condition} #{criterion.value}
</when>
<when test="criterion.betweenValue">
and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
</when>
<when test="criterion.listValue">
and ${criterion.condition}
<foreach close=")" collection="criterion.value" item="listItem" open="("
separator=",">
#{listItem}
</foreach>
</when>
</choose>
</foreach>
</trim>
</if>
</foreach>
</where>
</sql>
<sql id="Base_Column_List">
id, create_by, create_by_name, create_time, del_flag, update_by, update_time, order_id, ocr_picture,
ocr_picture_order, ocr_status, ocr_msg, shop_id, shop_name
</sql>
<insert id="batchSave" parameterType="java.util.List">
insert into t_purchase_ocr_picture (id, create_by, create_by_name, create_time, del_flag, update_by, update_time, order_id, ocr_picture,
ocr_picture_order, ocr_status, ocr_msg, shop_id, shop_name) values
<foreach item="purchaseOcrPicture" collection="purchaseOcrPictureList" index="index" separator=",">
(#{purchaseOcrPicture.id,jdbcType=VARCHAR},#{purchaseOcrPicture.createBy,jdbcType=VARCHAR},
#{purchaseOcrPicture.createByName,jdbcType=VARCHAR},#{purchaseOcrPicture.createTime,jdbcType=TIMESTAMP},
#{purchaseOcrPicture.delFlag,jdbcType=INTEGER},#{purchaseOcrPicture.updateBy,jdbcType=VARCHAR},
#{purchaseOcrPicture.updateTime,jdbcType=TIMESTAMP},#{purchaseOcrPicture.orderId,jdbcType=VARCHAR},
#{purchaseOcrPicture.ocrPicture,jdbcType=VARCHAR},#{purchaseOcrPicture.ocrPictureOrder,jdbcType=INTEGER},
#{purchaseOcrPicture.ocrStatus,jdbcType=INTEGER},#{purchaseOcrPicture.ocrMsg,jdbcType=VARCHAR},
#{purchaseOcrPicture.shopId,jdbcType=VARCHAR},#{purchaseOcrPicture.shopName,jdbcType=VARCHAR})
</foreach>
</insert>
<update id="batchUpdate">
<foreach collection="purchaseOcrPictureList" item="item" separator=";" open="" close="">
UPDATE t_purchase_ocr_picture SET ocr_msg = #{item.ocrMsg} , ocr_status = #{item.ocrStatus} WHERE id = #{item.id}
</foreach>
</update>
</mapper>

2
hiver-modules/hiver-mall/src/main/resources/mapper/ReturnSaleMapper.xml

@ -505,7 +505,7 @@
where id = #{id,jdbcType=VARCHAR}
</update>
<select id="saleSumAndCount" parameterType="cc.hiver.mall.entity.ReturnSaleExample" resultType="cc.hiver.mall.pojo.vo.SaleAllVO">
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
<if test="_parameter != null">
<include refid="Example_Where_Clause" />
</if>

42
hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml

@ -36,6 +36,7 @@
<result column="company_phone" jdbcType="VARCHAR" property="companyPhone" />
<result column="product_count" jdbcType="INTEGER" property="productCount" />
<result column="create_by_phone" jdbcType="VARCHAR" property="createByPhone" />
<result column="mode_of_service" jdbcType="VARCHAR" property="modeOfService" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -98,7 +99,7 @@
<sql id="Base_Column_List">
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
</sql>
<select id="selectByExample" parameterType="cc.hiver.mall.entity.SaleExample" resultMap="BaseResultMap">
@ -139,7 +140,7 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
already_earn, no_earn, pay_status,
status, transport_type, share_address,
receive_address, province, city,
area,sale_name,remark,other_expense,trans_company,company_name,company_phone,product_count,create_by_phone)
area,sale_name,remark,other_expense,trans_company,company_name,company_phone,product_count,create_by_phone,mode_of_service)
values (#{id,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR},#{createByName,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{delFlag,jdbcType=INTEGER}, #{updateBy,jdbcType=VARCHAR},#{updateByName,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP},
#{userId,jdbcType=VARCHAR},#{userName,jdbcType=VARCHAR}, #{shopId,jdbcType=VARCHAR},#{shopName,jdbcType=VARCHAR}, #{totalAmount,jdbcType=DECIMAL},
@ -148,7 +149,7 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
#{status,jdbcType=VARCHAR}, #{transportType,jdbcType=VARCHAR}, #{shareAddress,jdbcType=VARCHAR},
#{receiveAddress,jdbcType=VARCHAR}, #{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR},
#{area,jdbcType=VARCHAR}, #{saleName,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR},
#{otherExpense,jdbcType=VARCHAR},#{transCompany,jdbcType=VARCHAR},#{companyName,jdbcType=VARCHAR},#{companyPhone,jdbcType=VARCHAR},#{productCount,jdbcType=INTEGER},#{createByPhone,jdbcType=VARCHAR})
#{otherExpense,jdbcType=VARCHAR},#{transCompany,jdbcType=VARCHAR},#{companyName,jdbcType=VARCHAR},#{companyPhone,jdbcType=VARCHAR},#{productCount,jdbcType=INTEGER},#{createByPhone,jdbcType=VARCHAR},#{modeOfService,jdbcType=VARCHAR})
</insert>
<insert id="insertSelective" parameterType="cc.hiver.mall.entity.Sale">
insert into t_sale
@ -240,6 +241,9 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
<if test="createByPhone != null">
create_by_phone,
</if>
<if test="modeOfService != null">
mode_of_service,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -427,6 +431,9 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
<if test="record.createByPhone != null">
create_by_phone = #{record.createByPhone,jdbcType=VARCHAR},
</if>
<if test="record.modeOfService != null">
mode_of_service = #{record.modeOfService,jdbcType=VARCHAR},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -462,7 +469,8 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
company_name = #{record.companyName,jdbcType=VARCHAR},
company_phone = #{record.companyPhone,jdbcType=VARCHAR},
product_count = #{record.productCount,jdbcType=INTEGER},
create_by_phone = #{record.createByPhone,jdbcType=VARCHAR}
create_by_phone = #{record.createByPhone,jdbcType=VARCHAR},
mode_of_service = #{record.modeOfService,jdbcType=VARCHAR}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -554,6 +562,9 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
<if test="createByPhone != null">
create_by_phone = #{createByPhone,jdbcType=VARCHAR},
</if>
<if test="modeOfService != null">
mode_of_service = #{modeOfService,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
@ -586,7 +597,8 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
company_name = #{companyName,jdbcType=VARCHAR},
company_phone = #{companyPhone,jdbcType=VARCHAR},
product_count = #{productCount,jdbcType=INTEGER},
create_by_phone = #{createByPhone,jdbcType=VARCHAR}
create_by_phone = #{createByPhone,jdbcType=VARCHAR},
mode_of_service = #{modeOfService,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
<select id="saleSumAndCount" parameterType="cc.hiver.mall.entity.SaleExample" resultType="cc.hiver.mall.pojo.vo.SaleAllVO">
@ -631,6 +643,7 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
<include refid="Base_Column_List" />
from t_sale
where id in (select sale_id from t_sale_detail where product_id =#{productId})
order by create_time desc
</select>
<select id="getSalesRankingByShopId" resultType="cc.hiver.mall.pojo.vo.SalesRankingVo">
@ -792,7 +805,22 @@ trans_company, company_name, product_count, remark, sale_name, company_phone, cr
left join t_shop m
on t.shop_id = m.id
WHERE
t.trans_company = #{companyId}
and t.transport_type = '2'
t.trans_company = #{salePageQuery.companyId}
-- and t.transport_type = #{salePageQuery.transportType}
<if test='salePageQuery.status !=null and salePageQuery.status != ""'>
and t.status = #{salePageQuery.status}
</if>
<if test='salePageQuery.status !=null and salePageQuery.status != ""'>
and t.mode_of_service = #{salePageQuery.modeOfService}
</if>
</select>
<update id="companyGetSale" >
update t_sale
set
status = '9'
where id = #{saleId,jdbcType=VARCHAR}
</update>
</mapper>

3
hiver-modules/hiver-mall/src/main/resources/mapper/StockLogMapper.xml

@ -391,7 +391,8 @@
select
<include refid="Base_Column_List" />
from t_stock_log
where order_id in
where product_id = #{productId,jdbcType=VARCHAR}
and order_id in
<foreach close=")" collection="purchaseIds" item="listItem" open="(" separator=",">
#{listItem}
</foreach>

39
hiver-modules/hiver-mall/src/main/resources/mapper/StockMapper.xml

@ -558,13 +558,19 @@
<select id="stockListOfShop" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from t_stock
s.id, s.create_by, s.create_time, s.del_flag, s.update_by, s.update_time, s.product_id, s.product_name,
s.unit, s.shop_id, s.category_id, s.attribute_list, s.supplier_id, s.supplier_name, s.product_sn, s.barcode, s.price,
s.purchase_price, s.wholesale_price, s.product_picture, s.product_video, s.product_intro, s.sales_week,
s.print_barcode, s.stock_count, s.stock_warn_count, s.tail_warn
from t_stock s
right join t_product t
on s.product_id = t.id
and t.del_flag != 2
<where>
and shop_id = #{shopId,jdbcType=VARCHAR}
and s.shop_id = #{shopId,jdbcType=VARCHAR}
</where>
ORDER BY
create_time desc
s.create_time desc
</select>
<select id="productCount" parameterType="java.lang.String" resultType="java.lang.String">
@ -592,4 +598,29 @@
ORDER BY
attribute_list desc
</select>
<select id="getTailWarnProduct" resultMap="BaseResultMap">
SELECT
s.product_id,
s.product_name,
s.product_sn,
p.product_picture,
p.print_barcode,
s.attribute_list,
s.stock_count,
p.tail_warn
FROM
t_stock s
right join t_product p
ON s.product_id = p.id
and p.del_flag != 2
where s.shop_id= #{stockPageQuery.shopId,jdbcType=VARCHAR}
and s.stock_count &lt; p.tail_warn
<if test="stockPageQuery.searchStr != null and stockPageQuery.searchStr !=''">
and (s.product_name like concat('%',#{stockPageQuery.searchStr,jdbcType=VARCHAR},'%')
or s.product_sn like concat('%',#{stockPageQuery.searchStr,jdbcType=VARCHAR},'%')
)
</if>
order by s.product_name
</select>
</mapper>
Loading…
Cancel
Save