Просмотр исходного кода

提供mongodb非空更新方法

yzc 2 лет назад
Родитель
Сommit
f6d97b2489

+ 0 - 206
sckw-common/sckw-common-mongo/src/main/java/com/sckw/mongo/model/TradeOrderUpdateParam.java

@@ -1,206 +0,0 @@
-package com.sckw.mongo.model;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-import org.springframework.util.StringUtils;
-
-import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.Objects;
-
-/**
- * @author zk
- * @desc MongoDB-交易订单信息
- * @date 2023/7/8
- */
-
-@Getter
-@Setter
-@ToString
-@Accessors(chain = true)
-public class TradeOrderUpdateParam {
-
-    /**
-     * 订单主键
-     */
-    private Long tOrderId;
-
-    /**
-     * 订单成交数量
-     */
-    private BigDecimal amount;
-
-    /**
-     * 订单成交单价
-     */
-    private BigDecimal unitPrice;
-
-    /**
-     * 订单金额
-     */
-    private BigDecimal price;
-
-    /**
-     * 订单开始日期
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
-    private LocalDate startTime;
-
-    /**
-     * 订单结束日期
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
-    private LocalDate endTime;
-
-    /**
-     * 订单交易方式(预付款、货到付款)
-     */
-    private String trading;
-
-    /**
-     * 订单提货方式(采方自提、供应配送)
-     */
-    private String pickupType;
-
-    /**
-     * 订单交付类型(签发交付、签收交付)
-     */
-    private String deliveryType;
-
-    /**
-     * 订单已委托量
-     */
-    private BigDecimal entrustAmount;
-
-    /**
-     * 订单实际交付量
-     */
-    private BigDecimal actualAmount;
-
-    /**
-     * 状态
-     */
-    private Integer status;
-
-    /**
-     * 订单备注
-     */
-    private String remark;
-
-    /**
-     * 合同主键
-     */
-    private Long contractId;
-
-    /**
-     * 合同编号
-     */
-    private String contractNo;
-
-    /**
-     * 合同mc
-     */
-    private String contractName;
-
-    /**
-     * 合同签约方式
-     */
-    private String contractSigningWay;
-
-    /**
-     * 更新人主键id
-     */
-    private Long updateBy;
-
-    /**
-     * 更新人姓名
-     */
-    private String updateByName;
-
-    /**
-     * 更新时间
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date updateTime;
-
-    /**
-     * 是否删除(0未删除,1删除)
-     */
-    private Integer delFlag;
-
-    /**
-     * @desc: 参数转换
-     * @author: yzc
-     * @date: 2023-07-17 9:16
-     * @Param param:
-     * @Param order:
-     * @return: com.sckw.mongo.model.SckwTradeOrder
-     */
-    public void convertSckwTradeOrder(TradeOrderUpdateParam param, SckwTradeOrder order) {
-        if (Objects.nonNull(param.getAmount())) {
-            order.setAmount(param.getAmount());
-        }
-        if (Objects.nonNull(param.getUnitPrice())) {
-            order.setUnitPrice(param.getUnitPrice());
-        }
-        if (Objects.nonNull(param.getPrice())) {
-            order.setPrice(param.getPrice());
-        }
-        if (Objects.nonNull(param.getStartTime())) {
-            order.setStartTime(param.getStartTime());
-        }
-        if (Objects.nonNull(param.getEndTime())) {
-            order.setEndTime(param.getEndTime());
-        }
-        if (StringUtils.hasText(param.getTrading())) {
-            order.setTrading(param.getTrading());
-        }
-        if (StringUtils.hasText(param.getPickupType())) {
-            order.setPickupType(param.getPickupType());
-        }
-        if (StringUtils.hasText(param.getDeliveryType())) {
-            order.setDeliveryType(param.getDeliveryType());
-        }
-        if (Objects.nonNull(param.getEntrustAmount())) {
-            order.setEntrustAmount(param.getEntrustAmount());
-        }
-        if (Objects.nonNull(param.getActualAmount())) {
-            order.setActualAmount(param.getActualAmount());
-        }
-        if (Objects.nonNull(param.getStatus())) {
-            order.setStatus(param.getStatus());
-        }
-        if (StringUtils.hasText(param.getRemark())) {
-            order.setRemark(param.getRemark());
-        }
-        if (Objects.nonNull(param.getContractId())) {
-            order.setContractId(param.getContractId());
-        }
-        if (StringUtils.hasText(param.getContractNo())) {
-            order.setContractNo(param.getContractNo());
-        }
-        if (StringUtils.hasText(param.getContractName())) {
-            order.setContractName(param.getContractName());
-        }
-        if (StringUtils.hasText(param.getContractSigningWay())) {
-            order.setContractSigningWay(param.getContractSigningWay());
-        }
-        if (Objects.nonNull(param.getUpdateBy())) {
-            order.setUpdateBy(param.getUpdateBy());
-        }
-        if (StringUtils.hasText(param.getUpdateByName())) {
-            order.setUpdateByName(param.getUpdateByName());
-        }
-        if (Objects.nonNull(param.getUpdateTime())) {
-            order.setUpdateTime(param.getUpdateTime());
-        }
-        if (Objects.nonNull(param.getDelFlag())) {
-            order.setDelFlag(param.getDelFlag());
-        }
-    }
-
-}

