Browse Source

feat(goods): 复制多一份订单模块代码

muti_db
Yen 7 months ago
parent
commit
23410b8cdd
  1. 17
      src/main/java/com/qs/serve/modules/oms/controller/OmsOrderController.java
  2. 262
      src/main/java/com/qs/serve/modules/oms/controller/OmsSaleOrderController.java
  3. 249
      src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrder.java
  4. 153
      src/main/java/com/qs/serve/modules/oms/entity/OmsSaleOrderItem.java
  5. 24
      src/main/java/com/qs/serve/modules/oms/entity/bo/OrderRelateQuery.java
  6. 14
      src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderItemMapper.java
  7. 28
      src/main/java/com/qs/serve/modules/oms/mapper/OmsSaleOrderMapper.java
  8. 18
      src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderItemService.java
  9. 28
      src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderOptionsService.java
  10. 37
      src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderPart1Service.java
  11. 132
      src/main/java/com/qs/serve/modules/oms/service/OmsSaleOrderService.java
  12. 31
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderItemServiceImpl.java
  13. 449
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderOptionsServiceImpl.java
  14. 225
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderPart1ServiceImpl.java
  15. 1263
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java
  16. 18
      src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java
  17. 1
      src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java

17
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查询

262
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<OmsSaleOrder> stopOrder(@PathVariable("orderCode") String orderCode){
OmsSaleOrder omsOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper<OmsSaleOrder>()
.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<OmsOrder> checkOrder(@PathVariable("orderCode") String orderCode){
OmsSaleOrder omsSaleOrder = omsSaleOrderService.getOne(new LambdaQueryWrapper<OmsSaleOrder>()
.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<PageVo<OmsSaleOrder>> getPage(OmsSaleOrder param){
PageUtil.startPage();
LambdaQueryWrapper<OmsSaleOrder> 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<OmsSaleOrder> list = omsSaleOrderService.list(orderWrapper);
Set<Long> addrIds = list.stream().map(OmsSaleOrder::getSupplierAddrId).collect(Collectors.toSet());
addrIds.add(0L);
List<BmsSupplierAddress> supplierAddressList = bmsSupplierAddressService.listByIds(addrIds);
Set<String> userIds = list.stream().map(OmsSaleOrder::getCheckUserId).collect(Collectors.toSet());
userIds.add("0");
List<SysUser> userList = sysUserService.listByIds(userIds);
Set<Long> orderIds = list.stream().map(OmsSaleOrder::getId).collect(Collectors.toSet());
orderIds.add(0L);
List<OmsSaleOrderItem> orderItems = omsSaleOrderItemService.list(new LambdaQueryWrapper<OmsSaleOrderItem>().in(OmsSaleOrderItem::getOrderId,orderIds));
Map<Long,List<OmsSaleOrderItem>> 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<OmsSaleOrderItem> 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<OmsSaleOrder> 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<List<OmsSpuAssesInfo>> getSpuAssess(@Valid @RequestBody OmsSpuAssesInfoBo param){
return R.ok(omsSaleOrderService.getSpuAssess(param));
}
@GetMapping("/reSync/{code}")
public R<?> getSpuAssess(@PathVariable("code") String code){
List<OmsSaleOrder> omsOrders = omsSaleOrderService.list(new LambdaQueryWrapper<OmsSaleOrder>().eq(OmsSaleOrder::getOrderSn,code));
if(CollUtil.isNotEmpty(omsOrders)){
omsSaleOrderOptionsService.syncToErp11DB(omsOrders);
}
return R.ok();
}
}

249
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;
}

153
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;
}

24
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<String> orderCodes;
}

14
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<OmsSaleOrderItem> {
}

28
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<OmsSaleOrder> {
@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<SimpleKeyValue<String>> 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<String> getExpiredRateInfo(String oaId);
}

18
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<OmsSaleOrderItem> {
List<OmsSaleOrderItem> listByOrderId(Long orderId);
}

28
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<OmsSaleOrder> omsOrders);
}

37
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<SimpleKeyValue> verifySku(OmsVerifySkuParam param);
}

