|
|
@@ -16,13 +16,37 @@
|
|
|
*/
|
|
|
package org.springblade.box.tube.service.impl;
|
|
|
|
|
|
-import org.springblade.box.tube.entity.Transport;
|
|
|
-import org.springblade.box.tube.vo.TransportVO;
|
|
|
-import org.springblade.box.tube.mapper.TransportMapper;
|
|
|
-import org.springblade.box.tube.service.ITransportService;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import org.springblade.box.tube.entity.*;
|
|
|
+import org.springblade.box.tube.mapper.*;
|
|
|
+import org.springblade.box.tube.service.ITransportService;
|
|
|
+import org.springblade.box.tube.vo.TransportVO;
|
|
|
+import org.springblade.check.feign.ICheckClient;
|
|
|
+import org.springblade.client.entity.FeesDesc;
|
|
|
+import org.springblade.client.feign.IFeesDescClient;
|
|
|
+import org.springblade.client.feign.IMessageClient;
|
|
|
+import org.springblade.client.feign.ISerialClient;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.core.tool.utils.Func;
|
|
|
+import org.springblade.finance.feign.IFinanceClient;
|
|
|
+import org.springblade.system.feign.ISysClient;
|
|
|
+import org.springblade.system.user.feign.IUserClient;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.MathContext;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 出口装运/进口返程信息表 服务实现类
|
|
|
@@ -31,11 +55,278 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
* @since 2022-11-16
|
|
|
*/
|
|
|
@Service
|
|
|
+@AllArgsConstructor
|
|
|
public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport> implements ITransportService {
|
|
|
|
|
|
+ private final TransportItemMapper transportItemMapper;
|
|
|
+
|
|
|
+ private final TransportItemFeesMapper transportItemFeesMapper;
|
|
|
+
|
|
|
+ private final TransportFilesMapper transportFilesMapper;
|
|
|
+
|
|
|
+ private final ArchivesTrajectoryMapper archivesTrajectoryMapper;
|
|
|
+
|
|
|
+ private final ICheckClient iCheckClient;
|
|
|
+
|
|
|
+ private final IFinanceClient financeClient;//财务
|
|
|
+
|
|
|
+ private final ISysClient sysClient;
|
|
|
+
|
|
|
+ private IUserClient userClient;//获取用户信息
|
|
|
+
|
|
|
+ private final IMessageClient messageClient;//消息
|
|
|
+
|
|
|
+ private final ArchivesMapper archivesMapper;
|
|
|
+
|
|
|
+ private ISerialClient serialClient;//生成系统编号
|
|
|
+
|
|
|
+ private IFeesDescClient feesDescClient;//费用
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public IPage<TransportVO> selectTransportPage(IPage<TransportVO> page, TransportVO transport) {
|
|
|
return page.setRecords(baseMapper.selectTransportPage(page, transport));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Transport getDetail(Transport transport) {
|
|
|
+ if (transport.getId() == null) {
|
|
|
+ throw new RuntimeException("缺少必要参数");
|
|
|
+ }
|
|
|
+
|
|
|
+ Transport detail = baseMapper.selectById(transport.getId());
|
|
|
+ if (ObjectUtils.isNotNull(detail)) {
|
|
|
+ //获取明细信息
|
|
|
+ LambdaQueryWrapper<TransportItem> transportItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ transportItemLambdaQueryWrapper.eq(TransportItem::getIsDeleted, 0)
|
|
|
+ .eq(TransportItem::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(TransportItem::getPid, detail.getId());
|
|
|
+ List<TransportItem> transportItemList = transportItemMapper.selectList(transportItemLambdaQueryWrapper);
|
|
|
+ for (TransportItem transportItem : transportItemList) {
|
|
|
+ //获取箱轨迹
|
|
|
+ LambdaQueryWrapper<ArchivesTrajectory> trajectoryLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ trajectoryLambdaQueryWrapper.eq(ArchivesTrajectory::getIsDeleted, 0)
|
|
|
+ .eq(ArchivesTrajectory::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(ArchivesTrajectory::getCode, transportItem.getCode());
|
|
|
+ List<ArchivesTrajectory> trajectoryList = archivesTrajectoryMapper.selectList(trajectoryLambdaQueryWrapper);
|
|
|
+ transportItem.setArchivesTrajectoryList(trajectoryList);
|
|
|
+ }
|
|
|
+ detail.setTransportItemList(transportItemList);
|
|
|
+
|
|
|
+ //获取费用信息
|
|
|
+ LambdaQueryWrapper<TransportItemFees> transportItemFeesLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ transportItemFeesLambdaQueryWrapper.eq(TransportItemFees::getIsDeleted, 0)
|
|
|
+ .eq(TransportItemFees::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(TransportItemFees::getPid, detail.getId());
|
|
|
+ List<TransportItemFees> transportItemFeesList = transportItemFeesMapper.selectList(transportItemFeesLambdaQueryWrapper);
|
|
|
+ detail.setTransportItemFeesList(transportItemFeesList);
|
|
|
+
|
|
|
+ //获取附件信息
|
|
|
+ LambdaQueryWrapper<TransportFiles> tradingBoxFilesLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ tradingBoxFilesLambdaQueryWrapper.eq(TransportFiles::getIsDeleted, 0)
|
|
|
+ .eq(TransportFiles::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(TransportFiles::getPid, detail.getId());
|
|
|
+ List<TransportFiles> tradingBoxFilesList = transportFilesMapper.selectList(tradingBoxFilesLambdaQueryWrapper);
|
|
|
+ detail.setTransportFilesList(tradingBoxFilesList);
|
|
|
+ }
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Transport add(Transport transport) {
|
|
|
+ if (transport.getId() == null) {
|
|
|
+ //获取系统编号
|
|
|
+ R billNo = serialClient.getBillNo(transport.getBillType(), "BOX", transport.getBillType());
|
|
|
+ if (!billNo.isSuccess()) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new Error("生成系统编号失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ transport.setSysNo(billNo.getData().toString());
|
|
|
+ transport.setCreateTime(new Date());
|
|
|
+ transport.setCreateUser(AuthUtil.getUserId());
|
|
|
+ transport.setCreateUserName(AuthUtil.getUserName());
|
|
|
+ transport.setTenantId(AuthUtil.getTenantId());
|
|
|
+ transport.setStatus(0);
|
|
|
+ baseMapper.insert(transport);
|
|
|
+ } else {
|
|
|
+ transport.setUpdateTime(new Date());
|
|
|
+ transport.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ transport.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ baseMapper.updateById(transport);
|
|
|
+ }
|
|
|
+ //明细数据
|
|
|
+ List<TransportItem> transportItemList = transport.getTransportItemList();
|
|
|
+ if (ObjectUtils.isNotNull(transportItemList) && transportItemList.size() > 0) {
|
|
|
+ List<String> codes = transportItemList.stream().map(TransportItem::getCode).distinct().collect(Collectors.toList());
|
|
|
+ transport.setCode(String.join(",", codes));
|
|
|
+ if (ObjectUtils.isNotNull(transport.getTotalAmount())) {
|
|
|
+ transport.setTotalAmount(transportItemList.stream().map(TransportItem::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
|
|
|
+ }
|
|
|
+ baseMapper.updateById(transport);
|
|
|
+ for (TransportItem transportItem : transportItemList) {
|
|
|
+ if (transportItem.getId() == null) {
|
|
|
+ transportItem.setCreateUser(AuthUtil.getUserId());
|
|
|
+ transportItem.setCreateTime(new Date());
|
|
|
+ transportItem.setCreateUserName(AuthUtil.getUserName());
|
|
|
+ transportItem.setTenantId(AuthUtil.getTenantId());
|
|
|
+ transportItem.setPid(transport.getId());
|
|
|
+ transportItemMapper.insert(transportItem);
|
|
|
+ } else {
|
|
|
+ transportItem.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ transportItem.setUpdateTime(new Date());
|
|
|
+ transportItem.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ transportItem.setPid(transport.getId());
|
|
|
+ transportItemMapper.updateById(transportItem);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ObjectUtils.isNotNull(transportItem.getCode())) {
|
|
|
+ Archives archives = new Archives();
|
|
|
+ archives.setCode(transportItem.getCode());
|
|
|
+ archives.setAddress(transportItem.getAddress());
|
|
|
+ archives.setAddressId(transportItem.getAddressId());
|
|
|
+ archives.setNewDate(transportItem.getNewDate());
|
|
|
+ archivesMapper.updateCode(archives);
|
|
|
+ } else {
|
|
|
+ throw new RuntimeException("箱号不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ transport.setTransportItemList(transportItemList);
|
|
|
+ }
|
|
|
+ //费用明细
|
|
|
+ List<TransportItemFees> transportItemFeesList = transport.getTransportItemFeesList();
|
|
|
+ if (ObjectUtils.isNotNull(transportItemFeesList) && transportItemFeesList.size() > 0) {
|
|
|
+ for (TransportItemFees transportItemFees : transportItemFeesList) {
|
|
|
+ if (transportItemFees.getId() == null) {
|
|
|
+ transportItemFees.setCreateUser(AuthUtil.getUserId());
|
|
|
+ transportItemFees.setCreateTime(new Date());
|
|
|
+ transportItemFees.setTenantId(AuthUtil.getTenantId());
|
|
|
+ transportItemFees.setPid(transport.getId());
|
|
|
+ transportItemFeesMapper.insert(transportItemFees);
|
|
|
+ } else {
|
|
|
+ transportItemFees.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ transportItemFees.setUpdateTime(new Date());
|
|
|
+ transportItemFees.setPid(transport.getId());
|
|
|
+ transportItemFeesMapper.updateById(transportItemFees);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ transport.setTransportItemFeesList(transportItemFeesList);
|
|
|
+ }
|
|
|
+ //主表附件
|
|
|
+ List<TransportFiles> transportFilesList = transport.getTransportFilesList();
|
|
|
+ if (ObjectUtils.isNotNull(transportFilesList) && transportFilesList.size() > 0) {
|
|
|
+ for (TransportFiles transportFiles : transportFilesList) {
|
|
|
+ if (transportFiles.getId() == null) {
|
|
|
+ transportFiles.setCreateUser(AuthUtil.getUserId());
|
|
|
+ transportFiles.setCreateTime(new Date());
|
|
|
+ transportFiles.setTenantId(AuthUtil.getTenantId());
|
|
|
+ transportFiles.setPid(transport.getId());
|
|
|
+ transportFilesMapper.insert(transportFiles);
|
|
|
+ } else {
|
|
|
+ transportFiles.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ transportFiles.setUpdateTime(new Date());
|
|
|
+ transportFiles.setPid(transport.getId());
|
|
|
+ transportFilesMapper.updateById(transportFiles);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ transport.setTransportFilesList(transportFilesList);
|
|
|
+ }
|
|
|
+ return transport;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<TransportItem> statusUpdate(String ids, String type, String date, String address, String addressId, String status, String transportId) {
|
|
|
+ if (ObjectUtils.isNull(ids)) {
|
|
|
+ throw new RuntimeException("缺少必要参数");
|
|
|
+ }
|
|
|
+
|
|
|
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ //获取订单生效、失效日期
|
|
|
+ Transport transport = baseMapper.selectById(transportId);
|
|
|
+ if (ObjectUtils.isNull(transport) || ObjectUtils.isNull(transport.getEffectiveDate()) || ObjectUtils.isNull(transport.getExpiryDate())) {
|
|
|
+ throw new RuntimeException("数据不全,操作失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ //最新时间
|
|
|
+ Date newDate;
|
|
|
+ try {
|
|
|
+ newDate = formatter.parse(date);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ int days = 0;
|
|
|
+
|
|
|
+ if (transport.getExpiryDate().compareTo(newDate) < 0) {
|
|
|
+ //计算超期天数
|
|
|
+ days = (int) ((newDate.getTime() - transport.getExpiryDate().getTime()) / (1000 * 3600 * 24)) + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<TransportItem> transportItemList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<Long> list = Func.toLongList(ids);
|
|
|
+ //循环更新箱动态
|
|
|
+ for (Long id : list) {
|
|
|
+ TransportItem transportItem = transportItemMapper.selectById(id);
|
|
|
+ transportItem.setAddress(address);
|
|
|
+ transportItem.setAddressId(Long.parseLong(addressId));
|
|
|
+ transportItem.setNewDate(newDate);
|
|
|
+ transportItem.setUpdateTime(new Date());
|
|
|
+ transportItem.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ transportItem.setUpdateUserName(AuthUtil.getUserName());
|
|
|
+ transportItem.setStatus(type);
|
|
|
+ if ("2".equals(status) && "空箱入场".equals(type)) {
|
|
|
+ //判断空箱入场时间是否大于合同时间 true 计算超期金额 false 不计算
|
|
|
+ if (transport.getExpiryDate().compareTo(newDate) < 0) {
|
|
|
+ //计算超期金额
|
|
|
+ BigDecimal amount = transportItem.getOverduePrice().multiply(new BigDecimal(days), MathContext.DECIMAL32).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ transportItem.setOverdueAmount(amount);
|
|
|
+ R<FeesDesc> feesDescR = feesDescClient.getFeesByName("超期");
|
|
|
+ if (feesDescR.isSuccess() && ObjectUtils.isNotNull(feesDescR.getData())) {
|
|
|
+ TransportItemFees transportItemFees = new TransportItemFees();
|
|
|
+ transportItemFees.setCreateUser(AuthUtil.getUserId());
|
|
|
+ transportItemFees.setCreateTime(new Date());
|
|
|
+ transportItemFees.setTenantId(AuthUtil.getTenantId());
|
|
|
+ transportItemFees.setPid(transport.getId());
|
|
|
+ transportItemFees.setFeesType(1);
|
|
|
+ transportItemFees.setCode(transportItem.getCode());
|
|
|
+ transportItemFees.setSort(1);
|
|
|
+ transportItemFees.setItemId(feesDescR.getData().getId());
|
|
|
+ transportItemFees.setCorpId(transport.getCorpId());
|
|
|
+ transportItemFees.setQuantity(new BigDecimal(days));
|
|
|
+ transportItemFees.setPrice(transportItem.getOverduePrice());
|
|
|
+ transportItemFees.setAmount(amount);
|
|
|
+ transportItemFees.setCurrency("CNY");
|
|
|
+ transportItemFees.setAutoGenerate("0");
|
|
|
+ transportItemFees.setUnit(transportItem.getBoxType());
|
|
|
+ transportItemFeesMapper.insert(transportItemFees);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ transportItemMapper.updateById(transportItem);
|
|
|
+ Archives archives = new Archives();
|
|
|
+ archives.setCode(transportItem.getCode());
|
|
|
+ archives.setAddress(address);
|
|
|
+ archives.setAddressId(Long.parseLong(addressId));
|
|
|
+ archives.setNewDate(newDate);
|
|
|
+ archives.setBoxAccessStatus(type);
|
|
|
+ archivesMapper.updateCode(archives);
|
|
|
+
|
|
|
+ ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
|
|
|
+ archivesTrajectory.setStatus(type);
|
|
|
+ archivesTrajectory.setCode(transportItem.getCode());
|
|
|
+ archivesTrajectory.setAddress(address);
|
|
|
+ archivesTrajectory.setNewDate(newDate);
|
|
|
+ archivesTrajectory.setCreateTime(new Date());
|
|
|
+ archivesTrajectory.setCreateUser(AuthUtil.getUserId());
|
|
|
+ archivesTrajectory.setCreateUserName(AuthUtil.getUserName());
|
|
|
+ archivesTrajectory.setTenantId(AuthUtil.getTenantId());
|
|
|
+ archivesTrajectoryMapper.insert(archivesTrajectory);
|
|
|
+
|
|
|
+ transportItemList.add(transportItem);
|
|
|
+ }
|
|
|
+ return transportItemList;
|
|
|
+ }
|
|
|
+
|
|
|
}
|