diff --git a/src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java b/src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java index de5b6326..c438d0e7 100644 --- a/src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java +++ b/src/main/java/com/qs/serve/common/framework/security/filter/SecurityRequestFilter.java @@ -86,6 +86,7 @@ public class SecurityRequestFilter extends OncePerRequestFilter { } } response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader("Access-Control-Expose-Headers", "Date"); //登录拦截 if ("OPTIONS".equals(request.getMethod())) { HttpResponsePrintUtil.print(response,200,"success"); diff --git a/src/main/java/com/qs/serve/controller/AdminPortalController.java b/src/main/java/com/qs/serve/controller/AdminPortalController.java index 9fba9ba9..14b40f0c 100644 --- a/src/main/java/com/qs/serve/controller/AdminPortalController.java +++ b/src/main/java/com/qs/serve/controller/AdminPortalController.java @@ -14,6 +14,7 @@ import com.qs.serve.common.model.dto.SimpleKeyValue; import com.qs.serve.common.model.enums.BizType; import com.qs.serve.common.model.enums.SystemModule; import com.qs.serve.common.util.*; +import com.qs.serve.common.util.model.DateFormatString; import com.qs.serve.controller.dto.SyLoginParam; import com.qs.serve.controller.util.SyKeyLoginUtil; import com.qs.serve.modules.bms.entity.BmsSupplier; @@ -64,6 +65,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -102,6 +104,10 @@ public class AdminPortalController { private GoodsSkuService goodsSkuService; private GoodsCategoryService goodsCategoryService; + @GetMapping("/getSystemTime") + public R getSystemTime(){ + return R.ok(DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + } /** * 获取所有租户 diff --git a/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java b/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java index f76f6a93..8f9e283c 100644 --- a/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java +++ b/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java @@ -84,6 +84,17 @@ public class OmsSaleOrderController { return R.ok(saleOrders); } + /** + * 获取订单变更记录 + * @param code + * @return + */ + @GetMapping("/getChangeLog") + public R getChangeLog(String code){ + return R.ok(omsSaleOrderService.getChangeLog(code)); + } + + /** * 获取ERP订单信息 * @param query diff --git a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java index 4f30f803..f20f06e5 100644 --- a/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java +++ b/src/main/java/com/qs/serve/modules/oms/controller/api/OmsSaleOrderApi.java @@ -227,6 +227,7 @@ public class OmsSaleOrderApi { orderWrapper.in(OmsSaleOrder::getSupplierId,supplierIds); orderWrapper.eq(OmsSaleOrder::getOrderType,param.getOrderType()==null?0:param.getOrderType()); orderWrapper.orderByDesc(OmsSaleOrder::getId); + orderWrapper.eq(OmsSaleOrder::getCurrentFlag,1); if(param.getCheckStartTime()!=null){ orderWrapper.ge(OmsSaleOrder::getCheckTime,param.getCheckStartTime().atStartOfDay()); } diff --git a/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java b/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java index edf9f1ad..e6589e79 100644 --- a/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java +++ b/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java @@ -189,6 +189,12 @@ public class OmsSaleOrder implements Serializable { @JsonProperty private Boolean delFlag; + /** 业务确认人 */ + private String confirmUserName; + + /** 业务确认人 */ + private String confirmUserCode; + /** * 拓展查询条件 */ @@ -290,6 +296,7 @@ public class OmsSaleOrder implements Serializable { private String verifierName; private String currency; private Integer exchangeRate; + private Integer currentFlag; private String version; /** @@ -299,7 +306,7 @@ public class OmsSaleOrder implements Serializable { private Object discountRateInfo; @TableField(exist = false) - private List itemList; + private List itemList; } diff --git a/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSaleOrderChange.java b/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSaleOrderChange.java new file mode 100644 index 00000000..e0c451d8 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/entity/dto/OmsSaleOrderChange.java @@ -0,0 +1,27 @@ +package com.qs.serve.modules.oms.entity.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author YenHex + * @since 2025/2/8 + */@Data +public class OmsSaleOrderChange { + + /** 值:新增,删除,修改 */ + String optionType; + + String version; + + /** 操作人 */ + String userName; + + /** 操作时间 */ + LocalDateTime time; + + /** 备注 */ + String remark; + +} diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java index d217f8c1..77b5075f 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java @@ -10,6 +10,7 @@ import com.qs.serve.modules.oms.entity.OmsOrderItem; import com.qs.serve.modules.oms.entity.OmsSaleOrder; import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; import com.qs.serve.modules.oms.entity.bo.*; +import com.qs.serve.modules.oms.entity.dto.OmsSaleOrderChange; import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; import com.qs.serve.modules.oms.entity.vo.OmsPlanResult; import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; @@ -108,6 +109,9 @@ public interface OmsSaleOrderService extends IService { */ List listHistoryOrderByCode(String code); + + List getChangeLog(String orderCode); + /** * 拦截规则 * @param skuIds diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java index 71338989..df771090 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java @@ -120,7 +120,11 @@ public class OmsSaleOrderPart1ServiceImpl implements OmsSaleOrderPart1Service { omsSaleOrderService.save(order); for (OmsSaleOrderItem item : orderItems) { item.setId(null); + item.setVersion("cms"); item.setOrderId(order.getId()); + item.setOrderSn(order.getOrderSn()); + item.setProductionRemark(null); + item.setPreProductionDate(null); } omsSaleOrderItemService.saveBatch(orderItems); return order; diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java index 369585c4..bca1dfac 100644 --- a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java @@ -1,6 +1,7 @@ package com.qs.serve.modules.oms.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -30,6 +31,7 @@ import com.qs.serve.modules.oms.common.OmsOrderCheckState; import com.qs.serve.modules.oms.entity.*; import com.qs.serve.modules.oms.entity.bo.*; import com.qs.serve.modules.oms.entity.dto.OmsCalcAmount; +import com.qs.serve.modules.oms.entity.dto.OmsSaleOrderChange; import com.qs.serve.modules.oms.entity.dto.ShoppingCartsCheckResult; import com.qs.serve.modules.oms.entity.dto.XltOrderDTO; import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; @@ -107,7 +109,11 @@ public class OmsSaleOrderServiceImpl extends ServiceImpl0){ List skuList = goodsSkuMapper.selectList(new LambdaQueryWrapper().in(GoodsSku::getSkuCode,invCodes)); for (OmsPlanParam.InvItem item : invItemList) { - item.setFactory(skuList.stream().filter(sku -> sku.getSkuCode().equals(item.getInvCode())).findFirst().get().getBelong()); + for (GoodsSku sku : skuList) { + if(sku.getSkuCode().equals(item.getInvCode())){ + item.setFactory(sku.getBelong()); + } + } } } String result = HttpUtil.doPost(url, JsonUtil.objectToJson(invItemList),null); @@ -942,6 +948,150 @@ public class OmsSaleOrderServiceImpl extends ServiceImpl getChangeLog(String orderCode) { + // 获取订单历史版本列表并按创建时间正序排序 + List orderList = this.listHistoryOrderByCode(orderCode); + if(CollUtil.isEmpty(orderList)) { + return new ArrayList<>(); + } + + // 按创建时间正序排序 + orderList = orderList.stream() + .sorted(Comparator.comparing(OmsSaleOrder::getCreateTime)) + .collect(Collectors.toList()); + + Map versionChanges = new HashMap<>(); + + // 第一个订单作为基准参照物 + OmsSaleOrder baseOrder = orderList.get(0); + List baseItems = baseOrder.getItemList(); + + try { + OmsSaleOrderChange change = new OmsSaleOrderChange(); + if(baseOrder.getOrderStatusCombo().equals(0)){ + change.setUserName(baseOrder.getUserName()); + }else { + change.setUserName(baseOrder.getConfirmUserName()); + } + change.setOptionType("新增"); + change.setVersion(baseOrder.getVersion()); + change.setTime(baseOrder.getUpdateTime()); + StringBuilder sb = new StringBuilder(); + if(CollUtil.isNotEmpty(baseItems)){ + for (OmsSaleOrderItem baseItem : baseItems) { + sb.append(String.format("商品[%s] 数量:%d,价格:%.2f\n", + baseItem.getSkuCode(), + baseItem.getQuantity(), + baseItem.getSalesPrice())); + } + change.setRemark(sb.toString()); + } + versionChanges.put(baseOrder.getVersion(), change); + } catch (Exception e) { + e.printStackTrace(); + } + + // 从第二个订单开始比较变化 + for(int i = 1; i < orderList.size(); i++) { + OmsSaleOrder currentOrder = orderList.get(i); + List currentItems = currentOrder.getItemList(); + String currentVersion = currentOrder.getVersion(); + + // 获取或创建当前版本的变更记录 + OmsSaleOrderChange versionChange = versionChanges.computeIfAbsent(currentVersion, k -> { + OmsSaleOrderChange change = new OmsSaleOrderChange(); + change.setVersion(currentVersion); + change.setUserName(currentOrder.getConfirmUserName()); + change.setTime(currentOrder.getUpdateTime()); + return change; + }); + + List remarks = new ArrayList<>(); + boolean hasAdd = false; + boolean hasModify = false; + boolean hasDelete = false; + + // 比较商品变化 + if(CollUtil.isNotEmpty(baseItems) && CollUtil.isNotEmpty(currentItems)) { + Set matchedSkus = new HashSet<>(); + + // 检查新增和修改的商品 + for(OmsSaleOrderItem currentItem : currentItems) { + boolean found = false; + for(OmsSaleOrderItem baseItem : baseItems) { + if(currentItem.getSkuCode().equals(baseItem.getSkuCode())) { + found = true; + matchedSkus.add(currentItem.getSkuCode()); + + // 检查数量变化 + if(!currentItem.getQuantity().equals(baseItem.getQuantity())) { + hasModify = true; + remarks.add(String.format("[改数量] 商品[%s]数量从%d变更为%d", + currentItem.getSkuCode(), + baseItem.getQuantity(), + currentItem.getQuantity())); + } + + // 检查销售价变化 + if(currentItem.getSalesPrice() != null && baseItem.getSalesPrice() != null + && currentItem.getSalesPrice().compareTo(baseItem.getSalesPrice()) != 0) { + hasModify = true; + remarks.add(String.format("[改价格] 商品[%s]销售价从%.2f变更为%.2f", + currentItem.getSkuCode(), + baseItem.getSalesPrice(), + currentItem.getSalesPrice())); + } + break; + } + } + + // 新增的商品 + if(!found) { + hasAdd = true; + remarks.add(String.format("[新增] 商品[%s]数量%d", + currentItem.getSkuCode(), + currentItem.getQuantity())); + } + } + + // 检查删除的商品 + for(OmsSaleOrderItem baseItem : baseItems) { + if(!matchedSkus.contains(baseItem.getSkuCode())) { + hasDelete = true; + remarks.add(String.format("[删除] 商品[%s]", baseItem.getSkuCode())); + } + } + } + + // 设置操作类型 + if(hasDelete && !hasAdd && !hasModify) { + versionChange.setOptionType("删除"); + } else if(hasAdd || hasModify) { + versionChange.setOptionType("修改"); + }else { + versionChange.setOptionType("无变动"); + } + + // 合并备注信息 + if(!remarks.isEmpty()) { + String existingRemark = versionChange.getRemark(); + String newRemarks = String.join("\n", remarks); + versionChange.setRemark(existingRemark == null ? newRemarks : + existingRemark + "\n" + newRemarks); + } + + // 更新基准订单为当前订单,用于下一轮比较 + baseOrder = currentOrder; + baseItems = currentItems; + } + + // 将Map的values转为List并按time排序 + return versionChanges.values().stream() + .sorted(Comparator.comparing(OmsSaleOrderChange::getTime)) + .collect(Collectors.toList()); + } + @Override public List listHistoryOrderByCode(String code) { List omsSaleOrderList = this.list(new LambdaQueryWrapper() diff --git a/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java b/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java index bf04c1cd..84c97e3a 100644 --- a/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java +++ b/src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java @@ -19,6 +19,11 @@ public class OmsOrderUtil { if (orderItemList.size() < 1) { Assert.throwEx("空项目不支持下单"); } + boolean existSkuIdNull = orderItemList.stream() + .anyMatch(item -> item.getSkuId()== null || item.getSkuId().equals(0L)); + if(existSkuIdNull){ + Assert.throwEx("有错误明细,请清空列表再提交"); + } //拦截相同的skuItem long countDistinct = orderItemList.stream().map(OmsOrderItem::getSkuId).distinct().count(); if (orderItemList.size() != countDistinct) { @@ -36,6 +41,11 @@ public class OmsOrderUtil { if (orderItemList.size() < 1) { Assert.throwEx("空项目不支持下单"); } + boolean existSkuIdNull = orderItemList.stream() + .anyMatch(item -> item.getSkuId()== null || item.getSkuId().equals(0L)); + if(existSkuIdNull){ + Assert.throwEx("有错误明细,请清空列表再提交"); + } //拦截相同的skuItem long countDistinct = orderItemList.stream().map(OmsSaleOrderItem::getSkuId).distinct().count(); if (orderItemList.size() != countDistinct) {