+ 4 - 7
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -13,7 +13,6 @@ import com.sckw.core.utils.OrderGenerateUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.mongo.model.SckwTradeOrder;
-import com.sckw.mongo.model.TradeOrderUpdateParam;
 import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.model.*;
 import com.sckw.order.model.vo.req.*;
@@ -95,9 +94,7 @@ public class KwoTradeOrderService {
         String tOrderNo = tradeOrder.getTOrderNo();
         SckwTradeOrder order = new SckwTradeOrder();
         //提前填充这些参数防止初始创建mongodb集合没有这些字段
-        order.setFirmName(LoginUserHolder.getEntName()).setTOrderId(id).setDeliveryType("").setProjectName("")
-                .setEntrustAmount(BigDecimal.ZERO).setActualAmount(BigDecimal.ZERO).setContractId(0L).setContractNo("")
-                .setContractName("").setContractSigningWay("").setCreateByName(LoginUserHolder.getUserName())
+        order.setFirmName(LoginUserHolder.getEntName()).setTOrderId(id).setCreateByName(LoginUserHolder.getUserName())
                 .setUpdateByName(LoginUserHolder.getUserName());
         BeanUtils.copyProperties(tradeOrder, order);
         //商品信息
@@ -592,7 +589,7 @@ public class KwoTradeOrderService {
             goodsInfoService.updateGoodsAmount(goods.getGoodsId(), amount);
         }
         //更新mongodb
-        TradeOrderUpdateParam updateParam = BeanUtils.copyProperties(param, TradeOrderUpdateParam.class);
+        SckwTradeOrder updateParam = BeanUtils.copyProperties(param, SckwTradeOrder.class);
         updateParam.setTOrderId(param.getId()).setStatus(order.getStatus()).setContractId(contractInfo.getContractId())
                 .setContractNo(contractInfo.getContractNo()).setContractName(contractInfo.getContractName())
                 .setContractSigningWay(contractInfo.getContractSigningWay()).setUpdateBy(LoginUserHolder.getUserId())
@@ -629,7 +626,7 @@ public class KwoTradeOrderService {
         KwoTradeOrderGoods goods = kwoTradeOrderGoodsService.getByOrderId(order.getId());
         goodsInfoService.updateGoodsAmount(goods.getGoodsId(), order.getAmount().negate());
         //mongodb更新订单状态
-        TradeOrderUpdateParam updateParam = new TradeOrderUpdateParam();
+        SckwTradeOrder updateParam = new SckwTradeOrder();
         updateParam.setTOrderId(order.getId()).setStatus(order.getStatus()).setUpdateBy(LoginUserHolder.getUserId())
                 .setUpdateByName(LoginUserHolder.getUserName()).setUpdateTime(new Date());
         saveMongoDb(3, updateParam);
@@ -687,7 +684,7 @@ public class KwoTradeOrderService {
         BigDecimal amount = param.getActualAmount().subtract(order.getAmount());
         goodsInfoService.updateGoodsAmount(goods.getGoodsId(), amount);
         //mongodb更新订单状态
-        TradeOrderUpdateParam updateParam = new TradeOrderUpdateParam();
+        SckwTradeOrder updateParam = new SckwTradeOrder();
         updateParam.setTOrderId(order.getId()).setStatus(order.getStatus()).setUpdateBy(LoginUserHolder.getUserId())
                 .setUpdateByName(LoginUserHolder.getUserName()).setUpdateTime(new Date());
         saveMongoDb(3, updateParam);

+ 51 - 6
sckw-modules/sckw-report/src/main/java/com/sckw/report/consumer/SckwBusSumConsumer.java

@@ -7,7 +7,6 @@ import com.sckw.core.utils.StringUtils;
 import com.sckw.mongo.model.SckwLogisticsOrder;
 import com.sckw.mongo.model.SckwTradeOrder;
 import com.sckw.mongo.model.SckwWaybillOrder;
-import com.sckw.mongo.model.TradeOrderUpdateParam;
 import com.sckw.report.dao.SckwLogisticsOrderRepository;
 import com.sckw.report.dao.SckwTradeOrderRepository;
 import com.sckw.report.dao.SckwWaybillOrderRepository;
@@ -17,7 +16,14 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.data.annotation.Transient;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.util.ReflectionUtils;
 
+import java.lang.reflect.Modifier;
 import java.util.Optional;
 import java.util.function.Consumer;
 
@@ -36,6 +42,8 @@ public class SckwBusSumConsumer {
     SckwLogisticsOrderRepository logisticsOrderRepository;
     @Autowired
     SckwWaybillOrderRepository waybillOrderRepository;
+    @Autowired
+    private MongoTemplate mongoTemplate;
 
     /**
      * @desc 消息订阅
@@ -75,12 +83,9 @@ public class SckwBusSumConsumer {
             } else if (busSum.getMethod() == 2) {
                 tradeOrderRepository.save(order);
             } else {
-                Optional<SckwTradeOrder> sckwTradeOrder = tradeOrderRepository.findById(order.getTOrderId());
+                Optional<SckwTradeOrder> sckwTradeOrder = tradeOrderRepository.findById(order.get_id());
                 if (sckwTradeOrder.isPresent()) {
-                    SckwTradeOrder tradeOrder = sckwTradeOrder.get();
-                    TradeOrderUpdateParam updateParam = JSONObject.parseObject(JSON.toJSONString(busSum.getObject()), TradeOrderUpdateParam.class);
-                    updateParam.convertSckwTradeOrder(updateParam, tradeOrder);
-                    tradeOrderRepository.save(tradeOrder);
+                    updateById(order, order.get_id(), SckwTradeOrder.class);
                 } else {
                     throw new BusinessException("更新交易订单失败,订单:" + order.getTOrderId() + "不存在");
                 }
@@ -108,4 +113,44 @@ public class SckwBusSumConsumer {
         }
     }
 
+
+    /**
+     * @desc: 根据id非空更新
+     * @author: yzc
+     * @date: 2023-07-19 8:58
+     * @Param obj:
+     * @Param clazz:
+     * @Param id:
+     * @return: void
+     */
+    private void updateById(Object obj, Long id, Class<?> clazz) {
+        // 生成 Update 条件
+        final Update update = new Update();
+        // 反射遍历 entity 对象,将非空字段设置到 Update 中
+        ReflectionUtils.doWithFields(clazz, field -> {
+            // 排除指定条件
+            if ("_id".equals(field.getName()) // 排除 id 字段,因为作为查询主键
+                    || field.getAnnotation(Transient.class) != null // 排除 @Transient 注解的字段,因为非存储字段
+                    || Modifier.isStatic(field.getModifiers())) { // 排除静态字段
+                return;
+            }
+            // 设置字段可反射
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            // 排除字段为空的情况
+            if (field.get(obj) == null) {
+                return;
+            }
+            // 设置更新条件
+            update.set(field.getName(), field.get(obj));
+        });
+        // 防御,避免有业务传递空的 Update 对象
+        if (update.getUpdateObject().isEmpty()) {
+            return;
+        }
+        // 执行更新
+        mongoTemplate.updateFirst(new Query(Criteria.where("_id").is(id)), update, clazz);
+    }
+
 }

+ 1 - 1
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwOrderService.java

@@ -82,6 +82,7 @@ public class KwOrderService {
                     .setPickupType(DictEnum.getLabel(DictTypeEnum.PICKUP_TYPE.getType(), e.getPickupType()))
                     .setConsignmentStatus(Objects.isNull(e.getEntrustAmount()) || e.getEntrustAmount().compareTo(e.getAmount()) < 0 ? "待托运" : "已托运")
                     .setSource(DictEnum.getLabel(DictTypeEnum.TORDER_SOURCE.getType(), e.getSource()));
+            result.add(order);
         });
         return PageResult.build(params.getPage(), params.getPageSize(), count, result);
     }
@@ -141,7 +142,6 @@ public class KwOrderService {
         List<Criteria> orCriteriaList = new ArrayList<>();
         //商品名称
         if (StringUtils.isNotBlank(params.getGoodsName())) {
-            criteria.and("goodsName").is(params.getGoodsName());
             Pattern pattern = Pattern.compile("^.*" + params.getGoodsName() + ".*$", Pattern.CASE_INSENSITIVE);
             orCriteriaList.add(Criteria.where("goodsName").regex(pattern));
         }