From 23410b8cdd25178be4f24576574001152c915227 Mon Sep 17 00:00:00 2001 From: Yen Date: Wed, 11 Dec 2024 15:11:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(goods):=20=E5=A4=8D=E5=88=B6=E5=A4=9A?= =?UTF-8?q?=E4=B8=80=E4=BB=BD=E8=AE=A2=E5=8D=95=E6=A8=A1=E5=9D=97=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oms/controller/OmsOrderController.java | 17 + .../controller/OmsSaleOrderController.java | 262 ++++ .../modules/oms/entity/OmsSaleOrder.java | 249 ++++ .../modules/oms/entity/OmsSaleOrderItem.java | 153 ++ .../oms/entity/bo/OrderRelateQuery.java | 24 + .../oms/mapper/OmsSaleOrderItemMapper.java | 14 + .../oms/mapper/OmsSaleOrderMapper.java | 28 + .../oms/service/OmsSaleOrderItemService.java | 18 + .../service/OmsSaleOrderOptionsService.java | 28 + .../oms/service/OmsSaleOrderPart1Service.java | 37 + .../oms/service/OmsSaleOrderService.java | 132 ++ .../impl/OmsSaleOrderItemServiceImpl.java | 31 + .../impl/OmsSaleOrderOptionsServiceImpl.java | 449 ++++++ .../impl/OmsSaleOrderPart1ServiceImpl.java | 225 +++ .../service/impl/OmsSaleOrderServiceImpl.java | 1263 +++++++++++++++++ .../serve/modules/oms/utils/OmsOrderUtil.java | 18 + .../modules/tbs/common/TbsSeeYonConst.java | 1 + 17 files changed, 2949 insertions(+) create mode 100644 src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java create mode 100644 src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java create mode 100644 src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java create mode 100644 src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java create mode 100644 src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java create mode 100644 src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java create mode 100644 src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java diff --git a/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java b/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java index 5f07b3ac..5573364b 100644 --- a/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java +++ b/src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java @@ -8,7 +8,9 @@ import com.qs.serve.common.model.dto.R; import com.qs.serve.common.model.enums.BizType; import com.qs.serve.common.model.enums.SystemModule; import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.JsonUtil; import com.qs.serve.common.util.PageUtil; +import com.qs.serve.common.util.SpringUtils; import com.qs.serve.modules.bms.entity.BmsSupplier; import com.qs.serve.modules.bms.entity.BmsSupplierAddress; import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; @@ -18,9 +20,11 @@ import com.qs.serve.modules.oms.entity.OmsOrderItem; import com.qs.serve.modules.oms.entity.bo.OmsCheckParam; import com.qs.serve.modules.oms.entity.bo.OmsSpuAssesInfoBo; import com.qs.serve.modules.oms.entity.bo.OmsUrgentParam; +import com.qs.serve.modules.oms.entity.bo.OrderRelateQuery; import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; import com.qs.serve.modules.oms.service.OmsOrderItemService; import com.qs.serve.modules.oms.service.OmsOrderOptionsService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; import com.qs.serve.modules.sys.entity.SysUser; import com.qs.serve.modules.sys.service.SysUserService; import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; @@ -40,6 +44,8 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_ORDER_SOURCE; + /** * 订单模块 订单 * @author YenHex @@ -57,6 +63,17 @@ public class OmsOrderController { private SysUserService sysUserService; private OmsOrderItemService omsOrderItemService; private BmsSupplierMapper bmsSupplierMapper; + private SeeYonRequestBaseService seeYonRequestBaseService; + + /** + * 获取ERP订单信息 + * @param query + * @return + */ + @PostMapping("/getOrderRelateInfo") + public R getErpOrder(@RequestBody OrderRelateQuery query){ + return seeYonRequestBaseService.postBase(ERP_ORDER_SOURCE,query,"获取订单关联"); + } /** * ID查询 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 new file mode 100644 index 00000000..03d72083 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java @@ -0,0 +1,262 @@ +package com.qs.serve.modules.oms.controller; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.annotation.SysLog; +import com.qs.serve.common.model.dto.PageVo; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.enums.BizType; +import com.qs.serve.common.model.enums.SystemModule; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.PageUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +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.OmsCheckParam; +import com.qs.serve.modules.oms.entity.bo.OmsSpuAssesInfoBo; +import com.qs.serve.modules.oms.entity.bo.OmsUrgentParam; +import com.qs.serve.modules.oms.entity.bo.OrderRelateQuery; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.ERP_ORDER_SOURCE; + +/** + * 订单模块 订单 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("oms/saleOrder") +public class OmsSaleOrderController { + + private OmsSaleOrderService omsSaleOrderService; + private BmsSupplierAddressService bmsSupplierAddressService; + private OmsSaleOrderOptionsService omsSaleOrderOptionsService; + private SysUserService sysUserService; + private OmsSaleOrderItemService omsSaleOrderItemService; + private BmsSupplierMapper bmsSupplierMapper; + private SeeYonRequestBaseService seeYonRequestBaseService; + + /** + * 获取ERP订单信息 + * @param query + * @return + */ + @PostMapping("/getOrderRelateInfo") + public R getErpOrder(@RequestBody OrderRelateQuery query){ + return seeYonRequestBaseService.postBase(ERP_ORDER_SOURCE,query,"获取订单关联"); + } + + /** + * ID查询 + * @param orderCode + * @return + */ + @GetMapping("/stopOrder/{orderCode}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R stopOrder(@PathVariable("orderCode") String orderCode){ + OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .eq(OmsSaleOrder::getOrderSn,orderCode),false); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState() + .equals(OmsOrderCheckState.Commiting.getCode())){ + omsSaleOrderOptionsService.doRefuse(new TbsAffairCommitBo(omsOrder.getId()+"")); + return R.ok(); + } + return R.error("更新行数为0"); + } + + /** + * ID查询 + * @param orderCode + * @return + */ + @GetMapping("/checkOrder/{orderCode}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R checkOrder(@PathVariable("orderCode") String orderCode){ + OmsSaleOrder omsSaleOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .eq(OmsSaleOrder::getOrderSn,orderCode),false); + if(omsSaleOrder.getOrderType().equals(3)&&omsSaleOrder.getOrderCheckState() + .equals(OmsOrderCheckState.Commiting.getCode())){ + //omsOrderOptionsService.runCompensate(omsOrder.getId()+""); + omsSaleOrderOptionsService.doFinished(new TbsAffairCommitBo(omsSaleOrder.getId()+"")); + omsSaleOrderOptionsService.syncToErp(); + return R.ok(); + } + // 测试扣率 + //omsOrderOptionsService.syncToErp11DB(Arrays.asList(omsOrder)); + return R.error("更新行数为0"); + } + + /** + * 翻页 + * @param param + * @return + */ + @GetMapping("/page") + public R> getPage(OmsSaleOrder param){ + PageUtil.startPage(); + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(param); + orderWrapper.orderByDesc(OmsSaleOrder::getId); + if(param.getCheckStartTime()!=null){ + orderWrapper.ge(OmsSaleOrder::getCheckTime,param.getCheckStartTime().atStartOfDay()); + } + if(param.getCheckEndTime()!=null){ + orderWrapper.le(OmsSaleOrder::getCheckTime,param.getCheckEndTime().atTime(23,59,59)); + } + + List list = omsSaleOrderService.list(orderWrapper); + Set addrIds = list.stream().map(OmsSaleOrder::getSupplierAddrId).collect(Collectors.toSet()); + addrIds.add(0L); + List supplierAddressList = bmsSupplierAddressService.listByIds(addrIds); + + Set userIds = list.stream().map(OmsSaleOrder::getCheckUserId).collect(Collectors.toSet()); + userIds.add("0"); + List userList = sysUserService.listByIds(userIds); + + Set orderIds = list.stream().map(OmsSaleOrder::getId).collect(Collectors.toSet()); + orderIds.add(0L); + List orderItems = omsSaleOrderItemService.list(new LambdaQueryWrapper().in(OmsSaleOrderItem::getOrderId,orderIds)); + Map> orderItemsMap = orderItems.stream().collect(Collectors.groupingBy(OmsSaleOrderItem::getOrderId)); + for (OmsSaleOrder order : list) { + BmsSupplierAddress supplierAddress = null; + if(order.getSupplierAddrId()!=null){ + for (BmsSupplierAddress address : supplierAddressList) { + if(order.getSupplierAddrId().equals(address.getId())){ + supplierAddress = address; + } + } + order.setAddressInfo(supplierAddress); + } + if(order.getCheckUserId()!=null){ + SysUser sysUser = null; + for (SysUser user : userList) { + if(user.getId().equals(order.getCheckUserId())){ + sysUser = user; + } + } + if(sysUser!=null){ + order.setCheckUserInfo(sysUser.toSysUserVo()); + } + } + List items = orderItemsMap.get(order.getId()); + order.setOrderItems(items); + } + return R.byPageHelperList(list); + } + + /** + * ID查询 + * @param id + * @return + */ + @GetMapping("/getById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.QUERY) + public R getById(@PathVariable("id") String id){ + OmsSaleOrder omsOrder = omsSaleOrderService.getById(id); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Commiting.getCode())){ + omsSaleOrderOptionsService.runCompensate(omsOrder.getId()+""); + } + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + omsOrder.setSupplierInfo(supplier); + return R.ok(omsOrder); + } + + /** + * 审核 + * @param param + * @return + */ + @PostMapping("/check") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.UPDATE) + public R check(@RequestBody @Valid OmsCheckParam param){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(param.getOrderId()); + if(dbOmsOrder.getStatus().equals(0)){ + OmsSaleOrder omsOrder = new OmsSaleOrder(); + omsOrder.setId(param.getOrderId()); + omsOrder.setCheckState(param.getCheckSate().equals(1)?1:2); + omsOrder.setCheckTime(LocalDateTime.now()); + omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); + omsSaleOrderService.updateById(omsOrder); + return R.ok(); + } + return R.error("已完成的订单无法修改"); + } + + /** + * 设置加急 + * @param param + * @return + */ + @PostMapping("/urgent") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.UPDATE) + public R urgent(@RequestBody @Valid OmsUrgentParam param){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(param.getOrderId()); + if(dbOmsOrder.getStatus().equals(0)){ + OmsSaleOrder omsOrder = new OmsSaleOrder(); + omsOrder.setId(param.getOrderId()); + omsOrder.setUrgentFlag(param.getUrgentSate().equals(1)?1:0); + omsSaleOrderService.updateById(omsOrder); + return R.ok(); + } + return R.error("已完成的订单无法修改"); + } + + /** + * 删除 + * @param id + * @return + */ + @DeleteMapping("/deleteById/{id}") + @SysLog(module = SystemModule.BASE, title = "订单", biz = BizType.DELETE) + public R deleteById(@PathVariable("id") Long id){ + OmsSaleOrder dbOmsOrder = omsSaleOrderService.getById(id); + if(dbOmsOrder.getStatus().equals(0)&&dbOmsOrder.getCheckState().equals(0)&&dbOmsOrder.getOrderCheckState().equals(0)){ + boolean result = omsSaleOrderService.removeById(id); + return R.isTrue(result); + } + return R.error("当前状态无法删除"); + } + + /** + * 预估信息 + * @param param + * @return + */ + @PostMapping("/assess") + public R> getSpuAssess(@Valid @RequestBody OmsSpuAssesInfoBo param){ + return R.ok(omsSaleOrderService.getSpuAssess(param)); + } + + @GetMapping("/reSync/{code}") + public R getSpuAssess(@PathVariable("code") String code){ + List omsOrders = omsSaleOrderService.list(new LambdaQueryWrapper().eq(OmsSaleOrder::getOrderSn,code)); + if(CollUtil.isNotEmpty(omsOrders)){ + omsSaleOrderOptionsService.syncToErp11DB(omsOrders); + } + return R.ok(); + } +} + 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 new file mode 100644 index 00000000..55496311 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java @@ -0,0 +1,249 @@ +package com.qs.serve.modules.oms.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_sale_order") +public class OmsSaleOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + private String latitudeFrom; + + /** 订单号 */ + @NotBlank(message = "订单号不能为空") + @Length(max = 20,message = "订单号长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String orderSn; + + /** 订单类型:0->普通订单;1->赠品;2->试吃品;3->临期品 */ + private Integer orderType; + + private String orderSource; + + /** OA审批状态,订单审批状态 */ + private Integer orderCheckState; + + /** OA审批状态,订单审批状态 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime orderCheckSubmitTime; + + /** OA审批状态,订单审批状态 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime orderCheckFinishedTime; + + private String syFormId; + + /** 供应商ID */ + @NotNull(message = "供应商ID不能为空") + private Long supplierId; + + /** 供应商编码 */ + @NotBlank(message = "供应商编码不能为空") + @Length(max = 20,message = "供应商编码长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String supplierCode; + + /** 供应商名称 */ + @NotBlank(message = "供应商名称不能为空") + @Length(max = 30,message = "供应商名称长度不能超过30字") + @TableField(condition = SqlCondition.LIKE) + private String supplierName; + + /** 供应商收货地址id */ + @NotNull(message = "供应商收货地址id不能为空") + private Long supplierAddrId; + + /** 审核状态(非OA审批) */ + @NotNull(message = "审核状态不能为空") + private Integer checkState; + + /** 审核人 */ + @Length(max = 32,message = "审核人长度不能超过32字") + private String checkUserId; + + /** 审核时间 */ + @Length(max = 0,message = "审核时间长度不能超过0字") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + private LocalDateTime checkTime; + + /** 品牌ID */ + @NotNull(message = "品牌ID不能为空") + private Long brandRuleId; + + @TableField(condition = SqlCondition.LIKE) + private String brandRuleName; + + /** 制单人id */ + @Length(max = 32,message = "制单人id长度不能超过32字") + private String userId; + + /** 制单人名称 */ + @Length(max = 20,message = "制单人名称长度不能超过20字") + @TableField(condition = SqlCondition.LIKE) + private String userName; + + /** 制单人ERP编码 */ + @Length(max = 32,message = "制单人ERP编码长度不能超过32字") + @TableField(condition = SqlCondition.LIKE) + private String userCode; + + /** 制单人手机号 */ + @Length(max = 255,message = "制单人手机号长度不能超过255字") + private String userPhone; + + /** 发票类型:0->普通发票;1->增值税发票; */ + private Integer billType; + + /** 是否加急 */ + private Integer urgentFlag; + + /** CD单据备注 */ + private String cdOrderRemark; + + /** 临期品订单折扣率 */ + private BigDecimal discountRate; + + /** 适配的折扣率在OA的Id */ + private String oaRateId; + + /** 订单状态 + * 0->草稿; + * 1->下单(同步到调度系统); + * 2->已确认(已生成报价单); + * 6->已取消 + **/ + private Integer status; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 租户id */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 删除标识 */ + @JsonIgnore + @JsonProperty + private Boolean delFlag; + + /** + * 拓展查询条件 + */ + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion2; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegion3; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusSaleRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String cusBigRegion; + @TableField(condition = SqlCondition.LIKE) + private String cusProvince; + @TableField(condition = SqlCondition.LIKE) + private String cusCity; + @TableField(condition = SqlCondition.LIKE) + private String cusArea; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionAll; + @TableField(condition = SqlCondition.LIKE) + private String cusBizRegionCodes; + @TableField(condition = SqlCondition.LIKE) + private String allBands; + + + /** 订单明细项 */ + @TableField(exist = false) + private List orderItems; + + /** 订单明细项 */ + @TableField(exist = false) + private Object addressInfo; + + /** 订单明细项 */ + @TableField(exist = false) + private Object supplierInfo; + + /** 确认订单人员 */ + @TableField(exist = false) + private Object checkUserInfo; + + /** 订单明细项 */ + @TableField(exist = false) + private Object brandRuleInfo; + + /** + * 确认订单开始时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkStartTime; + + /** + * 确认订单结束时间 + */ + @TableField(exist = false) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") + private LocalDate checkEndTime; + + /** + * 折扣信息 + */ + @TableField(exist = false) + private Object discountRateInfo; +} + diff --git a/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java b/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java new file mode 100644 index 00000000..8dc9c985 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java @@ -0,0 +1,153 @@ +package com.qs.serve.modules.oms.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单明细 实体类 + * @author YenHex + * @since 2022-10-14 + */ +@Data +@TableName("oms_sale_order_item") +public class OmsSaleOrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.AUTO) + private Long id; + + /** 订单id */ + private Long orderId; + + /** 订单sn */ + @Length(max = 32,message = "订单sn长度不能超过32字") + private String orderSn; + + /** 商品id */ + private Long spuId; + + /** 商品编码 */ + @Length(max = 20,message = "商品编码长度不能超过20字") + private String spuCode; + + /** 商品名称 */ + @Length(max = 30,message = "商品名称长度不能超过30字") + private String spuTitle; + + private String skuTitle; + + /** skuBatchId */ + private Long skuBatchId; + + /** skuBatchCode */ + private String skuBatchCode; + + private Long skuId; + + /** sku编码 */ + @Length(max = 20,message = "sku编码长度不能超过20字") + private String skuCode; + + /** sku单位 */ + @Length(max = 20,message = "sku单位长度不能超过20字") + private String skuUnit; + + /** sku图片 */ + @Length(max = 255,message = "sku图片长度不能超过255字") + private String skuImg; + + /** 规格值 */ + @Length(max = 255,message = "规格值长度不能超过255字") + private String specValues; + + /** 数量 */ + private Integer quantity; + + /** 销售价 */ + private BigDecimal salesPrice; + + /** 客户价 */ + private BigDecimal cusPrice; + + /** 市场价 */ + private BigDecimal marketPrice; + + + private BigDecimal weight; + + private BigDecimal volume; + + /** 备注 */ + @Length(max = 255,message = "备注长度不能超过255字") + private String remark; + + /** 最后更新时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; + + /** 创建时间 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** 所属租户 */ + @JsonIgnore + @JsonProperty + private String tenantId; + + /** 逻辑删除标记(0:显示;1:隐藏) */ + @JsonIgnore + @JsonProperty + private String delFlag; + + /** 创建人 */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** 更新人 */ + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + /** 评估数量列表 */ + @TableField(exist = false) + private List assessInfoList; + + /** Spu */ + @TableField(exist = false) + private Object spuInfo; + + /** skuBelong */ + @TableField(exist = false) + private Object skuBelong; + + /** skuBelong */ + @TableField(exist = false) + private Object skuAddCode; + + /** 分类 */ + @TableField(exist = false) + private Object categoryInfo; + + /** 分类 */ + @TableField(exist = false) + private Object batchInfo; + + @TableField(exist = false) + private Integer skuSpecialFlag; +} + diff --git a/src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java b/src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java new file mode 100644 index 00000000..e6defb97 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java @@ -0,0 +1,24 @@ +package com.qs.serve.modules.oms.entity.bo; + +import lombok.Data; + +import java.util.List; + +@Data +public class OrderRelateQuery { + + /** + 订单类型 + CmsOrder + ErpOrder + ErpQuotation + ErpDispatch + */ + String orderType; + + /** + * 订单编码 + */ + List orderCodes; + +} diff --git a/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java b/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java new file mode 100644 index 00000000..22646481 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; + +/** + * 订单明细 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderItemMapper extends BaseMapper { + +} + diff --git a/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java b/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java new file mode 100644 index 00000000..9a7836ec --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.oms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单 Mapper + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderMapper extends BaseMapper { + + @Select("SELECT rate FROM `ext_expire_order_rate` where oa_id = #{oaId} and del_flag = 0 ") + BigDecimal getExpiredOrderRates(String oaId); + + @Select("SELECT oa_id as `value`,`name` as label,rate as value2 FROM `ext_expire_order_rate` where del_flag = 0 order by rate") + List> selectExpiredOrderRates(); + + @Select("SELECT oa_id as `value`,`name` as label,rate as value2 FROM `ext_expire_order_rate` where del_flag = 0 and oa_id = #{oaId} ") + SimpleKeyValue getExpiredRateInfo(String oaId); + +} + diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java new file mode 100644 index 00000000..8806e7cb --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java @@ -0,0 +1,18 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; + +import java.util.List; + +/** + * 订单明细 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderItemService extends IService { + + List listByOrderId(Long orderId); + +} + diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java new file mode 100644 index 00000000..87c85e0e --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java @@ -0,0 +1,28 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.modules.oms.entity.OmsOrder; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.seeyon.service.SeeYonOperationService; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/8/12 + */ +public interface OmsSaleOrderOptionsService extends SeeYonOperationService { + + /** + * 提交临期品订单 + * @param orderId + * @return + */ + Object submitExpiredOrder(String orderId); + + /** + * 定时同步通过审核的订单到ERP + */ + void syncToErp(); + + void syncToErp11DB(List omsOrders); +} diff --git a/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java new file mode 100644 index 00000000..a6604a4f --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java @@ -0,0 +1,37 @@ +package com.qs.serve.modules.oms.service; + +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.oms.entity.OmsSaleOrder; +import com.qs.serve.modules.oms.entity.bo.OmsVerifySkuParam; + +import java.util.List; + +/** + * @author YenHex + * @since 2024/6/21 + */ +public interface OmsSaleOrderPart1Service { + + + /** + * 复制订单 + * @param orderId + * @return + */ + OmsSaleOrder copyOrder(Long orderId); + + /** + * 释放临期品库存 + * @param orderId + * @return + */ + boolean releaseInventory(Long orderId); + + /** + * 校验sku合法性 + * @param param + * @return + */ + List verifySku(OmsVerifySkuParam param); + +} 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 new file mode 100644 index 00000000..6287efca --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java @@ -0,0 +1,132 @@ +package com.qs.serve.modules.oms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.oms.entity.OmsOrder; +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.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单 服务接口 + * @author YenHex + * @date 2022-10-14 + */ +public interface OmsSaleOrderService extends IService { + + BigDecimal getExpiredOrderRateById(String oaId); + + List> selectExpiredOrderRates(); + + /** + * 确认订单 H5 + * @param confirmOrder + * @return + */ + OmsConfirmOrderResult confirmOrder(OmsOrderBo confirmOrder); + + /** + * 确认订单 PC + * @param confirmOrder + * @return + */ + OmsConfirmOrderResult confirmOrderPc(OmsOrderSkuBo confirmOrder); + + /** + * 创建订单 H5 + * @param omsOrderBo + * @return + */ + OmsSaleOrder createOrder(OmsOrderBo omsOrderBo); + + /** + * 修改草稿的订单 + * @param param + * @return + */ + void modifyOrder(OmsOrderModifyParam param); + + /** + * 检测订单状态 + * @param order + * @return 是否进行更新,是则说明状态1->2 + */ + boolean checkMsOrderStatus(OmsSaleOrder order); + + boolean cancelOrder(String orderSn); + + /** + * 创建订单 PC + * @param omsOrderBo + * @return + */ + OmsSaleOrder createOrderPc(OmsOrderSkuBo omsOrderBo); + + /** + * 获取spu预估信息 + * @param param + * @return + */ + List getSpuAssess(OmsSpuAssesInfoBo param); + + /** + * 对接调度系统,生成ERP的报价单 + * @param id + */ + void buildPriceOrder(String id,String amount); + + /** + * 临期品订单 + * @param param + * @return + */ + OmsSaleOrder modifyImminentOrder(OmsOrderImminentBo param); + + /** + * 拦截规则 + * @param skuIds + * @param categoryRule + * @return + */ + List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule); + + + /** + * 拦截规则 + * @param categoryRule + * @param orderItems + */ + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems); + + /** + * 更新订单项特殊价 + * @param cusCode + * @param orderItemList + */ + public void updateCusPrice(String cusCode, List orderItemList); + + /** + * 保存到ERP + * @param omsOrder + * @param orderItemList + * @param brands + * @param supplierAddress + * @param bmsRegion + */ + public void saveToErpOrder(OmsSaleOrder omsOrder, + List orderItemList, + String brands, + BmsSupplierAddress supplierAddress, + BmsRegion bmsRegion); + +} + diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java new file mode 100644 index 00000000..8191beab --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java @@ -0,0 +1,31 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderItemMapper; +import com.qs.serve.modules.oms.service.OmsOrderItemService; +import com.qs.serve.modules.oms.service.OmsSaleOrderItemService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 订单明细 服务实现类 + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderItemServiceImpl extends ServiceImpl implements OmsSaleOrderItemService { + + @Override + public List listByOrderId(Long orderId) { + return this.list(new LambdaQueryWrapper().eq(OmsSaleOrderItem::getOrderId,orderId)); + } + +} + diff --git a/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java new file mode 100644 index 00000000..b106ba13 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java @@ -0,0 +1,449 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.oa.OaFormMainProcess; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.DateUtils; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.common.util.model.DateFormatString; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsRegion2; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.mapper.BmsRegion2Mapper; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.mapper.GoodsSpuMapper; +import com.qs.serve.modules.goods.service.GoodsImminentBatchService; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +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.dto.SeeYonOrderItemDTO; +import com.qs.serve.modules.oms.mapper.OmsOrderMapper; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderMapper; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.seeyon.entity.BaseCreateCallbackBo; +import com.qs.serve.modules.seeyon.service.SeeYonRequestService; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tag.mapper.TagInfoMapper; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 订单审批操作类 + * @author YenHex + * @since 2024/8/12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderOptionsServiceImpl implements OmsSaleOrderOptionsService { + + private final GoodsImminentBatchService goodsImminentBatchService; + private final OmsSaleOrderService omsSaleOrderService; + private final OmsOrderPart1Service omsOrderPart1Service; + private final OmsSaleOrderItemService omsSaleOrderItemService; + private final SysUserService sysUserService; + private final BmsRegionMapper regionMapper; + private final BmsRegion2Mapper region2Mapper; + + private final GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private final BmsSupplierAddressService bmsSupplierAddressService; + + private final BmsSupplierMapper bmsSupplierMapper; + private final BmsRegionMapper bmsRegionMapper; + private final TagInfoMapper tagInfoMapper; + private final GoodsSkuMapper goodsSkuMapper; + private final GoodsSpuMapper goodsSpuMapper; + private final OmsSaleOrderMapper omsSaleOrderMapper; + private final GoodsCategoryMapper goodsCategoryMapper; + private final SeeYonRequestService seeYonService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Object submitExpiredOrder(String orderId) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(orderId); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if(!userId.equals(omsOrder.getCreateBy())){ + Assert.throwEx("越权访问被拦截了"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 + if(!omsOrder.getOrderType().equals(3)){ + Assert.throwEx("该功能只针对临期品订单"); + } + omsSaleOrderService.checkMsOrderStatus(omsOrder); + if (!omsOrder.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode()) + && !omsOrder.getOrderCheckState().equals(OmsOrderCheckState.Rollback.getCode())) { + Assert.throwEx("订单状态不支持下单"); + } + List orderItemList = omsSaleOrderItemService.listByOrderId(Long.parseLong(orderId)); + + // 加成订单项合法性 + OmsOrderUtil.checkSaleOrderItemValues(orderItemList); + + //下单前规则拦截 + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + omsSaleOrderService.handleCategoryRule(categoryRule, orderItemList); + + List imminentBatches = new ArrayList<>(); + if (omsOrder.getOrderType().equals(3)) { + //临期品相关拦截 + for (OmsSaleOrderItem orderItem : orderItemList) { + if (orderItem.getSkuBatchId() == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + if (imminentBatch == null) { + Assert.throwEx(orderItem.getSkuCode() + " 单品无效或过期"); + } + int spur = imminentBatch.getQuantity() - imminentBatch.getOrderQuantity(); + if (orderItem.getQuantity() > spur) { + Assert.throwEx(orderItem.getSkuCode() + " 单品库存不足"); + } + // 扣减库存 + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() + orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + } + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + if(supplierAddress==null){ + Assert.throwEx("客户地址为空"); + } + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + + //补充:调度系统写报价单给ERP时,要把地址ID写过去 + if (supplierAddress.getTmsSysId() == null) { + Assert.throwEx("地址缺失TmsSysId关联"); + } + + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + + //更新最新的用户特殊价格 + omsSaleOrderService.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + BigDecimal totalOrderAmt = orderItemList.stream().map(a->a.getSalesPrice().multiply(new BigDecimal(a.getQuantity()))) + .reduce(BigDecimal.ZERO,BigDecimal::add); + + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + + String templateCode = this.getTemplateCode(); + + //加载大区信息 + String saleRegionId = supplier.handleSaleRegionId(); + BmsRegion saleRegion = regionMapper.selectById(saleRegionId); + String saleBizNames = saleRegion!=null?saleRegion.getPathNames():"null_申请时未录入"; + String bizRegionId = supplier.handleBizRegionId(); + BmsRegion2 bizRegion = region2Mapper.selectById(bizRegionId); + String bizBizNames = bizRegion!=null?bizRegion.getPathNames():"null_申请时未录入"; + + Map newWayData = new HashMap<>(); + + // 构建DATA + Map mainTableData = this.buildSeeyonData(omsOrder, sysUser, supplierAddress, supplier, + totalOrderAmt, templateCode, saleBizNames, bizBizNames); + newWayData.put("formmain_2206",mainTableData); + + // 构建子表data + List itemDTOList = getSeeYonOrderItemDTOS(orderItemList); + newWayData.put("formson_2210",itemDTOList); + + OaFormMainProcess mainProcess = new OaFormMainProcess(); + mainProcess.setTargetId(orderId); + mainProcess.setUploadFiles(new ArrayList<>()); + mainProcess.setTableName("formmain_2206"); + mainProcess.setData(newWayData); + mainProcess.setTemplateCode(templateCode); + mainProcess.setUserId(sysUser.getId()); + mainProcess.setSenderLoginName(sysUser.getAccount()); + R flowIdResult = seeYonService.newCreateProcess(mainProcess); + + if(flowIdResult==null||flowIdResult.getStatus()!=200){ + assert flowIdResult != null; + Assert.throwEx("远程服务调用失败:"+flowIdResult.getMsg()); + } + if(flowIdResult.getMsg()!=null && flowIdResult.getMsg().length()>45){ + log.error(flowIdResult.getMsg()); + JSONObject object = JSON.parseObject(flowIdResult.getMsg()); + if(!object.get("code").toString().equals("0")){ + Assert.throwEx("流程发起被拦截了"); + } + } + String formId = null; + R formIdResult = seeYonService.getFormId(templateCode,omsOrder.getId()); + if(formIdResult.getStatus()==200){ + formId = formIdResult.getData(); + } + omsOrder.setSyFormId(formId); + omsOrder.setOrderCheckState(OmsOrderCheckState.Commiting.getCode()); + omsOrder.setOrderCheckSubmitTime(LocalDateTime.now()); + omsSaleOrderService.updateById(omsOrder); + + BaseCreateCallbackBo callbackBo = new BaseCreateCallbackBo(templateCode,orderId); + seeYonService.createCallbackStatus(callbackBo); + return R.ok(); + } + + private List getSeeYonOrderItemDTOS(List orderItemList) { + List itemDTOList = orderItemList.stream().map(item->{ + SeeYonOrderItemDTO dto = new SeeYonOrderItemDTO(); + dto.setSpuCode(item.getSpuCode()); + dto.setSkuTitle(item.getSkuTitle()); + GoodsSpu goodsSpu = goodsSpuMapper.selectById(item.getSpuId()); + GoodsSku goodsSku = goodsSkuMapper.selectById(item.getSkuId()); + GoodsCategory goodsCategory = goodsCategoryMapper.selectById(goodsSpu.getCategoryLast()); + dto.setSkuAddCode(goodsSku.getSkuAddCode()); + dto.setSkuCode(item.getSkuCode()); + dto.setBatchCode(item.getSkuBatchCode()); + dto.setSkuCategories(goodsCategory.getLevelPathNames()); + dto.setSpecVal(item.getSpecValues()); + dto.setRemark(item.getRemark()); + dto.setWeight(item.getWeight()); + dto.setVolume(item.getVolume()); + dto.setQty(item.getQuantity()); + dto.setSalesPrice(item.getSalesPrice()); + dto.setTotalPrice(item.getSalesPrice().multiply(new BigDecimal(item.getQuantity()))); + return dto; + }).collect(Collectors.toList()); + return itemDTOList; + } + + @Override + public void syncToErp() { + AuthContextUtils.setTenant("001"); + List omsOrders = omsSaleOrderService.list(new LambdaQueryWrapper() + //临期品 + .eq(OmsSaleOrder::getOrderType,3) + //未下单 + .in(OmsSaleOrder::getStatus,0) + //审批完成 + .eq(OmsSaleOrder::getOrderCheckState,OmsOrderCheckState.Finished.getCode()) + ); + log.warn("临期品同步到ERP,数量:{}",omsOrders.size()); + syncToErp11DB(omsOrders); + } + + @Override + public void syncToErp11DB(List omsOrders) { + for (OmsSaleOrder omsOrder : omsOrders) { + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + List orderItemList = omsSaleOrderItemService.listByOrderId(omsOrder.getId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + List spuIds = orderItemList.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toList()); + List goodsSpuList = goodsSpuMapper.selectBatchIds(spuIds); + List cateIds = goodsSpuList.stream().map(GoodsSpu::getCategoryLast).collect(Collectors.toList()); + List categoryList = goodsCategoryMapper.selectBatchIds(cateIds); + String bs = categoryList.stream().map(GoodsCategory::getName).collect(Collectors.joining(",")); + // 读取OA最新订单折扣 + if(omsOrder.getOrderType().equals(3)){ + R codeRs = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + BigDecimal dr = null; + if(codeRs.getStatus()==200 && codeRs.getMsg()!=null){ + try { + String oaRateId = codeRs.getMsg().toString(); + dr = omsSaleOrderMapper.getExpiredOrderRates(oaRateId); + omsOrder.setDiscountRate(dr); + omsOrder.setOaRateId(oaRateId); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(dr==null){ + log.error("临期品订单,获取最新的折扣率失败,单号:{}",omsOrder.getOrderSn()); + continue; + } + } + // 写入到ERP中间表 + omsSaleOrderService.saveToErpOrder(omsOrder,orderItemList,bs,supplierAddress,bmsRegion); + } + } + + /** + * 构建DATA + * @param omsOrder + * @param sysUser + * @param supplierAddress + * @param supplier + * @param totalOrderAmt + * @param templateCode + * @param saleBizNames + * @param bizBizNames + * @return + */ + private Map buildSeeyonData(OmsSaleOrder omsOrder, SysUser sysUser, BmsSupplierAddress supplierAddress, BmsSupplier supplier, BigDecimal totalOrderAmt, String templateCode, String saleBizNames, String bizBizNames) { + Map data = new HashMap<>(); + data.put("orgId", omsOrder.getId()); + data.put("targetId", omsOrder.getId()); + data.put("targetCode", omsOrder.getOrderSn()); + data.put("applyUserCode", sysUser.getCode()); + data.put("applyUserName", sysUser.getName()); + data.put("supplierName", supplier.getName()); + data.put("supplierCode", supplier.getCode()); + data.put("exsp1", templateCode); + data.put("exsp2", bizBizNames); + data.put("exsp3", saleBizNames); + // title + data.put("exsp4", "临期订单-"+omsOrder.getOrderSn()); + //添加跳转地址业务 + String baseJumpUrl = "https://shop.gdjsl.com/pcOrder/#/"; + data.put("cmsLink",baseJumpUrl); + data.put("rowDate", DateUtils.format(LocalDateTime.now(), DateFormatString.DATE_TIME)); + data.put("rowState","00"); + //data.put("templateId", ""); + //data.put("templateName", ""); + //添加客户标签 + List tags = tagInfoMapper.lisTagsBySupplierCode(supplier.getCode()); + data.put("tags",tags); + + data.put("totalOrderAmt", totalOrderAmt); + // 解决特殊bug,整数传“.0” oa会报错 + if(totalOrderAmt.compareTo(new BigDecimal(totalOrderAmt.intValue()))==0){ + data.put("totalOrderAmt", totalOrderAmt.intValue()); + } + + data.put("cusAddr", supplierAddress.getDetail()); + data.put("cdNumber", omsOrder.getCdOrderRemark()); + data.put("remark", omsOrder.getRemark()); + data.put("mainRemark", omsOrder.getRemark()); + // 折扣率(审批时修改) + data.put("ext1", omsOrder.getOaRateId()); + if(omsOrder.getOrderType().equals(3)&&omsOrder.getDiscountRate()==null){ + Assert.throwEx("临期品订单,请确保折扣率被设置"); + } + // 申请时的总金额(审批时该金额不更新,非最终的合计金额) + data.put("ext2", + totalOrderAmt.multiply(omsOrder.getDiscountRate()) + .divide(new BigDecimal("100"),2, RoundingMode.DOWN) + ); + // 申请时的折扣率(跟ext1一样传oaid) + data.put("ext3",omsOrder.getOaRateId()); + return data; + } + + @Override + public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) { + OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .select(OmsSaleOrder::getSyFormId) + .eq(OmsSaleOrder::getId,affairCommit.getTargetId())); + return omsOrder!=null?omsOrder.getSyFormId():null; + } + + @Override + public Object doBacked(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Rollback.getCode()); + omsSaleOrderService.updateById(omsOrder); + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + return null; + } + + @Override + public Object doFinished(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Finished.getCode()); + omsOrder.setOrderCheckFinishedTime(LocalDateTime.now()); + omsSaleOrderService.updateById(omsOrder); + return null; + } + + @Override + public Object doRefuse(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + omsOrder.setOrderCheckState(OmsOrderCheckState.Stop.getCode()); + omsSaleOrderService.updateById(omsOrder); + omsOrderPart1Service.releaseInventory(omsOrder.getId()); + return null; + } + + @Override + public boolean checkSyFormIdIsNotNull(String targetId) { + OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper() + .select(OmsSaleOrder::getSyFormId) + .eq(OmsSaleOrder::getId,targetId)); + return omsOrder!=null&&omsOrder.getSyFormId()!=null; + } + + @Override + public void doCommitBacked(String targetId) { + + } + + @Override + public Object doNext(TbsAffairCommitBo param) { + OmsSaleOrder omsOrder = omsSaleOrderService.getById(param.getTargetId()); + R codeRs = seeYonRequestBaseService.getBase( + TbsSeeYonConst.OA_DATA_EXPIRE_ORDER_DR + omsOrder.getOrderSn() + ,"获取条款申请流水号"); + BigDecimal dr = null; + if(codeRs.getStatus()==200 && codeRs.getMsg()!=null){ + try { + String oaRateId = codeRs.getMsg().toString(); + dr = omsSaleOrderMapper.getExpiredOrderRates(oaRateId); + omsOrder.setDiscountRate(dr); + omsOrder.setOaRateId(oaRateId); + omsSaleOrderMapper.updateById(omsOrder); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(dr==null){ + log.error("临期品订单,获取最新的折扣率失败,单号:{}",omsOrder.getOrderSn()); + return null; + } + return null; + } + + @Override + public String getTemplateCode() { + return TbsSeeYonConst.ExpiredOrderConf.Code(); + } + +} 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 new file mode 100644 index 00000000..365b11fe --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java @@ -0,0 +1,225 @@ +package com.qs.serve.modules.oms.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.Assert; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.CodeGenUtil; +import com.qs.serve.common.util.CollectionUtil; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.GoodsCategoryRule; +import com.qs.serve.modules.goods.entity.GoodsImminentBatch; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +import com.qs.serve.modules.oms.common.OmsOrderCheckState; +import com.qs.serve.modules.oms.entity.OmsOrder; +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.OmsVerifySkuParam; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author YenHex + * @since 2024/6/21 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderPart1ServiceImpl implements OmsSaleOrderPart1Service { + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SalePlanMapper salePlanMapper; + private SalePlanGoodsMapper salePlanGoodsMapper; + + private OmsSaleOrderService omsSaleOrderService; + private OmsSaleOrderItemService omsSaleOrderItemService; + + private GoodsRuleService goodsRuleService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private GoodsCustomerPriceService goodsCustomerPriceService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private SeeYonRequestBaseService seeYonRequestBaseService; + private RedisService redisService; + + @Override + public OmsSaleOrder copyOrder(Long orderId) { + OmsSaleOrder orgOrder = omsSaleOrderService.getById(orderId); + List orderItems = omsSaleOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsSaleOrderItem::getOrderId, orderId)); + OmsSaleOrder order = new OmsSaleOrder(); + order.setId(null); + order.setOrderType(orgOrder.getOrderType()); + String orderPrefix = null; + if (order.getOrderType().equals(0)) { + orderPrefix = "SN"; + } else if (order.getOrderType().equals(1)) { + orderPrefix = "ZP"; + } else if (order.getOrderType().equals(2)) { + orderPrefix = "SC"; + } else if (order.getOrderType().equals(3)) { + orderPrefix = "SP"; + } else { + Assert.throwEx("订单类型错误"); + } + order.setOrderSn(orderPrefix + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + order.setUserId(user.getId()); + order.setUserCode(user.getCode()); + order.setUserName(user.getName()); + order.setUserPhone(user.getMobile()); + order.setCheckState(0); + order.setStatus(0); + order.setOrderCheckState(OmsOrderCheckState.UnPublish.getCode()); + order.setLatitudeFrom(orgOrder.getLatitudeFrom()); + order.setOrderSource(orgOrder.getOrderSource()); + order.setSupplierId(orgOrder.getSupplierId()); + order.setSupplierCode(orgOrder.getSupplierCode()); + order.setSupplierName(orgOrder.getSupplierName()); + order.setSupplierAddrId(orgOrder.getSupplierAddrId()); + order.setBrandRuleId(orgOrder.getBrandRuleId()); + order.setBrandRuleName(orgOrder.getBrandRuleName()); + + order.setBillType(orgOrder.getBillType()); + order.setCdOrderRemark(orgOrder.getCdOrderRemark()); + order.setRemark(orgOrder.getRemark()); + + + omsSaleOrderService.save(order); + for (OmsSaleOrderItem item : orderItems) { + item.setId(null); + item.setOrderId(order.getId()); + } + omsSaleOrderItemService.saveBatch(orderItems); + return order; + } + + @Override + public boolean releaseInventory(Long orderId) { + // 释放库存 + OmsSaleOrder omsOrder = omsSaleOrderService.getById(orderId); + // 目前只有临期品需要释放库存 + if (omsOrder.getOrderType().equals(3)) { + List imminentBatches = new ArrayList<>(); + List orderItemList = omsSaleOrderItemService.listByOrderId(orderId); + for (OmsSaleOrderItem orderItem : orderItemList) { + GoodsImminentBatch imminentBatch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + imminentBatch.setOrderQuantity(imminentBatch.getOrderQuantity() - orderItem.getQuantity()); + imminentBatches.add(imminentBatch); + } + if (imminentBatches.size() > 0) { + goodsImminentBatchService.updateBatchById(imminentBatches); + } + } + return true; + } + + @Override + public List verifySku(OmsVerifySkuParam param) { + + List errorImminentIds = new ArrayList<>(); + + LocalDate nowDate = LocalDate.now(); + boolean isImminentCheck = CollectionUtil.isNotEmpty(param.getImminentItemIds()); + List goodsImminentBatches = null; + if(isImminentCheck){ + if(CollectionUtil.isEmpty(param.getImminentItemIds())){ + return new ArrayList<>(); + } + goodsImminentBatches = goodsImminentBatchService.listByIds(param.getImminentItemIds()); + for (GoodsImminentBatch batch : goodsImminentBatches) { + if(batch.getEndDate().isBefore(nowDate)){ + errorImminentIds.add(new SimpleKeyValue("临期品已过期",batch.getId())); + } + if(batch.getQuantity()-batch.getOrderQuantity()<=0){ + errorImminentIds.add(new SimpleKeyValue("临期品库存不足",batch.getId())); + } + } + } + + List skuIds = param.getSkuIds(); + if(isImminentCheck){ + skuIds = goodsImminentBatches.stream().map(a->Long.parseLong(a.getSkuId())).collect(Collectors.toList()); + } + + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getRuleId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + + + List errorSkuIds = new ArrayList<>(); + //拦截商品授权维度规则 + GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + if (accrIdsDto != null) { + List selectSkuIds = goodsSkuMapper.listByOtherIds( + accrIdsDto.getCateIds(), + accrIdsDto.getSpuIds(), + accrIdsDto.getSkuIds(), + accrIdsDto.getNotInCateIds(), + accrIdsDto.getNotInSpuIds(), + accrIdsDto.getNotInSkuIds() + ); + for (Long paramSkuId : skuIds) { + for (Long skuId : selectSkuIds) { + if (paramSkuId.equals(skuId)) { + errorSkuIds.add(new SimpleKeyValue("商品未授权",skuId)); + break; + } + } + } + } + + //拦截客户维度规则 + errorSkuIds.addAll(goodsRuleService.checkSkuCode( supplier.getId(),skuIds)); + //拦截客户维度的用户规则 + errorSkuIds.addAll(goodsRuleService.checkSkuCodeByUserId( AuthContextUtils.getSysUserId(),skuIds)); + + //拦截品类下单规则 + errorSkuIds.addAll(omsSaleOrderService.handleCategoryRule(skuIds,categoryRule)); + + if(isImminentCheck){ + if(CollectionUtil.isEmpty(errorSkuIds)){ + for (SimpleKeyValue errorSkuId : errorSkuIds) { + for (GoodsImminentBatch batch : goodsImminentBatches) { + if(batch.getSkuId().equals(errorSkuId.getValue())){ + errorImminentIds.add(new SimpleKeyValue(errorSkuId.getLabel(),batch.getId())); + } + } + } + } + return errorImminentIds; + } + + return errorSkuIds; + } + +} 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 new file mode 100644 index 00000000..e603d93b --- /dev/null +++ b/src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java @@ -0,0 +1,1263 @@ +package com.qs.serve.modules.oms.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.qs.serve.common.framework.redis.RedisService; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.model.dto.SimpleKeyValue; +import com.qs.serve.common.util.*; +import com.qs.serve.modules.bms.entity.BmsRegion; +import com.qs.serve.modules.bms.entity.BmsSupplier; +import com.qs.serve.modules.bms.entity.BmsSupplierAddress; +import com.qs.serve.modules.bms.entity.vo.BmsSupplierExtRegionVo; +import com.qs.serve.modules.bms.mapper.BmsRegionMapper; +import com.qs.serve.modules.bms.mapper.BmsSupplierMapper; +import com.qs.serve.modules.bms.service.BmsSupplierAddressService; +import com.qs.serve.modules.goods.entity.*; +import com.qs.serve.modules.goods.entity.dto.GoodsAccrIdsDto; +import com.qs.serve.modules.goods.entity.dto.InventoryCusPrice; +import com.qs.serve.modules.goods.entity.so.InventoryCusPriceQuery; +import com.qs.serve.modules.goods.entity.vo.GoodSkuVo; +import com.qs.serve.modules.goods.mapper.GoodsCategoryMapper; +import com.qs.serve.modules.goods.mapper.GoodsCategoryRuleMapper; +import com.qs.serve.modules.goods.mapper.GoodsSkuMapper; +import com.qs.serve.modules.goods.service.*; +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.ShoppingCartsCheckResult; +import com.qs.serve.modules.oms.entity.dto.XltOrderDTO; +import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult; +import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo; +import com.qs.serve.modules.oms.mapper.OmsSaleOrderMapper; +import com.qs.serve.modules.oms.service.*; +import com.qs.serve.modules.oms.utils.OmsOrderUtil; +import com.qs.serve.modules.sale.entity.SalePlan; +import com.qs.serve.modules.sale.entity.SalePlanGoods; +import com.qs.serve.modules.sale.mapper.SalePlanGoodsMapper; +import com.qs.serve.modules.sale.mapper.SalePlanMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; +import com.qs.serve.modules.sys.entity.SysUser; +import com.qs.serve.modules.sys.service.SysDeptService; +import com.qs.serve.modules.sys.service.SysUserService; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static com.qs.serve.modules.tbs.common.TbsSeeYonConst.*; + +/** + * 订单 服务实现类 + * + * @author YenHex + * @since 2022-10-14 + */ +@Slf4j +@Service +@AllArgsConstructor +public class OmsSaleOrderServiceImpl extends ServiceImpl implements OmsSaleOrderService { + + private GoodsSkuMapper goodsSkuMapper; + private GoodsSkuService goodsSkuService; + private GoodsSpuService goodsSpuService; + private GoodsCategoryMapper goodsCategoryMapper; + private GoodsCategoryRuleMapper goodsCategoryRuleMapper; + private GoodsCustomerPriceService goodsCustomerPriceService; + + private BmsSupplierMapper bmsSupplierMapper; + private BmsRegionMapper bmsRegionMapper; + private BmsSupplierAddressService bmsSupplierAddressService; + + private SysUserService sysUserService; + private SysDeptService sysDeptService; + private SalePlanMapper salePlanMapper; + private SalePlanGoodsMapper salePlanGoodsMapper; + + private OmsSaleOrderItemService omsSaleOrderItemService; + private OmsShoppingCartService omsShoppingCartService; + private SeeYonRequestBaseService seeYonRequestBaseService; + private GoodsRuleService goodsRuleService; + private GoodsAccreditService goodsAccreditService; + private GoodsImminentBatchService goodsImminentBatchService; + private RedisService redisService; + + @Override + public BigDecimal getExpiredOrderRateById(String oaId) { + return baseMapper.getExpiredOrderRates(oaId); + } + + @Override + public List> selectExpiredOrderRates() { + return baseMapper.selectExpiredOrderRates(); + } + + @Override + public OmsConfirmOrderResult confirmOrder(OmsOrderBo confirmOrder) { + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + //购物车 + List shoppingCarts; + if (CollectionUtil.isNotEmpty(confirmOrder.getShoppingCartIds())) { + shoppingCarts = omsShoppingCartService.listByIds(confirmOrder.getShoppingCartIds(), supplier.getId()); + } else { + //立即购买,生成临时购物车 + GoodsSku goodsSku = goodsSkuService.getById(confirmOrder.getSkuId()); + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + OmsShoppingCart shoppingCart = new OmsShoppingCart(); + shoppingCart.setId(0L); + shoppingCart.setSpuId(goodsSku.getSpuId()); + shoppingCart.setSkuId(confirmOrder.getSkuId()); + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + shoppingCart.setSpuName(goodsSpu.getName()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setQuantity(confirmOrder.getQuantity()); + shoppingCart.setSpecInfo(goodsSku.getSpecInfos()); + shoppingCart.setPicUrl(goodsSku.getPicUrl()); + shoppingCarts = Arrays.asList(shoppingCart); + } + ShoppingCartsCheckResult cartsCheckResult = omsShoppingCartService.checkShoppingCarts(supplier, shoppingCarts, true); + OmsCalcAmount calcAmount = new OmsCalcAmount(); + BigDecimal totalAmount = BigDecimal.ZERO; + for (OmsShoppingCart shoppingCart : shoppingCarts) { + GoodSkuVo goodSkuVo = shoppingCart.getGoodSkuVo(); + //客户特殊价 + BigDecimal salePrice = goodSkuVo.getSalesPrice(); + shoppingCart.setSupplierSalesPrice(salePrice); + + BigDecimal itemPrice = new BigDecimal(shoppingCart.getQuantity()).multiply(salePrice); + shoppingCart.setItemSaleAmount(itemPrice); + totalAmount.add(itemPrice); + } + calcAmount.setTotalAmount(totalAmount); + // 计算供应商折扣 + // 计算是否有活动优惠 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + OmsConfirmOrderResult confirmOrderResult = new OmsConfirmOrderResult(); + confirmOrderResult.setSupplier(supplier); + confirmOrderResult.setOrderType(confirmOrder.getOrderType()); + confirmOrderResult.setOrderSource(confirmOrder.getOrderSource()); + confirmOrderResult.setShoppingCarts(shoppingCarts); + confirmOrderResult.setDefaultAddress(supplierAddress); + confirmOrderResult.setAmountInfo(calcAmount); + confirmOrderResult.setCartsCheckResult(cartsCheckResult); + return confirmOrderResult; + } + + @Override + public OmsConfirmOrderResult confirmOrderPc(OmsOrderSkuBo confirmOrder) { + BmsSupplier supplier = AuthContextUtils.getCurrentSupplier(); + //构建Sku + List spuIds = confirmOrder.getSpuParamList().stream() + .map(OmsOrderSkuBo.SpuParam::getSpuId).collect(Collectors.toList()); + //构建Sku + List skuIds = confirmOrder.getSpuParamList().stream() + .map(OmsOrderSkuBo.SpuParam::getSkuId).collect(Collectors.toList()); + //防止空指针 + spuIds.add(0L); + skuIds.add(0L); + List spuList = goodsSpuService.listByIds(spuIds); + List skuList = goodsSkuService.listByIds(skuIds); + + //通过当前函数获取当前账套对于的skuID,默认全部转化为开平(001)的sku +// Map goodsSpuMap = new HashMap<>(spuList.size()); +// for (GoodsSpu goodsSpu : spuList) { +// goodsSpuMap.put(goodsSpu.getId(),goodsSpu); +// } +// List spuCodeList = spuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); +// List spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodeList); +// Map spuGetSkuMap = new HashMap<>(spuToSkuKeys.size()); +// for (OmsSpuToSkuKey toSkuKey : spuToSkuKeys) { +// spuGetSkuMap.put(toSkuKey.getSkuCode(),toSkuKey.getInvCode()); +// } + + //构建临时购物车列表 + List shoppingCartList = new ArrayList<>(); + + for (GoodsSku goodsSku : skuList) { + GoodsSpu goodsSpu = null; + for (GoodsSpu spu : spuList) { + if (goodsSku.getSpuId().equals(spu.getId())) { + goodsSpu = spu; + } + } + if (goodsSku == null) { + Assert.throwEx("商品档案有更新,请刷新页面再试"); + } + OmsShoppingCart shoppingCart = new OmsShoppingCart(); + shoppingCart.setSpuId(goodsSpu.getId()); + shoppingCart.setSpuCode(goodsSpu.getSpuCode()); + int qty = 1; + for (OmsOrderSkuBo.SpuParam spuParam : confirmOrder.getSpuParamList()) { + if (spuParam.getSkuId() != null && goodsSku.getId().equals(spuParam.getSkuId())) { + if (spuParam.getQty() != null) { + qty = spuParam.getQty(); + } + shoppingCart.setVolume(spuParam.getVolume()); + shoppingCart.setWeight(spuParam.getWeight()); + shoppingCart.setRemark(spuParam.getRemark()); + break; + } + } + shoppingCart.setQuantity(qty); + shoppingCart.setSkuId(goodsSku.getId()); + shoppingCart.setSkuCode(goodsSku.getSkuCode()); + shoppingCart.setSpecInfo(goodsSku.getSpecInfos()); + shoppingCart.setAddPrice(goodsSku.getSalesPrice()); + shoppingCartList.add(shoppingCart); + } + + //计算合计 + OmsCalcAmount calcAmount = new OmsCalcAmount(); + calcAmount.setTotalAmount(BigDecimal.ZERO); + + // 计算供应商折扣 + // 计算是否有活动优惠 + //收货地址 + BmsSupplierAddress supplierAddress = null; + if (confirmOrder.getAddressId() == null) { + //supplierAddress = bmsSupplierAddressService.getDefault(Long.parseLong(supplier.getId())); + } else if (confirmOrder.getAddressId().equals(0L)) { + supplierAddress = new BmsSupplierAddress(); + supplierAddress.setId(0L); + } else { + supplierAddress = bmsSupplierAddressService.getById(confirmOrder.getAddressId()); + } + OmsConfirmOrderResult confirmOrderResult = new OmsConfirmOrderResult(); + confirmOrderResult.setSupplier(supplier); + confirmOrderResult.setDefaultAddress(supplierAddress); + confirmOrderResult.setAmountInfo(calcAmount); + confirmOrderResult.setShoppingCarts(shoppingCartList); + confirmOrderResult.setOrderType(confirmOrder.getOrderType()); + confirmOrderResult.setBrandRuleId(confirmOrder.getBrandRuleId()); + return confirmOrderResult; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void modifyOrder(OmsOrderModifyParam param) { + OmsSaleOrder order = super.getById(param.getId()); + if (!order.getStatus().equals(0)) { + Assert.throwEx("非草稿状态无法修改"); + } + if (order.getOrderType().equals(3)) { + Assert.throwEx("临期品订单不支持该接口修改"); + } + order.setId(param.getId()); + order.setOrderType(param.getOrderType()); + order.setOrderSource(param.getOrderSource()); + order.setSupplierAddrId(param.getSupplierAddrId()); + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getBrandRuleId()); + order.setBrandRuleId(param.getBrandRuleId()); + if (categoryRule != null) { + order.setBrandRuleName(categoryRule.getLabel()); + } + BmsSupplier supplier = null; + if (param.getSupplierId() != null) { + supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + order.setSupplierId(param.getSupplierId()); + order.setSupplierName(supplier.getSupplierName()); + order.setSupplierCode(supplier.getSupplierCode()); + this.appendCusRegion(supplier, order); + } + order.setCdOrderRemark(param.getCdOrderRemark()); + //if(StringUtils.hasText(param.getUserId())){ +// SysUser sysUser = sysUserService.getById(AuthContextUtils.getSysUserId()); +// order.setUserId(param.getUserId()); +// order.setUserPhone(sysUser.getMobile()); +// order.setUserCode(sysUser.getCode()); + //} + order.setBillType(param.getBillType()); + order.setUrgentFlag(param.getUrgentFlag()); + order.setRemark(param.getRemark()); + + //通过当前函数获取当前账套对于的skuID,默认全部转化为开平(001)的sku + List spuIds = param.getOrderItems().stream().map(OmsOrderModifyParam.OmsOrderItemModifyBo::getSpuId).collect(Collectors.toList()); + spuIds.add(0L);//兼容空订单,防止空指针 + this.appendBrandCategory(order, spuIds); + List spuList = goodsSpuService.listByIds(spuIds); + Map goodsSpuMap = new HashMap<>(spuList.size()); + for (GoodsSpu goodsSpu : spuList) { + goodsSpuMap.put(goodsSpu.getId(), goodsSpu); + } + List spuCodeList = spuList.stream().map(GoodsSpu::getSpuCode).collect(Collectors.toList()); + /*List spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodeList); + Map spuGetSkuMap = new HashMap<>(spuToSkuKeys.size()); + for (OmsSpuToSkuKey toSkuKey : spuToSkuKeys) { + spuGetSkuMap.put(toSkuKey.getSkuCode(),toSkuKey.getInvCode()); + }*/ + + //构建新的item + List newOrderItemList = new ArrayList<>(); + List orderModifyItems = param.getOrderItems(); + for (OmsOrderModifyParam.OmsOrderItemModifyBo modifyItem : orderModifyItems) { + GoodsSku goodsSku = null; + GoodsSpu goodsSpu = null; + if (order.getLatitudeFrom().equals("sku")) { + //H5下单 + goodsSku = goodsSkuService.getById(modifyItem.getSkuId()); + goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + } else { + //PC下单 + goodsSpu = goodsSpuMap.get(modifyItem.getSpuId()); + //防止切换ID + if (modifyItem.getSkuId() != null) { + goodsSku = goodsSkuService.getById(modifyItem.getSkuId()); + } else { +// String skuCode = spuGetSkuMap.get(goodsSpu.getSpuCode()); +// goodsSku = goodsSkuService.getByCode(skuCode); + Assert.throwEx("订单无货或下架了"); + } + } + OmsSaleOrderItem orderItem = new OmsSaleOrderItem(); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setSpuId(goodsSpu.getId()); + orderItem.setSpuCode(goodsSpu.getSpuCode()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setWeight(modifyItem.getWeight()); + orderItem.setVolume(modifyItem.getVolume()); + orderItem.setRemark(modifyItem.getRemark()); + if (goodsSku != null) { + orderItem.setSkuId(goodsSku.getId()); + orderItem.setSkuTitle(goodsSku.getSkuName()); + orderItem.setSkuCode(goodsSku.getSkuCode()); + orderItem.setSpecValues(goodsSku.getSpecInfos()); + orderItem.setSkuUnit(goodsSku.getUnitName()); + orderItem.setSkuImg(goodsSku.getPicUrl()); + orderItem.setSalesPrice(goodsSku.getSalesPrice()); + orderItem.setCusPrice(goodsSku.getSalesPrice()); + orderItem.setMarketPrice(goodsSku.getMarketPrice()); + } else { + orderItem.setSkuId(0L); + orderItem.setSkuCode(""); + orderItem.setSkuUnit(""); + orderItem.setSkuImg(null); + orderItem.setSpecValues(goodsSpu.getName()); + orderItem.setSalesPrice(BigDecimal.ZERO); + orderItem.setCusPrice(BigDecimal.ZERO); + orderItem.setMarketPrice(BigDecimal.ZERO); + } + orderItem.setQuantity(modifyItem.getQuantity()); + newOrderItemList.add(orderItem); + } + + List skuCodes = newOrderItemList.stream().map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + + //防止空指针 + skuCodes.add("NULL"); + + //商品特殊价 + this.buildSkuSpecPrice(supplier, newOrderItemList, skuCodes); + + //拦截商品授权维度规则 + this.checkGoodsRule(supplier, newOrderItemList); + + //拦截客户维度规则 + goodsRuleService.checkSkuCode(skuCodes, supplier.getId(), true); + + //用户维度拦截 + goodsRuleService.checkSkuCodeByUserId(skuCodes,AuthContextUtils.getSysUserId(),true); + + //拦截品类下单规则 + this.handleCategoryRule(categoryRule, newOrderItemList); + + this.updateById(order); + //移除已有的ITEM + LambdaQueryWrapper rmItemLqw = new LambdaQueryWrapper<>(); + rmItemLqw.eq(OmsSaleOrderItem::getOrderId, param.getId()); + omsSaleOrderItemService.remove(rmItemLqw); + //重新保存item + omsSaleOrderItemService.saveBatch(newOrderItemList); + //立即下单 + if (param.getInstantFlag() != null && param.getInstantFlag().equals(1)) { + this.buildPriceOrder(order.getId() + "", null); + } + } + + private void checkGoodsRule(BmsSupplier supplier, List newOrderItemList) { + GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds()); + if (accrIdsDto != null) { + List skuIds = goodsSkuMapper.listByOtherIds( + accrIdsDto.getCateIds(), + accrIdsDto.getSpuIds(), + accrIdsDto.getSkuIds(), + accrIdsDto.getNotInCateIds(), + accrIdsDto.getNotInSpuIds(), + accrIdsDto.getNotInSkuIds() + ); + for (OmsSaleOrderItem orderItem : newOrderItemList) { + for (Long skuId : skuIds) { + if (orderItem.getSkuId().equals(skuId)) { + Assert.throwEx("商品未授权:" + orderItem.getSkuCode()); + } + } + } + } + } + + /** + * 拦截规则 + * + * @param categoryRule + * @param orderItems + */ + @Override + public void handleCategoryRule(GoodsCategoryRule categoryRule, List orderItems) { + if (categoryRule != null && orderItems.size() > 0) { + List cids = Arrays.asList(categoryRule.getBrandIds()); + List igcids = null; + if (categoryRule.getIgnoreBrandIds() != null) { + igcids = Arrays.asList(categoryRule.getIgnoreBrandIds()); + } + Set spuIds = orderItems.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toSet()); + List skuIds = orderItems.stream().map(OmsSaleOrderItem::getSkuId).collect(Collectors.toList()); + List skuList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + if (!sku.getOrderFlag().equals(1) && sku.getSpecialFlag().equals(0)) { + Assert.throwEx("单品[" + sku.getSkuCode() + "]不予下单且非特殊品"); + } + } + skuIds.addAll(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList())); + } + + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + if (!goodsSpu.getShelf().equals(1)) { + Assert.throwEx("SKU已下架[" + goodsSpu.getSpuCode() + "]不予下单"); + } + if (!goodsSpu.getOrderFlag().equals(1)) { + boolean msp = skuList.stream().anyMatch(m -> m.getSpuId().equals(goodsSpu.getId()) && m.getSpecialFlag().equals(1)); + if (!msp) { + Assert.throwEx("SKU[" + goodsSpu.getSpuCode() + "]不予下单"); + } + } + matchIgnoreCate(igcids, goodsSpu.getCategoryFirst(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategorySecond(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategoryThird(), goodsSpu); + matchRuleCate(cids, goodsSpu); + } + } + } + + private void matchRuleCate(List cids, GoodsSpu goodsSpu) { + boolean isOk = false; + for (String cid : cids) { + if(cid.equals(goodsSpu.getCategoryFirst())|| + cid.equals(goodsSpu.getCategorySecond())|| + cid.equals(goodsSpu.getCategoryThird())){ + isOk = true; + break; + } + } + if(!isOk){ + Assert.throwEx("不符合下单规则:"+ goodsSpu.getSpuCode()); + } + } + + + @Override + public List handleCategoryRule(List skuIds,GoodsCategoryRule categoryRule) { + List errSkuIds = new ArrayList<>(); + if (categoryRule != null && skuIds.size() > 0) { + List cids = Arrays.asList(categoryRule.getBrandIds()); + List igcids = null; + if (categoryRule.getIgnoreBrandIds() != null) { + igcids = Arrays.asList(categoryRule.getIgnoreBrandIds()); + } + List skuList = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(skuIds)) { + skuList = goodsSkuService.listByIds(skuIds); + for (GoodsSku sku : skuList) { + if (!sku.getOrderFlag().equals(1) && sku.getSpecialFlag().equals(0)) { + errSkuIds.add(new SimpleKeyValue("单品不予下单且非特殊品",sku.getId())); + break; + } + } + skuIds.addAll(skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList())); + } + + Set spuIds = skuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toSet()); + List spuList = goodsSpuService.listByIds(spuIds); + for (GoodsSpu goodsSpu : spuList) { + if (!goodsSpu.getShelf().equals(1)) { + Long errSkuId = null; + for (GoodsSku sku : skuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + errSkuId = sku.getId(); + } + } + errSkuIds.add(new SimpleKeyValue("SKU不予下单且非特殊品",errSkuId)); + } + if (!goodsSpu.getOrderFlag().equals(1)) { + boolean msp = skuList.stream().anyMatch(m -> m.getSpuId().equals(goodsSpu.getId()) && m.getSpecialFlag().equals(1)); + if (!msp) { + Long errSkuId = null; + for (GoodsSku sku : skuList) { + if(sku.getSpuId().equals(goodsSpu.getId())){ + errSkuId = sku.getId(); + } + } + errSkuIds.add(new SimpleKeyValue("SKU不予下单",errSkuId)); + } + } + matchIgnoreCate(igcids, goodsSpu.getCategoryFirst(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategorySecond(), goodsSpu); + matchIgnoreCate(igcids, goodsSpu.getCategoryThird(), goodsSpu); + matchRuleCate(cids, goodsSpu); + + } + } + return errSkuIds; + } + + /** + * 拦截忽略的品牌 + * + * @param igcids + * @param spuCateId + * @param goodsSpu + */ + private void matchIgnoreCate(List igcids, String spuCateId, GoodsSpu goodsSpu) { + if (igcids == null || spuCateId == null || spuCateId.equals("") || spuCateId.equals("0")) { + return; + } + for (String igcid : igcids) { + if (spuCateId.equals(igcid)) { + Assert.throwEx("[" + goodsSpu.getSkuCode() + "]" + goodsSpu.getName() + ",不符合订单规则"); + } + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsSaleOrder createOrder(OmsOrderBo omsOrderBo) { + OmsConfirmOrderResult confirmOrder = this.confirmOrder(omsOrderBo); + confirmOrder.setLatitudeFrom("SKU"); + CreateOrderParam createOrderParam = omsOrderBo.getCreateOrderParam(); + return this.buildOmsOrder(confirmOrder, createOrderParam); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsSaleOrder createOrderPc(OmsOrderSkuBo omsOrderBo) { + OmsConfirmOrderResult confirmOrder = this.confirmOrderPc(omsOrderBo); + confirmOrder.setLatitudeFrom("SPU"); + confirmOrder.setOrderSource(omsOrderBo.getOrderSource()); + CreateOrderParam createOrderParam = omsOrderBo.getCreateOrderParam(); + createOrderParam.setCdOrderRemark(omsOrderBo.getCdOrderRemark()); + OmsSaleOrder order = this.buildOmsOrder(confirmOrder, createOrderParam); + if (omsOrderBo.getInstantFlag() != null && omsOrderBo.getInstantFlag().equals(1)) { + this.buildPriceOrder(order.getId() + "", null); + } + return order; + } + + @NotNull + private OmsSaleOrder buildOmsOrder(OmsConfirmOrderResult confirmOrder, CreateOrderParam createOrderParam) { + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + BmsSupplier supplier = confirmOrder.getSupplier(); + BmsSupplierAddress address = confirmOrder.getDefaultAddress(); +// if(address==null){ +// Assert.throwEx("请补充收货地址"); +// } + List shoppingCarts = confirmOrder.getShoppingCarts(); + OmsSaleOrder order = new OmsSaleOrder(); + order.setLatitudeFrom(confirmOrder.getLatitudeFrom().toLowerCase(Locale.ROOT)); + String orderPrefix = null; + if (order.getOrderType() == null || order.getOrderType().equals(0)) { + orderPrefix = "SN"; + } else if (order.getOrderType().equals(1)) { + orderPrefix = "ZP"; + } else if (order.getOrderType().equals(2)) { + orderPrefix = "SC"; + } + order.setOrderSn(orderPrefix + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(confirmOrder.getBrandRuleId()); + if (categoryRule != null) { + order.setBrandRuleName(categoryRule.getLabel()); + } + + order.setOrderSource(confirmOrder.getOrderSource()); + order.setCdOrderRemark(createOrderParam.getCdOrderRemark()); + order.setOrderType(confirmOrder.getOrderType()); + order.setSupplierId(Long.parseLong(supplier.getId())); + order.setSupplierCode(supplier.getCode()); + order.setSupplierName(supplier.getName()); + order.setSupplierAddrId(address != null ? address.getId() : 0); + order.setBrandRuleId(confirmOrder.getBrandRuleId()); + order.setUserId(user.getId()); + order.setUserName(user.getName()); + order.setUserCode(user.getCode()); + order.setUserPhone(user.getMobile()); + + this.appendCusRegion(supplier, order); + + if (createOrderParam != null) { + order.setBillType(createOrderParam.getBillType()); + order.setUrgentFlag(createOrderParam.getUrgentFlag()); + order.setRemark(createOrderParam.getRemark()); + } + this.save(order); + + //兼容转换 +// List spuToSkuKeys = null; +// if(confirmOrder.getLatitudeFrom()!=null&&confirmOrder.getLatitudeFrom().equals("SPU")){ +// List spuCodes = shoppingCarts.stream().map(OmsShoppingCart::getSpuCode).collect(Collectors.toList()); +// spuToSkuKeys = goodsSpuService.getSpuToSkuInfo(GoodsConst.DEFAULT_PlaCE,spuCodes); +// for (OmsSpuToSkuKey skuKey : spuToSkuKeys) { +// for (OmsShoppingCart cart : shoppingCarts) { +// if(skuKey.getSkuCode().equals(cart.getSpuCode())){ +// cart.setSkuCode(skuKey.getInvCode()); +// } +// } +// } +// } + + + List orderItems = new ArrayList<>(); + for (OmsShoppingCart shoppingCart : shoppingCarts) { + OmsSaleOrderItem orderItem = new OmsSaleOrderItem(); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setWeight(shoppingCart.getWeight()); + orderItem.setVolume(shoppingCart.getVolume()); + orderItem.setRemark(shoppingCart.getRemark()); + if (confirmOrder.getLatitudeFrom() != null && confirmOrder.getLatitudeFrom().equals("SPU")) { + // spu维度 + GoodsSku goodsSku = goodsSkuService.getById(shoppingCart.getSkuId()); + orderItem.setSpuId(shoppingCart.getSpuId()); + orderItem.setSpuTitle(shoppingCart.getSpuName()); + orderItem.setSkuId(shoppingCart.getSkuId()); + orderItem.setSkuCode(shoppingCart.getSkuCode()); + orderItem.setSkuUnit(null); + orderItem.setSkuImg(shoppingCart.getPicUrl()); + orderItem.setSpecValues(shoppingCart.getSpecInfo()); + orderItem.setSpuCode(shoppingCart.getSpuCode()); + if (goodsSku != null) { + GoodsSpu goodsSpu = goodsSpuService.getById(goodsSku.getSpuId()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setSkuTitle(goodsSpu.getSkuName()); + + log.warn("shoppingCart json =>" + JsonUtil.objectToJson(shoppingCart)); + orderItem.setSkuTitle(goodsSku.getSkuName()); + orderItem.setMarketPrice(goodsSku.getMarketPrice()); + orderItem.setSalesPrice(goodsSku.getSalesPrice()); + orderItem.setCusPrice(goodsSku.getSalesPrice()); + } + } else { + // 默认sku + GoodSkuVo goodSkuVo = shoppingCart.getGoodSkuVo(); + GoodsSpu goodsSpu = goodsSpuService.getByCode(goodSkuVo.getSpuCode()); + orderItem.setSpuId(goodSkuVo.getSpuId()); + orderItem.setSpuCode(goodSkuVo.getSpuCode()); + orderItem.setSpuTitle(goodsSpu.getName()); + orderItem.setSkuTitle(goodsSpu.getSkuName()); + orderItem.setSkuId(goodSkuVo.getId()); + orderItem.setSkuCode(goodSkuVo.getSkuCode()); + orderItem.setSkuUnit(goodSkuVo.getUnitName()); + orderItem.setSkuImg(goodSkuVo.getPicUrl()); + orderItem.setSpecValues(goodSkuVo.getSpecInfos()); + orderItem.setMarketPrice(goodSkuVo.getMarketPrice()); + orderItem.setSalesPrice(goodSkuVo.getSalesPrice()); + } + orderItem.setQuantity(shoppingCart.getQuantity()); + orderItem.setCusPrice(shoppingCart.getSupplierSalesPrice()); + orderItems.add(orderItem); + } + + //兼容客户特殊价 + List inventoryCusPrices = null; + try { + String supplierCode = supplier.getCode(); + List skuCodes = orderItems.stream().map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + if (skuCodes.size() > 0) { + List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplierCode, skuCodes); + inventoryCusPrices = customerPrices.stream().map(obj -> { + InventoryCusPrice cusPrice = new InventoryCusPrice(); + cusPrice.setCusCode(supplierCode); + cusPrice.setInvCode(obj.getSkuCode()); + cusPrice.setPrice(obj.getRealPrice()); + return cusPrice; + }).collect(Collectors.toList()); +// InventoryCusPriceQuery query = new InventoryCusPriceQuery(); +// query.setCusCode(supplierCode); +// query.setInvCodes(skuCodes); +// R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); +// if(res.getStatus().equals(200)){ +// inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); +// } + } + } catch (Exception e) { + log.error("客户特殊价异常:{}", e.getMessage()); + } + if (inventoryCusPrices != null) { + for (OmsSaleOrderItem orderItem : orderItems) { + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + if (orderItem.getSkuCode().equals(cusPrice.getInvCode())) { + orderItem.setMarketPrice(cusPrice.getPrice()); + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + } + } + } + } + + this.handleCategoryRule(categoryRule, orderItems); + + // 更新品牌相关参数 + List spuIds = orderItems.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toList()); + this.appendBrandCategory(order, spuIds); + this.updateById(order); + // 保存明细 + omsSaleOrderItemService.saveBatch(orderItems); + + + //清空勾选的购物车 + List cartIds = confirmOrder.getShoppingCarts().stream() + .filter(a -> a.getId() != null) + .map(OmsShoppingCart::getId).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(cartIds)) { + omsShoppingCartService.removeBatchByIds(cartIds); + } + return order; + } + + /** + * 根据商品SPU ID列表补充订单的品牌类别信息 + * 此方法旨在通过SPU ID获取对应的顶级分类ID,并进一步获取分类名称,最终将这些信息汇总到订单对象中 + * @param order 订单对象,用于存储品牌类别信息 + * @param spuIds 商品SPU ID列表,用于查询商品的顶级分类 + */ + private void appendBrandCategory(OmsSaleOrder order, List spuIds) { + if(CollUtil.isNotEmpty(spuIds)){ + List cateIds = goodsSpuService.list(new LambdaQueryWrapper() + .in(GoodsSpu::getId, spuIds) + .select(GoodsSpu::getCategoryFirst)) + .stream() + .map(GoodsSpu::getCategoryFirst) + .collect(Collectors.toList()); + if(CollUtil.isNotEmpty(cateIds)){ + String cateNames = goodsCategoryMapper.selectBatchIds(cateIds) + .stream().map(GoodsCategory::getName).collect(Collectors.joining(",")); + order.setAllBands(cateNames); + } + } + } + + /** + * 将供应商的自定义区域信息附加到订单中 + * 此方法用于从供应商信息中提取客户相关的区域数据,并将其填充到订单对象中 + * 这有助于在订单处理过程中考虑供应商的特定区域需求或特性 + * @param supplier 供应商对象,包含供应商的详细信息 + * @param order 订单对象,将要附加区域信息的目标 + */ + private void appendCusRegion(BmsSupplier supplier, OmsSaleOrder order) { + + try { + // 获取供应商的扩展区域信息 + BmsSupplierExtRegionVo regionVo = bmsSupplierMapper.getBmsSupplierExtRegionVo(supplier.getId()); + + if (regionVo == null) { + log.warn("Supplier ID {} does not have any extended region information", supplier.getId()); + return; + } + + // 设置销售区域信息 + order.setCusSaleRegion(regionVo.getSalRegionName()); + order.setCusSaleRegion2(regionVo.getSalRegionName2()); + order.setCusSaleRegion3(regionVo.getSalRegionName3()); + order.setCusSaleRegionAll(appendRegions(regionVo.getSalRegionName(), regionVo.getSalRegionName2(), regionVo.getSalRegionName3())); + order.setCusSaleRegionCodes(appendCodes(regionVo.getSalRegionCode(), regionVo.getSalRegionCode2(), regionVo.getSalRegionCode3())); + + // 设置业务区域信息 + order.setCusBigRegion(regionVo.getBigRegion()); + order.setCusProvince(regionVo.getBizRegionName()); + order.setCusCity(regionVo.getBizRegionName2()); + order.setCusArea(regionVo.getBizRegionName3()); + order.setCusBizRegionAll(appendRegions(regionVo.getBizRegionName(), regionVo.getBizRegionName2(), regionVo.getBizRegionName3())); + order.setCusBizRegionCodes(appendCodes(regionVo.getBizRegionCode(), regionVo.getBizRegionCode2(), regionVo.getBizRegionCode3())); + + } catch (Exception e) { + log.error("Error appending customer region information for supplier ID {}: {}", supplier.getId(), e.getMessage(), e); + } + } + + /** + * 辅助方法:拼接三个区域名称 + * @param region1 第一个区域名称 + * @param region2 第二个区域名称 + * @param region3 第三个区域名称 + * @return 拼接后的区域名称字符串 + */ + private String appendRegions(String region1, String region2, String region3) { + StringBuilder sb = new StringBuilder(); + if (region1 != null) sb.append(region1); + if (region2 != null) sb.append(",").append(region2); + if (region3 != null) sb.append(",").append(region3); + return sb.toString(); + } + + /** + * 辅助方法:拼接三个区域代码 + * @param code1 第一个区域代码 + * @param code2 第二个区域代码 + * @param code3 第三个区域代码 + * @return 拼接后的区域代码字符串 + */ + private String appendCodes(String code1, String code2, String code3) { + StringBuilder sb = new StringBuilder(); + if (code1 != null) sb.append(code1); + if (code2 != null) sb.append(",").append(code2); + if (code3 != null) sb.append(",").append(code3); + return sb.toString(); + } + + + @Override + public List getSpuAssess(OmsSpuAssesInfoBo param) { + List spuIds = param.getSpuIds(); + Integer year = param.getYearNum(); + Integer month = param.getMonthNum(); + String supplierId = param.getSupplierId(); + LambdaQueryWrapper spLqw = new LambdaQueryWrapper<>(); + spLqw.eq(SalePlan::getYearNum, year); + spLqw.eq(SalePlan::getMonthNum, month); + spLqw.eq(SalePlan::getSupplierId, supplierId); + //spLqw.eq(SalePlan::getPlanState,1); + List salePlanList = salePlanMapper.selectList(spLqw); + Map spuIdAndSum = new HashMap<>(); + if (salePlanList.size() > 0) { + List spIds = salePlanList.stream().map(SalePlan::getId).collect(Collectors.toList()); + LambdaQueryWrapper spgLqw = new LambdaQueryWrapper<>(); + spgLqw.in(SalePlanGoods::getPlanId, spIds); + spgLqw.in(SalePlanGoods::getTargetId, spuIds); + List salePlanGoodsList = salePlanGoodsMapper.selectList(spgLqw); + for (SalePlanGoods planGoods : salePlanGoodsList) { + spuIdAndSum.merge(planGoods.getTargetId(), planGoods.getQty(), Integer::sum); + } + } + List spuAssesInfoList = new ArrayList<>(); + for (Long spuId : spuIds) { + OmsSpuAssesInfo assesInfo = new OmsSpuAssesInfo(); + assesInfo.setSpuId(spuId); + Integer sum = spuIdAndSum.get(spuId); + assesInfo.setNum(sum == null ? 0 : sum); + spuAssesInfoList.add(assesInfo); + } + return spuAssesInfoList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public OmsSaleOrder modifyImminentOrder(OmsOrderImminentBo param) { + + SysUser user = sysUserService.getById(AuthContextUtils.getSysUserId()); + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(param.getBrandRuleId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(param.getSupplierId()); + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(param.getAddressId()); + + OmsSaleOrder order; + if (param.getId() != null) { + order = this.getById(param.getId()); + if (!order.getOrderType().equals(3)) { + Assert.throwEx("订单类型不支持混用"); + } + if(!order.getOrderCheckState().equals(OmsOrderCheckState.UnPublish.getCode()) + &&!order.getOrderCheckState().equals(OmsOrderCheckState.Rollback.getCode())){ + Assert.throwEx("OA审批状态拦截"); + } + } else { + order = new OmsSaleOrder(); + order.setOrderSn("SP" + CodeGenUtil.generate(CodeGenUtil.SourceKey.OmsOrder)); + } + order.setLatitudeFrom("sp"); + order.setCdOrderRemark(param.getCdOrderRemark()); + order.setOaRateId(param.getOaRateId()); + BigDecimal discountRate = baseMapper.getExpiredOrderRates(param.getOaRateId()); + order.setDiscountRate(discountRate); + order.setOrderType(3); + order.setSupplierId(Long.parseLong(supplier.getId())); + order.setSupplierCode(supplier.getCode()); + order.setSupplierName(supplier.getName()); + order.setSupplierAddrId(supplierAddress != null ? supplierAddress.getId() : 0); + order.setBrandRuleId(param.getBrandRuleId()); + order.setUserId(user.getId()); + order.setUserName(user.getName()); + order.setUserCode(user.getCode()); + order.setUserPhone(user.getMobile()); + order.setBillType(param.getBillType()); + order.setUrgentFlag(param.getUrgentFlag()); + order.setRemark(param.getRemark()); + this.saveOrUpdate(order); + + List orderItems = new ArrayList<>(); + + if (CollectionUtil.isNotEmpty(param.getItemList())) { + Set batchSkuIds = param.getItemList().stream().map(OmsOrderImminentBo.ItemParam::getBatchSkuId) + .collect(Collectors.toSet()); + if (order.getStatus() != null && !order.getStatus().equals(0) && CollectionUtil.isEmpty(param.getItemList())) { + Assert.throwEx("请选择商品"); + } + List imminentBatches = goodsImminentBatchService + .list( + new LambdaQueryWrapper() + .in(GoodsImminentBatch::getId, batchSkuIds) + .ge(GoodsImminentBatch::getEndDate, LocalDate.now()) + ); + if (CollectionUtil.isEmpty(imminentBatches)) { + Assert.throwEx("参数过期或无效,请重新选择商品"); + } + + Set skuIds = imminentBatches.stream() + .map(GoodsImminentBatch::getSkuId).collect(Collectors.toSet()); + if (skuIds.size() != imminentBatches.size()) { + Assert.throwEx("不同批次相同产品,请分开下单"); + } + + List goodsSkuList = goodsSkuService.listByIds(skuIds); + + List spuIds = goodsSkuList.stream().map(GoodsSku::getSpuId).collect(Collectors.toList()); + spuIds.add(0L); + List spuList = goodsSpuService.listByIds(spuIds); + + for (OmsOrderImminentBo.ItemParam item : param.getItemList()) { + for (GoodsImminentBatch batch : imminentBatches) { + if (item.getBatchSkuId().equals(batch.getId())) { + for (GoodsSku sku : goodsSkuList) { + if (sku.getId().toString().equals(batch.getSkuId())) { + //创建OrderItem + OmsSaleOrderItem orderItem = createImminentOrderItem(order, spuList, item, batch, sku); + orderItems.add(orderItem); + } + } + } + } + } + + List skuCodes = orderItems.stream() + .map(OmsSaleOrderItem::getSkuCode).collect(Collectors.toList()); + + //商品特殊价 + buildSkuSpecPrice(supplier, orderItems, skuCodes); + + //拦截商品授权维度规则 + this.checkGoodsRule(supplier, orderItems); + + //拦截客户维度规则 + goodsRuleService.checkSkuCode(skuCodes, order.getSupplierId().toString(), true); + + //拦截品类下单规则 + this.handleCategoryRule(categoryRule, orderItems); + + } + + this.updateById(order); + //移除已有的ITEM + LambdaQueryWrapper rmItemLqw = new LambdaQueryWrapper<>(); + rmItemLqw.eq(OmsSaleOrderItem::getOrderId, param.getId()); + omsSaleOrderItemService.remove(rmItemLqw); + //重新保存item + if (orderItems.size() > 0) { + omsSaleOrderItemService.saveBatch(orderItems); + } + //立即下单 + if (param.getInstantFlag() != null && param.getInstantFlag().equals(1)) { + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(param.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + OmsOrderOptionsService optionsService = SpringUtils.getBean(OmsOrderOptionsService.class); + optionsService.submitExpiredOrder(order.getId()+""); + } + return order; + } + + + @NotNull + private OmsSaleOrderItem createImminentOrderItem(OmsSaleOrder order, List spuList, OmsOrderImminentBo.ItemParam item, GoodsImminentBatch batch, GoodsSku sku) { + OmsSaleOrderItem orderItem = new OmsSaleOrderItem(); + orderItem.setRemark(item.getRemark()); + orderItem.setQuantity(item.getQty()); + orderItem.setOrderId(order.getId()); + orderItem.setOrderSn(order.getOrderSn()); + orderItem.setSpuId(sku.getSpuId()); + for (GoodsSpu spu : spuList) { + if (sku.getSpuId().equals(spu.getId())) { + orderItem.setSpuCode(spu.getSpuCode()); + orderItem.setSpuTitle(spu.getName()); + break; + } + } + orderItem.setWeight(sku.getWeight()); + orderItem.setVolume(sku.getVolume()); + orderItem.setSkuBatchId(batch.getId()); + orderItem.setSkuBatchCode(batch.getBatchCode()); + orderItem.setSkuId(sku.getId()); + orderItem.setSkuTitle(sku.getSkuName()); + orderItem.setSkuCode(sku.getSkuCode()); + orderItem.setSpecValues(sku.getSpecInfos()); + orderItem.setSkuUnit(sku.getUnitName()); + orderItem.setSkuImg(sku.getPicUrl()); + orderItem.setSalesPrice(sku.getSalesPrice()); + orderItem.setCusPrice(sku.getSalesPrice()); + orderItem.setMarketPrice(sku.getMarketPrice()); + return orderItem; + } + + private void buildSkuSpecPrice(BmsSupplier supplier, List orderItems, List skuCodes) { + List customerPrices = goodsCustomerPriceService.getBySupplierCodeAndCode(supplier.getCode(), skuCodes); + for (OmsSaleOrderItem orderItem : orderItems) { + for (GoodsCustomerPrice customerPrice : customerPrices) { + if (orderItem.getSkuCode().equals(customerPrice.getSkuCode())) { + orderItem.setSalesPrice(customerPrice.getRealPrice()); + break; + } + } + } + } + + @Override + public void buildPriceOrder(String id, String amount) { + redisService.throwResLock(OmsOrder.class.getSimpleName(), id); + OmsSaleOrder omsOrder = super.getById(id); + String userId = AuthContextUtils.getSysUserId(); + SysUser sysUser = sysUserService.getById(userId); + if (omsOrder == null) { + Assert.throwEx("订单不存在或被移除"); + } + if (!omsOrder.getUserId().equals(userId)) { + Assert.throwEx("非制单人无法下单"); + } + // 非临期品不走当前流程 +// if(omsOrder.getOrderType().equals(3)){ +// Assert.throwEx("临期品需要审批方式下单"); +// } + this.checkMsOrderStatus(omsOrder); + if (!omsOrder.getStatus().equals(0) && !omsOrder.getStatus().equals(6)) { + Assert.throwEx("订单状态不支持下单"); + } + LambdaQueryWrapper iteLqw = new LambdaQueryWrapper<>(); + iteLqw.eq(OmsSaleOrderItem::getOrderId, id); + List orderItemList = omsSaleOrderItemService.list(iteLqw); + + // 加成订单项合法性 + OmsOrderUtil.checkSaleOrderItemValues(orderItemList); + + //下单前规则拦截 + GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId()); + this.handleCategoryRule(categoryRule, orderItemList); + String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(",")); + + //客户校验 + BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId()); + BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId()); + if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) { + Assert.throwEx("请补充CD单号"); + } + String lastRegionId = supplier.getRegionLast(); + BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId); + if (bmsRegion == null) { + Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员"); + } + //更新最新的用户特殊价格 + this.updateCusPrice(omsOrder.getSupplierCode(), orderItemList); + + //补充:调度系统写报价单给ERP时,要把地址ID写过去 + if (supplierAddress.getTmsSysId() == null) { + Assert.throwEx("地址缺失TmsSysId关联"); + } + + //保存到ERP中间表 + this.saveToErpOrder(omsOrder, orderItemList, brands, supplierAddress, bmsRegion); + + } + + @Override + public void saveToErpOrder(OmsSaleOrder omsOrder, + List orderItemList, + String brands, + BmsSupplierAddress supplierAddress, + BmsRegion bmsRegion) { + SysUser sysUser = sysUserService.getById(omsOrder.getCreateBy()); + //保存到临时表-主表 + LocalDateTime nowTime = LocalDateTime.now(); + OmsXltOrder xltOrder = new OmsXltOrder(); + xltOrder.setId(IdUtil.getSnowFlakeId() + ""); + xltOrder.setOrderType(omsOrder.getOrderType()); + xltOrder.setDingDanHao(omsOrder.getOrderSn()); + xltOrder.setShenQingRiQi(nowTime); + xltOrder.setKeHuBianHao(omsOrder.getSupplierCode()); + xltOrder.setShouHuoDiZhi(supplierAddress.getDetail()); + xltOrder.setRenYuanBianHao(omsOrder.getUserCode()); + xltOrder.setCdOrderRemark(omsOrder.getCdOrderRemark()); + xltOrder.setDiscountRate(omsOrder.getDiscountRate()); + String remark = sysUser.getName() + "(" + sysUser.getMobile() + ")" + omsOrder.getRemark() + supplierAddress.getDetail(); + if (remark.length() > 120) { + remark = remark.substring(0, 120); + } + xltOrder.setZhuYiShiXian(remark); + xltOrder.setXieRuShiJian(nowTime); + xltOrder.setChuLiShiJian(null); + xltOrder.setRowCreateDate(nowTime); + xltOrder.setRenYuanXingMing(omsOrder.getUserName()); + xltOrder.setRenYuanDianHua(omsOrder.getUserPhone()); + xltOrder.setXianZhiWeiDu("品牌"); + xltOrder.setXianZhiWeiDuMingChen(brands); + xltOrder.setZhuangTai(0); + //状态:0未使用;1报价单;2销售订单 + xltOrder.setStatus(0); + + xltOrder.setTmsSysId(supplierAddress.getId() + ""); + xltOrder.setEmpName(omsOrder.getUserName()); + xltOrder.setCusCode(omsOrder.getSupplierCode()); + xltOrder.setCusName(omsOrder.getSupplierName()); + + try { + String[] regions = bmsRegion.getPathNames().split("_"); + if (regions.length > 1) { + xltOrder.setDealerProvince(regions[1]); + } + if (regions.length > 0) { + xltOrder.setDealerCity(regions[0]); + } + } catch (Exception e) { + log.warn("区域档案异常:{}",bmsRegion.getName()); + } + xltOrder.setDealerArea(bmsRegion.getPathNames()); + + //保存到临时表-明细表 + List xltOrderItemList = new ArrayList<>(); + for (int i = 0; i < orderItemList.size(); i++) { + OmsSaleOrderItem orderItem = orderItemList.get(i); + OmsXltOrderItem xltOrderItem = new OmsXltOrderItem(); + xltOrderItem.setId(xltOrder.getId() + "_" + (i + 1)); + xltOrderItem.setDingDanID(xltOrder.getId()); + xltOrderItem.setSpuCode(orderItem.getSpuCode()); + boolean eq = orderItem.getSkuCode().equals(orderItem.getSpuCode()); + if (!StringUtils.hasText(orderItem.getSkuCode()) || eq) { + GoodsSku sku = goodsSkuService.getById(orderItem.getSkuId()); + GoodsSpu spu = goodsSpuService.getById(orderItem.getSpuId()); + if (!sku.getSkuCode().equals(spu.getSpuCode())) { + Assert.throwEx("SKU【" + orderItem.getSpuCode() + "】存货缺失,请联系档案负责人"); + } + } + xltOrderItem.setChanPinBianHao(orderItem.getSkuCode()); + xltOrderItem.setChanPinDanWei(orderItem.getSkuUnit()); + xltOrderItem.setDingHuoShuLiang(orderItem.getQuantity()); + xltOrderItem.setDaZengShuLiang(BigDecimal.ZERO); + xltOrderItem.setChanPinYuanJia(orderItem.getMarketPrice()); + xltOrderItem.setChanPinXianJia(orderItem.getSalesPrice()); + xltOrderItem.setXieRuShiJian(nowTime); + xltOrderItem.setChuLiShiJian(null); + xltOrderItem.setRowCreateDate(nowTime); + if (omsOrder.getOrderType().equals(3)) { + String itemRm = orderItem.getRemark() == null ? "" : orderItem.getRemark(); + xltOrderItem.setBeiZhu("批号[" + orderItem.getSkuBatchCode() + "]" + itemRm); + } else { + xltOrderItem.setBeiZhu(orderItem.getRemark()); + } + xltOrderItem.setZhuangTai(0); + xltOrderItemList.add(xltOrderItem); + } + XltOrderDTO xltOrderDTO = new XltOrderDTO(xltOrder, xltOrderItemList); + //请求到中间服务保存 + seeYonRequestBaseService.postBase(ERP_ORDER_CREATE, xltOrderDTO, "创建订单:" + xltOrder.getDingDanHao()); + //更新订单 + omsOrder.setStatus(1); + omsOrder.setCheckTime(LocalDateTime.now()); + omsOrder.setCheckUserId(omsOrder.getCreateBy()); + if(!omsOrder.getOrderType().equals(3)){ + omsOrder.setCheckUserId(AuthContextUtils.getSysUserId()); + } + this.updateById(omsOrder); + } + + @Override + public void updateCusPrice(String cusCode, List orderItemList) { + List codes = orderItemList.stream().map(OmsSaleOrderItem::getSkuCode).distinct().collect(Collectors.toList()); + InventoryCusPriceQuery query = new InventoryCusPriceQuery(); + query.setCusCode(cusCode); + query.setInvCodes(codes); + R res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价"); + if(res.getStatus().equals(200)) { + List inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class); + if(CollectionUtil.isNotEmpty(inventoryCusPrices)){ + assert inventoryCusPrices != null; + for (InventoryCusPrice cusPrice : inventoryCusPrices) { + for (OmsSaleOrderItem orderItem : orderItemList) { + if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){ + orderItem.setCusPrice(cusPrice.getPrice()); + orderItem.setSalesPrice(cusPrice.getPrice()); + omsSaleOrderItemService.updateById(orderItem); + } + } + } + } + } + } + + @Override + public boolean checkMsOrderStatus(OmsSaleOrder omsOrder) { + if (omsOrder.getStatus().equals(1)) { + //检索是否能取消 + String status = seeYonRequestBaseService.postBase(ERP_ORDER_STATUS + "/" + omsOrder.getOrderSn() + , null + , "获取订单状态" + ).getData(); + if (!status.equals("0")) { + omsOrder.setStatus(2); + super.updateById(omsOrder); + return true; + } + } + return false; + } + + @Override + public boolean cancelOrder(String orderSn) { + OmsSaleOrder order = this.getOne(new LambdaQueryWrapper().eq(OmsSaleOrder::getOrderSn, orderSn)); + if (order == null) { + Assert.throwEx("订单编码异常"); + } + + List updItemBatch = new ArrayList<>(); + if (order.getOrderType().equals(3)) { + List itemList = omsSaleOrderItemService.list(new LambdaQueryWrapper() + .eq(OmsSaleOrderItem::getOrderId, order.getId())); + for (OmsSaleOrderItem orderItem : itemList) { + GoodsImminentBatch batch = goodsImminentBatchService.getById(orderItem.getSkuBatchId()); + GoodsImminentBatch newBatch = new GoodsImminentBatch(); + newBatch.setId(batch.getId()); + newBatch.setOrderQuantity(batch.getOrderQuantity() - orderItem.getQuantity()); + updItemBatch.add(newBatch); + } + } + + R r = seeYonRequestBaseService.postBase(ERP_ORDER_CANCEL + "/" + orderSn + , null + , "取消订单状态" + ); + if (r.getStatus() == 200) { + if (CollectionUtil.isNotEmpty(updItemBatch)) { + goodsImminentBatchService.updateBatchById(updItemBatch); + } + } + return r.getStatus() == 200; + } + +} + 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 1c1371c3..bf04c1cd 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 @@ -2,6 +2,7 @@ package com.qs.serve.modules.oms.utils; import com.qs.serve.common.util.Assert; import com.qs.serve.modules.oms.entity.OmsOrderItem; +import com.qs.serve.modules.oms.entity.OmsSaleOrderItem; import lombok.experimental.UtilityClass; import java.util.List; @@ -30,4 +31,21 @@ public class OmsOrderUtil { } } + + public static void checkSaleOrderItemValues(List orderItemList) { + if (orderItemList.size() < 1) { + Assert.throwEx("空项目不支持下单"); + } + //拦截相同的skuItem + long countDistinct = orderItemList.stream().map(OmsSaleOrderItem::getSkuId).distinct().count(); + if (orderItemList.size() != countDistinct) { + Assert.throwEx("有重复存货,请检查订单项"); + } + for (OmsSaleOrderItem orderItem : orderItemList) { + if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) { + Assert.throwEx("确认订单商品项数量不能为零"); + } + } + } + } diff --git a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java index e2623a92..b0560ea3 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java +++ b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java @@ -128,6 +128,7 @@ public interface TbsSeeYonConst { String ERP_ORDER_CREATE = "/erp/order/create"; String ERP_ORDER_STATUS = "/erp/order/getStatus"; String ERP_ORDER_CANCEL = "/erp/order/cancelOrder"; + String ERP_ORDER_SOURCE = "/erp/order/getOrderRelateInfo"; String XLT_SAVE_CHECK = "/xlt/saveCheck"; String XLT_SAVE_PAYMENT = "/xlt/savePayment";