From 3856318dc542210a2b6aa826af043b9ed308b5d3 Mon Sep 17 00:00:00 2001 From: mashuai Date: Fri, 6 Dec 2024 17:22:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lease/domain/LeaseRepairRecord.java | 7 + .../impl/LeaseRepairRecordServiceImpl.java | 237 +++++++++++------- .../material/order/domain/OrderDetailDto.java | 4 + .../lease/LeaseRepairRecordMapper.xml | 7 +- .../mapper/material/order/OrderInfoMapper.xml | 12 +- 5 files changed, 169 insertions(+), 98 deletions(-) diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/domain/LeaseRepairRecord.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/domain/LeaseRepairRecord.java index 7f62b4b..034c560 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/domain/LeaseRepairRecord.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/domain/LeaseRepairRecord.java @@ -87,6 +87,13 @@ public class LeaseRepairRecord extends BaseEntity implements Serializable { @ApiModelProperty(value = "备注") private String remark; + @ApiModelProperty(value = "订单状态") + private Integer orderStatus; + + @ApiModelProperty(value = "订单完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date rentOverTime; + @ApiModelProperty(value = "改价人id") private Long changePriceUser; diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/service/impl/LeaseRepairRecordServiceImpl.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/service/impl/LeaseRepairRecordServiceImpl.java index 8fd1e12..45668a8 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/service/impl/LeaseRepairRecordServiceImpl.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/lease/service/impl/LeaseRepairRecordServiceImpl.java @@ -3,6 +3,7 @@ package com.bonus.material.lease.service.impl; import com.bonus.common.biz.constant.MaterialConstants; import com.bonus.common.biz.domain.BmFileInfo; import com.bonus.common.biz.enums.HttpCodeEnum; +import com.bonus.common.biz.enums.OrderStatusEnum; import com.bonus.common.core.exception.ServiceException; import com.bonus.common.core.utils.DateUtils; import com.bonus.common.core.web.domain.AjaxResult; @@ -24,9 +25,11 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -37,6 +40,8 @@ import java.util.stream.Collectors; @Slf4j public class LeaseRepairRecordServiceImpl implements LeaseRepairRecordService { + private static final String DEVICE_NAME_ERROR = "的数量不能大于设备数量"; + @Resource private LeaseRepairRecordMapper mapper; @@ -98,22 +103,26 @@ public class LeaseRepairRecordServiceImpl implements LeaseRepairRecordService { if (orderInfoDto != null) { leaseRecordDto.setCode(orderInfoDto.getCode()); leaseRecordDto.setMaNumber(orderInfoDto.getMaNumber()); - leaseRecordDto.setRentEndTime(orderInfoDto.getRentEndTime()); - leaseRecordDto.setRentDay(orderInfoDto.getDays()); leaseRecordDto.setLeaseCompany(orderInfoDto.getCzcompanyName()); - leaseRecordDto.setCost(orderInfoDto.getCost()); } List orderDetailList = orderMapper.selectOrderDetailsByOderId(dto.getOrderId()); if (CollectionUtils.isNotEmpty(orderDetailList)) { - leaseRecordDto.setOrderDetailDtoList(orderDetailList); for (OrderDetailDto detailDto : orderDetailList) { + detailDto.setDays(detailDto.getDateDays() == null ? detailDto.getDays() : String.valueOf(detailDto.getDateDays())); if (detailDto.getChangeCost() != null) { leaseRecordDto.setIsChangePrice(1); totalCost = totalCost.add(detailDto.getChangeCost()); } else { - totalCost = totalCost.add(detailDto.getCosts()); + if (detailDto.getDateDays() != null && detailDto.getDateDays() > 0 + && detailDto.getDayLeasePrice() != null) { + BigDecimal newTotalPrice = detailDto.getDayLeasePrice().multiply(new BigDecimal(detailDto.getDateDays())) + .setScale(2, RoundingMode.HALF_UP); + totalCost = totalCost.add(newTotalPrice); + detailDto.setCosts(newTotalPrice); + } } } + leaseRecordDto.setOrderDetailDtoList(orderDetailList); } // 根据订单id查询订单详情 List list = mapper.getLeaseRepairRecordList(dto); @@ -175,7 +184,7 @@ public class LeaseRepairRecordServiceImpl implements LeaseRepairRecordService { * @return */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public AjaxResult add(LeaseRecordDto leaseRecordDto) { if (leaseRecordDto == null || leaseRecordDto.getOrderId() == null || leaseRecordDto.getCode() == null) { return AjaxResult.error(HttpCodeEnum.TO_PARAM_NULL.getCode(), HttpCodeEnum.TO_PARAM_NULL.getMsg()); @@ -275,6 +284,7 @@ public class LeaseRepairRecordServiceImpl implements LeaseRepairRecordService { int result = mapper.update(leaseRepairRecord); //修改订单状态为已完成 if (result > 0) { + leaseRepairRecord.setOrderStatus(OrderStatusEnum.ORDER_FINISHED.getStatus()); result += orderMapper.updateOrder(leaseRepairRecord); } if (result > 0) { @@ -293,95 +303,140 @@ public class LeaseRepairRecordServiceImpl implements LeaseRepairRecordService { int result = 0; for (Integer maId : maIdList) { LeaseRepairRecord leaseRepairRecord = createLeaseRepairRecord(leaseRecordDto); - List repairRecordList = leaseRecordDto.getRepairRecordList().stream() - .filter(item -> item.getMaId().equals(maId)).collect(Collectors.toList()); - List scrapRecordList = leaseRecordDto.getScrapRecordList().stream() - .filter(item -> item.getMaId().equals(maId)).collect(Collectors.toList()); - List lossRecordList = leaseRecordDto.getLossRecordList().stream() - .filter(item -> item.getMaId().equals(maId)).collect(Collectors.toList()); - int repairNum = repairRecordList.stream().mapToInt(record -> Optional.ofNullable(record.getRepairNum()).orElse(0)).sum(); - int scrapNum = scrapRecordList.stream().mapToInt(record -> Optional.ofNullable(record.getScrapNum()).orElse(0)).sum(); - int lossNum = lossRecordList.stream().mapToInt(record -> Optional.ofNullable(record.getLossNum()).orElse(0)).sum(); - // 选择第一个不为空的集合的 getNum() 数量 - int num = 0; - if (!repairRecordList.isEmpty()) { - num = repairRecordList.stream() - .mapToInt(record -> Optional.ofNullable(record.getNum()).orElse(0)) - .sum(); - } else if (!scrapRecordList.isEmpty()) { - num = scrapRecordList.stream() - .mapToInt(record -> Optional.ofNullable(record.getNum()).orElse(0)) - .sum(); - } else if (!lossRecordList.isEmpty()) { - num = lossRecordList.stream() - .mapToInt(record -> Optional.ofNullable(record.getNum()).orElse(0)) - .sum(); - } - if (repairNum > 0 && scrapNum == 0 && lossNum == 0 && repairNum > num) { - throw new ServiceException(repairRecordList.get(0).getDeviceName() + "的维修数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - if (repairNum == 0 && scrapNum > 0 && lossNum == 0 && scrapNum > num) { - throw new ServiceException(scrapRecordList.get(0).getDeviceName() + "的报废数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - if (repairNum == 0 && scrapNum == 0 && lossNum > 0 && lossNum > num) { - throw new ServiceException(lossRecordList.get(0).getDeviceName() + "的丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - if (repairNum > 0 && scrapNum > 0 && lossNum == 0 && repairNum + scrapNum > num) { - throw new ServiceException(repairRecordList.get(0).getDeviceName() + "的维修数量+报废数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - if (repairNum > 0 && scrapNum == 0 && lossNum > 0 && repairNum + lossNum > num) { - throw new ServiceException(repairRecordList.get(0).getDeviceName() + "的维修数量+丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - if (repairNum == 0 && scrapNum > 0 && lossNum > 0 && scrapNum + lossNum > num) { - throw new ServiceException(scrapRecordList.get(0).getDeviceName() + "的报废数量+丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - if (repairNum > 0 && scrapNum > 0 && lossNum > 0 && repairNum + scrapNum + lossNum > num) { - throw new ServiceException(repairRecordList.get(0).getDeviceName() + "的维修数量+报废数量+丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); - } - // 插入维修记录 - if (CollectionUtils.isNotEmpty(repairRecordList)) { - for (LeaseRepairRecord repairRecord : repairRecordList) { - leaseRepairRecord.setMaId(repairRecord.getMaId()); - leaseRepairRecord.setTypeId(repairRecord.getTypeId()); - leaseRepairRecord.setRepairNum(repairRecord.getRepairNum()); - leaseRepairRecord.setRepairPrice(repairRecord.getRepairPrice()); - leaseRepairRecord.setRepairChangePrice(repairRecord.getRepairChangePrice()); - if (CollectionUtils.isNotEmpty(repairRecord.getFileInfoList())) { - bmFileInfoMapper.insertBmFileInfos(repairRecord.getFileInfoList()); - } - } - } - // 插入报废记录 - if (CollectionUtils.isNotEmpty(scrapRecordList)) { - for (LeaseRepairRecord scrapRecord : scrapRecordList) { - leaseRepairRecord.setMaId(scrapRecord.getMaId()); - leaseRepairRecord.setTypeId(scrapRecord.getTypeId()); - leaseRepairRecord.setScrapNum(scrapRecord.getScrapNum()); - leaseRepairRecord.setScrapPrice(scrapRecord.getScrapPrice()); - leaseRepairRecord.setScrapReason(scrapRecord.getScrapReason() == null ? "" : scrapRecord.getScrapReason()); - if (CollectionUtils.isNotEmpty(scrapRecord.getFileInfoList())) { - bmFileInfoMapper.insertBmFileInfos(scrapRecord.getFileInfoList()); - } - } - } - // 插入丢失记录 - if (CollectionUtils.isNotEmpty(lossRecordList)) { - for (LeaseRepairRecord lossRecord : lossRecordList) { - leaseRepairRecord.setMaId(lossRecord.getMaId()); - leaseRepairRecord.setTypeId(lossRecord.getTypeId()); - leaseRepairRecord.setLossNum(lossRecord.getLossNum()); - leaseRepairRecord.setLossPrice(lossRecord.getLossPrice()); - if (CollectionUtils.isNotEmpty(lossRecord.getFileInfoList())) { - bmFileInfoMapper.insertBmFileInfos(lossRecord.getFileInfoList()); - } - } + // 获取对应的记录集合 + List repairRecordList = filterRecordsByMaId(leaseRecordDto.getRepairRecordList(), maId); + List scrapRecordList = filterRecordsByMaId(leaseRecordDto.getScrapRecordList(), maId); + List lossRecordList = filterRecordsByMaId(leaseRecordDto.getLossRecordList(), maId); + + // 获取数量 + int repairNum = sumRecordNum(repairRecordList, LeaseRepairRecord::getRepairNum); + int scrapNum = sumRecordNum(scrapRecordList, LeaseRepairRecord::getScrapNum); + int lossNum = sumRecordNum(lossRecordList, LeaseRepairRecord::getLossNum); + + // 检查数量是否合法 + if (!isValidNumber(repairRecordList, scrapRecordList, lossRecordList, repairNum, scrapNum, lossNum)) { + return AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg()); } + + // 插入维修、报废、丢失记录 + result += insertRepairScrapLossRecords(repairRecordList, leaseRepairRecord); + result += insertRepairScrapLossRecords(scrapRecordList, leaseRepairRecord); + result += insertRepairScrapLossRecords(lossRecordList, leaseRepairRecord); + + // 执行插入操作 result += mapper.insert(leaseRepairRecord); } - if (result > 0) { - return AjaxResult.success(HttpCodeEnum.SUCCESS.getMsg()); + LeaseRepairRecord leaseRepairRecord = new LeaseRepairRecord(); + leaseRepairRecord.setOrderId(leaseRecordDto.getOrderId()); + leaseRepairRecord.setOrderStatus(OrderStatusEnum.ORDER_TERMINATED.getStatus()); + result += orderMapper.updateOrder(leaseRepairRecord); + // 返回结果 + return result > 0 ? AjaxResult.success(HttpCodeEnum.SUCCESS.getMsg()) + : AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg()); + } + + /** + * 根据maId过滤记录 + * @param recordList + * @param maId + * @return + */ + private List filterRecordsByMaId(List recordList, Integer maId) { + return recordList.stream().filter(item -> item.getMaId().equals(maId)).collect(Collectors.toList()); + } + + /** + * 获取数量 + * @param recordList + * @param getNum + * @return + */ + private int sumRecordNum(List recordList, Function getNum) { + return recordList.stream() + .mapToInt(record -> Optional.ofNullable(getNum.apply(record)).orElse(0)) + .sum(); + } + + /** + * 检查数量是否合法 + * @param repairRecordList + * @param scrapRecordList + * @param lossRecordList + * @param repairNum + * @param scrapNum + * @param lossNum + * @return + */ + private boolean isValidNumber(List repairRecordList, List scrapRecordList, + List lossRecordList, int repairNum, int scrapNum, int lossNum) { + int num = getFirstValidRecordNum(repairRecordList, scrapRecordList, lossRecordList); + if (repairNum > 0 && scrapNum == 0 && lossNum == 0 && repairNum > num) { + throw new ServiceException(repairRecordList.get(0).getDeviceName() + DEVICE_NAME_ERROR, HttpCodeEnum.FAIL.getCode()); } - return AjaxResult.error(HttpCodeEnum.FAIL.getCode(), HttpCodeEnum.FAIL.getMsg()); + if (repairNum == 0 && scrapNum > 0 && lossNum == 0 && scrapNum > num) { + throw new ServiceException(scrapRecordList.get(0).getDeviceName() + DEVICE_NAME_ERROR, HttpCodeEnum.FAIL.getCode()); + } + if (repairNum == 0 && scrapNum == 0 && lossNum > 0 && lossNum > num) { + throw new ServiceException(lossRecordList.get(0).getDeviceName() + DEVICE_NAME_ERROR, HttpCodeEnum.FAIL.getCode()); + } + if (repairNum > 0 && scrapNum > 0 && lossNum == 0 && repairNum + scrapNum > num) { + throw new ServiceException(repairRecordList.get(0).getDeviceName() + "的维修数量+报废数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); + } + if (repairNum > 0 && scrapNum == 0 && lossNum > 0 && repairNum + lossNum > num) { + throw new ServiceException(repairRecordList.get(0).getDeviceName() + "的维修数量+丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); + } + if (repairNum == 0 && scrapNum > 0 && lossNum > 0 && scrapNum + lossNum > num) { + throw new ServiceException(scrapRecordList.get(0).getDeviceName() + "的报废数量+丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); + } + if (repairNum > 0 && scrapNum > 0 && lossNum > 0 && repairNum + scrapNum + lossNum > num) { + throw new ServiceException(repairRecordList.get(0).getDeviceName() + "维修数量+报废数量+丢失数量不能大于设备数量", HttpCodeEnum.FAIL.getCode()); + } + return true; + } + + /** + * 获取第一个有效的记录数量 + * @param repairRecordList + * @param scrapRecordList + * @param lossRecordList + * @return + */ + private int getFirstValidRecordNum(List repairRecordList, List scrapRecordList, + List lossRecordList) { + if (!repairRecordList.isEmpty()) { + return sumRecordNum(repairRecordList, LeaseRepairRecord::getNum); + } else if (!scrapRecordList.isEmpty()) { + return sumRecordNum(scrapRecordList, LeaseRepairRecord::getNum); + } else if (!lossRecordList.isEmpty()) { + return sumRecordNum(lossRecordList, LeaseRepairRecord::getNum); + } + return 0; + } + + /** + * 插入维修、报废、丢失记录 + * @param recordList + * @param leaseRepairRecord + * @return + */ + private int insertRepairScrapLossRecords(List recordList, LeaseRepairRecord leaseRepairRecord) { + int result = 0; + for (LeaseRepairRecord record : recordList) { + leaseRepairRecord.setMaId(record.getMaId()); + leaseRepairRecord.setTypeId(record.getTypeId()); + leaseRepairRecord.setRepairNum(record.getRepairNum()); + leaseRepairRecord.setRepairPrice(record.getRepairPrice()); + leaseRepairRecord.setScrapNum(record.getScrapNum()); + leaseRepairRecord.setScrapPrice(record.getScrapPrice()); + leaseRepairRecord.setScrapReason(record.getScrapReason() != null ? record.getScrapReason() : ""); + leaseRepairRecord.setLossNum(record.getLossNum()); + leaseRepairRecord.setLossPrice(record.getLossPrice()); + if (CollectionUtils.isNotEmpty(record.getFileInfoList())) { + bmFileInfoMapper.insertBmFileInfos(record.getFileInfoList()); + } + result++; + } + return result; } /** diff --git a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java index 566f78e..61ee6fb 100644 --- a/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java +++ b/bonus-modules/bonus-material-mall/src/main/java/com/bonus/material/order/domain/OrderDetailDto.java @@ -99,4 +99,8 @@ public class OrderDetailDto { @ApiModelProperty(value = "设备状态") private String maStatus; + + @ApiModelProperty(value = "实际天数") + private Integer dateDays; + } diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/lease/LeaseRepairRecordMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/lease/LeaseRepairRecordMapper.xml index e826a17..425adbc 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/lease/LeaseRepairRecordMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/lease/LeaseRepairRecordMapper.xml @@ -214,9 +214,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" hh.order_status AS orderStatus, CASE WHEN hh.order_status = 5 THEN - '已退租' + '已退租-待结算' WHEN hh.order_status = 6 THEN - '已完成' ELSE '未知' + '已结算-待完成' + WHEN hh.order_status = 7 THEN + '已完成' + ELSE '未知' END AS orderStatusName, hh.create_time AS orderTime, hh.costs AS rentPrice diff --git a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml index 00d4535..efdac63 100644 --- a/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml +++ b/bonus-modules/bonus-material-mall/src/main/resources/mapper/material/order/OrderInfoMapper.xml @@ -73,9 +73,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" UPDATE ma_order_details - SET order_status = 6, - rent_over_user = #{priceConfirmUser}, - rent_over_time = now() + set order_status = #{orderStatus}, + update_time = now() WHERE order_id = #{orderId} @@ -188,7 +187,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT moi.code AS code, COUNT(hh.ma_id) as maNumber, - hh.rent_end_time as rentEndTime, hh.days as days, moi.order_time, c.company_name AS czcompanyName, @@ -249,7 +247,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" hh.take_over_time, hh.rent_over_user, hh.rent_over_time, - hh.change_cost as changeCost + hh.change_cost as changeCost, + CASE + WHEN DATE(hh.rent_over_time) = DATE(hh.pre_outbound_time) THEN 1 + ELSE TIMESTAMPDIFF(DAY, hh.pre_outbound_time, hh.rent_over_time) + 1 + END AS dateDays FROM ma_order_details hh LEFT JOIN ma_order_info moi ON hh.order_id = moi.order_id