From 1a841f3f85083ab1a7f249097bcba8cebdedd1b2 Mon Sep 17 00:00:00 2001 From: liyj <1617420630@qq.com> Date: Sat, 11 Oct 2025 14:23:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BA=93=E5=AD=98=E6=89=A3?= =?UTF-8?q?=E5=87=8F=E4=B8=AD=E9=97=B4=E8=A1=A8=E7=9A=84=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=EF=BC=8C=E4=BF=9D=E8=AF=81=E5=BA=93=E5=AD=98=E7=9A=84=E6=89=A3?= =?UTF-8?q?=E5=87=8F=E4=B8=80=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/small/client/dao/SxDataDao.java | 46 ++++++++++++++++--- .../dto/ProductQuantityConsumptionDto.java | 42 +++++++++++++++++ .../client/service/imp/SxDataServiceImp.java | 19 +++++++- 3 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java diff --git a/client/src/main/java/com/small/client/dao/SxDataDao.java b/client/src/main/java/com/small/client/dao/SxDataDao.java index 88fb3f51..5329c644 100644 --- a/client/src/main/java/com/small/client/dao/SxDataDao.java +++ b/client/src/main/java/com/small/client/dao/SxDataDao.java @@ -3,16 +3,25 @@ package com.small.client.dao; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.google.gson.Gson; import com.small.client.Utils.BigDecimalFormatter; +import com.small.client.Utils.CommonUtil; +import com.small.client.Utils.HttpUtils; import com.small.client.dto.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.math.NumberUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.*; import java.util.*; +import java.util.stream.Collectors; /** * 考虑到每个思迅软件都是自己的数据,所以采用动态获取的方式获取数据 @@ -22,7 +31,10 @@ import java.util.*; @Service @Slf4j public class SxDataDao extends BaseDao{ - + @Autowired + private RestTemplate restTemplate; + @Value("${remoteIp}") + private String remoteIp; private final static String T_BD_ITEM_CLS="t_bd_item_cls";//商品分类 private final static String T_BD_ITEM_INFO="t_bd_item_info b";//商品表 private final static String T_RM_VIP_INFO="t_rm_vip_info";//会员表 @@ -458,7 +470,8 @@ public class SxDataDao extends BaseDao{ * @param dataBaseInfo * @param map */ - public void updateStoreData(DataBaseInfo dataBaseInfo, Map map){ + public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,List productQuantityConsumptionDtoList, + CommentModel commentModel){ if(CollectionUtil.isEmpty(map)){ log.info("同步数据为空"); return; @@ -482,8 +495,12 @@ public class SxDataDao extends BaseDao{ int count = 0; Set sme=map.entrySet(); for (Map.Entry entry : sme) { + BigDecimal stock_qty= (BigDecimal) entry.getValue(); + if(stock_qty.compareTo(BigDecimal.ZERO)==0){ + continue; + } ps.setString(1, (String) entry.getKey()); - ps.setDouble(2, (double) entry.getValue()); + ps.setDouble(2, stock_qty.doubleValue()); ps.setTimestamp(3, timestamp); ps.addBatch(); // 添加至批处理 count++; @@ -495,22 +512,37 @@ public class SxDataDao extends BaseDao{ } // 执行剩余未满 batchSize 的批次 int[] remainingCounts = ps.executeBatch(); + + List consumIds=productQuantityConsumptionDtoList + .stream() + .map(ProductQuantityConsumptionDto::getConsumeId) + .collect(Collectors.toList()); + Gson gson=new Gson(); + String jsonString=gson.toJson(consumIds); + JSONArray jsonArray = JSONUtil.parseArray(jsonString); + String sign= CommonUtil.generateOpenSign(jsonString,commentModel.getAppKey(),commentModel.getAppId()); + String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_POST_STORE_DATA_RESPONSE + +"?appKey="+commentModel.getAppKey() + +"&sign="+sign, jsonArray); + if (!HttpUtils.SUCCESSCODE.equals(code)) { + throw new Exception("服务器异常"); + } log.info("剩余批次更新数: {}", Arrays.toString(remainingCounts)); conn.commit(); // 最终提交事务 log.info("批量更新完成,总记录数: {}" , count); //baseUpdateImBrancStock(dataBaseInfo); - } catch (SQLException e) { + } catch (Exception e) { conn.rollback(); // 出错时回滚整个事务 - e.printStackTrace(); + log.info("业务失败:: {}", e.getMessage()); } } catch (SQLException e) { - e.printStackTrace(); + log.info("sql失败:: {}", e.getMessage()); }finally { if(conn!=null){ try { conn.close(); } catch (SQLException e) { - throw new RuntimeException(e); + log.info("最后sql失败:: {}", e.getMessage()); } } } diff --git a/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java b/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java new file mode 100644 index 00000000..70cb361e --- /dev/null +++ b/client/src/main/java/com/small/client/dto/ProductQuantityConsumptionDto.java @@ -0,0 +1,42 @@ +package com.small.client.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 同步消费中间表,同步数据时保存数据到这个表中,消费完更新已消费,证明数据已经同步给思迅客户端 + */ +@Data +@ApiModel("商品数量消费表") +public class ProductQuantityConsumptionDto { + @ApiModelProperty("自定义主键ID") + private String consumeId; + + @ApiModelProperty("订单编号") + private String orderId; + + @ApiModelProperty("商品编号") + private String productNumber; + + @ApiModelProperty("数量(正数表示入库/增加,负数表示出库/减少)") + private BigDecimal quantity; + + @ApiModelProperty("消费状态:0-未消费,1-已消费") + private Integer status; + + @ApiModelProperty("店铺ID") + private Integer storeId; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java index ebd3a212..afb3e193 100644 --- a/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java +++ b/client/src/main/java/com/small/client/service/imp/SxDataServiceImp.java @@ -218,6 +218,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_MEMBER +"?appKey="+commentModel.getAppKey() +"&sign="+sign,memberList);//todo 后期改为文件传输 + if (!HttpUtils.SUCCESSCODE.equals(code)) { continue; } @@ -739,8 +740,22 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService +"?appKey="+commentModel.getAppKey() +"&sign="+commentModel.getAppId(),JSONObject.class); if(null!=jsonObject.get("result")){ - Map map=(Map)jsonObject.get("result"); - sxDataDao.updateStoreData(dataBaseInfo,map); + // Map map=(Map)jsonObject.get("result"); + List productQuantityConsumptionDtoList = + JSONUtil.toList(jsonObject.getStr("result"),ProductQuantityConsumptionDto.class); + if(!productQuantityConsumptionDtoList.isEmpty()){ + Map map = productQuantityConsumptionDtoList.stream() + .collect(Collectors.groupingBy( + ProductQuantityConsumptionDto::getProductNumber, + Collectors.reducing( + BigDecimal.ZERO, + ProductQuantityConsumptionDto::getQuantity, + BigDecimal::add + ) + )); + sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoList,commentModel); + } + } }