Browse Source

快小猪:

1.物流的模型修改;
2.放开待入库交易记录挂钩限制;
3.app/productShare/save 接口传一个scene参数  在share表存一下,在getShareList的时候返回(前台会传参id的时候);
4.app/sale/buyAi需要返回attrId;
5.快小猪:
buyNew接口  旧商品的新规格没有和attrId的分类绑定
6.快小猪:
app/sale/listPages返回商品的 分类价格;还有getShopAll;还有app/sale/get/还有app/purchase/getPurchaseAllData
8.快小猪:
app/customerCategory/getCustomerCategoryListByShopId  加上负库存数
9.快小猪:
app/sale/savePresale接收一下categoryId(客户分类)如果有值的话(前台不一定传值),并保存到客户表里,app/debt/selectByUserId需要返回categoryId
10.快小猪:
purchaseOcrPicture/callWithMessageOfPurchase和app/sale/buyAi确保把productCount返回一个数字,没有就返回0
11.快小猪:
app/sale/buyAi
purchaseOcrPicture/callWithMessageOfPurchase
app/product/getByProductSn
app/product/getShareList
app/product/getByBarcode
app/product/getById
app/sale/listPages还有首页app/sale/getShopAll和app/sale/get/(这几个可能和上边逻辑不一样,是已保存到表里的saledetail里的productId联查)
这几个接口  接口加一个参数  客户id,如果前台传值了,需要联查该客户  以上接口查询到的商品的 购买次数
12.入库(分新商品和旧商品更新)、新增商品、编辑桑品。判断一下前台有可能传值null字符串和 '[]',数据库保存''.(历史数据需要处理)
dev
wangfukang 2 years ago
parent
commit
62d85b2721
  1. 18
      hiver-admin/test-output/test-report.html
  2. 24
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java
  3. 37
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/SaleController.java
  4. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/dao/mapper/SaleMapper.java
  5. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/entity/Debt.java
  6. 10
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java
  7. 5
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Product.java
  8. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleDetailDTO.java
  9. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleQueryDTO.java
  10. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java
  11. 16
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/BuyCountVo.java
  12. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo2.java
  13. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductPageVO.java
  14. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleVO.java
  15. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ShopStockVo.java
  16. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java
  17. 6
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductService.java
  18. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/SaleService.java
  19. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java
  20. 198
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductServiceImpl.java
  21. 86
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java
  22. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java
  23. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java
  24. 7
      hiver-modules/hiver-mall/src/main/resources/mapper/ProductCategoryMapper.xml
  25. 4
      hiver-modules/hiver-mall/src/main/resources/mapper/ProductMapper.xml
  26. 19
      hiver-modules/hiver-mall/src/main/resources/mapper/SaleMapper.xml

18
hiver-admin/test-output/test-report.html

@ -5,7 +5,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Hiver测试报告</title>
<title>Hiver测试报告</title>
<link rel="apple-touch-icon" href="spark/logo.png">
<link rel="shortcut icon" href="spark/logo.png">
<link rel="stylesheet" href="spark/spark-style.css">
@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a>
</li>
<li class="m-r-10">
<a href="#"><span class="badge badge-primary">九月 21, 2024 16:22:06</span></a>
<a href="#"><span class="badge badge-primary">九月 23, 2024 22:26:15</span></a>
</li>
</ul>
</div>
@ -84,7 +84,7 @@
<div class="test-detail">
<span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p>
<p class="text-sm"><span>16:22:06 下午</span> / <span>0.012 secs</span></p>
<p class="text-sm"><span>22:26:16 下午</span> / <span>0.015 secs</span></p>
</div>
<div class="test-contents d-none">
<div class="detail-head">
@ -92,9 +92,9 @@
<div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>09.21.2024 16:22:06</span>
<span class='badge badge-danger'>09.21.2024 16:22:06</span>
<span class='badge badge-default'>0.012 secs</span>
<span class='badge badge-success'>09.23.2024 22:26:16</span>
<span class='badge badge-danger'>09.23.2024 22:26:16</span>
<span class='badge badge-default'>0.015 secs</span>
</div>
<div class="m-t-10 m-l-5"></div>
</div>
@ -104,7 +104,7 @@
<tbody>
<tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td>
<td>16:22:06</td>
<td>22:26:16</td>
<td>
Test passed
</td>
@ -128,13 +128,13 @@
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Started</p>
<h3>九月 21, 2024 16:22:06</h3>
<h3>九月 23, 2024 22:26:15</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>九月 21, 2024 16:22:06</h3>
<h3>九月 23, 2024 22:26:16</h3>
</div></div>
</div>
<div class="col-md-3">

24
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ProductController.java

