huminmin
2026-07-13 53c0da6e44a01acf9d97bdc7abaf25e5984b92dc
修改生产核算
已添加1个文件
已修改7个文件
228 ■■■■ 文件已修改
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDetailExportDto.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionAccountController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionAccountService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -33,6 +33,7 @@
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.production.service.ProductionAccountService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysDeptMapper;
@@ -97,6 +98,7 @@
    private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper;
    private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
    private final ProductionProductMainMapper productionProductMainMapper;
    private final ProductionAccountService productionAccountService;
    @Override
    public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) {
@@ -717,6 +719,7 @@
            return;
        }
        productionProductMainMapper.updateById(productionProductMain);
        productionAccountService.rebuildByProductionProductMainId(productionProductMain.getId());
    }
    private List<ApprovalTask> createNodeAndTasks(ApprovalInstance instance, ApprovalTemplateNode templateNode) {
src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDetailExportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.production.bean.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
@Schema(name = "ProductionAccountDetailExportDto", description = "生产核算导出明细")
public class ProductionAccountDetailExportDto {
    @Excel(name = "报工单号")
    private String reportNo;
    @Excel(name = "生产日期", dateFormat = "yyyy-MM-dd")
    private LocalDate schedulingDate;
    @Excel(name = "生产人")
    private String schedulingUserName;
    @Excel(name = "审核状态")
    private String auditStatusName;
    @Excel(name = "报工类型")
    private String reportTypeName;
    @Excel(name = "销售合同号")
    private String salesContractNo;
    @Excel(name = "产品大类")
    private String productName;
    @Excel(name = "规格型号")
    private String productModelName;
    @Excel(name = "单位")
    private String unit;
    @Excel(name = "工序")
    private String process;
    @Excel(name = "工单编号")
    private String workOrderNo;
    @Excel(name = "工时(h)")
    private BigDecimal workHour;
    @Excel(name = "生产数量")
    private BigDecimal quantity;
    @Excel(name = "工时定额")
    private BigDecimal workHours;
    @Excel(name = "工资")
    private BigDecimal wages;
}
src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
@@ -64,8 +64,7 @@
    private LocalDate entryDate;
    @Schema(description = "日期范围")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate[] dateRange;
    private String[] dateRange;
    @Schema(description = "开始日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -21,11 +21,20 @@
    @Schema(description = "报工ID")
    private Long productMainId;
    @Schema(description = "报工单号")
    private String reportNo;
    @Schema(description = "报工结果类型:0合格,1轻微返工,2严重返工,3报废")
    private Integer reportType;
    @Schema(description = "报工结果类型名称")
    private String reportTypeName;
    @Schema(description = "审核状态:0待审核,1审核通过,2审核不通过")
    private Integer auditStatus;
    @Schema(description = "审核状态名称")
    private String auditStatusName;
    @Schema(description = "审核意见")
    private String auditRemark;
@@ -78,6 +87,12 @@
    @Schema(description = "工资")
    private BigDecimal wages;
    @Schema(description = "工资修正金额")
    private BigDecimal adjustAmount;
    @Schema(description = "工资修正说明")
    private String adjustRemark;
    @Schema(description = "工序参数列表")
    private List<ProductionOrderRoutingOperationParam> productionOperationParamList;
}
src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
@@ -3,13 +3,17 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.production.bean.dto.ProductionAccountDetailExportDto;
import com.ruoyi.production.bean.dto.ProductionAccountDto;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.bean.vo.ProductionAccountVo;
import com.ruoyi.production.service.ProductionAccountService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,26 +34,62 @@
    private final ProductionAccountService productionAccountService;
    @GetMapping("/listPage")
    @Log(title = "生产核算-分页查询", businessType = BusinessType.OTHER)
    @Operation(summary = "生产核算分页查询")
    public R<IPage<ProductionAccountVo>> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) {
    public R<IPage<com.ruoyi.production.bean.vo.ProductionAccountVo>> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) {
        return R.ok(productionAccountService.listPage(page, dto));
    }
    @GetMapping("/listProductionDetails")
    @Log(title = "生产核算-工资明细查询", businessType = BusinessType.OTHER)
    @Operation(summary ="查询工人生产工资信息")
    public R<IPage<ProductionProductMainDto>> listProductionDetails(ProductionAccountDto productionAccountDto, Page page) {
        return R.ok(productionAccountService.listProductionDetails(productionAccountDto,page));
    }
    @PostMapping("/batchAccounting")
    @Log(title = "生产核算-批量核算", businessType = BusinessType.UPDATE)
    @Operation(summary = "批量核算")
    public R<Boolean> batchAccounting(@RequestBody ProductionAccountDto dto) {
        return R.ok(productionAccountService.batchAccounting(dto));
    }
    @PostMapping("/singleAdjust")
    @Log(title = "生产核算-单个修正", businessType = BusinessType.UPDATE)
    @Operation(summary = "单个修正")
    public R<Boolean> singleAdjust(@RequestBody ProductionAccountDto dto) {
        return R.ok(productionAccountService.singleAdjust(dto));
    }
    @PostMapping("/exportSalarySlip")
    @Log(title = "生产核算-导出工资条", businessType = BusinessType.EXPORT)
    @Operation(summary = "导出工资条")
    public void exportSalarySlip(HttpServletResponse response, ProductionAccountDto dto) {
        ExcelUtil<ProductionAccountDetailExportDto> util = new ExcelUtil<>(ProductionAccountDetailExportDto.class);
        util.exportExcel(response,
                productionAccountService.listProductionDetails(dto, new Page<>(1, Integer.MAX_VALUE))
                        .getRecords()
                        .stream()
                        .map(item -> {
                            ProductionAccountDetailExportDto exportDto = new ProductionAccountDetailExportDto();
                            exportDto.setReportNo(item.getReportNo());
                            exportDto.setSchedulingDate(item.getSchedulingDate());
                            exportDto.setSchedulingUserName(item.getSchedulingUserName());
                            exportDto.setAuditStatusName(item.getAuditStatusName());
                            exportDto.setReportTypeName(item.getReportTypeName());
                            exportDto.setSalesContractNo(item.getSalesContractNo());
                            exportDto.setProductName(item.getProductName());
                            exportDto.setProductModelName(item.getProductModelName());
                            exportDto.setUnit(item.getUnit());
                            exportDto.setProcess(item.getProcess());
                            exportDto.setWorkOrderNo(item.getWorkOrderNo());
                            exportDto.setWorkHour(item.getWorkHour());
                            exportDto.setQuantity(item.getQuantity());
                            exportDto.setWorkHours(item.getWorkHours());
                            exportDto.setWages(item.getWages());
                            return exportDto;
                        })
                        .toList(),
                "生产工资条");
    }
}
src/main/java/com/ruoyi/production/service/ProductionAccountService.java
@@ -24,4 +24,6 @@
    Boolean batchAccounting(ProductionAccountDto dto);
    Boolean singleAdjust(ProductionAccountDto dto);
    Boolean rebuildByProductionProductMainId(Long productionProductMainId);
}
src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
@@ -33,6 +33,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeParseException;
import java.util.List;
@Service
@@ -100,26 +101,58 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean singleAdjust(ProductionAccountDto dto) {
        if (dto == null || dto.getSchedulingUserId() == null) {
        if (dto == null || (dto.getProductionProductMainId() == null && dto.getSchedulingUserId() == null)) {
            throw new ServiceException("请选择需要修正的人员");
        }
        BigDecimal adjustAmount = dto.getAdjustAmount();
        if (adjustAmount == null || adjustAmount.compareTo(BigDecimal.ZERO) == 0) {
            throw new ServiceException("修正金额不能为空");
        }
        ProductionAccount account = new ProductionAccount();
        account.setSchedulingUserId(dto.getSchedulingUserId());
        account.setSchedulingUserName(dto.getSchedulingUserName());
        account.setTechnologyOperationName("工资修正");
        account.setAdjustAmount(adjustAmount);
        account.setAdjustRemark(dto.getAdjustRemark());
        account.setAdjustUser(dto.getAdjustUser());
        account.setAdjustTime(LocalDateTime.now());
        account.setSchedulingDate(LocalDateTime.now());
        account.setWorkHours(BigDecimal.ZERO);
        account.setFinishedNum(BigDecimal.ZERO);
        account.setAccountingBatchNo("ADJ-" + LocalDate.now());
        baseMapper.insert(account);
        if (dto.getProductionProductMainId() != null) {
            ProductionAccount account = new ProductionAccount();
            account.setAdjustAmount(adjustAmount);
            account.setAdjustRemark(dto.getAdjustRemark());
            account.setAdjustUser(dto.getAdjustUser());
            account.setAdjustTime(LocalDateTime.now());
            baseMapper.update(account, new LambdaQueryWrapper<ProductionAccount>()
                    .eq(ProductionAccount::getProductionProductMainId, dto.getProductionProductMainId()));
        } else {
            ProductionAccount account = new ProductionAccount();
            account.setSchedulingUserId(dto.getSchedulingUserId());
            account.setSchedulingUserName(dto.getSchedulingUserName());
            account.setTechnologyOperationName("工资修正");
            account.setAdjustAmount(adjustAmount);
            account.setAdjustRemark(dto.getAdjustRemark());
            account.setAdjustUser(dto.getAdjustUser());
            account.setAdjustTime(LocalDateTime.now());
            account.setSchedulingDate(LocalDateTime.now());
            account.setWorkHours(BigDecimal.ZERO);
            account.setFinishedNum(BigDecimal.ZERO);
            account.setAccountingBatchNo("ADJ-" + LocalDate.now());
            baseMapper.insert(account);
        }
        return Boolean.TRUE;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean rebuildByProductionProductMainId(Long productionProductMainId) {
        if (productionProductMainId == null) {
            return Boolean.FALSE;
        }
        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductMainId);
        if (productionProductMain == null) {
            return Boolean.FALSE;
        }
        if (productionProductMain.getAuditStatus() == null || productionProductMain.getAuditStatus() != 1) {
            productionAccountDelete(productionProductMainId);
            return Boolean.FALSE;
        }
        if (productionProductMain.getReportType() == null || productionProductMain.getReportType() != 0) {
            productionAccountDelete(productionProductMainId);
            return Boolean.FALSE;
        }
        rebuildAccount(productionProductMain);
        return Boolean.TRUE;
    }
@@ -127,6 +160,14 @@
        if (productionProductMain == null || productionProductMain.getId() == null) {
            return;
        }
        ProductionAccount existedAccount = baseMapper.selectOne(Wrappers.<ProductionAccount>lambdaQuery()
                .eq(ProductionAccount::getProductionProductMainId, productionProductMain.getId())
                .last("limit 1"));
        BigDecimal existedAdjustAmount = existedAccount == null ? null : existedAccount.getAdjustAmount();
        String existedAdjustRemark = existedAccount == null ? null : existedAccount.getAdjustRemark();
        Long existedAdjustUser = existedAccount == null ? null : existedAccount.getAdjustUser();
        LocalDateTime existedAdjustTime = existedAccount == null ? null : existedAccount.getAdjustTime();
        productionAccountDelete(productionProductMain.getId());
        ProductionProductOutput output = productionProductOutputMapper.selectOne(
                Wrappers.<ProductionProductOutput>lambdaQuery()
@@ -157,6 +198,10 @@
        account.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
        account.setSchedulingDate(LocalDateTime.now());
        account.setAccountingBatchNo("BATCH-" + LocalDate.now());
        account.setAdjustAmount(existedAdjustAmount);
        account.setAdjustRemark(existedAdjustRemark);
        account.setAdjustUser(existedAdjustUser);
        account.setAdjustTime(existedAdjustTime);
        baseMapper.insert(account);
    }
@@ -173,22 +218,23 @@
        if (dto == null) {
            return new ProductionAccountDto();
        }
        LocalDate[] dateRange = dto.getDateRange();
        if ((dto.getEntryDateStart() == null || dto.getEntryDateEnd() == null)
                && dateRange != null
                && dateRange.length > 0) {
                && dto.getDateRange() != null
                && dto.getDateRange().length > 0) {
            LocalDate rangeStart = parseDate(dto.getDateRange()[0]);
            LocalDate rangeEnd = dto.getDateRange().length > 1 ? parseDate(dto.getDateRange()[1]) : rangeStart;
            if (dto.getEntryDateStart() == null) {
                dto.setEntryDateStart(dateRange[0]);
                dto.setEntryDateStart(rangeStart);
            }
            if (dto.getEntryDateEnd() == null) {
                dto.setEntryDateEnd(dateRange.length > 1 ? dateRange[1] : dateRange[0]);
                dto.setEntryDateEnd(rangeEnd);
            }
        }
        String dateType = dto.getDateType();
        if ("day".equalsIgnoreCase(dateType)) {
            if (dto.getEntryDate() == null && dateRange != null && dateRange.length > 0) {
                dto.setEntryDate(dateRange[0]);
            if (dto.getEntryDate() == null && dto.getDateRange() != null && dto.getDateRange().length > 0) {
                dto.setEntryDate(parseDate(dto.getDateRange()[0]));
            }
            if (dto.getEntryDate() == null) {
                dto.setEntryDate(dto.getEntryDateStart());
@@ -206,4 +252,15 @@
        return dto;
    }
    private LocalDate parseDate(String dateValue) {
        if (dateValue == null || dateValue.isEmpty()) {
            return null;
        }
        try {
            return LocalDate.parse(dateValue);
        } catch (DateTimeParseException e) {
            throw new ServiceException("日期格式错误,请使用 yyyy-MM-dd");
        }
    }
}
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -136,11 +136,15 @@
               ifnull(ppo.quantity, 0) as quantity,
               ifnull(ppo.scrap_qty, 0) as scrapQty,
               date(pa.scheduling_date) as schedulingDate,
               pa.scheduling_user_id as schedulingUserId,
               pa.scheduling_user_name as schedulingUserName,
               cast(ifnull(ppm.work_hour, 0) as decimal(18,4)) as workHour,
               cast(ifnull(pa.work_hours, 0) as decimal(18,4)) as workHours,
               cast(ifnull(pa.adjust_amount, 0) as decimal(18,4)) as adjustAmount,
               pa.adjust_remark as adjustRemark,
               cast(
                   case
                       when pa.adjust_amount is not null then ifnull(pa.adjust_amount, 0)
                       when poro.type = 0 then ifnull(pa.work_hours, 0) * ifnull(ppm.work_hour, 0)
                       else ifnull(pa.work_hours, 0) * ifnull(pa.finished_num, 0) *
                            case