| | |
| | | package com.ruoyi.production.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | 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.mapper.ProductionAccountMapper; |
| | | import com.ruoyi.production.mapper.ProductionOperationTaskMapper; |
| | | import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper; |
| | | import com.ruoyi.production.mapper.ProductionProductMainMapper; |
| | | import com.ruoyi.production.mapper.ProductionProductOutputMapper; |
| | | import com.ruoyi.production.pojo.ProductionAccount; |
| | | import com.ruoyi.production.pojo.ProductionOperationTask; |
| | | import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; |
| | | import com.ruoyi.production.pojo.ProductionProductMain; |
| | | import com.ruoyi.production.pojo.ProductionProductOutput; |
| | | import com.ruoyi.technology.mapper.TechnologyOperationMapper; |
| | | import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; |
| | | import com.ruoyi.technology.pojo.TechnologyOperation; |
| | | import com.ruoyi.technology.pojo.TechnologyRoutingOperation; |
| | | import com.ruoyi.project.system.mapper.SysUserMapper; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.production.service.ProductionAccountService; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | | @RequiredArgsConstructor |
| | |
| | | |
| | | |
| | | private final ProductionProductMainMapper productionProductMainMapper; |
| | | private final ProductionProductOutputMapper productionProductOutputMapper; |
| | | private final ProductionOperationTaskMapper productionOperationTaskMapper; |
| | | private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper; |
| | | private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper; |
| | | private final TechnologyOperationMapper technologyOperationMapper; |
| | | private final SysUserMapper sysUserMapper; |
| | | |
| | | @Override |
| | | public IPage<ProductionAccountVo> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) { |
| | |
| | | @Override |
| | | public IPage<ProductionProductMainDto> listProductionDetails(ProductionAccountDto dto, Page page) { |
| | | // 查询生产核算明细 |
| | | return productionProductMainMapper.listProductionDetails(normalizeDateQuery(dto), page); |
| | | ProductionAccountDto queryDto = normalizeDateQuery(dto); |
| | | if (queryDto.getAuditStatus() == null) { |
| | | queryDto.setAuditStatus(1); |
| | | } |
| | | if (queryDto.getReportType() == null) { |
| | | queryDto.setReportType(0); |
| | | } |
| | | return productionProductMainMapper.listProductionDetails(queryDto, page); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean batchAccounting(ProductionAccountDto dto) { |
| | | ProductionAccountDto queryDto = normalizeDateQuery(dto); |
| | | LambdaQueryWrapper<ProductionProductMain> queryWrapper = Wrappers.<ProductionProductMain>lambdaQuery() |
| | | .eq(ProductionProductMain::getAuditStatus, 1) |
| | | .eq(ProductionProductMain::getReportType, 0); |
| | | if (queryDto.getSchedulingUserId() != null) { |
| | | queryWrapper.eq(ProductionProductMain::getUserId, queryDto.getSchedulingUserId()); |
| | | } |
| | | if (queryDto.getSchedulingUserName() != null && !queryDto.getSchedulingUserName().isEmpty()) { |
| | | queryWrapper.like(ProductionProductMain::getUserName, queryDto.getSchedulingUserName()); |
| | | } |
| | | if (queryDto.getEntryDate() != null) { |
| | | queryWrapper.apply("date(create_time) = {0}", queryDto.getEntryDate()); |
| | | } |
| | | if (queryDto.getEntryDateStart() != null) { |
| | | queryWrapper.ge(ProductionProductMain::getCreateTime, queryDto.getEntryDateStart().atStartOfDay()); |
| | | } |
| | | if (queryDto.getEntryDateEnd() != null) { |
| | | queryWrapper.le(ProductionProductMain::getCreateTime, queryDto.getEntryDateEnd().atTime(23, 59, 59)); |
| | | } |
| | | List<ProductionProductMain> reportList = productionProductMainMapper.selectList(queryWrapper); |
| | | for (ProductionProductMain report : reportList) { |
| | | rebuildAccount(report); |
| | | } |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean singleAdjust(ProductionAccountDto dto) { |
| | | if (dto == 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); |
| | | return Boolean.TRUE; |
| | | } |
| | | |
| | | private void rebuildAccount(ProductionProductMain productionProductMain) { |
| | | if (productionProductMain == null || productionProductMain.getId() == null) { |
| | | return; |
| | | } |
| | | productionAccountDelete(productionProductMain.getId()); |
| | | ProductionProductOutput output = productionProductOutputMapper.selectOne( |
| | | Wrappers.<ProductionProductOutput>lambdaQuery() |
| | | .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId()) |
| | | .last("limit 1")); |
| | | if (output == null || output.getQuantity() == null || output.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { |
| | | return; |
| | | } |
| | | ProductionOperationTask task = productionOperationTaskMapper.selectById(productionProductMain.getProductionOperationTaskId()); |
| | | if (task == null) { |
| | | return; |
| | | } |
| | | ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(task.getProductionOrderRoutingOperationId()); |
| | | if (routingOperation == null) { |
| | | return; |
| | | } |
| | | TechnologyRoutingOperation technologyRoutingOperation = technologyRoutingOperationMapper.selectById(routingOperation.getTechnologyRoutingOperationId()); |
| | | TechnologyOperation technologyOperation = technologyRoutingOperation == null ? null |
| | | : technologyOperationMapper.selectById(technologyRoutingOperation.getTechnologyOperationId()); |
| | | SysUser user = sysUserMapper.selectUserById(productionProductMain.getUserId()); |
| | | |
| | | ProductionAccount account = new ProductionAccount(); |
| | | account.setProductionProductMainId(productionProductMain.getId()); |
| | | account.setSchedulingUserId(user == null ? productionProductMain.getUserId() : user.getUserId()); |
| | | account.setSchedulingUserName(user == null ? productionProductMain.getUserName() : user.getNickName()); |
| | | account.setFinishedNum(output.getQuantity()); |
| | | account.setWorkHours(technologyOperation == null ? null : technologyOperation.getSalaryQuota()); |
| | | account.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName()); |
| | | account.setSchedulingDate(LocalDateTime.now()); |
| | | account.setAccountingBatchNo("BATCH-" + LocalDate.now()); |
| | | baseMapper.insert(account); |
| | | } |
| | | |
| | | private void productionAccountDelete(Long productionProductMainId) { |
| | | if (productionProductMainId == null) { |
| | | return; |
| | | } |
| | | baseMapper.delete(new LambdaQueryWrapper<ProductionAccount>() |
| | | .eq(ProductionAccount::getProductionProductMainId, productionProductMainId)); |
| | | } |
| | | |
| | | private ProductionAccountDto normalizeDateQuery(ProductionAccountDto dto) { |