@ -56,7 +56,7 @@ public class ProductController {
// 根据货号查询商品是否存在
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
final CopyOnWriteArrayList<Product> oldProductListBySn = productService.getByProductSn(productVo.getProductSn(), shopId);
final CopyOnWriteArrayList<Product> oldProductListBySn = productService.getByProductSn(productVo.getProductSn(), shopId,"");
if (oldProductListBySn != null && !oldProductListBySn.isEmpty()) {
return ResultUtil.error("您已有货号"+productVo.getProductSn()+"的商品,请更换货号");
}
@ -77,6 +77,10 @@ public class ProductController {
product.setShopId(shopId);
// 新增的默认为已上架
product.setDelFlag(CommonConstant.DEL_FLAG_TRUE);
// 处理前台的错误传参
if("[]".equals(product.getCustomerCategoryRule()) || "null".equals(product.getCustomerCategoryRule())){
product.setCustomerCategoryRule("");
}
final boolean result = productService.save(product);
// 如果有子图,那么新增子图信息
final List<ProductPicture> productPictures = productVo.getProductPictures();
@ -100,7 +104,7 @@ public class ProductController {
// 根据货号查询商品是否存在
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
final CopyOnWriteArrayList<Product> oldProductListBySn = productService.getByProductSn(productVo.getProductSn(), shopId);
final CopyOnWriteArrayList<Product> oldProductListBySn = productService.getByProductSn(productVo.getProductSn(), shopId,"");
if (oldProductListBySn != null && !oldProductListBySn.isEmpty()) {
// 如果旧商品id不等于前台传递的商品id,则返回信息
if (!productVo.getId().equals(oldProductListBySn.get(0).getId())) {
@ -123,6 +127,10 @@ public class ProductController {
} else {
return ResultUtil.error("添加分类信息失败");
}
// 处理前台的错误传参
if("[]".equals(product.getCustomerCategoryRule()) || "null".equals(product.getCustomerCategoryRule())){
product.setCustomerCategoryRule("");
}
final boolean result = productService.updateById(product);
// 如果有子图,那么新增子图信息
final List<ProductPicture> productPictures = productVo.getProductPictures();
@ -326,8 +334,8 @@ public class ProductController {
@RequestMapping(value = "/getById/{id}", method = RequestMethod.POST)
@ApiOperation("根据id查询商品信息")
public Result<Product> getById(@PathVariable String id) {
final Product byId = productService.getByIdOrBrcode(id);
public Result<Product> getById(@PathVariable String id,String customerId) {
final Product byId = productService.getByIdOrBrcode(id, customerId);
if (byId != null) {
return new ResultUtil<Product>().setData(byId);
} else {
@ -337,10 +345,10 @@ public class ProductController {
@RequestMapping(value = "/getByProductSn", method = RequestMethod.POST)
@ApiOperation("根据货号获取商品信息")
public Result<List<Product>> getByProductSn(String productSn) {
public Result<List<Product>> getByProductSn(String productSn,String customerId) {
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
final List<Product> byProductSn = productService.getByProductSn(productSn, shopId);
final List<Product> byProductSn = productService.getByProductSn(productSn, shopId,customerId);
if (byProductSn != null) {
return new ResultUtil<List<Product>>().setData(byProductSn);
} else {
@ -350,8 +358,8 @@ public class ProductController {
@RequestMapping(value = "/getByBarcode", method = RequestMethod.POST)
@ApiOperation("根据条码获取商品信息")
public Result<List<Product>> getByBarcode(String barcode) {
final List<Product> byBarcode = productService.getByBarcode(barcode);
public Result<List<Product>> getByBarcode(String barcode, String customerId) {
final List<Product> byBarcode = productService.getByBarcode(barcode, customerId);
if (byBarcode != null) {
return new ResultUtil<List<Product>>().setData(byBarcode);
} else {

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

@ -480,7 +480,7 @@ public class SaleController {
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
@ApiOperation("获得订单详情")
public Result<SaleNewVO> get(@PathVariable String id) {
public Result<SaleNewVO> get(@PathVariable String id, String customerId) {
final SaleNewVO saleNewVO = new SaleNewVO();
final Sale sale = saleService.getById(id);
saleNewVO.setSale(sale);
@ -537,6 +537,7 @@ public class SaleController {
if (productMap.containsKey(productId)) {
final BigDecimal purchasePrice = productMap.get(productId).getPurchasePrice() == null ? BigDecimal.ZERO : productMap.get(productId).getPurchasePrice();
saleDetailDTO.setPurchasePrice(purchasePrice);
saleDetailDTO.setCustomerCategoryRule(productMap.get(productId).getCustomerCategoryRule());
} else {
saleDetailDTO.setPurchasePrice(saleDetail.getPurchasePrice());
}
@ -560,10 +561,23 @@ public class SaleController {
saleDetailDTO.setStockLogList1(saleDetailQueryDTOS);
saleDetailDTOS.add(saleDetailDTO);
}
// 如果客户id不为空,查询客户的购买次数
if (StringUtils.isNotEmpty(customerId)) {
final List<BuyCountVo> buyCount = saleService.buyCount(customerId, list);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
for (SaleDetailDTO saleDetailDTO : saleDetailDTOS) {
final String productId = saleDetailDTO.getProductId();
saleDetailDTO.setBuyCount(buyCountMap.getOrDefault(productId, 0));
}
}
saleNewVO.setSaleDetailDTOList(saleDetailDTOS);
//增加客户信息明细
final String customerId = sale.getUserId();
final Customer customer = customerService.getById(customerId);
final String addCustomerId = sale.getUserId();
final Customer customer = customerService.getById(addCustomerId);
saleNewVO.setCustomer(customer);
// 增加物流公司信息
final String transCompanyId = sale.getTransCompany();
@ -1157,12 +1171,12 @@ public class SaleController {
@RequestMapping(value = "/buyAi", method = RequestMethod.POST)
@ApiOperation("同步步Ai开单")
public Result buyAi(String aiMsg) {
public Result buyAi(String aiMsg, String customerId) {
if (StringUtils.isEmpty(aiMsg)) {
ResultUtil.error("指令不能为空!");
}
final JSONObject jsonObject = saleService.buyAi(aiMsg);
final JSONObject jsonObject = saleService.buyAi(aiMsg, customerId);
return new ResultUtil<JSONObject>().setData(jsonObject);
}
@ -1332,4 +1346,17 @@ public class SaleController {
return ResultUtil.error("暂存失败!");
}
}
// 查询指定客户的购买次数
@RequestMapping(value = "/buyCount", method = RequestMethod.POST)
@ApiOperation("查询指定客户的购买次数")
public Result buyCount(String customerId, String productIds) {
if (StringUtils.isEmpty(customerId)) {
return ResultUtil.error("客户id不能为空");
}
// 将productIds使用,分隔,并封装为list
final List<String> productIdList = Arrays.asList(productIds.split(","));
final List<BuyCountVo> count = saleService.buyCount(customerId, productIdList);
return new ResultUtil<List<BuyCountVo>>().setData(count);
}
}

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

@ -140,4 +140,6 @@ public interface SaleMapper extends BaseMapper<Sale> {
* @date 2024/8/18
*/
Page<TotalAmountDetailByProductVo> totalAmountDetailByProduct(Page<TotalAmountDetailByProductVo> page, @Param("salePageQuery") SalePageQuery salePageQuery);
List<BuyCountVo> buyCount(@Param("customerId")String customerId, @Param("productIdList") List<String> productIdList);
}

12
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/entity/Debt.java

@ -1,11 +1,13 @@
package cc.hiver.mall.debt.entity;
import cc.hiver.core.base.HiverBaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.Transient;
import java.math.BigDecimal;
@Data
@ -35,4 +37,14 @@ public class Debt extends HiverBaseEntity {
@ApiModelProperty(value = "欠款方式:0:客户欠款;1:供应商欠款")
private String userType;
@Transient
@TableField(exist = false)
@ApiModelProperty(value = "客户分类id")
private String categoryId;
@Transient
@TableField(exist = false)
@ApiModelProperty(value = "客户分类名称")
private String categoryName;
}

10
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/debt/service/impl/DebtServiceImpl.java

@ -290,7 +290,15 @@ public class DebtServiceImpl extends ServiceImpl<DebtMapper, Debt> implements De
@Override
public Debt selectByUserId(String shopId, String userId) {
return debtMapper.selectByUserId(shopId, userId);
final Debt debt = debtMapper.selectByUserId(shopId, userId);
// 查询客户的分类id
if(debt != null){
// 获取客户信息
final Customer customer = customerService.getById(userId);
debt.setCategoryId(customer.getCategoryId());
debt.setCategoryName(customer.getCategoryName());
}
return debt == null ? new Debt() : debt;
}
@Override

5
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Product.java

@ -123,4 +123,9 @@ public class Product implements Serializable {
@ApiModelProperty(value = "库存数量")
private Integer stockCount;
@Transient
@TableField(exist = false)
@ApiModelProperty(value = "客户购买数量")
private Integer buyCount;
}

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleDetailDTO.java

@ -76,6 +76,12 @@ public class SaleDetailDTO implements Serializable {
@ApiModelProperty(value = "客户分类价格规则")
private String customerCategoryRule;
@ApiModelProperty(value = "商品专属分类id")
private String attrId;
@ApiModelProperty(value = "客户购买数量")
private Integer buyCount;
private static final long serialVersionUID = 1L;

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/SaleQueryDTO.java

@ -36,6 +36,12 @@ public class SaleQueryDTO implements Serializable {
@ApiModelProperty(value = "客户名称")
private String username;
@ApiModelProperty(value = "客户分类id")
private String categoryId;
@ApiModelProperty(value = "客户分类名称")
private String categoryName;
@ApiModelProperty(value = "挂单及分享单的id")
private String oldSaleId;
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java

@ -72,4 +72,7 @@ public class ProductPageQuery extends HiverBasePageQuery {
@ApiModelProperty("结束时间")
private String endDate;
@ApiModelProperty("客户id")
private String customerId;
}

16
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/BuyCountVo.java

@ -0,0 +1,16 @@
package cc.hiver.mall.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "客户商品购买数量Vo")
public class BuyCountVo {
@ApiModelProperty(value = "商品id")
private String productId;
@ApiModelProperty(value = "购买次数")
private Integer buyCount;
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductCategoryVo2.java

@ -23,5 +23,8 @@ public class ProductCategoryVo2 extends HiverBaseEntity {
@ApiModelProperty(value = "盘点数量")
private int stockCount;
@ApiModelProperty(value = "商品总负库存数(某一规格库存为正数的按0计算总数)")
private Integer minusStockCount;
private static final long serialVersionUID = 1L;
}

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductPageVO.java

@ -101,6 +101,9 @@ public class ProductPageVO {
@ApiModelProperty(value = "商品总库存(某一规格库存为负数的按0计算总数)")
private Integer stockCount;
@ApiModelProperty(value = "商品总负库存数(某一规格库存为正数的按0计算总数)")
private Integer minusStockCount;
@ApiModelProperty(value = "入库状态:0:待入库(未维护对应的采购价信息);1:已入库;新增商品时为已入库")
private Integer inStorageStatus;
@ -117,4 +120,7 @@ public class ProductPageVO {
@ApiModelProperty(value = "客户价格规则")
private String customerCategoryRule;
@ApiModelProperty(value = "商品购买数量")
private Integer buyCount;
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/SaleVO.java

@ -77,4 +77,7 @@ public class SaleVO implements Serializable {
@ApiModelProperty(value = "删除标识")
String delFlag;
@ApiModelProperty(value = "客户id(如果传了这,需要查询客户的购买数量)")
private String customerId;
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ShopStockVo.java

@ -26,6 +26,9 @@ public class ShopStockVo {
@ApiModelProperty(value = "库存数")
private Integer stockCount;
@ApiModelProperty(value = "负库存数")
private Integer minusStockCount;
@ApiModelProperty(value = "库存成本")
private BigDecimal stockCost;

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/purchaseocr/service/impl/PurchaseOcrPictureServiceImpl.java

@ -241,7 +241,7 @@ public class PurchaseOcrPictureServiceImpl implements PurchaseOcrPictureService
final String attributeList = object.getString("attributeList");
final JSONArray attributeListJsonArray = JSON.parseArray(attributeList);
// 根据货号去查询商品,如果
final List<Product> byProductSn = productService.getByProductSn(productSn, shopId);
final List<Product> byProductSn = productService.getByProductSn(productSn, shopId,"");
if (byProductSn != null && !byProductSn.isEmpty()) {
// 原则上一个店铺一个货号对应一个商品,这里如果查到了,直接拿第一个。
final Product product = byProductSn.get(0);

6
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/ProductService.java

@ -30,13 +30,13 @@ public interface ProductService extends IService<Product> {
*/
List<Product> getProductListOfShop();
CopyOnWriteArrayList<Product> getByProductSn(String productSn, String shopId);
CopyOnWriteArrayList<Product> getByProductSn(String productSn, String shopId,String customerId);
ProductLastBuyVo getByUserIdAndProductId(String userId, String productId);
Product getByIdOrBrcode(String id);
Product getByIdOrBrcode(String id,String customerId);
List<Product> getByBarcode(String barcode);
List<Product> getByBarcode(String barcode, String customerId);
/**
* 删除分类时根据分类id删除商品信息

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

@ -57,7 +57,7 @@ public interface SaleService extends IService<Sale> {
void buyAiSync(String aiMsg, String saleId);
JSONObject buyAi(String aiMsg);
JSONObject buyAi(String aiMsg, String customerId);
void updateAiFlag(String id, Integer status);
@ -148,4 +148,14 @@ public interface SaleService extends IService<Sale> {
* @date 2024/8/18
*/
Page<TotalAmountDetailByProductVo> totalAmountDetailByProduct(SalePageQuery salePageQuery);
/**
* 获取客户购买次数
*
* @param customerId
* @return Integer
* @author 王富康
* @date 2024/9/26
*/
List<BuyCountVo> buyCount(String customerId, List<String> productIdList);
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/SalesAndDetailsServiceImpl.java

@ -507,6 +507,8 @@ public class SalesAndDetailsServiceImpl implements SalesAndDetailsService {
customer.setCity(saleQueryDTO.getSale().getCity());
customer.setArea(saleQueryDTO.getSale().getArea());
customer.setShopId(saleQueryDTO.getSale().getShopId());
customer.setCategoryId(saleQueryDTO.getCategoryId());
customer.setCategoryName(saleQueryDTO.getCategoryName());
customerService.save(customer);
// 客户id拿新增的
customerId = customer.getId();

198
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductServiceImpl.java

@ -7,6 +7,7 @@ import cc.hiver.core.entity.User;
import cc.hiver.mall.common.constant.PurchaseConstant;
import cc.hiver.mall.dao.mapper.ProductMapper;
import cc.hiver.mall.entity.Product;
import cc.hiver.mall.entity.ProductAttributeValue;
import cc.hiver.mall.entity.Stock;
import cc.hiver.mall.pojo.dto.SaleDetailDTO;
import cc.hiver.mall.pojo.dto.SaleDetailQueryDTO;
@ -15,9 +16,7 @@ import cc.hiver.mall.pojo.query.ProductPageQuery;
import cc.hiver.mall.pojo.vo.*;
import cc.hiver.mall.productpicture.entity.ProductPicture;
import cc.hiver.mall.productpicture.service.ProductPictureService;
import cc.hiver.mall.service.mybatis.ProductCategoryService;
import cc.hiver.mall.service.mybatis.ProductService;
import cc.hiver.mall.service.mybatis.StockService;
import cc.hiver.mall.service.mybatis.*;
import cc.hiver.mall.utils.DateUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
@ -47,9 +46,15 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
@Autowired
private ProductCategoryService productCategoryService;
@Autowired
private ProductAttributeValueService productAttributeValueService;
@Autowired
private StockService stockService;
@Autowired
private SaleService saleService;
@Override
public IPage<ProductPageVO> getShareList(ProductPageQuery productPageQuery) {
if (StringUtils.isNotEmpty(productPageQuery.getEndDate())) {
@ -62,7 +67,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
final List<String> productIdList = new ArrayList<>();
for (ProductPageVO productPageVO : list) {
productIdList.add(productPageVO.getId());
}
if (!productIdList.isEmpty()) {
// 获取子图
final List<ProductPicture> productPictureByProductIds = productPictureService.getProductPictureByProductIds(productIdList);
@ -83,7 +90,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
}
}
// 获取商品均色均码的库存数
List<Stock> stockList = stockService.getDefaultStockCount(productIdList);
final List<Stock> stockList = stockService.getDefaultStockCount(productIdList);
// 处理为map, key为productId
final Map<String, Stock> stockMap = new HashMap<>();
for (Stock stock : stockList) {
@ -97,6 +104,19 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
productPageVO.setDefaultStockCount(0);
}
}
// 如果客户id不为空,查询客户的购买次数
if (StringUtils.isNotEmpty(productPageQuery.getCustomerId())) {
final List<BuyCountVo> buyCount = saleService.buyCount(productPageQuery.getCustomerId(), productIdList);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
for (ProductPageVO productPageVO : list) {
final String productId = productPageVO.getId();
productPageVO.setBuyCount(buyCountMap.getOrDefault(productId, 0));
}
}
}
page.setRecords(list);
return page;
@ -132,8 +152,25 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
}
@Override
public CopyOnWriteArrayList<Product> getByProductSn(String productSn, String shopId) {
return baseMapper.getByProductSn(productSn, shopId);
public CopyOnWriteArrayList<Product> getByProductSn(String productSn, String shopId, String customerId) {
final CopyOnWriteArrayList<Product> byProductSn = baseMapper.getByProductSn(productSn, shopId);
// 如果客户id不为空,查询客户的购买次数
if (StringUtils.isNotEmpty(customerId)) {
// 理论上来说一个货号在一个店铺中只会查询到一个商品信息
final List<String> productIdList = new ArrayList<>();
productIdList.add(byProductSn.get(0).getId());
final List<BuyCountVo> buyCount = saleService.buyCount(customerId, productIdList);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
for (Product product : byProductSn) {
product.setBuyCount(buyCountMap.getOrDefault(product.getId(), 0));
}
}
return byProductSn;
}
@Override
@ -142,15 +179,46 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
}
@Override
public Product getByIdOrBrcode(String id) {
return baseMapper.getByIdOrBrcode(id);
public Product getByIdOrBrcode(String id, String customerId) {
final Product byIdOrBrcode = baseMapper.getByIdOrBrcode(id);
// 如果客户id不为空,查询客户的购买次数
if (StringUtils.isNotEmpty(customerId)) {
final List<String> productIdList = new ArrayList<>();
productIdList.add(byIdOrBrcode.getId());
final List<BuyCountVo> buyCount = saleService.buyCount(customerId, productIdList);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
byIdOrBrcode.setBuyCount(buyCountMap.getOrDefault(byIdOrBrcode.getId(), 0));
}
return byIdOrBrcode;
}
@Override
public List<Product> getByBarcode(String barcode) {
public List<Product> getByBarcode(String barcode, String customerId) {
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
return baseMapper.getByBarcode(barcode, shopId);
final List<Product> byBarcode = baseMapper.getByBarcode(barcode, shopId);
// 如果客户id不为空,查询客户的购买次数
if (StringUtils.isNotEmpty(customerId)) {
final List<String> productIdList = new ArrayList<>();
for (Product product : byBarcode) {
productIdList.add(product.getId());
}
final List<BuyCountVo> buyCount = saleService.buyCount(customerId, productIdList);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
for (Product product : byBarcode) {
final String productId = product.getId();
product.setBuyCount(buyCountMap.getOrDefault(productId, 0));
}
}
return byBarcode;
}
/**
@ -177,7 +245,8 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
// 需要新增的商品
final List<Product> addProductList = new ArrayList<>();
final List<ProductPicture> addProductPictureList = new ArrayList<>();
// 需要新增的属性值集合
final List<ProductAttributeValue> productAttributeValues = new ArrayList<>();
for (SaleDetailDTO saleDetailDTO : saleDetailList) {
// 需要新增的商品规格信息
final ProductCategoryVo productCategoryVo = new ProductCategoryVo();
@ -194,7 +263,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
continue;
}
// 根据货号查询商品是否存在
CopyOnWriteArrayList<Product> oldProductListBySn = getByProductSn(saleDetailDTO.getProductSn(), shopId);
final CopyOnWriteArrayList<Product> oldProductListBySn = getByProductSn(saleDetailDTO.getProductSn(), shopId, "");
if (oldProductListBySn != null && !oldProductListBySn.isEmpty()) {
// 旧商品,赋值商品id
saleDetailDTO.setProductId(oldProductListBySn.get(0).getId());
@ -235,9 +304,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
for (SaleDetailQueryDTO saleDetailQueryDTO : stockLogList1) {
final String attributeList = saleDetailQueryDTO.getAttributeList();
final StringBuilder newAttributeList = new StringBuilder();
newAttributeList.append("{");
StringBuilder colorStr = new StringBuilder("\"颜色\":");
StringBuilder sizeStr = new StringBuilder("\"尺码\":");
newAttributeList.append('{');
final StringBuilder colorStr = new StringBuilder("\"颜色\":");
final StringBuilder sizeStr = new StringBuilder("\"尺码\":");
final JSONObject jsonObject = JSONUtil.parseObj(attributeList);
for (Map.Entry<String, Object> stringObjectEntry : jsonObject.entrySet()) {
final String key = stringObjectEntry.getKey();
@ -300,8 +369,103 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
product.setAttrId(s);
addProductList.add(product);
}
} else {
// 判断规格是否需要新增
final List<String> categoryIdList = new ArrayList<>();
categoryIdList.add(saleDetailDTO.getAttrId());
// 获取商品下的规格
final List<ProductCategoryVo> shopCategory = productCategoryService.getShopCategory(categoryIdList);
final ProductCategoryVo oldProductCategoryVo = shopCategory.get(0);
final List<ProductAttributeOfAddVo> productAttributeOfAddVos = oldProductCategoryVo.getProductAttributeOfAddVos();
final Map<String, ProductAttributeOfAddVo> productAttributeOfAddVoMap = new HashMap<>();
for (ProductAttributeOfAddVo productAttributeOfAddVo : productAttributeOfAddVos) {
productAttributeOfAddVoMap.put(productAttributeOfAddVo.getAttributeName(), productAttributeOfAddVo);
}
//获取颜色及规格进行拼接
List<ProductAttributeValueVo> colorProductAttributeValueVoList = new ArrayList<>();
List<ProductAttributeValueVo> sizeProductAttributeValueVoList = new ArrayList<>();
if (productAttributeOfAddVoMap.containsKey("颜色")) {
colorProductAttributeValueVoList = productAttributeOfAddVoMap.get("颜色").getProductAttributeValueVoList();
}
// 将所有颜色放到一个集合中
final CopyOnWriteArrayList<String> colorList = new CopyOnWriteArrayList<>();
for (ProductAttributeValueVo productAttributeValueVo : colorProductAttributeValueVoList) {
colorList.add(productAttributeValueVo.getValue());
}
if (productAttributeOfAddVoMap.containsKey("尺码")) {
sizeProductAttributeValueVoList = productAttributeOfAddVoMap.get("尺码").getProductAttributeValueVoList();
}
// 将所有尺码放到一个集合中
final CopyOnWriteArrayList<String> sizeList = new CopyOnWriteArrayList<>();
for (ProductAttributeValueVo productAttributeValueVo : sizeProductAttributeValueVoList) {
sizeList.add(productAttributeValueVo.getValue());
}
// 判断是否需要新增规格
// 将规格及规格下的规格值提取出来
final List<SaleDetailQueryDTO> stockLogList1 = saleDetailDTO.getStockLogList1();
for (SaleDetailQueryDTO saleDetailQueryDTO : stockLogList1) {
final String attributeList = saleDetailQueryDTO.getAttributeList();
final StringBuilder newAttributeList = new StringBuilder();
newAttributeList.append('{');
final StringBuilder colorStr = new StringBuilder("\"颜色\":");
final StringBuilder sizeStr = new StringBuilder("\"尺码\":");
final JSONObject jsonObject = JSONUtil.parseObj(attributeList);
for (Map.Entry<String, Object> stringObjectEntry : jsonObject.entrySet()) {
final String key = stringObjectEntry.getKey();
String value = String.valueOf(stringObjectEntry.getValue());
// 根据规格id规格是颜色、还是尺码。
if ("颜色".equals(key)) {
if (!value.contains("色")) {
value += '色';
}
colorStr.append('"' + value + '"');
// 判断该商品是否已包含该颜色,不包含,则需要新增
if (!colorList.contains(value)) {
final ProductAttributeValue productAttributeValue = new ProductAttributeValue();
final String attributeId = productAttributeOfAddVoMap.get("颜色").getAttributeId();
productAttributeValue.setAttributeId(attributeId);
productAttributeValue.setValue(value);
productAttributeValues.add(productAttributeValue);
}
} else if ("尺码".equals(key)) {
final String valueUpperCase = value.toUpperCase();
if (value.contains("码")) {
value = valueUpperCase;
} else {
value = valueUpperCase + '码';
}
sizeStr.append('"' + value + '"');
// 判断该商品是否已包含该尺码,不包含,则需要新增
if (!colorList.contains(value)) {
final ProductAttributeValue productAttributeValue = new ProductAttributeValue();
final String attributeId = productAttributeOfAddVoMap.get("尺码").getAttributeId();
productAttributeValue.setAttributeId(attributeId);
productAttributeValue.setValue(value);
productAttributeValues.add(productAttributeValue);
}
} else {
// 暂不支持其他规格
}
if (attributeValueMap.containsKey(key)) {
final List<String> strings = attributeValueMap.get(key);
if (!strings.contains(value)) {
strings.add(value);
}
} else {
final List<String> valueList = new ArrayList<>();
valueList.add(value);
attributeValueMap.put(key, valueList);
}
}
newAttributeList.append(colorStr);
newAttributeList.append(',');
newAttributeList.append(sizeStr);
newAttributeList.append('}');
saleDetailQueryDTO.setAttributeList(newAttributeList.toString());
}
}
}
if (!addProductList.isEmpty()) {
// 批量插入商品
productMapper.batchSaveProduct(addProductList);
@ -310,6 +474,10 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
// 批量插入商品图片
productPictureService.batchSaveProductPicture(addProductPictureList);
}
//批量插入属性值
if (!productAttributeValues.isEmpty()) {
productAttributeValueService.saveBatch(productAttributeValues, productAttributeValues.size());
}
return saleQueryDTO;
}

86
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/SaleServiceImpl.java

@ -58,7 +58,7 @@ import java.util.regex.Pattern;
public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements SaleService {
private static final Pattern productSn = Pattern.compile("货号");
private static final Pattern COMPILE = Pattern.compile("\\D+");
private static final Pattern COMPILE = Pattern.compile("-?\\d+");
private static final Pattern SYYS = Pattern.compile("所有颜色", Pattern.LITERAL);
private static final Pattern SYCM = Pattern.compile("所有尺码", Pattern.LITERAL);
@Autowired
@ -174,6 +174,7 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
}
final Page<Sale> saleList = saleMapper.queryPage(page, saleVO);
// 获取订单详情信息
List<String> productIdList = new ArrayList<>();
for (Sale sale : saleList.getRecords()) {
final QueryWrapper<SaleDetail> querySaleDetailWrapper = new QueryWrapper<>();
querySaleDetailWrapper.select("product_id")
@ -181,6 +182,7 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
.groupBy("product_id");
final List<String> list = saleDetailService.selectByCondition1(querySaleDetailWrapper);
if (!list.isEmpty()) {
productIdList.addAll(list);
final List<SaleDetailDTO> saleDetailDTOS = new ArrayList<>();
final Map<String, Product> productMap = new HashMap<>();
// 获取商品信息
@ -219,10 +221,12 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
saleDetailDTO.setRealPrice(saleDetail.getRealPrice());
// 回填商品的的图片及货号
if (productMap.containsKey(productId)) {
BigDecimal purchasePrice = productMap.get(productId).getPurchasePrice() == null ? BigDecimal.ZERO : productMap.get(productId).getPurchasePrice();
final BigDecimal purchasePrice = productMap.get(productId).getPurchasePrice() == null ? BigDecimal.ZERO : productMap.get(productId).getPurchasePrice();
saleDetailDTO.setPurchasePrice(purchasePrice);
saleDetailDTO.setProductPicture(productMap.get(productId).getProductPicture());
saleDetailDTO.setProductSn(productMap.get(productId).getProductSn());
saleDetailDTO.setAttrId(productMap.get(productId).getAttrId());
saleDetailDTO.setCustomerCategoryRule(productMap.get(productId).getCustomerCategoryRule());
} else {
saleDetailDTO.setPurchasePrice(saleDetail.getPurchasePrice());
}
@ -244,6 +248,21 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
sale.setSaleDetailDTOList(saleDetailDTOS);
}
}
// 如果客户id不为空,查询客户的购买次数
if (StringUtils.isNotEmpty(saleVO.getCustomerId())) {
final List<BuyCountVo> buyCount = saleService.buyCount(saleVO.getCustomerId(), productIdList);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
for (Sale saleListRecord : saleList.getRecords()) {
for (SaleDetailDTO saleDetailDTO : saleListRecord.getSaleDetailDTOList()) {
String productId = saleDetailDTO.getProductId();
saleDetailDTO.setBuyCount(buyCountMap.getOrDefault(productId, 0));
}
}
}
return saleList;
}
@ -303,7 +322,7 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
queryPWrapper.in("sale_id", saleIdList);
final List<SaleDetail> saleDetailList = saleDetailService.list(queryPWrapper);
// 获取商品id
List<String> productIdList = new ArrayList<>();
final List<String> productIdList = new ArrayList<>();
for (SaleDetail saleDetail : saleDetailList) {
productIdList.add(saleDetail.getProductId());
}
@ -328,8 +347,8 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
saleDetailDTO.setWholesalePrice(saleDetail.getWholesalePrice());
// 取商品的采购价
if (productMap.containsKey(saleDetail.getProductId())) {
Product product = productMap.get(saleDetail.getProductId());
BigDecimal purchasePrice = product.getPurchasePrice() == null ? BigDecimal.ZERO : product.getPurchasePrice();
final Product product = productMap.get(saleDetail.getProductId());
final BigDecimal purchasePrice = product.getPurchasePrice() == null ? BigDecimal.ZERO : product.getPurchasePrice();
saleDetailDTO.setPurchasePrice(purchasePrice);
} else {
saleDetailDTO.setPurchasePrice(saleDetail.getPurchasePrice());
@ -640,7 +659,7 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
}
@Override
public JSONObject buyAi(String aiMsg) {
public JSONObject buyAi(String aiMsg, String customerId) {
final JSONObject returnJsonObject = new JSONObject();
// 叉转X 文本纠错 使用正则表达式替换单个或多个连续的“叉”字符
aiMsg = replaceAllX(aiMsg);
@ -652,13 +671,15 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
final JSONObject jsonObject = AliOcrUtil.callWithMessage(aiMsg);
final String resultContent = jsonObject.get("resultContent").toString();
final JSONArray json = JSON.parseArray(resultContent);
// 旧商品的id集合
List<String> oldProductIdList = new ArrayList<>();
for (int i = 0; i < json.size(); i++) {
final JSONObject object = json.getJSONObject(i);
String productSn = object.getString("productSn");
// 尝试从货号中提取正确的货号,因为货号可能包含颜色等信息
productSn = CommonUtil.getProductSn(productSn);
final String attributeList = object.getString("attributeList");
String wholesalePriceStr = object.getString("wholesalePrice");
final String wholesalePriceStr = object.getString("wholesalePrice");
BigDecimal wholesalePrice = BigDecimal.ZERO;
// 使用正则表达式提取数字部分
final Pattern pattern = Pattern.compile("-?\\d+(\\.\\d+)?");
@ -672,11 +693,12 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
// 定义一个map,货号为key,purchaseDetail 为value
final Map<String, PurchaseDetail> purchaseDetailMap = new HashMap<>();
// 根据货号去查询商品,如果
final List<Product> byProductSn = productService.getByProductSn(productSn, shopId);
final List<Product> byProductSn = productService.getByProductSn(productSn, shopId,"");
if (byProductSn != null && !byProductSn.isEmpty()) {
// 原则上一个店铺一个货号对应一个商品,这里如果查到了,直接拿第一个。
final Product product = byProductSn.get(0);
final String productId = product.getId();
oldProductIdList.add(productId);
// 查询商品所有的库存
final List<Stock> stockList = stockService.getProductStock(productId);
final Map<String, Integer> stockMap = new HashMap<>();
@ -704,6 +726,7 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
saleDetailDTO.setProductSn(product.getProductSn());
saleDetailDTO.setProductCount(0);
saleDetailDTO.setSupplierName(product.getSupplierName());
saleDetailDTO.setAttrId(product.getAttrId());
final List<SaleDetailQueryDTO> saleDetailQueryDTOS = new ArrayList<>();
// 获取商品分类及规格信息
@ -741,7 +764,12 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
String color = attributeListObject.getString("color").toUpperCase();
String size = attributeListObject.getString("size").toUpperCase();
final String productCount1 = attributeListObject.getString("productCount");
final int productCount = Integer.parseInt(COMPILE.matcher(productCount1).replaceAll(""));
final Matcher countMatchered = COMPILE.matcher(productCount1);
String replaced = "";
if (countMatchered.find()) {
replaced = countMatchered.group();
}
final int productCount = Integer.parseInt(StringUtils.isEmpty(replaced) ? "0" : replaced);
// 20240330 只能新增颜色和尺码,颜色统一改为*色、尺码统一转大写,加‘码’;
// 根据规格id规格是颜色、还是尺码。
if (!color.contains("色")) {
@ -823,7 +851,12 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
String color = attributeListObject.getString("color").toUpperCase();
String size = attributeListObject.getString("size").toUpperCase();
final String productCount1 = attributeListObject.getString("productCount");
final int productCount = Integer.parseInt(COMPILE.matcher(productCount1).replaceAll(""));
final Matcher countMatchered = COMPILE.matcher(productCount1);
String replaced = "";
if (countMatchered.find()) {
replaced = countMatchered.group();
}
final int productCount = Integer.parseInt(StringUtils.isEmpty(replaced) ? "0" : replaced);
// 20240330 只能新增颜色和尺码,颜色统一改为*色、尺码统一转大写,加‘码’;
// 根据规格id规格是颜色、还是尺码。
if (!color.contains("色")) {
@ -847,11 +880,27 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
}
}
// 如果客户id不为空,那么就查询商品的购买记录
if(StringUtils.isNotEmpty(customerId)){
// 获取客户的购买次数
final List<BuyCountVo> buyCount = buyCount(customerId,oldProductIdList);
// 封装为Map
final Map<String, Integer> buyCountMap = new HashMap<>();
for (BuyCountVo buyCountVo : buyCount) {
buyCountMap.put(buyCountVo.getProductId(), buyCountVo.getBuyCount());
}
// 回填数据
for (SaleDetailDTO saleDetailDTO : saleDetailDTOS) {
final String productId = saleDetailDTO.getProductId();
saleDetailDTO.setBuyCount(buyCountMap.getOrDefault(productId, 0));
}
}
} catch (NoApiKeyException e) {
throw new RuntimeException(e);
} catch (InputRequiredException e) {
throw new RuntimeException(e);
}
returnJsonObject.put("data", saleDetailDTOS);
returnJsonObject.put("aiNotRecognition", String.join(";", aiNotRecognitionList));
return returnJsonObject;
@ -1222,7 +1271,7 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
salePageQuery.setShopId(shopId);
Page<TotalAmountDetailByCustomerVo> totalAmountDetailByCustomerVoPage = saleMapper.totalAmountDetailByCustomer(page, salePageQuery);
final Page<TotalAmountDetailByCustomerVo> totalAmountDetailByCustomerVoPage = saleMapper.totalAmountDetailByCustomer(page, salePageQuery);
return totalAmountDetailByCustomerVoPage;
}
@ -1245,10 +1294,23 @@ public class SaleServiceImpl extends ServiceImpl<SaleMapper, Sale> implements Sa
// shopId从缓存中设置
final String shopId = securityUtil.getShopId();
salePageQuery.setShopId(shopId);
Page<TotalAmountDetailByProductVo> totalAmountDetailByProductVoPage = saleMapper.totalAmountDetailByProduct(page, salePageQuery);
final Page<TotalAmountDetailByProductVo> totalAmountDetailByProductVoPage = saleMapper.totalAmountDetailByProduct(page, salePageQuery);
return totalAmountDetailByProductVoPage;
}
/**
* 获取客户购买次数
*
* @param customerId
* @return Integer
* @author 王富康
* @date 2024/9/26
*/
@Override
public List<BuyCountVo> buyCount(String customerId, List<String> productIdList) {
return saleMapper.buyCount(customerId,productIdList);
}
/**
* 使用正则表达式替换输入字符串中连续的字符为相应数量的X字符
*

17
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/StockServiceImpl.java

@ -501,7 +501,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
// 设置商品的批发价和零售价
product.setPrice(purchaseDetail.getLsPrice());
product.setWholesalePrice(purchaseDetail.getWholesalePrice());
if(!"[]".equals(purchaseDetail.getCustomerCategoryRule()) && !"null".equals(purchaseDetail.getCustomerCategoryRule())){
product.setCustomerCategoryRule(purchaseDetail.getCustomerCategoryRule());
}
// 保存商品供应商信息
updateProductList.add(product);
@ -608,6 +610,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
int tailWarnCount = 0;
// 4. 库存数
int stockCount = 0;
int minusStockCount = 0;
// 5. 库存成本
BigDecimal stockCost = new BigDecimal(0);
for (Stock stock : stockList) {
@ -629,6 +632,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
}
// 计算库存数
stockCount += thisStockCount > 0 ? thisStockCount : 0;
// 计算负库存总数
minusStockCount += thisStockCount < 0 ? thisStockCount : 0;
// 计算达到库存预警的规格数量
if (tailWarn != null && tailWarn > thisStockCount) {
tailWarnCount++;
@ -636,6 +642,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
}
shopStockVo.setTailWarnCount(tailWarnCount);
shopStockVo.setStockCount(stockCount);
shopStockVo.setMinusStockCount(minusStockCount);
shopStockVo.setStockCost(stockCost);
return shopStockVo;
}
@ -779,7 +786,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
// 20240824 增加货号判断是否为旧商品
// 根据货号查询商品是否存在
CopyOnWriteArrayList<Product> oldProductListBySn = productService.getByProductSn(purchaseDetail.getProductSn(), shopId);
CopyOnWriteArrayList<Product> oldProductListBySn = productService.getByProductSn(purchaseDetail.getProductSn(), shopId,"");
if (oldProductListBySn != null && !oldProductListBySn.isEmpty()) {
// 旧商品,赋值商品id
purchaseDetail.setProductId(oldProductListBySn.get(0).getId());
@ -813,7 +820,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
product.setPrintBarcode(purchaseDetail.getPrintBarcode());
product.setTailWarn(purchaseDetail.getTailWarn());
product.setInStorageStatus(PurchaseConstant.IN_STORAGE_STATUS[1]);
if(!"[]".equals(purchaseDetail.getCustomerCategoryRule()) && !"null".equals(purchaseDetail.getCustomerCategoryRule())){
product.setCustomerCategoryRule(purchaseDetail.getCustomerCategoryRule());
}
addProductList.add(product);
// 放到要查询的id中
productIdList.add(product.getId());
@ -1001,7 +1010,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
product.setProductPicture(purchaseDetail.getProductPicture());
// 更新商品的名称
product.setProductName(purchaseDetail.getProductName());
if(!"[]".equals(purchaseDetail.getCustomerCategoryRule()) && !"null".equals(purchaseDetail.getCustomerCategoryRule())){
product.setCustomerCategoryRule(purchaseDetail.getCustomerCategoryRule());
}
updateProductList.add(product);
// 先计算平均采购价、再更新库存数,否则会有问题。
@ -1190,9 +1201,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
productService.saveOrUpdateBatch(updateProductList);
// 更新供应商欠款信息及欠款记录
//如果没有采购价 并且是普通用户的话,不保存记录
// if(CollectionUtil.isNotEmpty(purchaseVo.getPurchaseDetails()) && purchaseVo.getPurchaseDetails().get(0).getPurchasePrice() == null && !user.getType().equals(UserConstant.USER_TYPE_NORMAL)) {
if(CollectionUtil.isNotEmpty(purchaseVo.getPurchaseDetails()) && purchaseVo.getPurchaseDetails().get(0).getPurchasePrice() == null && !user.getType().equals(UserConstant.USER_TYPE_NORMAL)) {
debtService.purchaseToDebt(purchase);
// }
}
return ResultUtil.success("添加成功");
} else {
return ResultUtil.error("添加入库单商品规格信息失败");

8
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/AliOcrUtil.java

@ -945,7 +945,7 @@ public class AliOcrUtil {
msgManager.add(userMsg);
stopWatch.start("开始回答");
final QwenParam param =
QwenParam.builder().model("qwen2-72b-instruct").messages(msgManager.get())
QwenParam.builder().model("qwen-turbo-0919").messages(msgManager.get())
.resultFormat(QwenParam.ResultFormat.MESSAGE)
.seed(1234)
.temperature(0.85F)
@ -997,7 +997,7 @@ public class AliOcrUtil {
// 尝试从货号中提取正确的货号,因为货号可能包含颜色等信息
productSn = CommonUtil.getProductSn(productSn);
// 根据货号去查询商品
final CopyOnWriteArrayList<Product> byProductSn = productService.getByProductSn(productSn, shopId);
final CopyOnWriteArrayList<Product> byProductSn = productService.getByProductSn(productSn, shopId,"");
if (byProductSn != null && !byProductSn.isEmpty()) {
// 原则上一个店铺一个货号对应一个商品,这里如果查到了,直接拿第一个。
final Product product = byProductSn.get(0);
@ -1224,7 +1224,7 @@ public class AliOcrUtil {
msgManager.add(userMsg);
stopWatch.start("开始回答");
final QwenParam param =
QwenParam.builder().model("qwen2-72b-instruct").messages(msgManager.get())
QwenParam.builder().model("qwen-turbo-0919").messages(msgManager.get())
.resultFormat(QwenParam.ResultFormat.MESSAGE)
.build();
final GenerationResult result = gen.call(param);
@ -1267,7 +1267,7 @@ public class AliOcrUtil {
msgManager.add(userMsg);
stopWatch.start("开始回答");
final QwenParam param =
QwenParam.builder().model("qwen2-72b-instruct").messages(msgManager.get())
QwenParam.builder().model("qwen-turbo-0919").messages(msgManager.get())
.resultFormat(QwenParam.ResultFormat.MESSAGE)
.build();
final GenerationResult result = gen.call(param);

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

@ -285,7 +285,8 @@
<select id="getCategoryListByShopId" parameterType="java.lang.String" resultType="cc.hiver.mall.pojo.vo.ProductCategoryVo2">
SELECT
sum( count ) AS count,
sum( stockCount ) AS stockCount,
sum( stockCount ) AS stock_count,
sum( minus_stock_count ) AS minus_stock_count,
dd.id,
dd.category_name,
dd.shop_id,
@ -299,13 +300,15 @@
LEFT JOIN (
SELECT
count( * ) AS count,
sum( COALESCE ( ss.stock_count, 0 ) ) AS stockCount,
sum( COALESCE ( ss.stock_count, 0 ) ) AS stock_count,
sum( COALESCE ( ss.minus_stock_count, 0) ) AS minus_stock_count,
t.category_id
FROM
t_product t
LEFT JOIN (
SELECT
sum( CASE WHEN s.stock_count &lt; 0 THEN 0 ELSE s.stock_count END ) AS stock_count,
sum( CASE WHEN s.stock_count > 0 THEN 0 ELSE s.stock_count END ) AS minus_stock_count,
shop_id,
product_id
FROM

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

@ -575,7 +575,8 @@
t.tail_warn,
t.in_storage_status,
t.customer_category_rule,
COALESCE(ss.stock_count, 0) AS stock_count
COALESCE(ss.stock_count, 0) AS stock_count,
COALESCE(ss.minus_stock_count, 0) AS minus_stock_count
<if test='queryParams.startDate !=null and queryParams.startDate.trim() neq "" and queryParams.endDate !=null and queryParams.endDate.trim() neq ""'>
, COALESCE(sd.total_sold, 0) AS total_sold
</if>
@ -583,6 +584,7 @@
LEFT JOIN (
SELECT
sum( CASE WHEN s.stock_count &lt; 0 THEN 0 ELSE s.stock_count END ) AS stock_count,
sum( CASE WHEN s.stock_count > 0 THEN 0 ELSE s.stock_count END ) AS minus_stock_count,
shop_id,
product_id
FROM

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

@ -1366,4 +1366,23 @@ GROUP BY
ORDER BY
profit DESC
</select>
<select id="buyCount" resultType="cc.hiver.mall.pojo.vo.BuyCountVo">
SELECT
tsd.product_id,
COUNT(ts.id) AS buy_count
FROM
t_sale ts
JOIN
t_sale_detail tsd ON ts.id = tsd.sale_id
WHERE
ts.user_id = #{customerId}
and status = '4'
AND tsd.product_id
<foreach item="item" index="index" collection="productIdList" open="(" close=")" separator=",">
#{item}
</foreach>
GROUP BY
tsd.product_id
</select>
</mapper>
Loading…
Cancel
Save