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