Browse Source

feat: 订单审批前置校验;opt: 订单提取公共服务

muti_db
Yen 11 months ago
parent
commit
609fdf0003
  1. 1
      src/main/java/com/qs/serve/common/model/enums/BizType.java
  2. 40
      src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java
  3. 3
      src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java
  4. 4
      src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java
  5. 18
      src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java
  6. 15
      src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java
  7. 8
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java
  8. 152
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java
  9. 97
      src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java
  10. 33
      src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java
  11. 46
      src/main/resources/mapper/seeyon/CommonCheckMapper.xml

1
src/main/java/com/qs/serve/common/model/enums/BizType.java

@ -45,6 +45,7 @@ public enum BizType {
LEAVE("离职"),
EXPORT("导出"),
SUBMIT("提交"),
RESET("重置");

40
src/main/java/com/qs/serve/modules/oms/controller/OmsOrderExpiredController.java

@ -0,0 +1,40 @@
package com.qs.serve.modules.oms.controller;
import com.qs.serve.common.model.annotation.SysLog;
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.modules.oms.entity.OmsOrder;
import com.qs.serve.modules.oms.service.OmsOrderOptionsService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author YenHex
* @since 2024/8/12
*/
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("oms/orderExpired")
public class OmsOrderExpiredController {
OmsOrderOptionsService omsOrderOptionsService;
/**
* 提交临期订单
* @param id 订单ID
* @return
*/
@PostMapping("submit")
@SysLog(module = SystemModule.BIZ, title = "临期订单", biz = BizType.SUBMIT)
public R<?> submit(@PathVariable("id") Long id){
omsOrderOptionsService.submitExpiredOrder(id+"");
return R.ok();
}
}

3
src/main/java/com/qs/serve/modules/oms/entity/OmsOrder.java

@ -45,6 +45,9 @@ public class OmsOrder implements Serializable {
private String orderSource;
/** OA审批状态,订单审批状态 */
private Integer orderCheckState;
/** 供应商ID */
@NotNull(message = "供应商ID不能为空")
private Long supplierId;

4
src/main/java/com/qs/serve/modules/oms/service/OmsOrderItemService.java

@ -3,6 +3,8 @@ package com.qs.serve.modules.oms.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.modules.oms.entity.OmsOrderItem;
import java.util.List;
/**
* 订单明细 服务接口
* @author YenHex
@ -10,5 +12,7 @@ import com.qs.serve.modules.oms.entity.OmsOrderItem;
*/
public interface OmsOrderItemService extends IService<OmsOrderItem> {
List<OmsOrderItem> listByOrderId(Long orderId);
}

18
src/main/java/com/qs/serve/modules/oms/service/OmsOrderOptionsService.java

@ -0,0 +1,18 @@
package com.qs.serve.modules.oms.service;
import com.qs.serve.modules.seeyon.service.SeeYonOperationService;
/**
* @author YenHex
* @since 2024/8/12
*/
public interface OmsOrderOptionsService extends SeeYonOperationService {
/**
* 提交临期品订单
* @param orderId
* @return
*/
Object submitExpiredOrder(String orderId);
}

15
src/main/java/com/qs/serve/modules/oms/service/OmsOrderService.java

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.qs.serve.common.model.dto.SimpleKeyValue;
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.bo.*;
import com.qs.serve.modules.oms.entity.vo.OmsConfirmOrderResult;
import com.qs.serve.modules.oms.entity.vo.OmsSpuAssesInfo;
@ -88,5 +89,19 @@ public interface OmsOrderService extends IService<OmsOrder> {
*/
List<SimpleKeyValue> handleCategoryRule(List<Long> skuIds,GoodsCategoryRule categoryRule);
/**
* 拦截规则
* @param categoryRule
* @param orderItems
*/
public void handleCategoryRule(GoodsCategoryRule categoryRule, List<OmsOrderItem> orderItems);
/**
* 更新订单项特殊价
* @param cusCode
* @param orderItemList
*/
public void updateCusPrice(String cusCode, List<OmsOrderItem> orderItemList);
}

8
src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderItemServiceImpl.java

@ -1,5 +1,6 @@
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 lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -8,6 +9,8 @@ import com.qs.serve.modules.oms.entity.OmsOrderItem;
import com.qs.serve.modules.oms.service.OmsOrderItemService;
import com.qs.serve.modules.oms.mapper.OmsOrderItemMapper;
import java.util.List;
/**
* 订单明细 服务实现类
* @author YenHex
@ -18,5 +21,10 @@ import com.qs.serve.modules.oms.mapper.OmsOrderItemMapper;
@AllArgsConstructor
public class OmsOrderItemServiceImpl extends ServiceImpl<OmsOrderItemMapper,OmsOrderItem> implements OmsOrderItemService {
@Override
public List<OmsOrderItem> listByOrderId(Long orderId) {
return this.list(new LambdaQueryWrapper<OmsOrderItem>().eq(OmsOrderItem::getOrderId,orderId));
}
}

152
src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderOptionsServiceImpl.java

@ -0,0 +1,152 @@
package com.qs.serve.modules.oms.service.impl;
import com.qs.serve.common.util.Assert;
import com.qs.serve.common.util.AuthContextUtils;
import com.qs.serve.common.util.StringUtils;
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.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.mapper.GoodsCategoryRuleMapper;
import com.qs.serve.modules.goods.service.GoodsImminentBatchService;
import com.qs.serve.modules.oms.entity.OmsOrder;
import com.qs.serve.modules.oms.entity.OmsOrderItem;
import com.qs.serve.modules.oms.service.OmsOrderItemService;
import com.qs.serve.modules.oms.service.OmsOrderOptionsService;
import com.qs.serve.modules.oms.service.OmsOrderService;
import com.qs.serve.modules.oms.utils.OmsOrderUtil;
import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* 订单审批操作类
* @author YenHex
* @since 2024/8/12
*/
@Slf4j
@Service
@AllArgsConstructor
public class OmsOrderOptionsServiceImpl implements OmsOrderOptionsService {
private final GoodsImminentBatchService goodsImminentBatchService;
private final OmsOrderService omsOrderService;
private final OmsOrderItemService omsOrderItemService;
private final GoodsCategoryRuleMapper goodsCategoryRuleMapper;
private BmsSupplierAddressService bmsSupplierAddressService;
private BmsSupplierMapper bmsSupplierMapper;
private BmsRegionMapper bmsRegionMapper;
@Override
public Object submitExpiredOrder(String orderId) {
OmsOrder omsOrder = omsOrderService.getById(orderId);
String userId = AuthContextUtils.getSysUserId();
if (omsOrder == null) {
Assert.throwEx("订单不存在或被移除");
}
if (!omsOrder.getUserId().equals(userId)) {
Assert.throwEx("非制单人无法下单");
}
// 非临期品不走当前流程
if(!omsOrder.getOrderType().equals(3)){
Assert.throwEx("该功能只针对临期品订单");
}
omsOrderService.checkMsOrderStatus(omsOrder);
if (!omsOrder.getStatus().equals(0) && !omsOrder.getStatus().equals(6)) {
Assert.throwEx("订单状态不支持下单");
}
List<OmsOrderItem> orderItemList = omsOrderItemService.listByOrderId(Long.parseLong(orderId));
// 加成订单项合法性
OmsOrderUtil.checkOrderItemValues(orderItemList);
//下单前规则拦截
GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId());
omsOrderService.handleCategoryRule(categoryRule, orderItemList);
List<GoodsImminentBatch> imminentBatches = new ArrayList<>();
if (omsOrder.getOrderType().equals(3)) {
//临期品相关拦截
for (OmsOrderItem 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());
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() + "]缺失销售区域数据,请联系管理员");
}
//更新最新的用户特殊价格
omsOrderService.updateCusPrice(omsOrder.getSupplierCode(), orderItemList);
if (imminentBatches.size() > 0) {
goodsImminentBatchService.updateBatchById(imminentBatches);
}
return null;
}
@Override
public String getSyFormIdByTargetInfo(TbsAffairCommitBo affairCommit) {
return null;
}
@Override
public Object doBacked(TbsAffairCommitBo param) {
return null;
}
@Override
public Object doFinished(TbsAffairCommitBo param) {
return null;
}
@Override
public Object doRefuse(TbsAffairCommitBo param) {
return null;
}
@Override
public boolean checkSyFormIdIsNotNull(String targetId) {
return false;
}
@Override
public void doCommitBacked(String targetId) {
}
@Override
public String getTemplateCode() {
return null;
}
}

