Browse Source

功能优化;

dev
wangfukang 1 year ago
parent
commit
3e51066931
  1. 2
      hiver-admin/src/main/resources/application.yml
  2. 16
      hiver-admin/test-output/test-report.html
  3. 7
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/SupplierBillPurchaseVo.java
  4. 17
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/entity/CheckStock.java
  5. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java
  6. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java
  7. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java
  8. 66
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java
  9. 32
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockTjVo.java
  10. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/OrderController.java
  11. 16
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/ReturnSaleDetailDTO.java
  12. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/query/ProductPageQuery.java
  13. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/vo/ProductPageVO.java
  14. 253
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/ProductServiceImpl.java
  15. 75
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/controller/UrlMappingController.java
  16. 29
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/entity/UrlMapping.java
  17. 8
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/mapper/UrlMappingMapper.java
  18. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/service/UrlMappingService.java
  19. 12
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/service/impl/UrlMappingServiceImpl.java
  20. 24
      hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml
  21. 12
      hiver-modules/hiver-mall/src/main/resources/mapper/UrlMappingMapper.xml

2
hiver-admin/src/main/resources/application.yml

@ -347,7 +347,7 @@ ignored:
- /hiver/app/dealingRecord/getDealingsRecordList
- /hiver/app/customer/getCustomerData
- /hiver/app/supplier/getSupplierData
- /hiver/order/redirect
- /hiver/app/urlMapping/redirect
# 临时增加
- /hiver/app/logisticsOrder/addLogisticsOrder

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

@ -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">十一月 07, 2024 20:11:47</span></a>
<a href="#"><span class="badge badge-primary">十一月 10, 2024 16:27:17</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>20:11:48 下午</span> / <span>0.016 secs</span></p>
<p class="text-sm"><span>16:27:17 下午</span> / <span>0.017 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'>11.07.2024 20:11:48</span>
<span class='badge badge-danger'>11.07.2024 20:11:48</span>
<span class='badge badge-default'>0.016 secs</span>
<span class='badge badge-success'>11.10.2024 16:27:17</span>
<span class='badge badge-danger'>11.10.2024 16:27:17</span>
<span class='badge badge-default'>0.017 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>20:11:48</td>
<td>16:27:17</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>十一月 07, 2024 20:11:47</h3>
<h3>十一月 10, 2024 16:27:17</h3>
</div></div>
</div>
<div class="col-md-3">
<div class="card"><div class="card-body">
<p class="m-b-0">Ended</p>
<h3>十一月 07, 2024 20:11:48</h3>
<h3>十一月 10, 2024 16:27:17</h3>
</div></div>
</div>
<div class="col-md-3">

7
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/bill/vo/SupplierBillPurchaseVo.java

@ -1,9 +1,12 @@
package cc.hiver.mall.bill.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
@ -47,8 +50,10 @@ public class SupplierBillPurchaseVo {
@ApiModelProperty(value = "交易类型:0:开单;1:退货;2:回款")
private Integer dealingsType;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "交易时间")
private Integer dealingsTime;
private Date dealingsTime;
@ApiModelProperty(value = "交易备注")
private String dealingsRecordRemark;

17
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/entity/CheckStock.java

@ -11,6 +11,7 @@ import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.math.BigDecimal;
@Data
@Accessors(chain = true)
@ -36,4 +37,20 @@ public class CheckStock extends HiverBaseEntity {
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "盘点总款数")
private Integer totalCount;
@ApiModelProperty(value = "多出来的总件数")
private Integer extraCount;
@ApiModelProperty(value = "多出来的总金额")
private BigDecimal extraTotal;
@ApiModelProperty(value = "少出来的总件数")
private Integer lessCount;
@ApiModelProperty(value = "少出来的总金额")
private BigDecimal lessTotal;
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/mapper/CheckStockDetailMapper.java

