|
|
@@ -19,6 +19,7 @@ package org.springblade.salesPart.ship.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import io.seata.spring.annotation.GlobalTransactional;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.springblade.client.feign.ISerialClient;
|
|
|
import org.springblade.core.secure.utils.AuthUtil;
|
|
|
@@ -26,11 +27,13 @@ import org.springblade.core.tool.api.R;
|
|
|
import org.springblade.core.tool.utils.BeanUtil;
|
|
|
import org.springblade.core.tool.utils.Func;
|
|
|
import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
-import org.springblade.purchase.sales.entity.OrderItems;
|
|
|
import org.springblade.salesPart.entity.*;
|
|
|
import org.springblade.salesPart.enums.OrderTypeEnum;
|
|
|
+import org.springblade.salesPart.goods.mapper.GoodsDescMapper;
|
|
|
+import org.springblade.salesPart.history.mapper.HistoryMapper;
|
|
|
import org.springblade.salesPart.order.mapper.OrderItemsMapper;
|
|
|
import org.springblade.salesPart.order.mapper.OrderMapper;
|
|
|
+import org.springblade.salesPart.productLaunch.mapper.ProductLaunchMapper;
|
|
|
import org.springblade.salesPart.ship.mapper.ShipItemsMapper;
|
|
|
import org.springblade.salesPart.stock.mapper.StockDescMapper;
|
|
|
import org.springblade.salesPart.vo.ShipVO;
|
|
|
@@ -39,15 +42,22 @@ import org.springblade.salesPart.ship.service.IShipService;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import org.springblade.system.entity.Dept;
|
|
|
import org.springblade.system.feign.ISysClient;
|
|
|
+import org.springblade.system.user.entity.User;
|
|
|
+import org.springblade.system.user.feign.IUserClient;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.MathContext;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
|
|
|
+import static org.springblade.core.secure.utils.AuthUtil.getUser;
|
|
|
+
|
|
|
/**
|
|
|
* 配件收发货表 服务实现类
|
|
|
*
|
|
|
@@ -67,6 +77,10 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
private final OrderMapper orderMapper;
|
|
|
private final ISysClient sysClient;
|
|
|
private final StockDescMapper stockDescMapper;
|
|
|
+ private final GoodsDescMapper goodsDescMapper;
|
|
|
+ private final ProductLaunchMapper productLaunchMapper;
|
|
|
+ private final HistoryMapper historyMapper;
|
|
|
+ private final IUserClient userClient;
|
|
|
|
|
|
/**
|
|
|
* 获取收发货订单详情
|
|
|
@@ -78,10 +92,27 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
public PjShip getMessageById(PjShip ship) {
|
|
|
PjShip detail = baseMapper.selectById(ship.getId());
|
|
|
|
|
|
+ //明细
|
|
|
LambdaQueryWrapper<PjShipItems> itemsLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
itemsLambdaQueryWrapper.eq(PjShipItems::getTenantId, AuthUtil.getTenantId())
|
|
|
.eq(PjShipItems::getIsDeleted, 0)
|
|
|
.eq(PjShipItems::getPid, detail.getId());
|
|
|
+ detail.setShipItemsList(shipItemsMapper.selectList(itemsLambdaQueryWrapper));
|
|
|
+
|
|
|
+ //订单信息
|
|
|
+ ShipVO vo = new ShipVO();
|
|
|
+ BeanUtil.copyProperties(detail, vo);
|
|
|
+ List<ShipVO> listVo = new ArrayList<>();
|
|
|
+ listVo.add(vo);
|
|
|
+ detail.setShipVOList(listVo);
|
|
|
+
|
|
|
+ //历史记录
|
|
|
+ LambdaQueryWrapper<PjHistory> historyLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ historyLambdaQueryWrapper.eq(PjHistory::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjHistory::getIsDeleted, 0)
|
|
|
+ .eq(PjHistory::getPid, detail.getId());
|
|
|
+ detail.setHistoryList(historyMapper.selectList(historyLambdaQueryWrapper));
|
|
|
+
|
|
|
return detail;
|
|
|
}
|
|
|
|
|
|
@@ -97,7 +128,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
public R saveShipMessage(PjShip ship) {
|
|
|
|
|
|
//获得所属公司
|
|
|
@@ -109,6 +141,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
throw new SecurityException("请选择所属公司");
|
|
|
}
|
|
|
|
|
|
+ //库管员名称
|
|
|
+ ship.setStockClerkName(userClient.userInfoById(ship.getStockClerkId()).getData().getRealName());
|
|
|
+
|
|
|
if (ship.getId() == null){
|
|
|
// 获取系统编号
|
|
|
R billNo = serialClient.getBillNo(ship.getBizTypeName(), ship.getBizTypeName(), ship.getBizTypeName());
|
|
|
@@ -159,7 +194,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
public R outboundWorkOrder(String ids) {
|
|
|
List<Long> shipIds = Func.toLongList(ids);
|
|
|
for (Long id : shipIds) {
|
|
|
@@ -206,8 +242,11 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
shipItems.setCreateTime(new Date());
|
|
|
shipItems.setCreateUser(AuthUtil.getUserId());
|
|
|
shipItems.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
- shipItems.setSendNum(e.getGoodsNum());
|
|
|
- shipItemsMapper.insert(shipItems);
|
|
|
+ shipItems.setSendNum(e.getGoodsNum().subtract(e.getSendNum()));
|
|
|
+ if (e.getGoodsNum().compareTo(e.getSendNum()) != 0){
|
|
|
+ shipItemsMapper.insert(shipItems);
|
|
|
+ }
|
|
|
+
|
|
|
});
|
|
|
gdShip.setNumberRows(list.size());
|
|
|
}
|
|
|
@@ -215,6 +254,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
//修改出库任务状态
|
|
|
rwShip.setStatusName(OrderTypeEnum.DISPATCHED.getType());
|
|
|
baseMapper.updateById(rwShip);
|
|
|
+
|
|
|
+ //生成出库工单历史记录
|
|
|
+ saveHistory(gdShip.getId(), OrderTypeEnum.TOBESHIPPEDOUT.getType());
|
|
|
}
|
|
|
|
|
|
return R.success("操作成功");
|
|
|
@@ -227,7 +269,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
public R outboundCompleted(PjShip ship) {
|
|
|
ship.setStatusName(OrderTypeEnum.OURTBOUND.getType());
|
|
|
if (ship.getId() == null){
|
|
|
@@ -279,6 +322,35 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
}else {
|
|
|
throw new RuntimeException("数据异常请联系管理员");
|
|
|
}
|
|
|
+
|
|
|
+ //获得商品
|
|
|
+ PjGoodsDesc goodsDesc = goodsDescMapper.selectById(item.getGoodsId());
|
|
|
+ if (ObjectUtil.isEmpty(goodsDesc)){
|
|
|
+ throw new RuntimeException("商品数据异常");
|
|
|
+ }
|
|
|
+ //修改库存账
|
|
|
+ LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjStockDesc::getIsDeleted, 0)
|
|
|
+ .eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
|
|
|
+ .eq(PjStockDesc::getGoodsId, item.getGoodsId())
|
|
|
+ .eq(PjStockDesc::getStorageId, ship.getStorageId());
|
|
|
+ if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && goodsDesc.getWhether().equals("1")){//管理批次号
|
|
|
+ lambdaQueryWrapper.eq(PjStockDesc::getDot, item.getDot());
|
|
|
+ }else {
|
|
|
+ lambdaQueryWrapper.isNull(PjStockDesc::getDot);
|
|
|
+ }
|
|
|
+
|
|
|
+ PjStockDesc stockOne = stockDescMapper.selectOne(lambdaQueryWrapper);
|
|
|
+ if (ObjectUtil.isNotEmpty(stockOne)){
|
|
|
+ stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().subtract(item.getSendNum()));
|
|
|
+ stockOne.setStoreInventory(stockOne.getBalanceQuantity());
|
|
|
+ stockOne.setInventoryAmount(stockOne.getInventoryAmount().subtract(item.getSendNum().multiply(item.getCostprie())));
|
|
|
+ stockDescMapper.updateById(stockOne);
|
|
|
+ }else {
|
|
|
+ throw new RuntimeException("库存数据异常");
|
|
|
+ }
|
|
|
+
|
|
|
});
|
|
|
ship.setShipItemsList(ship.getShipItemsList());
|
|
|
ship.setNumberRows(ship.getShipItemsList().size());
|
|
|
@@ -305,6 +377,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //生成出库工单历史记录
|
|
|
+ saveHistory(ship.getId(), OrderTypeEnum.OURTBOUND.getType());
|
|
|
+
|
|
|
return R.data(ship);
|
|
|
}
|
|
|
|
|
|
@@ -315,7 +390,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
public R generateWarehousing(String ids) {
|
|
|
List<Long> shipIds = Func.toLongList(ids);
|
|
|
for (Long id : shipIds) {
|
|
|
@@ -337,7 +413,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
|
|
|
gdShip.setId(null);
|
|
|
gdShip.setBillno((String) billNo.getData());
|
|
|
- //gdShip.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
|
|
|
+ gdShip.setStatusName(OrderTypeEnum.TREATWAREHOUSING.getType());
|
|
|
gdShip.setTenantId(AuthUtil.getTenantId());
|
|
|
gdShip.setBizTypeName(OrderTypeEnum.SHGD.getType());
|
|
|
gdShip.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
@@ -371,6 +447,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
//修改入库任务状态
|
|
|
rwShip.setStatusName(OrderTypeEnum.DISPATCHED.getType());
|
|
|
baseMapper.updateById(rwShip);
|
|
|
+
|
|
|
+ //生成出库工单历史记录
|
|
|
+ saveHistory(gdShip.getId(), OrderTypeEnum.TREATWAREHOUSING.getType());
|
|
|
}
|
|
|
|
|
|
return R.success("操作成功");
|
|
|
@@ -383,7 +462,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
public R WarehousingComplete(PjShip ship) {
|
|
|
ship.setStatusName(OrderTypeEnum.RECEIVED.getType());
|
|
|
if (ship.getId() == null){
|
|
|
@@ -422,7 +502,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
shipItemsMapper.updateById(item);
|
|
|
}
|
|
|
|
|
|
- //修改销售明细
|
|
|
+ //修改采购明细
|
|
|
PjOrderItems orderItems = orderItemsMapper.selectById(item.getSrcItemId());
|
|
|
if (ObjectUtil.isNotEmpty(orderItems)){
|
|
|
orderItems.setSendNum(item.getSendNum());
|
|
|
@@ -431,6 +511,12 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
throw new RuntimeException("数据异常请联系管理员");
|
|
|
}
|
|
|
|
|
|
+ //获得商品
|
|
|
+ PjGoodsDesc goodsDesc = goodsDescMapper.selectById(item.getGoodsId());
|
|
|
+ if (ObjectUtil.isEmpty(goodsDesc)){
|
|
|
+ throw new RuntimeException("商品数据异常");
|
|
|
+ }
|
|
|
+
|
|
|
//生成库存账
|
|
|
PjStockDesc stockDesc = new PjStockDesc();
|
|
|
|
|
|
@@ -452,34 +538,80 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
|
|
|
.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
|
|
|
.eq(PjStockDesc::getGoodsId, item.getGoodsId())
|
|
|
.eq(PjStockDesc::getStorageId, ship.getStorageId());
|
|
|
+ if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && goodsDesc.getWhether().equals("1")){//管理批次号
|
|
|
+ lambdaQueryWrapper.eq(PjStockDesc::getDot, item.getDot());
|
|
|
+ }else {
|
|
|
+ lambdaQueryWrapper.isNull(PjStockDesc::getDot);
|
|
|
+ }
|
|
|
|
|
|
PjStockDesc stockOne = stockDescMapper.selectOne(lambdaQueryWrapper);
|
|
|
if (ObjectUtil.isEmpty(stockOne)){
|
|
|
stockDesc.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
stockDesc.setCreateTime(new Date());
|
|
|
stockDesc.setCreateUser(AuthUtil.getUserId());
|
|
|
- stockDesc.setBalanceQuantity(item.getGoodsNum());
|
|
|
+ stockDesc.setBalanceQuantity(item.getSendNum());
|
|
|
+ stockDesc.setStoreInventory(item.getSendNum());
|
|
|
+ stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
|
|
|
+ stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
|
|
|
stockDescMapper.insert(stockDesc);
|
|
|
}else {
|
|
|
stockDesc.setUpdateTime(new Date());
|
|
|
stockDesc.setUpdateUser(AuthUtil.getUserId());
|
|
|
- stockDesc.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getGoodsNum()));
|
|
|
+ stockDesc.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getSendNum()));
|
|
|
+ stockDesc.setStoreInventory(stockDesc.getBalanceQuantity());
|
|
|
+ stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
|
|
|
+ stockDesc.setInventoryAmount(stockDesc.getInventoryAmount().add(stockOne.getInventoryAmount()));
|
|
|
+ stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
|
|
|
stockDescMapper.updateById(stockDesc);
|
|
|
}
|
|
|
+
|
|
|
+ //修改上架库存
|
|
|
+ LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(PjProductLaunch::getIsDeleted, 0)
|
|
|
+ .eq(PjProductLaunch::getGoodsId, stockDesc.getGoodsId())
|
|
|
+ .eq(PjProductLaunch::getBillType, 0);
|
|
|
+ PjProductLaunch productLaunch = productLaunchMapper.selectOne(productLaunchQueryWrapper);
|
|
|
+
|
|
|
+ if (ObjectUtil.isNotEmpty(productLaunch)){
|
|
|
+ productLaunch.setInventory(stockDesc.getBalanceQuantity());
|
|
|
+ }
|
|
|
+ productLaunchMapper.updateById(productLaunch);
|
|
|
});
|
|
|
ship.setShipItemsList(ship.getShipItemsList());
|
|
|
ship.setNumberRows(ship.getShipItemsList().size());
|
|
|
}
|
|
|
|
|
|
+ //修改采购订单状态
|
|
|
PjOrder order = orderMapper.selectById(ship.getOrdId());
|
|
|
if (ObjectUtil.isNotEmpty(order)){
|
|
|
- order.setStatus(OrderTypeEnum.SHIPED.getType());
|
|
|
+ order.setStatus(OrderTypeEnum.RECEIVEDGOODS.getType());
|
|
|
orderMapper.updateById(order);
|
|
|
}else {
|
|
|
throw new RuntimeException("数据异常请联系管理员");
|
|
|
}
|
|
|
|
|
|
+ //生成出库工单历史记录
|
|
|
+ saveHistory(ship.getId(), OrderTypeEnum.RECEIVED.getType());
|
|
|
+
|
|
|
return R.data(ship);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 生成出库工单历史记录
|
|
|
+ */
|
|
|
+ public void saveHistory(Long pid, String status){
|
|
|
+ //生成出库工单历史记录
|
|
|
+ PjHistory history = new PjHistory();
|
|
|
+ history.setTenantId(AuthUtil.getTenantId());
|
|
|
+ history.setCreateUser(AuthUtil.getUserId());
|
|
|
+ history.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ history.setCreateTime(new Date());
|
|
|
+ history.setPid(pid);
|
|
|
+ history.setOperatorId(AuthUtil.getUserId());
|
|
|
+ history.setOperatorName(getUser().getRoleName());
|
|
|
+ history.setOperateTime(new Date());
|
|
|
+ history.setOperateStatus(status);
|
|
|
+ historyMapper.insert(history);
|
|
|
+ }
|
|
|
}
|