97
src/main/java/com/qs/serve/modules/oms/service/impl/OmsOrderServiceImpl.java

@ -31,6 +31,7 @@ import com.qs.serve.modules.oms.mapper.OmsOrderMapper;
import com.qs.serve.modules.oms.service.OmsOrderItemService;
import com.qs.serve.modules.oms.service.OmsOrderService;
import com.qs.serve.modules.oms.service.OmsShoppingCartService;
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;
@ -393,7 +394,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
* @param categoryRule
* @param orderItems
*/
private void handleCategoryRule(GoodsCategoryRule categoryRule, List<OmsOrderItem> orderItems) {
@Override
public void handleCategoryRule(GoodsCategoryRule categoryRule, List<OmsOrderItem> orderItems) {
if (categoryRule != null && orderItems.size() > 0) {
List<String> cids = Arrays.asList(categoryRule.getBrandIds());
List<String> igcids = null;
@ -899,6 +901,10 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
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("订单状态不支持下单");
@ -907,46 +913,13 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
iteLqw.eq(OmsOrderItem::getOrderId, id);
List<OmsOrderItem> orderItemList = omsOrderItemService.list(iteLqw);
if (orderItemList.size() < 1) {
Assert.throwEx("空项目不支持下单");
}
List<GoodsImminentBatch> imminentBatches = new ArrayList<>();
if (omsOrder.getOrderType().equals(3)) {
//临期品相关拦截
for (OmsOrderItem 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);
}
}
//拦截相同的skuItem
long countDistinct = orderItemList.stream().map(OmsOrderItem::getSkuId).distinct().count();
if (orderItemList.size() != countDistinct) {
Assert.throwEx("有重复存货,请检查订单项");
}
for (OmsOrderItem orderItem : orderItemList) {
if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) {
Assert.throwEx("确认订单商品项数量不能为零");
}
}
// 加成订单项合法性
OmsOrderUtil.checkOrderItemValues(orderItemList);
//下单前规则拦截
GoodsCategoryRule categoryRule = goodsCategoryRuleMapper.selectById(omsOrder.getBrandRuleId());
this.handleCategoryRule(categoryRule, orderItemList);
String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(","));
//List<Long> spuIds = orderItemList.stream().map(OmsOrderItem::getSpuId).collect(Collectors.toList());
@ -959,9 +932,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
//SysDept dept = sysDeptService.getById(sysUser.getDeptId());
//this.toU8Api(omsOrder, sysUser, dept, orderItemList);
//加载关联数据
//客户校验
BmsSupplierAddress supplierAddress = bmsSupplierAddressService.getById(omsOrder.getSupplierAddrId());
String brands = Arrays.stream(categoryRule.getBrandNames()).collect(Collectors.joining(","));
BmsSupplier supplier = bmsSupplierMapper.selectById(omsOrder.getSupplierId());
if (supplier.getCdOrderFlag().equals(1) && !StringUtils.hasText(omsOrder.getCdOrderRemark())) {
Assert.throwEx("请补充CD单号");
@ -972,26 +944,7 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
Assert.throwEx("客户档案[" + supplier.getCode() + "]缺失销售区域数据,请联系管理员");
}
//更新最新的用户特殊价格
List<String> codes = orderItemList.stream().map(OmsOrderItem::getSkuCode).distinct().collect(Collectors.toList());
InventoryCusPriceQuery query = new InventoryCusPriceQuery();
query.setCusCode(omsOrder.getSupplierCode());
query.setInvCodes(codes);
R<String> res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价");
if(res.getStatus().equals(200)) {
List<InventoryCusPrice> inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class);
if(CollectionUtil.isNotEmpty(inventoryCusPrices)){
assert inventoryCusPrices != null;
for (InventoryCusPrice cusPrice : inventoryCusPrices) {
for (OmsOrderItem orderItem : orderItemList) {
if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){
orderItem.setCusPrice(cusPrice.getPrice());
orderItem.setSalesPrice(cusPrice.getPrice());
omsOrderItemService.updateById(orderItem);
}
}
}
}
}
this.updateCusPrice(omsOrder.getSupplierCode(), orderItemList);
//保存到临时表-主表
LocalDateTime nowTime = LocalDateTime.now();
@ -1081,10 +1034,30 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
omsOrder.setCheckUserId(AuthContextUtils.getSysUserId());
this.updateById(omsOrder);
if (imminentBatches.size() > 0) {
goodsImminentBatchService.updateBatchById(imminentBatches);
}
}
@Override
public void updateCusPrice(String cusCode, List<OmsOrderItem> orderItemList) {
List<String> codes = orderItemList.stream().map(OmsOrderItem::getSkuCode).distinct().collect(Collectors.toList());
InventoryCusPriceQuery query = new InventoryCusPriceQuery();
query.setCusCode(cusCode);
query.setInvCodes(codes);
R<String> res = seeYonRequestBaseService.postBase(TbsSeeYonConst.ERP_CUS_INV_PRICE,query,"查询客户特殊价");
if(res.getStatus().equals(200)) {
List<InventoryCusPrice> inventoryCusPrices = JsonUtil.jsonToList(res.getData(), InventoryCusPrice.class);
if(CollectionUtil.isNotEmpty(inventoryCusPrices)){
assert inventoryCusPrices != null;
for (InventoryCusPrice cusPrice : inventoryCusPrices) {
for (OmsOrderItem orderItem : orderItemList) {
if(orderItem.getSkuCode().equals(cusPrice.getInvCode())){
orderItem.setCusPrice(cusPrice.getPrice());
orderItem.setSalesPrice(cusPrice.getPrice());
omsOrderItemService.updateById(orderItem);
}
}
}
}
}
}
@Override