@ -2,6 +2,7 @@ package cc.hiver.mall.checkstock.mapper;
import cc.hiver.mall.checkstock.entity.CheckStockDetail;
import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery;
import cc.hiver.mall.checkstock.vo.CheckStockTjVo;
import cc.hiver.mall.deductlog.vo.WorkerDeductLogVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -21,4 +22,6 @@ public interface CheckStockDetailMapper extends BaseMapper<CheckStockDetail> {
List<CheckStockDetail> getByCheckStockDetailByCheckIdOfPage(@Param("checkStockPageQuery")CheckStockPageQuery checkStockPageQuery);
Page<String> getByCheckStockProductByCheckId(Page<WorkerDeductLogVo> page, @Param("checkStockPageQuery")CheckStockPageQuery checkStockPageQuery);
List<CheckStockTjVo> getCheckStockTjVos(@Param("shopId")String shopId, @Param("checkStockIds")List<String> checkStockIds);
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/CheckStockDetailService.java

@ -3,6 +3,7 @@ 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 cc.hiver.mall.checkstock.vo.CheckStockTjVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
@ -17,4 +18,6 @@ public interface CheckStockDetailService extends IService<CheckStockDetail> {
List<CheckStockDetailVo> getByCheckStockDetailByCheckId(String checkStockId);
Page<CheckStockDetailVo> getByCheckStockDetailByCheckIdOfPage(CheckStockPageQuery checkStockPageQuery);
List<CheckStockTjVo> getCheckStockTjVos(String shopId, List<String> checkStockIds);
}

8
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockDetailServiceImpl.java

@ -7,6 +7,7 @@ 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.checkstock.vo.CheckStockTjVo;
import cc.hiver.mall.deductlog.vo.WorkerDeductLogVo;
import cc.hiver.mall.entity.Product;
import cc.hiver.mall.service.mybatis.ProductService;
@ -179,6 +180,7 @@ public class CheckStockDetailServiceImpl extends ServiceImpl<CheckStockDetailMap
}
checkStockPageQuery.setProductIdList(checkStockDetailListOfProduct.getRecords());
// 查询出来商品信息,获取采购价
if(!checkStockDetailListOfProduct.getRecords().isEmpty()){
List<Product> productList = productService.getProductList(checkStockDetailListOfProduct.getRecords());
// 商品id为key,商品信息为value封装被map
Map<String,Product> productMap = new HashMap<>();
@ -217,6 +219,7 @@ public class CheckStockDetailServiceImpl extends ServiceImpl<CheckStockDetailMap
returnData.setRecords(new ArrayList<>(checkStockDetailVoMap.values()));
}
}
return returnData;
} catch (Exception e) {
// 异常处理,建议加上更详细的日志记录
@ -224,4 +227,9 @@ public class CheckStockDetailServiceImpl extends ServiceImpl<CheckStockDetailMap
}
}
@Override
public List<CheckStockTjVo> getCheckStockTjVos(String shopId, List<String> checkStockIds) {
return checkStockDetailMapper.getCheckStockTjVos(shopId, checkStockIds);
}
}

66
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/service/impl/CheckStockServiceImpl.java

