buhuazhen
2 天以前 60e741a676ff88385fdf08ed8f506beb979fde54
feat(production): 新增报工主表实体及实现报工主表相关服务逻辑

- 添加 ProductionProductMain 实体类,支持设备信息及报工时间管理
- 扩展 ProductionProductMainDto,包含设备ID、设备名称及工时字段
- 修改 SQL 查询,新增关联设备名称、设备ID及计算工时字段
- 实现 ProductionProductMainServiceImpl,完成报工新增、审核、删除及后续处理逻辑
- 审核流程中根据状态更新工单和生产订单完成数量及时间
- 报工新增时根据工序生成对应质检记录或直接入库处理
- 删除报工时校验不合格处理状态,清理相关库存及核算记录
- 更新 SalesLedgerProductionAccountingDto,新增设备作业信息及解析列表
- 修改分页查询语句,聚合设备作业信息并按调度用户ID分组
- 在服务层解析设备作业信息字符串为列表结构,便于前端展示
已修改7个文件
94 ■■■■ 文件已修改
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -65,4 +65,8 @@
    private Long auditUserId;
    private String auditUserName;
    private Long deviceId;
    private String deviceName;
    private String workMinutes;
}
src/main/java/com/ruoyi/production/dto/SalesLedgerProductionAccountingDto.java
@@ -7,9 +7,10 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import org.apache.commons.lang3.tuple.Pair;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
 * @author :yys
@@ -18,7 +19,7 @@
@Data
@ApiModel
@ExcelIgnoreUnannotated
public class SalesLedgerProductionAccountingDto extends SalesLedgerProductDto{
public class SalesLedgerProductionAccountingDto extends SalesLedgerProductDto {
    /**
     * 生产人id
@@ -88,5 +89,9 @@
    private String dateType;
    private String deviceWorkInfo;
    private List<Pair<String,Integer>> deviceWorkInfoPairList;
}
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -92,4 +92,10 @@
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "end_time")
    private LocalDateTime endTime;
    @TableField(value = "device_id")
    private Long deviceId;
    @TableField(value = "device_name")
    private String deviceName;
}
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -151,6 +151,10 @@
        productionProductMain.setAuditUserId(dto.getAuditUserId());
        productionProductMain.setAuditUserName(dto.getAuditUserName());
        productionProductMain.setStatus(0);
        productionProductMain.setStartTime(dto.getStartTime());
        productionProductMain.setEndTime(dto.getEndTime());
        productionProductMain.setDeviceId(productProcess.getDeviceId());
        productionProductMain.setDeviceName(productProcess.getDeviceName());
        productionProductMainMapper.insert(productionProductMain);
        /*新增报工投入表*/
        List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
src/main/java/com/ruoyi/production/service/impl/SalesLedgerProductionAccountingServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -14,9 +15,13 @@
import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * @author :yys
@@ -56,7 +61,21 @@
            salesLedgerProductionAccountingDto.setEntryDateStart(null);
            salesLedgerProductionAccountingDto.setEntryDateEnd(null);
        }
        return salesLedgerProductionAccountingMapper.pageProductionAccounting(page, salesLedgerProductionAccountingDto);
        IPage<SalesLedgerProductionAccountingDto> salesLedgerProductionAccountingDtoIPage = salesLedgerProductionAccountingMapper.pageProductionAccounting(page, salesLedgerProductionAccountingDto);
        salesLedgerProductionAccountingDtoIPage.getRecords().forEach(it->{
            // 拿到机台统计 分钟-机台, 这样排列
            String deviceWorkInfo = it.getDeviceWorkInfo();
            List<String> str = StrUtil.split(deviceWorkInfo, ">>>");
            List<Pair<String,Integer>> collect = str.stream().map(n1 -> {
                List<String> strPair = StrUtil.split(n1, "|$|");
                if (strPair.size() == 2) {
                    return Pair.of(strPair.get(1),Integer.parseInt(strPair.get(0)));
                }
                return null;
            }).filter(Objects::nonNull).collect(Collectors.toList());
            it.setDeviceWorkInfoPairList(collect);
        });
        return salesLedgerProductionAccountingDtoIPage;
    }
    @Override
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -74,7 +74,13 @@
        slpa.process,
        ppo.quantity,
        slpa.work_hours,
        slpa.work_hours * slpa.finished_num AS wages
        slpa.work_hours * slpa.finished_num AS wages,
        ppm.device_name,
        ppm.device_id,
        IFNULL(
        TIMESTAMPDIFF(MINUTE, ppm.start_time, ppm.end_time),
        0
        ) AS work_minutes
        FROM
        production_product_main ppm
        LEFT JOIN sales_ledger_production_accounting slpa ON slpa.product_main_id = ppm.id
@@ -85,7 +91,7 @@
        LEFT JOIN product_model pm ON po.product_model_id = pm.id
        LEFT JOIN product p ON p.id = pm.product_id
        LEFT JOIN sales_ledger sl ON po.sales_ledger_id = sl.id
        <where>
        where ppm.audit_status = 1
            <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''">
                and slpa.scheduling_user_name = #{ew.schedulingUserName}
            </if>
@@ -97,7 +103,6 @@
                and slpa.scheduling_date >= #{ew.entryDateStart}
                and slpa.scheduling_date &lt; date_add(#{ew.entryDateEnd}, INTERVAL 1 DAY)
            </if>
        </where>
    </select>
    <select id="listMain" resultType="java.lang.Long">
        SELECT ppm.id FROM production_product_main ppm
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -52,24 +52,45 @@
    </select>
    <select id="pageProductionAccounting"
            resultType="com.ruoyi.production.dto.SalesLedgerProductionAccountingDto">
        SELECT
        slpa.scheduling_user_id,
        slpa.scheduling_user_name,
        sum(ppout.quantity) as output_num,
        sum(slpa.finished_num * work_hours) as wages,
        MIN(slpa.scheduling_user_name) AS scheduling_user_name,
        SUM(ppout.quantity) AS output_num,
        SUM(slpa.finished_num * slpa.work_hours) AS wages,
        CONCAT(
        ROUND(
        CASE
        WHEN SUM(ppout.quantity) = 0 OR SUM(ppout.quantity) IS NULL THEN 0
        ELSE SUM(slpa.finished_num) * 100.0 / SUM(ppout.quantity)
        END,
        2
        END, 2
        ),
        '%'
        ) as output_rate
        ) AS output_rate,
        GROUP_CONCAT(
        CONCAT(
        IFNULL(
        TIMESTAMPDIFF(MINUTE, ppm.start_time, ppm.end_time),
        0
        ),
        '|$|',
        IFNULL(ppm.device_name, '未知机台')
        )
        ORDER BY ppm.start_time
        SEPARATOR '>>>'
        ) AS device_work_info
        FROM sales_ledger_production_accounting slpa
        LEFT JOIN production_product_main ppm ON slpa.product_main_id = ppm.id
        LEFT JOIN production_product_output ppout ON ppm.id = ppout.product_main_id
        LEFT JOIN production_product_main ppm
        ON slpa.product_main_id = ppm.id
        LEFT JOIN production_product_output ppout
        ON ppm.id = ppout.product_main_id
        <where>
            <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''">
                and slpa.scheduling_user_name = #{ew.schedulingUserName}
@@ -84,7 +105,7 @@
            </if>
        </where>
        GROUP BY slpa.scheduling_user_name
        GROUP BY slpa.scheduling_user_id
    </select>