用车需求合并,拆分

This commit is contained in:
王帅 2025-06-10 10:20:58 +08:00
parent f4717672de
commit d81634f69d
21 changed files with 640 additions and 34 deletions

View File

@ -8,6 +8,6 @@
and a.car_long = b.car_long
where a.start_city = #{pickUpHub}
and a.target_city = #{deliveryAddress}
and a.failureTime >= TRUNC(SYSDATE)
and a.failure_time >= TRUNC(SYSDATE)
</select>
</mapper>

View File

@ -15,4 +15,5 @@ import org.jeecg.modules.tms.basicdata.logisticsroute.entity.LogisticsRoute;
*/
public interface LogisticsRouteMapper extends BaseMapper<LogisticsRoute> {
Integer getDistance(String pickUpHub, String deliveryAddress);
}

View File

@ -2,4 +2,9 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.tms.basicdata.logisticsroute.mapper.LogisticsRouteMapper">
<select id="getDistance" resultType="java.lang.Integer">
SELECT kilometers FROM tms_logistics_route WHERE
start_city = #{pickUpHub}
AND target_city = #{deliveryAddress}
</select>
</mapper>

View File

@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.tms.constant.TmsConstants;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
@ -185,9 +186,9 @@ public class VehicleInOutController extends JeecgController<VehicleInOut, IVehic
if (vehicleInOut.getCurrentStatus() != null && Integer.parseInt(vehicleInOut.getCurrentStatus()) <= Integer.parseInt(byId.getCurrentStatus())) {
return Result.error("操作失败,请按照流程操作!");
}
if ("3".equals(vehicleInOut.getCurrentStatus())) {
if (TmsConstants.currentStatus_3.equals(vehicleInOut.getCurrentStatus())) {
vehicleInOut.setAtaTime(new Date());
} else if ("4".equals(vehicleInOut.getCurrentStatus())) {
} else if (TmsConstants.currentStatus_4.equals(vehicleInOut.getCurrentStatus())) {
vehicleInOut.setAtdTime(new Date());
}
vehicleInOutService.updateById(vehicleInOut);
@ -214,7 +215,7 @@ public class VehicleInOutController extends JeecgController<VehicleInOut, IVehic
vehicleInOut.setId(null)
.setCreateTime(null)
.setCreateBy(null)
.setCurrentStatus("1")
.setCurrentStatus(TmsConstants.currentStatus_1)
.setPo(vehicleInOut.getPo())
.setVehicleDemandCountId(vehicleInOut.getId());
vehicleInOutService.save(vehicleInOut);

View File

@ -0,0 +1,18 @@
package org.jeecg.modules.tms.constant;
/**
* @Description
* @Author admin
* @Date 2025/6/10 8:41
*/
public class TmsConstants {
public static String currentStatus_0 = "0";
public static String currentStatus_1 = "1";
public static String currentStatus_2 = "2";
public static String currentStatus_3 = "3";
public static String currentStatus_4 = "4";
public static String shipType_0 = "0";
public static String shipType_1 = "1";
public static String shipType_2 = "2";
}

View File

@ -129,11 +129,14 @@ public class DeliveryDemandController extends JeecgController<DeliveryDemand, ID
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody DeliveryDemand deliveryDemand) {
deliveryDemandService.updateById(deliveryDemand);
LambdaQueryWrapper<DeliveryDemandDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DeliveryDemandDetail::getDeliveryDemandId, deliveryDemand.getId());
deliveryDemandDetailService.remove(lambdaQueryWrapper);
List<DeliveryDemandDetail> deliveryDemandDetailList = deliveryDemand.getDeliveryDemandDetailList();
deliveryDemandDetailList.forEach(item ->{
item.setDeliveryDemandId(deliveryDemand.getId());
});
deliveryDemandDetailService.saveOrUpdateBatch(deliveryDemandDetailList);
deliveryDemandDetailService.saveBatch(deliveryDemandDetailList);
return Result.OK("编辑成功!");
}

View File