@ -8,10 +8,7 @@ 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.checkstock.vo.*;
import cc.hiver.mall.common.constant.StockLogConstant;
import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.entity.Stock;
@ -27,7 +24,11 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 盘点服务实现类
@ -184,9 +185,64 @@ public class CheckStockServiceImpl extends ServiceImpl<CheckStockMapper, CheckSt
if (StringUtils.isNotEmpty(checkStockPageQuery.getEndDate())) {
checkStockPageQuery.setEndDate(DateUtil.addDay(checkStockPageQuery.getEndDate(), 1));
}
final Page<CheckStock> checkStockList = checkStockMapper.getCheckStockList(page, checkStockPageQuery);
final List<CheckStock> records = checkStockList.getRecords();
final List<String> checkStockIds = new ArrayList<>();
for (CheckStock record : records) {
checkStockIds.add(record.getId());
}
// 盘点总款数、多出来的总件数、总金额、少出来的总件数、总金额
final List<CheckStockTjVo> checkStockTjVos = checkStockDetailService.getCheckStockTjVos(shopId, checkStockIds);
// 将结果按照盘点id分类
final Map<String, List<CheckStockTjVo>> checkStockTjVoMap = new HashMap<>();
for (CheckStockTjVo checkStockTjVo : checkStockTjVos) {
final String checkStockId = checkStockTjVo.getCheckStockId();
final List<CheckStockTjVo> checkStockTjVoList = checkStockTjVoMap.computeIfAbsent(checkStockId, k -> new ArrayList<>());
checkStockTjVoList.add(checkStockTjVo);
}
// 封装盘点总款数、多出来的总件数、总金额、少出来的总件数、总金额
for (CheckStock record : records) {
final String checkStockId = record.getId();
// 总款数
int size = 0;
// 多出来的总件数
int extraCount = 0;
// 多出来的总金额
BigDecimal extraTotal = BigDecimal.ZERO;
// 少出来的总件数
int lessCount = 0;
// 少出来的总金额
BigDecimal lessTotal = BigDecimal.ZERO;
if (checkStockTjVoMap.containsKey(checkStockId) && checkStockTjVoMap.get(checkStockId) != null) {
// 获取Map中该次盘点的详情,
final List<CheckStockTjVo> checkStockTjVoList = checkStockTjVoMap.get(checkStockId);
List<String> productIds = new ArrayList<>();
for (CheckStockTjVo checkStockTjVo : checkStockTjVoList) {
final BigDecimal purchasePrice = checkStockTjVo.getPurchasePrice() == null ? BigDecimal.ZERO : checkStockTjVo.getPurchasePrice();
final int changeCount = checkStockTjVo.getChangeCount() == null ? 0 : checkStockTjVo.getChangeCount();
if ("1".equals(checkStockTjVo.getChangeType())) {
extraCount += changeCount;
extraTotal = extraTotal.add(purchasePrice.multiply(BigDecimal.valueOf(changeCount)));
} else {
lessCount += Math.abs(changeCount);
lessTotal = lessTotal.add(purchasePrice.multiply(BigDecimal.valueOf(Math.abs(changeCount))));
}
if(!productIds.contains(checkStockTjVo.getProductId())){
productIds.add(checkStockTjVo.getProductId());
size ++;
}
}
record.setTotalCount(size);
record.setExtraCount(extraCount);
record.setExtraTotal(extraTotal);
record.setLessCount(lessCount);
record.setLessTotal(lessTotal);
}
}
// 执行查询,并返回结果
return checkStockMapper.getCheckStockList(page, checkStockPageQuery);
return checkStockList;
}
@Override

32
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/checkstock/vo/CheckStockTjVo.java

@ -0,0 +1,32 @@
package cc.hiver.mall.checkstock.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 统计Vo
* @author 王富康
* @date 2024/11/8
*/
@Data
public class CheckStockTjVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "商品id")
private String productId;
@ApiModelProperty(value = "盘点id")
private String checkStockId;
@ApiModelProperty(value = "变化数量")
private Integer changeCount;
@ApiModelProperty(value = "商品采购价")
private BigDecimal purchasePrice;
@ApiModelProperty(value = "变化类型:1:增加;2:减少")
private String changeType;
}

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