33
src/main/java/com/qs/serve/modules/oms/utils/OmsOrderUtil.java

@ -0,0 +1,33 @@
package com.qs.serve.modules.oms.utils;
import com.qs.serve.common.util.Assert;
import com.qs.serve.modules.oms.entity.OmsOrderItem;
import lombok.experimental.UtilityClass;
import java.util.List;
/**
* 封装常用的订单工具类
* @author YenHex
* @since 2024/8/12
*/
@UtilityClass
public class OmsOrderUtil {
public static void checkOrderItemValues(List<OmsOrderItem> orderItemList) {
if (orderItemList.size() < 1) {
Assert.throwEx("空项目不支持下单");
}
//拦截相同的skuItem
long countDistinct = orderItemList.stream().map(OmsOrderItem::getSkuId).distinct().count();
if (orderItemList.size() != countDistinct) {
Assert.throwEx("有重复存货,请检查订单项");
}
for (OmsOrderItem orderItem : orderItemList) {
if (orderItem.getQuantity() == null || orderItem.getQuantity() < 1) {
Assert.throwEx("确认订单商品项数量不能为零");
}
}
}
}

46
src/main/resources/mapper/seeyon/CommonCheckMapper.xml

@ -143,6 +143,30 @@
</if>
</if>
<if test="query.targetType == 'CheckCostAgree'">
select
'CheckCostAgree' as target_type,
tbs_cost_todo.id as target_id,
tbs_cost_todo.todo_code as target_code,
tbs_cost_todo.pay_msg as title,
tbs_cost_todo.create_time as `time`
from tbs_cost_todo
where tbs_cost_todo.check_status = 3
and tbs_cost_todo.create_by = #{query.userId}
and tbs_cost_todo.del_flag = 0
<if test="query.title !=null and query.title != ''">
and tbs_cost_todo.pay_msg like concat('%',#{query.title},'%')
</if>
<if test="query.targetCode !=null and query.targetCode != ''">
and tbs_cost_todo.todo_code like concat('%',#{query.targetCode},'%')
</if>
<if test="query.startDate !=null">
and tbs_cost_todo.create_time &gt;= #{query.startDate}
</if>
<if test="query.endDate !=null">
and tbs_cost_todo.create_time &lt;= #{query.endDate}
</if>
</if>
<if test="query.targetType == null ">
select
@ -343,6 +367,28 @@
from vtb_verification_batch
where vtb_verification_batch.vtb_batch_status = 3 and vtb_verification_batch.user_id = #{query.userId} and vtb_verification_batch.del_flag = 0
</if>
<if test="query.targetType == 'CheckCostAgree'">
select
'CheckCostAgree' as target_type,
tbs_cost_todo.id as target_id
from tbs_cost_todo
where tbs_cost_todo.check_status = 3
and tbs_cost_todo.create_by = #{query.userId}
and tbs_cost_todo.del_flag = 0
<if test="query.title !=null and query.title != ''">
and tbs_cost_todo.pay_msg like concat('%',#{query.title},'%')
</if>
<if test="query.targetCode !=null and query.targetCode != ''">
and tbs_cost_todo.todo_code like concat('%',#{query.targetCode},'%')
</if>
<if test="query.startDate !=null">
and tbs_cost_todo.create_time &gt;= #{query.startDate}
</if>
<if test="query.endDate !=null">
and tbs_cost_todo.create_time &lt;= #{query.endDate}
</if>
</if>
<if test="query.targetType == null ">
select
'CostBill' as target_type,

Loading…
Cancel
Save