132
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<OmsSaleOrder> {
BigDecimal getExpiredOrderRateById(String oaId);
List<SimpleKeyValue<String>> 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<OmsSpuAssesInfo> 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<SimpleKeyValue> handleCategoryRule(List<Long> skuIds,GoodsCategoryRule categoryRule);
/**
* 拦截规则
* @param categoryRule
* @param orderItems
*/
public void handleCategoryRule(GoodsCategoryRule categoryRule, List<OmsSaleOrderItem> orderItems);
/**
* 更新订单项特殊价
* @param cusCode
* @param orderItemList
*/
public void updateCusPrice(String cusCode, List<OmsSaleOrderItem> orderItemList);
/**
* 保存到ERP
* @param omsOrder
* @param orderItemList
* @param brands
* @param supplierAddress
* @param bmsRegion
*/
public void saveToErpOrder(OmsSaleOrder omsOrder,
List<OmsSaleOrderItem> orderItemList,
String brands,
BmsSupplierAddress supplierAddress,
BmsRegion bmsRegion);
}

31
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<OmsSaleOrderItemMapper, OmsSaleOrderItem> implements OmsSaleOrderItemService {
@Override
public List<OmsSaleOrderItem> listByOrderId(Long orderId) {
return this.list(new LambdaQueryWrapper<OmsSaleOrderItem>().eq(OmsSaleOrderItem::getOrderId,orderId));
}
}

449
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<OmsSaleOrderItem> orderItemList = omsSaleOrderItemService.listByOrderId(Long.parseLong(orderId));
// 加成订单项合法性
OmsOrderUtil.checkSaleOrderItemValues(orderItemList);
//下单前规则拦截
GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId());
omsSaleOrderService.handleCategoryRule(categoryRule, orderItemList);
List<GoodsImminentBatch> 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<String, Object> newWayData = new HashMap<>();
// 构建DATA
Map<String, Object> mainTableData = this.buildSeeyonData(omsOrder, sysUser, supplierAddress, supplier,
totalOrderAmt, templateCode, saleBizNames, bizBizNames);
newWayData.put("formmain_2206",mainTableData);
// 构建子表data
List<SeeYonOrderItemDTO> 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<String> 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<SeeYonOrderItemDTO> getSeeYonOrderItemDTOS(List<OmsSaleOrderItem> orderItemList) {
List<SeeYonOrderItemDTO> 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<OmsSaleOrder> omsOrders = omsSaleOrderService.list(new LambdaQueryWrapper<OmsSaleOrder>()
//临期品
.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<OmsSaleOrder> omsOrders) {
for (OmsSaleOrder omsOrder : omsOrders) {
BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId());
List<OmsSaleOrderItem> orderItemList = omsSaleOrderItemService.listByOrderId(omsOrder.getId());
BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId());
String lastRegionId = supplier.getRegionLast();
BmsRegion bmsRegion = bmsRegionMapper.selectById(lastRegionId);
List<Long> spuIds = orderItemList.stream().map(OmsSaleOrderItem::getSpuId).collect(Collectors.toList());
List<GoodsSpu> goodsSpuList = goodsSpuMapper.selectBatchIds(spuIds);
List<String> cateIds = goodsSpuList.stream().map(GoodsSpu::getCategoryLast).collect(Collectors.toList());
List<GoodsCategory> 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<String, Object> buildSeeyonData(OmsSaleOrder omsOrder, SysUser sysUser, BmsSupplierAddress supplierAddress, BmsSupplier supplier, BigDecimal totalOrderAmt, String templateCode, String saleBizNames, String bizBizNames) {
Map<String, Object> 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<String> 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<OmsSaleOrder>()
.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<OmsSaleOrder>()
.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();
}
}

225
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<OmsSaleOrderItem> orderItems = omsSaleOrderItemService.list(new LambdaQueryWrapper<OmsSaleOrderItem>()
.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<GoodsImminentBatch> imminentBatches = new ArrayList<>();
List<OmsSaleOrderItem> 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<SimpleKeyValue> verifySku(OmsVerifySkuParam param) {
List<SimpleKeyValue> errorImminentIds = new ArrayList<>();
LocalDate nowDate = LocalDate.now();
boolean isImminentCheck = CollectionUtil.isNotEmpty(param.getImminentItemIds());
List<GoodsImminentBatch> 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<Long> 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<SimpleKeyValue> errorSkuIds = new ArrayList<>();
//拦截商品授权维度规则
GoodsAccrIdsDto accrIdsDto = goodsAccreditService.listIgnoreAcc2(supplier.getId(), supplier.listBizRegionIds(), supplier.listSaleRegionIds());
if (accrIdsDto != null) {
List<Long> 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;
}
}

1263
src/main/java/com/qs/serve/modules/oms/service/impl/OmsSaleOrderServiceImpl.java

File diff suppressed because it is too large

18
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<OmsSaleOrderItem> 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("确认订单商品项数量不能为零");
}
}
}
}

1
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";

Loading…
Cancel
Save