@ -500,7 +500,7 @@ public class OrderController {
final String wxAccessToken = jsonObject.get("access_token").getAsString();
log.info("获取小程序码getQrtAccessToken成功:{}", wxAccessToken);
//获取小程序码地址
final String wechatQrcodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + wxAccessToken;
final String wechatQrcodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + wxAccessToken+"&check_path=false";
final OkHttpClient client = new OkHttpClient();
final JSONObject jsonBody = new JSONObject();
jsonBody.set("scene", scene);

16
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/ReturnSaleDetailDTO.java

@ -1,5 +1,6 @@
package cc.hiver.mall.pojo.dto;
import cc.hiver.mall.productpicture.entity.ProductPicture;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -69,6 +70,21 @@ public class ReturnSaleDetailDTO implements Serializable {
@ApiModelProperty(value = "货号")
private String productSn;
@ApiModelProperty(value = "供应商名称")
private String supplierName;
@ApiModelProperty(value = "商品子图")
private List<ProductPicture> productPictures;
@ApiModelProperty(value = "客户分类价格规则")
private String customerCategoryRule;
@ApiModelProperty(value = "商品专属分类id")
private String attrId;
@ApiModelProperty(value = "客户购买数量")
private Integer buyCount;
private static final long serialVersionUID = 1L;

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

@ -75,4 +75,7 @@ public class ProductPageQuery extends HiverBasePageQuery {
@ApiModelProperty("客户id")
private String customerId;
@ApiModelProperty("盘点id")
private String checkStockId;
}

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

@ -15,6 +15,7 @@ limitations under the License.
*/
package cc.hiver.mall.pojo.vo;
import cc.hiver.mall.checkstock.vo.CheckStockAttributeVo;
import cc.hiver.mall.productpicture.entity.ProductPicture;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
@ -123,4 +124,7 @@ public class ProductPageVO {
@ApiModelProperty(value = "商品购买数量")
private Integer buyCount;
@ApiModelProperty(value = "盘点明细")
private List<CheckStockAttributeVo> checkStockAttributeVos;
}

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

@ -4,14 +4,17 @@ import cc.hiver.core.common.constant.ProductConstant;
import cc.hiver.core.common.utils.SecurityUtil;
import cc.hiver.core.common.utils.StringUtils;
import cc.hiver.core.entity.User;
import cc.hiver.mall.checkstock.pojo.CheckStockPageQuery;
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.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;
import cc.hiver.mall.pojo.dto.SaleQueryDTO;
import cc.hiver.mall.pojo.dto.*;
import cc.hiver.mall.pojo.query.ProductPageQuery;
import cc.hiver.mall.pojo.vo.*;
import cc.hiver.mall.productpicture.entity.ProductPicture;
@ -55,6 +58,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
@Autowired
private SaleService saleService;
@Autowired
private CheckStockService checkStockService;
@Override
public IPage<ProductPageVO> getShareList(ProductPageQuery productPageQuery) {
if (StringUtils.isNotEmpty(productPageQuery.getEndDate())) {
@ -117,6 +123,25 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
productPageVO.setBuyCount(buyCountMap.getOrDefault(productId, 0));
}
}
// 增加盘点信息
if (StringUtils.isNotEmpty(productPageQuery.getCheckStockId())) {
final CheckStockPageQuery checkStockPageQuery = new CheckStockPageQuery();
checkStockPageQuery.setCheckStockId(productPageQuery.getCheckStockId());
checkStockPageQuery.setProductIdList(productIdList);
checkStockPageQuery.setPageSize(200);
final CheckStockPageVo checkStock = checkStockService.getCheckStock(checkStockPageQuery);
final Page<CheckStockDetailVo> checkStockDetailVoList = checkStock.getCheckStockDetailVoList();
final Map<String, List<CheckStockAttributeVo>> checkStockAttributeVoMap = new HashMap<>();
for (CheckStockDetailVo record : checkStockDetailVoList.getRecords()) {
checkStockAttributeVoMap.put(record.getProductId(), record.getCheckStockAttributeVos());
}
for (ProductPageVO productPageVO : list) {
final String productId = productPageVO.getId();
if (checkStockAttributeVoMap.containsKey(productId)) {
productPageVO.setCheckStockAttributeVos(checkStockAttributeVoMap.get(productId));
}
}
}
}
page.setRecords(list);
return page;
@ -475,7 +500,229 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
}
}
}
// 20241110 新商品直接退货的也需要判断时是否需要新增商品
SaleReturnDTO saleReturnDTO = saleQueryDTO.getSaleReturnDTO();
if(saleReturnDTO != null){
List<ReturnSaleDetailDTO> returnSaleDetailList = saleReturnDTO.getReturnSaleDetailList();
for (ReturnSaleDetailDTO returnSaleDetailDTO : returnSaleDetailList) {
// 需要新增的商品规格信息
final ProductCategoryVo productCategoryVo = new ProductCategoryVo();
productCategoryVo.setShopId("spfl");
// 需要新增的
final Map<String, List<String>> attributeValueMap = new HashMap<>();
// shopId从缓存中设置
// 判断是否新的商品,新的商品进行新增
final String productId = returnSaleDetailDTO.getProductId();
if (StringUtils.isEmpty(productId)) {
// 货号或者商品名称都为空的时候不新增,其他时候新增商品
if (StringUtils.isEmpty(returnSaleDetailDTO.getProductSn()) && StringUtils.isEmpty(returnSaleDetailDTO.getProductName())) {
continue;
}
// 根据货号查询商品是否存在
final CopyOnWriteArrayList<Product> oldProductListBySn = getByProductSn(returnSaleDetailDTO.getProductSn(), shopId, "");
if (oldProductListBySn != null && !oldProductListBySn.isEmpty()) {
// 旧商品,赋值商品id
returnSaleDetailDTO.setProductId(oldProductListBySn.get(0).getId());
} else {
// 新增商品
final Product product = new Product();
product.setCreateBy(user.getId());
product.setCreateTime(new Date());
product.setProductName(returnSaleDetailDTO.getProductName());
product.setShopId(shopId);
// 默认为已上架的
product.setDelFlag(ProductConstant.DEL_FLAG[1]);
product.setCategoryId(returnSaleDetailDTO.getCategoryId());
product.setSupplierName(returnSaleDetailDTO.getSupplierName());
product.setProductSn(returnSaleDetailDTO.getProductSn());
// 零售价
product.setPrice(returnSaleDetailDTO.getPrice());
// 采购价
product.setPurchasePrice(returnSaleDetailDTO.getPurchasePrice());
// 批发价
product.setWholesalePrice(returnSaleDetailDTO.getWholesalePrice());
product.setProductPicture(returnSaleDetailDTO.getProductPicture());
product.setInStorageStatus(PurchaseConstant.IN_STORAGE_STATUS[1]);
// 放到要查询的id中
// 填充前台传过来的数据
returnSaleDetailDTO.setProductId(product.getId());
if (returnSaleDetailDTO.getProductPictures() != null) {
// 新增商品图片子图
for (ProductPicture productPicture : returnSaleDetailDTO.getProductPictures()) {
productPicture.setProductId(product.getId());
}
addProductPictureList.addAll(returnSaleDetailDTO.getProductPictures());
}
// 将规格及规格下的规格值提取出来
final List<SaleDetailQueryDTO> stockLogList1 = returnSaleDetailDTO.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 + '"');
} else if ("尺码".equals(key)) {
final String valueUpperCase = value.toUpperCase();
if (value.contains("码")) {
value = valueUpperCase;
} else {
value = valueUpperCase + '码';
}
sizeStr.append('"' + value + '"');
} 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());
}
final CopyOnWriteArrayList<ProductAttributeOfAddVo> productAttributeOfAddVos = new CopyOnWriteArrayList<>();
for (Map.Entry<String, List<String>> stringListEntry : attributeValueMap.entrySet()) {
final String key = stringListEntry.getKey();
final List<String> entryValue = stringListEntry.getValue();
final ProductAttributeOfAddVo productAttributeOfAddVo = new ProductAttributeOfAddVo();
productAttributeOfAddVo.setAttributeName(key);
final CopyOnWriteArrayList<ProductAttributeValueVo> productAttributeValueVoList = new CopyOnWriteArrayList<>();
for (String s : entryValue) {
final ProductAttributeValueVo productAttributeValueVo = new ProductAttributeValueVo();
productAttributeValueVo.setValue(s);
productAttributeValueVoList.add(productAttributeValueVo);
}
productAttributeOfAddVo.setProductAttributeValueVoList(productAttributeValueVoList);
productAttributeOfAddVos.add(productAttributeOfAddVo);
}
productCategoryVo.setProductAttributeOfAddVos(productAttributeOfAddVos);
// 批量去新增,并拿到分类id,回填商品
// 维护该商品专属分类
final String s = productCategoryService.batchSaveCategoryAndAttribute(productCategoryVo);
// 维护该店铺的专属分类
productCategoryService.batchSaveCategoryOfShop(productCategoryVo);
product.setAttrId(s);
addProductList.add(product);
}
} else {
// 判断规格是否需要新增
final List<String> categoryIdList = new ArrayList<>();
categoryIdList.add(returnSaleDetailDTO.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 = returnSaleDetailDTO.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 (!sizeList.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);

75
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/controller/UrlMappingController.java

@ -0,0 +1,75 @@
package cc.hiver.mall.urlmapping.controller;
import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.mall.urlmapping.entity.UrlMapping;
import cc.hiver.mall.urlmapping.service.UrlMappingService;
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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.net.URI;
import java.util.List;
@Slf4j
@RestController
@Api(tags = "二维码重定向接口")
@RequestMapping("/hiver/app/urlMapping/")
@Transactional
public class UrlMappingController {
@Autowired
private UrlMappingService urlMappingService;
/**
* 新增修改二维码重定向接口
*
* @param urlMappings
* @return Result
* @author 王富康
* @date 2024/8/11
*/
@PostMapping("/saveOrUpdateUrlMapping")
@ApiOperation("新增修改二维码重定向接口")
public Result saveOrUpdateUrlMapping(@RequestBody List<UrlMapping> urlMappings) {
// 参数校验,id 及 longUrl 都不能为空,
urlMappings.forEach(urlMapping -> {
if (StringUtils.isEmpty(urlMapping.getId()) || StringUtils.isEmpty(urlMapping.getLongUrl())) {
throw new RuntimeException("请检查id及重定向url,两者都不可为空!");
}
});
final boolean save = urlMappingService.saveOrUpdateBatch(urlMappings);
if (save) {
return ResultUtil.success("执行成功!");
} else {
return ResultUtil.error("执行失败!");
}
}
/**
* 根据id重定向指定地址
*
* @param id
* @return ResponseEntity<Void>
* @author 王富康
* @date 2024/11/8
*/
@GetMapping("/redirect")
public ResponseEntity<Void> redirect(String id) {
if(StringUtils.isEmpty(id)){
throw new RuntimeException("id不可为空!");
}
final UrlMapping byId = urlMappingService.getById(id);
if (byId != null) {
return ResponseEntity.status(HttpStatus.FOUND).location(URI.create(byId.getLongUrl())).build();
} else {
return ResponseEntity.notFound().build();
}
}
}

29
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/entity/UrlMapping.java

@ -0,0 +1,29 @@
package cc.hiver.mall.urlmapping.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 二维码重定向对应表
*
* @author 王富康
* @date 2024/11/8
*/
@Data
@ApiModel(value = "二维码重定向对应表")
@TableName(value = "t_url_mapping", autoResultMap = true)
public class UrlMapping implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键id")
private String id;
@ApiModelProperty(value = "重定向的连接")
private String longUrl;
}

8
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/mapper/UrlMappingMapper.java

@ -0,0 +1,8 @@
package cc.hiver.mall.urlmapping.mapper;
import cc.hiver.mall.urlmapping.entity.UrlMapping;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UrlMappingMapper extends BaseMapper<UrlMapping> {
}

14
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/service/UrlMappingService.java

@ -0,0 +1,14 @@
package cc.hiver.mall.urlmapping.service;
import cc.hiver.mall.urlmapping.entity.UrlMapping;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 二维码重定向对应服务
*
* @author 王富康
* @date 2024/11/8
*/
public interface UrlMappingService extends IService<UrlMapping> {
}

12
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/urlmapping/service/impl/UrlMappingServiceImpl.java

@ -0,0 +1,12 @@
package cc.hiver.mall.urlmapping.service.impl;
import cc.hiver.mall.urlmapping.entity.UrlMapping;
import cc.hiver.mall.urlmapping.mapper.UrlMappingMapper;
import cc.hiver.mall.urlmapping.service.UrlMappingService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UrlMappingServiceImpl extends ServiceImpl<UrlMappingMapper, UrlMapping> implements UrlMappingService {
}

24
hiver-modules/hiver-mall/src/main/resources/mapper/CheckStockDetailMapper.xml

@ -135,4 +135,28 @@ product_picture, product_sn, shop_id, attribute_list, pd_num, change_count, stoc
and check_stock_id = #{checkStockId,jdbcType=VARCHAR}
and product_id = #{productId,jdbcType=VARCHAR}
</delete>
<select id="getCheckStockTjVos" resultType="cc.hiver.mall.checkstock.vo.CheckStockTjVo">
SELECT
dd.product_id,
dd.check_stock_id,
sum( dd.change_count ) change_count,
tt.purchase_price,(
CASE
WHEN dd.change_count > 0 THEN
1
WHEN dd.change_count &lt; 0 THEN
2
END
) AS change_type
FROM
t_check_stock_detail dd
JOIN t_product tt ON dd.product_id = tt.id
WHERE
dd.shop_id = #{shopId,jdbcType=VARCHAR}
GROUP BY
dd.product_id,
change_type,
dd.check_stock_id
</select>
</mapper>

12
hiver-modules/hiver-mall/src/main/resources/mapper/UrlMappingMapper.xml

@ -0,0 +1,12 @@
<?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.urlmapping.mapper.UrlMappingMapper">
<resultMap id="BaseResultMap" type="cc.hiver.mall.urlmapping.entity.UrlMapping">
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="long_url" jdbcType="VARCHAR" property="longUrl" />
</resultMap>
<sql id="Base_Column_List">
id, long_url
</sql>
</mapper>
Loading…
Cancel
Save