@ -16,7 +16,6 @@ import org.jeecg.modules.tms.outbound.deliverydemanddetail.entity.DeliveryDemand
*/
public interface DeliveryDemandMapper extends BaseMapper<DeliveryDemand> {
void updateCurrentStatus(@Param("shipType") String shipType,
@Param("pn") String pn,
@Param("deliveryAddress") String deliveryAddress,
@Param("pickUpHub") String pickUpHub,
@Param("shipDate") Date shipDate,

View File

@ -6,7 +6,6 @@
update tms_delivery_demand
set current_status = '1', vd_no = #{sequence}
where ship_type = #{shipType}
and pn = #{pn}
and delivery_address = #{deliveryAddress}
and pick_up_hub = #{pickUpHub}
and ship_date = #{shipDate}

View File

@ -22,6 +22,12 @@ public interface IDeliveryDemandService extends IService<DeliveryDemand> {
*/
Result<?> handleMerge(List<String> ids);
/**
* 定时合并
* @return
*/
void timedMerge();
/**
* 根据料号规格发货数量计算托盘数
* @param deliveryDemands

View File

@ -10,6 +10,7 @@ import org.jeecg.modules.tms.basicdata.constant.GeneralSequenceConstant;
import org.jeecg.modules.tms.basicdata.generalsequence.service.IGeneralSequenceService;
import org.jeecg.modules.tms.basicdata.vehicleproduct.entity.TmsVehicleProduct;
import org.jeecg.modules.tms.basicdata.vehicleproduct.mapper.TmsVehicleProductMapper;
import org.jeecg.modules.tms.constant.TmsConstants;
import org.jeecg.modules.tms.outbound.deliverydemand.entity.DeliveryDemand;
import org.jeecg.modules.tms.outbound.deliverydemand.mapper.DeliveryDemandMapper;
import org.jeecg.modules.tms.outbound.deliverydemand.service.IDeliveryDemandService;
@ -45,32 +46,32 @@ public class DeliveryDemandServiceImpl extends ServiceImpl<DeliveryDemandMapper,
@Transactional(rollbackFor = Exception.class)
public Result<?> handleMerge(List<String> ids) {
List<DeliveryDemand> deliveryDemands = deliveryDemandMapper.selectBatchIds(ids);
boolean hasEven = deliveryDemands.stream().anyMatch(item -> "0".equals(item.getShipType()));
boolean hasEven = deliveryDemands.stream().anyMatch(item -> TmsConstants.shipType_2.equals(item.getShipType()));
if (hasEven) {
return Result.error("数据中含有整车数据!");
return Result.error("数据中含有快递数据!");
}
boolean hasEven1 = deliveryDemands.stream().anyMatch(item -> !"0".equals(item.getCurrentStatus()));
boolean hasEven1 = deliveryDemands.stream().anyMatch(item -> !TmsConstants.currentStatus_0.equals(item.getCurrentStatus()));
if (hasEven1) {
return Result.error("数据中含有当前状态不是创建的数据!");
}
// 将需要合并的数据进行分组 shipType, pn, deliveryAddress, pickUpHub 为key
// 将需要合并的数据进行分组 shipType, deliveryAddress, pickUpHub, shipDate 为key
Map<String, VehicleDemand> mergedMap = deliveryDemands.stream()
.collect(Collectors.toMap(
demand -> String.format("%s|%s|%s|%s|%s",
demand -> String.format("%s|%s|%s|%s",
demand.getShipType(),
demand.getPn(),
demand.getDeliveryAddress(),
demand.getPickUpHub(),
demand.getShipDate()),
demand -> {
VehicleDemand merged = new VehicleDemand();
merged.setShipType(demand.getShipType());
merged.setPn(demand.getPn());
merged.setDeliveryAddress(demand.getDeliveryAddress());
merged.setPickUpHub(demand.getPickUpHub());
merged.setShipDate(demand.getShipDate());
merged.setTotalPallets(demand.getPalletsNum());
merged.setPreTotalPallets(demand.getPalletsNum());
merged.setTotalShips(demand.getShipNumber());
merged.setDeliveryDate(demand.getDeliveryDate());
return merged;
}, (merged1, merged2) -> {
merged1.setTotalPallets(
@ -90,24 +91,83 @@ public class DeliveryDemandServiceImpl extends ServiceImpl<DeliveryDemandMapper,
VehicleDemand value = entry.getValue(); // 合并后的值
String[] parts = key.split("\\|");
String shipType = parts[0];
String pn = parts[1];
String deliveryAddress = parts[2];
String pickUpHub = parts[3];
Date shipDate = DateUtil.parse(parts[4], "EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
String deliveryAddress = parts[1];
String pickUpHub = parts[2];
Date shipDate = DateUtil.parse(parts[3], "EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
String sequence = generalSequenceService.getSequence(GeneralSequenceConstant.VEHICLE_DEMAND_NO);
deliveryDemandMapper.updateCurrentStatus(shipType, pn, deliveryAddress, pickUpHub, shipDate, sequence);
deliveryDemandMapper.updateCurrentStatus(shipType, deliveryAddress, pickUpHub, shipDate, sequence);
value.setShipType(shipType)
.setPn(pn)
.setDeliveryAddress(deliveryAddress)
.setPickUpHub(pickUpHub)
.setShipDate(shipDate)
.setVdNo(sequence);
.setVdNo(sequence)
.setCurrentStatus(TmsConstants.currentStatus_0);
vehicleDemands.add(value);
}
vehicleDemandService.saveBatch(vehicleDemands);
return Result.OK("合并成功!");
}
@Override
@Transactional(rollbackFor = Exception.class)
public void timedMerge() {
LambdaQueryWrapper<DeliveryDemand> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DeliveryDemand::getCurrentStatus, TmsConstants.currentStatus_0);
lambdaQueryWrapper.ne(DeliveryDemand::getShipType, TmsConstants.shipType_2);
List<DeliveryDemand> deliveryDemands = deliveryDemandMapper.selectList(lambdaQueryWrapper);
// 将需要合并的数据进行分组 shipType, deliveryAddress, pickUpHub, shipDate 为key
Map<String, VehicleDemand> mergedMap = deliveryDemands.stream()
.collect(Collectors.toMap(
demand -> String.format("%s|%s|%s|%s",
demand.getShipType(),
demand.getDeliveryAddress(),
demand.getPickUpHub(),
demand.getShipDate()),
demand -> {
VehicleDemand merged = new VehicleDemand();
merged.setShipType(demand.getShipType());
merged.setDeliveryAddress(demand.getDeliveryAddress());
merged.setPickUpHub(demand.getPickUpHub());
merged.setShipDate(demand.getShipDate());
merged.setTotalPallets(demand.getPalletsNum());
merged.setPreTotalPallets(demand.getPalletsNum());
merged.setTotalShips(demand.getShipNumber());
merged.setDeliveryDate(demand.getDeliveryDate());
return merged;
}, (merged1, merged2) -> {
merged1.setTotalPallets(
(merged1.getTotalPallets() == null ? 0 : merged1.getTotalPallets()) +
(merged2.getTotalPallets() == null ? 0 : merged2.getTotalPallets())
);
merged1.setTotalShips(
(merged1.getTotalShips() == null ? 0 : merged1.getTotalShips()) +
(merged2.getTotalShips() == null ? 0 : merged2.getTotalShips())
);
return merged1;
}
));
List<VehicleDemand> vehicleDemands = new ArrayList<>();
for (Map.Entry<String, VehicleDemand> entry : mergedMap.entrySet()) {
String key = entry.getKey(); // 拼接的键
VehicleDemand value = entry.getValue(); // 合并后的值
String[] parts = key.split("\\|");
String shipType = parts[0];
String deliveryAddress = parts[1];
String pickUpHub = parts[2];
Date shipDate = DateUtil.parse(parts[3], "EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
String sequence = generalSequenceService.getSequence(GeneralSequenceConstant.VEHICLE_DEMAND_NO);
deliveryDemandMapper.updateCurrentStatus(shipType, deliveryAddress, pickUpHub, shipDate, sequence);
value.setShipType(shipType)
.setDeliveryAddress(deliveryAddress)
.setPickUpHub(pickUpHub)
.setShipDate(shipDate)
.setVdNo(sequence)
.setCurrentStatus(TmsConstants.currentStatus_0);
vehicleDemands.add(value);
}
vehicleDemandService.saveBatch(vehicleDemands);
}
@Override
public Result<?> getPalletsNum(List<DeliveryDemand> deliveryDemands) {
BigDecimal results = BigDecimal.ZERO;

View File

@ -1,5 +1,6 @@
package org.jeecg.modules.tms.outbound.vehicledemand.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -10,9 +11,15 @@ import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.tms.basicdata.constant.GeneralSequenceConstant;
import org.jeecg.modules.tms.basicdata.generalsequence.service.IGeneralSequenceService;
import org.jeecg.modules.tms.basicdata.logisticsroute.mapper.LogisticsRouteMapper;
import org.jeecg.modules.tms.constant.TmsConstants;
import org.jeecg.modules.tms.outbound.deliverydemand.service.IDeliveryDemandService;
import org.jeecg.modules.tms.outbound.vehicledemand.entity.VehicleDemand;
import org.jeecg.modules.tms.outbound.vehicledemand.service.IVehicleDemandService;
@ -23,6 +30,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.tms.outbound.vehicledemandcount.service.IVehicleDemandCountService;
import org.jeecg.modules.tms.outbound.vehicledemandhis.entity.VehicleDemandHis;
import org.jeecg.modules.tms.outbound.vehicledemandhis.service.IVehicleDemandHisService;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
@ -55,8 +64,14 @@ public class VehicleDemandController extends JeecgController<VehicleDemand, IVeh
private IVehicleDemandService vehicleDemandService;
@Autowired
private IVehicleDemandCountService vehicleDemandCountService;
@Autowired
private IDeliveryDemandService deliveryDemandService;
@Autowired
private IDeliveryDemandService deliveryDemandService;
@Autowired
private IVehicleDemandHisService vehicleDemandHisService;
@Autowired
private IGeneralSequenceService generalSequenceService;
@Autowired
private LogisticsRouteMapper logisticsRouteMapper;
/**
* 分页列表查询
@ -204,4 +219,117 @@ public class VehicleDemandController extends JeecgController<VehicleDemand, IVeh
public Result<?> carCount(@RequestBody VehicleDemand vehicleDemand) {
return vehicleDemandService.carCount(vehicleDemand);
}
/**
* 手动合并
* @param ids
* @return
*/
@Transactional(rollbackFor = Exception.class)
@PostMapping("/handleMerge")
public Result<?> handleMerge(@RequestBody List<String> ids) {
List<VehicleDemand> vehicleDemands = vehicleDemandService.listByIds(ids);
boolean hasEven = vehicleDemands.stream().anyMatch(item -> !TmsConstants.currentStatus_0.equals(item.getCurrentStatus()));
if (hasEven) {
return Result.error("数据中含有不是创建状态的数据!");
}
List<VehicleDemandHis> vehicleDemandHisList = BeanUtil.copyToList(vehicleDemands, VehicleDemandHis.class);
Map<String, VehicleDemand> collect = vehicleDemands.stream()
.collect(Collectors.toMap(
vehicleDemand -> String.format("%s|%s",
vehicleDemand.getShipDate(),
vehicleDemand.getShipType()),
vehicleDemand -> {
VehicleDemand merged = new VehicleDemand();
merged.setShipType(vehicleDemand.getShipType());
merged.setDeliveryAddress(vehicleDemand.getDeliveryAddress());
merged.setPickUpHub(vehicleDemand.getPickUpHub());
Integer distance = logisticsRouteMapper.getDistance(vehicleDemand.getPickUpHub(),
vehicleDemand.getDeliveryAddress());
merged.setDistance(distance);
merged.setShipDate(vehicleDemand.getShipDate());
merged.setTotalPallets(vehicleDemand.getTotalPallets());
merged.setPreTotalPallets(vehicleDemand.getPreTotalPallets());
merged.setTotalShips(vehicleDemand.getTotalShips());
merged.setDeliveryDate(vehicleDemand.getDeliveryDate());
return merged;
}, (merged1, merged2) -> {
// 默认策略保留距离更长的那个对象的 pickupHub / deliveryAddress
VehicleDemand longer;
if (merged1.getDistance() == null && merged2.getDistance() == null) {
longer = merged1; // 都为 null默认选 merged1
} else if (merged1.getDistance() == null) {
longer = merged2;
} else if (merged2.getDistance() == null) {
longer = merged1;
} else {
longer = merged1.getDistance() >= merged2.getDistance() ? merged1 : merged2;
}
// 保留距离大的那组 pickupHub/deliveryAddress
merged1.setPickUpHub(longer.getPickUpHub());
merged1.setDeliveryAddress(longer.getDeliveryAddress());
merged1.setTotalPallets(
(merged1.getTotalPallets() == null ? 0 : merged1.getTotalPallets()) +
(merged2.getTotalPallets() == null ? 0 : merged2.getTotalPallets())
);
merged1.setPreTotalPallets(
(merged1.getPreTotalPallets() == null ? 0 : merged1.getPreTotalPallets()) +
(merged2.getPreTotalPallets() == null ? 0 : merged2.getPreTotalPallets())
);
merged1.setTotalShips(
(merged1.getTotalShips() == null ? 0 : merged1.getTotalShips()) +
(merged2.getTotalShips() == null ? 0 : merged2.getTotalShips())
);
return merged1;
}
));
List<VehicleDemand> vehicleDemandList = new ArrayList<>();
for (Map.Entry<String, VehicleDemand> entry : collect.entrySet()) {
String key = entry.getKey();
VehicleDemand value = entry.getValue(); // 合并后的值
String sequence = generalSequenceService.getSequence(GeneralSequenceConstant.VEHICLE_DEMAND_NO);
value.setVdNo(sequence)
.setCurrentStatus(TmsConstants.currentStatus_1);
vehicleDemandList.add(value);
vehicleDemandHisList.forEach(item -> {
if (key.equals(String.format("%s|%s",
item.getShipDate(),
item.getShipType()))) {
item.setVdNoNew(sequence);
}
});
}
// 生成新的用车需求
vehicleDemandService.saveBatch(vehicleDemandList);
// 删除旧的用车需求
vehicleDemandService.removeBatchByIds(vehicleDemands);
// 保存旧的用车需求到历史记录
vehicleDemandHisService.saveBatch(vehicleDemandHisList);
return Result.OK("合并成功!");
}
/**
* 解绑
* @param ids
* @return
*/
@PostMapping("/handleUnbind")
public Result<?> handleUnbind(@RequestBody List<String> ids) {
List<VehicleDemand> vehicleDemands = vehicleDemandService.listByIds(ids);
List<String> vdNoNews = vehicleDemands.stream()
.map(VehicleDemand::getVdNo)
.collect(Collectors.toList());
LambdaQueryWrapper<VehicleDemandHis> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(VehicleDemandHis::getVdNoNew, vdNoNews);
List<VehicleDemandHis> list = vehicleDemandHisService.list(lambdaQueryWrapper);
List<VehicleDemand> vehicleDemandList = BeanUtil.copyToList(list, VehicleDemand.class);
// 恢复原来合并删除的数据
vehicleDemandService.saveBatch(vehicleDemandList);
// 删除合并的数据
vehicleDemandService.removeBatchByIds(ids);
// 删除历史记录
vehicleDemandHisService.removeByIds(list);
return Result.OK("解绑成功!");
}
}

View File

@ -4,10 +4,8 @@ import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
@ -61,6 +59,12 @@ public class VehicleDemand implements Serializable {
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "发货日期")
private Date shipDate;
/**到货日期*/
@Excel(name = "到货日期", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "到货日期")
private Date deliveryDate;
/**发货类型*/
@Excel(name = "发货类型", width = 15, dicCode = "ship_type")
@Dict(dicCode = "ship_type")
@ -72,6 +76,10 @@ public class VehicleDemand implements Serializable {
/**预计装车总托数*/
@Excel(name = "预计装车总托数", width = 15)
@ApiModelProperty(value = "预计装车总托数")
private Integer preTotalPallets;
/**实际装车总托数*/
@Excel(name = "实际装车总托数", width = 15)
@ApiModelProperty(value = "实际装车总托数")
private Integer totalPallets;
/**总发货数量*/
@Excel(name = "总发货数量", width = 15)
@ -81,16 +89,24 @@ public class VehicleDemand implements Serializable {
// @Excel(name = "送货区域", width = 15)
@ApiModelProperty(value = "送货区域")
private String deliveryArea;
/**取货地点*/
@Excel(name = "取货地点", width = 15, dicCode = "pick_up_hub")
@Dict(dicCode = "pick_up_hub")
private String pickUpHub;
/**送货地点*/
@Excel(name = "送货地点", width = 15, dicCode = "delivery_address")
@Dict(dicCode = "delivery_address")
private String deliveryAddress;
/**取货仓库*/
@Excel(name = "取货仓库", width = 15, dicCode = "pick_up_hub")
@Dict(dicCode = "pick_up_hub")
private String pickUpHub;
/**用车需求编号*/
@Excel(name = "用车需求编号", width = 15)
@ApiModelProperty(value = "用车需求编号")
private String vdNo;
/**当前状态 0-创建, 1-已合并需求, 2-计算车辆需求中, 3-发送车辆需求, 4-等待装车,
* 5-车辆离厂完成, 6-取消, 7-超期无效*/
@Excel(name = "当前状态", width = 15, dicCode = "current_status")
@Dict(dicCode = "current_status")
@ApiModelProperty(value = "当前状态")
private java.lang.String currentStatus;
@TableField(exist = false)
private Integer distance;
}

View File

@ -4,6 +4,8 @@ import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.tms.outbound.vehicledemand.entity.VehicleDemand;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 用车需求
* @Author: jeecg-boot

View File

@ -5,8 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.tms.basicdata.constant.GeneralSequenceConstant;
import org.jeecg.modules.tms.basicdata.generalsequence.service.IGeneralSequenceService;
import org.jeecg.modules.tms.basicdata.iogisticsprice.entity.TmsIogisticsPrice;
import org.jeecg.modules.tms.basicdata.iogisticsprice.mapper.TmsIogisticsPriceMapper;
import org.jeecg.modules.tms.basicdata.logisticsroute.mapper.LogisticsRouteMapper;
import org.jeecg.modules.tms.basicdata.vehiclepallet.entity.VehiclePallet;
import org.jeecg.modules.tms.basicdata.vehiclepallet.mapper.VehiclePalletMapper;
import org.jeecg.modules.tms.outbound.deliverydemand.mapper.DeliveryDemandMapper;
@ -16,6 +19,8 @@ import org.jeecg.modules.tms.outbound.vehicledemand.mapper.VehicleDemandMapper;
import org.jeecg.modules.tms.outbound.vehicledemand.service.IVehicleDemandService;
import org.jeecg.modules.tms.outbound.vehicledemandcount.entity.VehicleDemandCount;
import org.jeecg.modules.tms.outbound.vehicledemandcount.service.IVehicleDemandCountService;
import org.jeecg.modules.tms.outbound.vehicledemandhis.entity.VehicleDemandHis;
import org.jeecg.modules.tms.outbound.vehicledemandhis.service.IVehicleDemandHisService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -23,6 +28,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: 用车需求
@ -164,9 +170,9 @@ public class VehicleDemandServiceImpl extends ServiceImpl<VehicleDemandMapper, V
/**
* 拼凑一个用车需求计算的集合
* @param vehicleDemand
* @param vehiclePallet
* @param vehicleDemandCounts
* @param
* @param
* @param
*/
/*private void insertVehicleDemandCount(VehicleDemand vehicleDemand, VehiclePallet vehiclePallet, List<VehicleDemandCount> vehicleDemandCounts) {
VehicleDemandCount vehicleDemandCount = new VehicleDemandCount();

View File

@ -0,0 +1,173 @@
package org.jeecg.modules.tms.outbound.vehicledemandhis.controller;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.tms.outbound.deliverydemand.entity.DeliveryDemand;
import org.jeecg.modules.tms.outbound.vehicledemandcount.entity.VehicleDemandCount;
import org.jeecg.modules.tms.outbound.vehicledemandhis.entity.VehicleDemandHis;
import org.jeecg.modules.tms.outbound.vehicledemandhis.service.IVehicleDemandHisService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 用车需求历史
* @Author: jeecg-boot
* @Date: 2025-06-09
* @Version: V1.0
*/
@Api(tags="tms_vehicle_demand_his")
@RestController
@RequestMapping("/vehicledemanddetail/vehicleDemandDetail")
@Slf4j
public class VehicleDemandHisController extends JeecgController<VehicleDemandHis, IVehicleDemandHisService> {
@Autowired
private IVehicleDemandHisService vehicleDemandDetailService;
/**
* 分页列表查询
*
* @param vehicleDemandDetail
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "tms_vehicle_demand_his-分页列表查询")
@ApiOperation(value="tms_vehicle_demand_his -分页列表查询", notes="tms_vehicle_demand_his -分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<VehicleDemandHis>> queryPageList(VehicleDemandHis vehicleDemandDetail,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<VehicleDemandHis> queryWrapper = QueryGenerator.initQueryWrapper(vehicleDemandDetail, req.getParameterMap());
Page<VehicleDemandHis> page = new Page<VehicleDemandHis>(pageNo, pageSize);
IPage<VehicleDemandHis> pageList = vehicleDemandDetailService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param vehicleDemandDetail
* @return
*/
@AutoLog(value = "tms_vehicle_demand_his -添加")
@ApiOperation(value="tms_vehicle_demand_his -添加", notes="tms_vehicle_demand_his -添加")
//@RequiresPermissions("org.jeecg.modules.tms:tms_vehicle_demand_his:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody VehicleDemandHis vehicleDemandDetail) {
vehicleDemandDetailService.save(vehicleDemandDetail);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param vehicleDemandDetail
* @return
*/
@AutoLog(value = "tms_vehicle_demand_his -编辑")
@ApiOperation(value="tms_vehicle_demand_his -编辑", notes="tms_vehicle_demand_his -编辑")
//@RequiresPermissions("org.jeecg.modules.tms:tms_vehicle_demand_his:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody VehicleDemandHis vehicleDemandDetail) {
vehicleDemandDetailService.updateById(vehicleDemandDetail);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "tms_vehicle_demand_his -通过id删除")
@ApiOperation(value="tms_vehicle_demand_his -通过id删除", notes="tms_vehicle_demand_his -通过id删除")
//@RequiresPermissions("org.jeecg.modules.tms:tms_vehicle_demand_his:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
vehicleDemandDetailService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "tms_vehicle_demand_his -批量删除")
@ApiOperation(value="tms_vehicle_demand_his -批量删除", notes="tms_vehicle_demand_his -批量删除")
//@RequiresPermissions("org.jeecg.modules.tms:tms_vehicle_demand_his:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.vehicleDemandDetailService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "tms_vehicle_demand_his-通过id查询")
@ApiOperation(value="tms_vehicle_demand_his -通过id查询", notes="tms_vehicle_demand_his -通过id查询")
@GetMapping(value = "/queryById")
public Result<VehicleDemandHis> queryById(@RequestParam(name="id",required=true) String id) {
VehicleDemandHis vehicleDemandDetail = vehicleDemandDetailService.getById(id);
if(vehicleDemandDetail==null) {
return Result.error("未找到对应数据");
}
return Result.OK(vehicleDemandDetail);
}
/**
* 导出excel
*
* @param request
* @param vehicleDemandDetail
*/
//@RequiresPermissions("org.jeecg.modules.tms:tms_vehicle_demand_his:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, VehicleDemandHis vehicleDemandDetail) {
return super.exportXls(request, vehicleDemandDetail, VehicleDemandHis.class, "tms_vehicle_demand_his");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
//@RequiresPermissions("tms_vehicle_demand_his:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, VehicleDemandHis.class);
}
@GetMapping(value = "/getByVdNo")
public Result<?> getByVdNo(@RequestParam(name="vdNo",required=true) String vdNo) {
List<VehicleDemandHis> vdNos = vehicleDemandDetailService.query().eq("vd_no_new", vdNo).list();
IPage<VehicleDemandHis> page = new Page<>(1, vdNos.size());
page.setRecords(vdNos);
page.setTotal(vdNos.size());
return Result.OK(page);
}
}

