已添加1个文件
已修改16个文件
405 ■■■■ 文件已修改
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/UploadImageDTO.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceRepair.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceRepairMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -6,6 +6,7 @@
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class DeviceMaintenanceDto {
@@ -66,4 +67,14 @@
    @ApiModelProperty("创建人名称")
    private String createUserName;
    @ApiModelProperty("领用备件ids")
    private String sparePartsIds;
    private String sparePartsNames;
    @ApiModelProperty("图片URL数组")
    private List<UploadImageDTO> imagesFile;
}
src/main/java/com/ruoyi/device/dto/DeviceRepairDto.java
@@ -69,6 +69,10 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("领用备件ids")
    private String sparePartsIds;
    private String sparePartsNames;
}
src/main/java/com/ruoyi/device/dto/UploadImageDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.device.dto;
import lombok.Data;
@Data
public class UploadImageDTO {
    private String name;
    private String type;
    private String url;
}
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -3,13 +3,16 @@
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.device.dto.UploadImageDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("device_maintenance")
@@ -84,4 +87,13 @@
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty("领用备件ids")
    private String sparePartsIds;
    /**
     * å›¾ç‰‡URL数组
     */
    @TableField(value = "images_file", typeHandler = JacksonTypeHandler.class)
    private List<UploadImageDTO> imagesFile;
}
src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -73,4 +73,8 @@
    private Long tenantId;
    @ApiModelProperty("领用备件ids")
    private String sparePartsIds;
}
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -4,26 +4,34 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.xiaoymin.knife4j.core.util.StrUtil;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceMaintenanceDto;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.execl.DeviceMaintenanceExeclDto;
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.IDeviceMaintenanceService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class DeviceMaintenanceServiceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements IDeviceMaintenanceService {
    @Autowired
    private SparePartsMapper sparePartsMapper;
    @Autowired
    private DeviceMaintenanceMapper deviceMaintenanceMapper;
@@ -31,7 +39,44 @@
    @Override
    public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) {
        return deviceMaintenanceMapper.queryPage(page, deviceMaintenanceDto);
        IPage<DeviceMaintenanceDto> deviceMaintenanceDtoIPage = deviceMaintenanceMapper.queryPage(page, deviceMaintenanceDto);
        List<DeviceMaintenanceDto> records = deviceMaintenanceDtoIPage.getRecords();
        if (!CollectionUtils.isEmpty(records)) {
            // 1. èŽ·å–æ‰€æœ‰å”¯ä¸€çš„å¤‡ä»¶ID
            Set<String> allIds = records.stream()
                    .map(DeviceMaintenanceDto::getSparePartsIds)
                    .filter(StrUtil::isNotBlank)
                    .flatMap(ids -> Arrays.stream(StringUtils.split(ids, ",")))
                    .map(String::trim)
                    .filter(StrUtil::isNotBlank)
                    .collect(Collectors.toSet());
            if (!allIds.isEmpty()) {
                // 2. æŸ¥è¯¢å¹¶åˆ›å»ºID到名称的映射
                Map<Long, String> idToNameMap = sparePartsMapper.selectBatchIds(new ArrayList<>(allIds))
                        .stream()
                        .collect(Collectors.toMap(
                                SpareParts::getId,
                                SpareParts::getName,
                                (v1, v2) -> v1
                        ));
                // 3. ä¸ºæ¯ä¸ªè®°å½•设置备件名称
                records.forEach(record -> {
                    String names = Optional.ofNullable(record.getSparePartsIds())
                            .filter(StrUtil::isNotBlank)
                            .map(ids -> Arrays.stream(StringUtils.split(ids, ","))
                                    .map(String::trim)
                                    .map(Long::valueOf)
                                    .map(idToNameMap::get)
                                    .filter(Objects::nonNull)
                                    .collect(Collectors.joining(",")))
                            .orElse("");
                    record.setSparePartsNames(names);
                });
            }
        }
        return deviceMaintenanceDtoIPage;
    }
    @Override
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -1,8 +1,11 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.xiaoymin.knife4j.core.util.StrUtil;
import com.google.common.collect.Lists;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
@@ -15,15 +18,20 @@
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.device.service.IDeviceRepairService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@@ -36,10 +44,51 @@
    private DeviceRepairMapper deviceRepairMapper;
    @Autowired
    private IDeviceLedgerService deviceLedgerService;
    @Autowired
    private SparePartsMapper sparePartsMapper;
    @Override
    public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
        IPage<DeviceRepairDto> deviceRepairDtoIPage = deviceRepairMapper.queryPage(page, deviceRepairDto);
        return deviceRepairMapper.queryPage(page, deviceRepairDto);
        List<DeviceRepairDto> records = deviceRepairDtoIPage.getRecords();
        if (!CollectionUtils.isEmpty(records)) {
            // 1. èŽ·å–æ‰€æœ‰å”¯ä¸€çš„å¤‡ä»¶ID
            Set<String> allIds = records.stream()
                    .map(DeviceRepairDto::getSparePartsIds)
                    .filter(StrUtil::isNotBlank)
                    .flatMap(ids -> Arrays.stream(StringUtils.split(ids, ",")))
                    .map(String::trim)
                    .filter(StrUtil::isNotBlank)
                    .collect(Collectors.toSet());
            if (!allIds.isEmpty()) {
                // 2. æŸ¥è¯¢å¹¶åˆ›å»ºID到名称的映射
                Map<Long, String> idToNameMap = sparePartsMapper.selectBatchIds(new ArrayList<>(allIds))
                        .stream()
                        .collect(Collectors.toMap(
                                SpareParts::getId,
                                SpareParts::getName,
                                (v1, v2) -> v1
                        ));
                // 3. ä¸ºæ¯ä¸ªè®°å½•设置备件名称
                records.forEach(record -> {
                    String names = Optional.ofNullable(record.getSparePartsIds())
                            .filter(StrUtil::isNotBlank)
                            .map(ids -> Arrays.stream(StringUtils.split(ids, ","))
                                    .map(String::trim)
                                    .map(Long::valueOf)
                                    .map(idToNameMap::get)
                                    .filter(Objects::nonNull)
                                    .collect(Collectors.joining(",")))
                            .orElse("");
                    record.setSparePartsNames(names);
                });
            }
        }
        return deviceRepairDtoIPage;
    }
    @Override