View File

@ -0,0 +1,112 @@
package org.jeecg.modules.tms.outbound.vehicledemandhis.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.common.aspect.annotation.Dict;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 用车需求历史
* @Author: jeecg-boot
* @Date: 2025-06-09
* @Version: V1.0
*/
@Data
@TableName("tms_vehicle_demand_his")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="tms_vehicle_demand_his对象", description="tms_vehicle_demand_his")
public class VehicleDemandHis implements Serializable {
private static final long serialVersionUID = 1L;
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private String id;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建日期")
private Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private Date updateTime;
/**所属部门*/
@ApiModelProperty(value = "所属部门")
private String sysOrgCode;
/**发货日期*/
@Excel(name = "发货日期", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "发货日期")
private Date shipDate;
/**到货日期*/
@Excel(name = "到货日期", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern="yyyy-MM-dd")
@ApiModelProperty(value = "到货日期")
private Date deliveryDate;
/**发货类型*/
@Excel(name = "发货类型", width = 15, dicCode = "ship_type")
@Dict(dicCode = "ship_type")
private String shipType;
/**料号*/
@Excel(name = "料号", width = 15)
@ApiModelProperty(value = "料号")
private String pn;
/**预计装车总托数*/
@Excel(name = "预计装车总托数", width = 15)
@ApiModelProperty(value = "预计装车总托数")
private Integer preTotalPallets;
/**实际装车总托数*/
@Excel(name = "实际装车总托数", width = 15)
@ApiModelProperty(value = "实际装车总托数")
private Integer totalPallets;
/**总发货数量*/
@Excel(name = "总发货数量", width = 15)
@ApiModelProperty(value = "总发货数量")
private Integer totalShips;
/**送货区域*/
// @Excel(name = "送货区域", width = 15)
@ApiModelProperty(value = "送货区域")
private String deliveryArea;
/**取货地点*/
@Excel(name = "取货地点", width = 15, dicCode = "pick_up_hub")
@Dict(dicCode = "pick_up_hub")
private String pickUpHub;
/**送货地点*/
@Excel(name = "送货地点", width = 15, dicCode = "delivery_address")
@Dict(dicCode = "delivery_address")
private String deliveryAddress;
/**用车需求编号*/
@Excel(name = "用车需求编号", width = 15)
@ApiModelProperty(value = "用车需求编号")
private String vdNo;
/**当前状态 0-创建, 1-已合并需求, 2-计算车辆需求中, 3-发送车辆需求, 4-等待装车,
* 5-车辆离厂完成, 6-取消, 7-超期无效*/
@Excel(name = "当前状态", width = 15, dicCode = "current_status")
@Dict(dicCode = "current_status")
@ApiModelProperty(value = "当前状态")
private java.lang.String currentStatus;
/**新的用车需求编号*/
private String vdNoNew;
}

View File

@ -0,0 +1,14 @@
package org.jeecg.modules.tms.outbound.vehicledemandhis.mapper;
import org.jeecg.modules.tms.outbound.vehicledemandhis.entity.VehicleDemandHis;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 用车需求历史
* @Author: jeecg-boot
* @Date: 2025-06-09
* @Version: V1.0
*/
public interface VehicleDemandHisMapper extends BaseMapper<VehicleDemandHis> {
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.tms.outbound.vehicledemandhis.mapper.VehicleDemandHisMapper">
</mapper>

View File

@ -0,0 +1,14 @@
package org.jeecg.modules.tms.outbound.vehicledemandhis.service;
import org.jeecg.modules.tms.outbound.vehicledemandhis.entity.VehicleDemandHis;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 用车需求历史
* @Author: jeecg-boot
* @Date: 2025-06-09
* @Version: V1.0
*/
public interface IVehicleDemandHisService extends IService<VehicleDemandHis> {
}

View File

@ -0,0 +1,19 @@
package org.jeecg.modules.tms.outbound.vehicledemandhis.service.impl;
import org.jeecg.modules.tms.outbound.vehicledemandhis.entity.VehicleDemandHis;
import org.jeecg.modules.tms.outbound.vehicledemandhis.mapper.VehicleDemandHisMapper;
import org.jeecg.modules.tms.outbound.vehicledemandhis.service.IVehicleDemandHisService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 用车需求历史
* @Author: jeecg-boot
* @Date: 2025-06-09
* @Version: V1.0
*/
@Service
public class VehicleDemandHisServiceImpl extends ServiceImpl<VehicleDemandHisMapper, VehicleDemandHis> implements IVehicleDemandHisService {
}

View File

@ -0,0 +1,25 @@
package org.jeecg.modules.tms.quartz.jobs;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.tms.outbound.deliverydemand.service.IDeliveryDemandService;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @Description
* @Author admin
* @Date 2025/6/9 15:59
*/
@Slf4j
public class DeliveryDemandJob implements Job {
@Autowired
private IDeliveryDemandService deliveryDemandService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("========发货需求自动合并开始=======");
deliveryDemandService.timedMerge();
log.info("========发货需求自动合并结束=======");
}
}