@@ -48,7 +97,7 @@
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        boolean save = this.save(deviceRepair);
        if (save){
        if (save) {
            return AjaxResult.success();
        }
        return AjaxResult.error();
@@ -63,7 +112,7 @@
            deviceDefectRecordDto.setDeviceLedgerId(id);
            deviceDefectRecordDto.setStatus("严重缺陷");
            List<DeviceDefectRecordDto> records = deviceDefectRecordService.listPage(new Page<>(1, -1), deviceDefectRecordDto).getRecords();
            if (!records.isEmpty()){
            if (!records.isEmpty()) {
                records.forEach(deviceDefectRecord -> {
                    deviceDefectRecord.setStatus("正常");
                    deviceDefectRecordService.updateByDDR(deviceDefectRecord);
@@ -81,21 +130,21 @@
            ArrayList<DeviceRepairExeclDto> deviceLedgerExeclDtos = new ArrayList<>();
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto);
                BeanUtils.copyProperties(deviceRepair, deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : deviceRepair.getStatus() == 1 ? "完结" : "失败");
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
            });
            ExcelUtil<DeviceRepairExeclDto> util = new ExcelUtil<DeviceRepairExeclDto>(DeviceRepairExeclDto.class);
            util.exportExcel(response, deviceLedgerExeclDtos, "设备报修导出");
        }else {
        } else {
            ArrayList<Long> arrayList = new ArrayList<>();
            Arrays.stream(ids).map(arrayList::add);
            List<DeviceRepair> supplierManageList = deviceRepairMapper.selectBatchIds(arrayList);
            ArrayList<DeviceRepairExeclDto> deviceLedgerExeclDtos = new ArrayList<>();
            supplierManageList.stream().forEach(deviceRepair -> {
                DeviceRepairExeclDto deviceRepairExeclDto = new DeviceRepairExeclDto();
                BeanUtils.copyProperties(deviceRepair,deviceRepairExeclDto);
                BeanUtils.copyProperties(deviceRepair, deviceRepairExeclDto);
                deviceRepairExeclDto.setStatusStr(deviceRepair.getStatus() == 0 ? "待维修" : deviceRepair.getStatus() == 1 ? "完结" : "失败");
                deviceLedgerExeclDtos.add(deviceRepairExeclDto);
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
@@ -58,4 +58,10 @@
        return AjaxResult.success(sparePartsService.removeById(id));
    }
    @GetMapping("getByIdDeviceId")
    @ApiOperation("备件分类-查询")
    public AjaxResult getByDeviceId(Long deviceLedgerId){
        return AjaxResult.success(sparePartsService.getByDeviceId(deviceLedgerId));
    }
}
src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
@@ -8,7 +8,11 @@
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SparePartsMapper extends BaseMapper<SpareParts> {
    IPage<SparePartsDto> listPage(Page page,@Param("spareParts") SpareParts spareParts);
    List<SparePartsDto> getByDeviceId(@Param("id") Long id);
}
src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
@@ -13,4 +13,6 @@
    IPage<SparePartsDto> listPage(Page page, SpareParts spareParts);
    List<SparePartsDto> getTree();
    List<SparePartsDto> getByDeviceId(Long id);
}
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
@@ -15,10 +15,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -52,6 +49,11 @@
        return buildTree(records);
    }
    @Override
    public List<SparePartsDto> getByDeviceId(Long id) {
        return sparePartsMapper.getByDeviceId(id);
    }
    /**
     * å°†æ‰å¹³ç»“构数据转换为树形结构
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -81,43 +81,45 @@
        productProcessRoute.setBomId(processRoute.getBomId());
        productProcessRouteMapper.insert(productProcessRoute);
        //新增生产订单下的工艺路线子表
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
        //添加排序,执行最后一道工序的工单
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()).orderByDesc(ProcessRouteItem::getDragSort));
        // ç”Ÿæˆå½“前日期的前缀:年月日
        String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        for (ProcessRouteItem processRouteItem : processRouteItems) {
            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
            productProcessRouteItem.setProductOrderId(productOrder.getId());
            productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
            productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
            int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
            if (insert > 0) {
                // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
                ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                int sequenceNumber = 1; // é»˜è®¤åºå·
                if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                    String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                    if (lastNo.startsWith(datePrefix)) {
                        String seqStr = lastNo.substring(datePrefix.length());
                        try {
                            sequenceNumber = Integer.parseInt(seqStr) + 1;
                        } catch (NumberFormatException e) {
                            sequenceNumber = 1;
                        }
        ProcessRouteItem processRouteItem = processRouteItems.get(0);
//        for (ProcessRouteItem processRouteItem : processRouteItems) {
        ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
        productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
        productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
        productProcessRouteItem.setProductOrderId(productOrder.getId());
        productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
        productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
        int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
        if (insert > 0) {
            // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
            ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
            int sequenceNumber = 1; // é»˜è®¤åºå·
            if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                if (lastNo.startsWith(datePrefix)) {
                    String seqStr = lastNo.substring(datePrefix.length());
                    try {
                        sequenceNumber = Integer.parseInt(seqStr) + 1;
                    } catch (NumberFormatException e) {
                        sequenceNumber = 1;
                    }
                }
                // ç”Ÿæˆå®Œæ•´çš„工单号
                String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
                ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                productWorkOrder.setProductOrderId(productOrder.getId());
                ProductOrder order = productOrderMapper.selectById(productOrder.getId());
                productWorkOrder.setPlanQuantity(order.getQuantity());
                productWorkOrder.setWorkOrderNo(workOrderNoStr);
                productWorkOrder.setStatus(1);
                productWorkOrderMapper.insert(productWorkOrder);
            }
            // ç”Ÿæˆå®Œæ•´çš„工单号
            String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
            ProductWorkOrder productWorkOrder = new ProductWorkOrder();
            productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
            productWorkOrder.setProductOrderId(productOrder.getId());
            ProductOrder order = productOrderMapper.selectById(productOrder.getId());
            productWorkOrder.setPlanQuantity(order.getQuantity());
            productWorkOrder.setWorkOrderNo(workOrderNoStr);
            productWorkOrder.setStatus(1);
            productWorkOrderMapper.insert(productWorkOrder);
//            }
        }
        return productOrderMapper.updateById(productOrder);
    }
@@ -149,11 +151,11 @@
        //如果已经开始生产,不能删除
        //查询生产订单下的工单
        List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
        if (productWorkOrders.size()>0){
        if (productWorkOrders.size() > 0) {
            //判断是否有报工数据
            List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery()
                    .in(ProductionProductMain::getWorkOrderId, productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList())));
            if (productionProductMains.size()>0){
            if (productionProductMains.size() > 0) {
                throw new RuntimeException("生产订单已经开始生产,不能删除");
            }
            //删除工单
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -329,8 +329,8 @@
        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
        //删除不需要质检的合格入库
        stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
        //删除投入对应的出库记录
        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
        //删除投入对应的出库记录  ä¸æ‰§è¡Œå‡ºåº“,对应的删除出库也不执行
//        stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
        // åˆ é™¤ä¸»è¡¨
        productionProductMainMapper.deleteById(productionProductMain.getId());
        return true;
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -85,7 +85,6 @@
    private StockUtils stockUtils;
    @Autowired
    private ProductStructureMapper productStructureMapper;
    @Autowired
@@ -104,14 +103,14 @@
//        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
//                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
        if (!CollectionUtils.isEmpty(salesLedgerProducts)) {
            salesLedgerProducts.forEach(item -> {
                // å‘货信息
                ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
                        .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
                        .orderByDesc(ShippingInfo::getCreateTime)
                        .last("limit 1"));
                if(shippingInfo != null){
                if (shippingInfo != null) {
                    item.setShippingDate(shippingInfo.getShippingDate());
                    item.setShippingCarNumber(shippingInfo.getShippingCarNumber());
                    item.setShippingStatus(shippingInfo.getStatus());
@@ -131,8 +130,8 @@
                    BigDecimal noInvoiceNum = BigDecimal.ZERO;
                    BigDecimal noInvoiceAmount = BigDecimal.ZERO;
                    for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
                        if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) {
                            invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum());
                            invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                        }
                    }
@@ -166,7 +165,7 @@
        //删除发货信息
        List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
                .in(ShippingInfo::getSalesLedgerProductId, Arrays.asList(ids)));
        if(!CollectionUtils.isEmpty(shippingInfos)){
        if (!CollectionUtils.isEmpty(shippingInfos)) {
            shippingInfoService.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList()));
        }
@@ -203,12 +202,12 @@
    @Transactional(rollbackFor = Exception.class)
    public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
        // å¾…回款,付款
        if(salesLedgerProduct.getType().equals(1)){
        if (salesLedgerProduct.getType().equals(1)) {
            salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal()));
            //未开票数量+金额
            salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity());
            salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
        }else{
        } else {
            salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
            // æœªæ¥ç¥¨æ•°é‡+金额
            salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
@@ -279,7 +278,7 @@
        List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
                .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
                .orderByDesc(ProcessRoute::getCreateTime));
        if (processRoutes.size()>0){
        if (processRoutes.size() > 0) {
            ProcessRoute processRoute = processRoutes.get(0);
            //新增生产订单工艺路线主表
            ProductProcessRoute productProcessRoute = new ProductProcessRoute();
@@ -289,45 +288,46 @@
            productProcessRoute.setBomId(processRoute.getBomId());
            productProcessRouteMapper.insert(productProcessRoute);
            //新增生产订单工艺路线子表
            List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
            // ç”Ÿæˆå½“前日期的前缀:年月日
            List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()).orderByDesc(ProcessRouteItem::getDragSort));
            // ç”Ÿæˆå½“前日期的前缀:年月日‘
            ProcessRouteItem processRouteItem = processRouteItems.get(0);
            String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            for (ProcessRouteItem processRouteItem : processRouteItems) {
                ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
                productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                productProcessRouteItem.setProductOrderId(productOrder.getId());
                productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
                productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
                int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
                if (insert > 0) {
                    // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
                    ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                    int sequenceNumber = 1; // é»˜è®¤åºå·
                    if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                        String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                        if (lastNo.startsWith(datePrefix)) {
                            String seqStr = lastNo.substring(datePrefix.length());
                            try {
                                sequenceNumber = Integer.parseInt(seqStr) + 1;
                            } catch (NumberFormatException e) {
                                sequenceNumber = 1;
                            }
//            for (ProcessRouteItem processRouteItem : processRouteItems) {
            ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
            productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
            productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
            productProcessRouteItem.setProductOrderId(productOrder.getId());
            productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
            productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
            int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
            if (insert > 0) {
                // æŸ¥è¯¢ä»Šæ—¥å·²å­˜åœ¨çš„æœ€å¤§å·¥å•号
                ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
                int sequenceNumber = 1; // é»˜è®¤åºå·
                if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
                    String lastNo = lastWorkOrder.getWorkOrderNo().toString();
                    if (lastNo.startsWith(datePrefix)) {
                        String seqStr = lastNo.substring(datePrefix.length());
                        try {
                            sequenceNumber = Integer.parseInt(seqStr) + 1;
                        } catch (NumberFormatException e) {
                            sequenceNumber = 1;
                        }
                    }
                    // ç”Ÿæˆå®Œæ•´çš„工单号
                    String workOrderNoStr ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
                    ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                    productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                    productWorkOrder.setProductOrderId(productOrder.getId());
                    productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                    productWorkOrder.setWorkOrderNo(workOrderNoStr);
                    productWorkOrder.setStatus(1);
                    productWorkOrderMapper.insert(productWorkOrder);
                }
                // ç”Ÿæˆå®Œæ•´çš„工单号
                String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
                ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                productWorkOrder.setProductOrderId(productOrder.getId());
                productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
                productWorkOrder.setWorkOrderNo(workOrderNoStr);
                productWorkOrder.setStatus(1);
                productWorkOrderMapper.insert(productWorkOrder);
            }
//            }
            productOrder.setRouteId(processRoute.getId());
            productOrderMapper.updateById(productOrder);
        }
@@ -431,9 +431,9 @@
        IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct);
        salesLedgerProductDtoIPage.getRecords().forEach(item -> {
            // åˆ¤æ–­çŠ¶æ€
            if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){
            if (item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0) {
                item.setStatusName("已完成付款");
            }else{
            } else {
                item.setStatusName("未完成付款");
            }
        });
@@ -445,9 +445,9 @@
        IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct);
        salesLedgerProductDtoIPage.getRecords().forEach(item -> {
            // åˆ¤æ–­çŠ¶æ€
            if(item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0){
            if (item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0) {
                item.setStatusName("已完成付款");
            }else{
            } else {
                item.setStatusName("未完成付款");
            }
        });
@@ -488,6 +488,7 @@
            throw new RuntimeException("动态更新主表金额失败", e);
        }
    }
    @Override
    public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
        //获取产品最新的工艺路线
@@ -506,7 +507,7 @@
            //所需数量
            BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity());
            BigDecimal subtract =stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
            BigDecimal subtract = stockInventory.getQualitity().subtract(stockInventory.getLockedQuantity()).subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING);
            if (subtract.compareTo(BigDecimal.ZERO) <= 0) {
                count++;
                stringBuffer.append(productStructureDto.getProductName())
@@ -517,9 +518,9 @@
                        .append(System.lineSeparator());
            }
        }
        if (count>0) {
        if (count > 0) {
            return R.fail(stringBuffer.toString());
        }else {
        } else {
            return R.ok();
        }
    }
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -5,8 +5,28 @@
<mapper namespace="com.ruoyi.device.mapper.DeviceMaintenanceMapper">
    <select id="queryPage" resultType="com.ruoyi.device.dto.DeviceMaintenanceDto">
        select dm.id,
    <resultMap id="deviceMaintenanceResultMap" type="com.ruoyi.device.dto.DeviceMaintenanceDto">
        <id property="id" column="id"/>
        <result property="deviceLedgerId" column="device_ledger_id"/>
        <result property="maintenancePlanTime" column="maintenance_plan_time"/>
        <result property="maintenanceActuallyTime" column="maintenance_actually_time"/>
        <result property="status" column="status"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="createUser" column="create_user"/>
        <result property="updateUser" column="update_user"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="maintenanceActuallyName" column="maintenance_actually_name"/>
        <result property="deviceName" column="device_name"/>
        <result property="deviceModel" column="device_model"/>
        <result property="createUserName" column="create_user_name"/>
        <result property="imagesFile" column="images_file"
                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
    </resultMap>
    <select id="queryPage" resultMap="deviceMaintenanceResultMap">
        select
        dm.id,
        dm.device_ledger_id,
        dm.maintenance_plan_time,
        dm.maintenance_actually_time,
@@ -20,31 +40,28 @@
        dm.maintenance_actually_name,
        dl.device_name,
        dl.device_model,
        su.nick_name as create_user_name
        su.nick_name as create_user_name,
        dm.spare_parts_ids
        su.nick_name as create_user_name,
        dm.images_file
        from device_maintenance dm
        left join device_ledger dl on dm.device_ledger_id = dl.id
        left join sys_user su on dm.create_user = su.user_id
        <where>
            1 = 1
            <if test="deviceMaintenanceDto.deviceName != null">
            <if test="deviceMaintenanceDto.deviceName != null and deviceMaintenanceDto.deviceName != ''">
                and dl.device_name like concat('%',#{deviceMaintenanceDto.deviceName},'%')
            </if>
            <if test="deviceMaintenanceDto.deviceModel != null">
            <if test="deviceMaintenanceDto.deviceModel != null and deviceMaintenanceDto.deviceModel != ''">
                and dl.device_model like concat('%',#{deviceMaintenanceDto.deviceModel},'%')
            </if>
            <if test="deviceMaintenanceDto.status != null">
                and dm.status = #{deviceMaintenanceDto.status}
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyName != null">
            <if test="deviceMaintenanceDto.maintenanceActuallyName != null and deviceMaintenanceDto.maintenanceActuallyName != ''">
                and dm.maintenance_actually_name like concat('%',#{deviceMaintenanceDto.maintenanceActuallyName},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenancePlanTime != null">
                and dm.maintenance_plan_time like concat('%',#{deviceMaintenanceDto.maintenancePlanTime},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyTime != null">
                and dm.maintenance_actually_time like concat('%',#{deviceMaintenanceDto.maintenanceActuallyTime},'%')
            </if>
            <if test="deviceMaintenanceDto.maintenanceActuallyTime != null">
            <if test="deviceMaintenanceDto.maintenanceActuallyTime != null and deviceMaintenanceDto.maintenanceActuallyTime != ''">
                and dm.maintenance_actually_time >= str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d')
                and dm.maintenance_actually_time &lt; date_add(str_to_date(#{deviceMaintenanceDto.maintenanceActuallyTime}, '%Y-%m-%d'), interval 1 day)
            </if>
src/main/resources/mapper/device/DeviceRepairMapper.xml
@@ -21,7 +21,8 @@
                dr.update_user,
               dr.tenant_id,
               dl.device_name,
               dl.device_model
               dl.device_model,
               dr.spare_parts_ids
        from device_repair dr
        left join device_ledger dl on dr.device_ledger_id = dl.id
        <where>
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -11,4 +11,9 @@
            </if>
        </where>
    </select>
    <select id="getByDeviceId" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
        SELECT * FROM spare_parts
        WHERE status = '正常'
          AND FIND_IN_SET(#{id}, device_ids) > 0
    </select>
</mapper>