src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -507,7 +507,7 @@ private void handlePurchaseApprovalFinished(ApprovalInstance instance, String status) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne( new LambdaQueryWrapper<PurchaseLedger>() .eq(PurchaseLedger::getPurchaseContractNumber, instance.getTitle()) .eq(PurchaseLedger::getId, instance.getBusinessId()) .last("limit 1") ); if (purchaseLedger == null) { @@ -545,7 +545,7 @@ private void handleSalesQuotationApprovalFinished(ApprovalInstance instance, String status) { SalesQuotation salesQuote = salesQuotationMapper.selectOne( new LambdaQueryWrapper<SalesQuotation>() .eq(SalesQuotation::getQuotationNo, instance.getTitle()) .eq(SalesQuotation::getId, instance.getBusinessId()) .last("limit 1") ); if (salesQuote == null) { @@ -565,7 +565,7 @@ private void handleShippingApprovalFinished(ApprovalInstance instance, String status) { ShippingInfo shippingInfo = shippingInfoMapper.selectOne( new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getShippingNo, instance.getTitle()) .eq(ShippingInfo::getId, instance.getTitle()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1") ); src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -157,8 +157,4 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "模板id") private Long templateId; } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -6,8 +6,11 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; @@ -18,7 +21,6 @@ import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; @@ -47,7 +49,6 @@ import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; @@ -100,6 +101,8 @@ private final ApproveProcessServiceImpl approveProcessService; private final ProcurementRecordMapper procurementRecordStorageMapper; private final FileUtil fileUtil; private final ApprovalInstanceService approvalInstanceService; private final ApprovalTemplateMapper approvalTemplateMapper; @Override public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) { @@ -617,14 +620,18 @@ if (loginUser == null) { return; } ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(5); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason(purchaseLedger.getPurchaseContractNumber()); approveProcessVO.setApproveUserIds(purchaseLedger.getApproveUserIds()); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); approveProcessService.addApprove(approveProcessVO); ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto(); approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,5L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId()); approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,5L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName()); approvalInstance.setBusinessId(purchaseLedger.getId()); approvalInstance.setBusinessType(5L); approvalInstance.setCurrentLevel(1); approvalInstance.setApplicantId(loginUser.getUserId()); approvalInstance.setTitle(purchaseLedger.getPurchaseContractNumber()+"审批"); approvalInstance.setApplicantName(loginUser.getNickName()); approvalInstance.setApplyTime(LocalDateTime.now()); approvalInstanceService.add(approvalInstance); } /** src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -2,16 +2,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.SecurityUtils; import java.time.LocalDateTime; 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.framework.security.LoginUser; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.domain.R; @@ -27,7 +21,6 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.time.LocalDate; import java.util.List; /** @@ -57,25 +50,7 @@ @Transactional(rollbackFor = Exception.class) @Log(title = "发货信息管理", businessType = BusinessType.INSERT) public AjaxResult add(@RequestBody ShippingInfoDto req) throws Exception { LoginUser loginUser = SecurityUtils.getLoginUser(); String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no", req.getCreateTime() != null ? req.getCreateTime() : LocalDateTime.now()); // 发货审批 ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(7); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason(sh);//发货编号 approveProcessVO.setApproveUserIds(req.getApproveUserIds()); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); // 先保存发货单,再发起审批;无审核人自动通过时需要按发货编号回写发货状态。 req.setShippingNo(sh); req.setStatus("待审核"); boolean save = shippingInfoService.add(req); if (!save) { return AjaxResult.error(); } approveProcessService.addApprove(approveProcessVO); return AjaxResult.success(); return AjaxResult.success(shippingInfoService.addReq(req) ? "添加成功" : "添加失败"); } @Operation(summary = "发货扣库存") src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
@@ -31,4 +31,6 @@ List<ShippingProductDetailDto> getDetail(Long id); ShippingApproveDto getDateilByShippingNo(String shippingNo); boolean addReq(ShippingInfoDto req); } src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -9,8 +9,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.pojo.ApprovalInstance; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; @@ -32,7 +33,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -104,31 +104,22 @@ }).collect(Collectors.toList()); salesQuotationProductService.saveBatch(products); // 报价审批 ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(6); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason(quotationNo); approveProcessVO.setApproveUserIds(salesQuotationDto.getApproveUserIds()); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); approveProcessVO.setPrice(salesQuotationDto.getTotalAmount()); ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto(); approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId()); approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName()); approvalInstance.setBusinessId(salesQuotation.getId()); approvalInstance.setBusinessType(6L); approvalInstance.setCurrentLevel(1); approvalInstance.setTitle(quotationNo+"审批"); approvalInstance.setApplicantId(loginUser.getUserId()); approvalInstance.setApplicantName(loginUser.getNickName()); approvalInstance.setApplyTime(LocalDateTime.now()); try { approveProcessService.addApprove(approveProcessVO); approvalInstanceService.add(approvalInstance); } catch (Exception e) { log.error("SalesQuotationServiceImpl approve error for quotationNo: {}", e); throw new RuntimeException("审批失败: " + e.getMessage(), e); } // 报价审批 ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto(); approvalInstanceDto.setTemplateId(salesQuotationDto.getTemplateId()); approvalInstanceDto.setBusinessId(salesQuotationDto.getId()); approvalInstanceDto.setBusinessType(7L); approvalInstanceDto.setTitle("报价编号:" + quotationNo); approvalInstanceDto.setApplicantId(SecurityUtils.getUserId()); approvalInstanceDto.setTemplateName(approvalTemplateMapper.selectById(salesQuotationDto.getTemplateId()).getTemplateName()); approvalInstanceDto.setApplicantName(SecurityUtils.getLoginUser().getNickName()); approvalInstanceDto.setApplyTime(LocalDateTime.now()); approvalInstanceService.add(approvalInstanceDto); return true; } @Override @@ -156,10 +147,25 @@ salesQuotationProductService.saveBatch(products); // 修改报价审批 vo.setApproveUserIds(salesQuotationDto.getApproveUserIds()); vo.setApproveType(6); vo.setApproveReason(salesQuotationDto.getQuotationNo()); approveProcessService.updateApproveUser(vo); // 先结束之前未结束的报价审批 approvalInstanceService.lambdaUpdate().set(ApprovalInstance::getStatus,"REJECTED").eq(ApprovalInstance::getBusinessId,salesQuotation.getId()).eq(ApprovalInstance::getBusinessType,6L).update(); ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto(); approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId()); approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName()); approvalInstance.setBusinessId(salesQuotation.getId()); approvalInstance.setBusinessType(6L); approvalInstance.setCurrentLevel(1); approvalInstance.setTitle(salesQuotation.getQuotationNo()+"审批"); approvalInstance.setApplicantId(SecurityUtils.getUserId()); approvalInstance.setApplicantName(SecurityUtils.getLoginUser().getNickName()); approvalInstance.setApplyTime(LocalDateTime.now()); try { approvalInstanceService.add(approvalInstance); } catch (Exception e) { log.error("SalesQuotationServiceImpl approve error for quotationNo: {}", e); throw new RuntimeException("审批失败: " + e.getMessage(), e); } return true; } @Override src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -4,13 +4,20 @@ 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.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.FileNameType; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.procurementrecord.bean.vo.ShippingProductVo; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.dto.ShippingApproveDto; @@ -28,6 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; /** @@ -52,6 +60,8 @@ private final ApproveProcessServiceImpl approveProcessService; private final FileUtil fileUtil; private final ShippingProductDetailMapper shippingProductDetailMapper; private final ApprovalTemplateMapper approvalTemplateMapper; private final ApprovalInstanceService approvalInstanceService; @Override public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) { @@ -158,4 +168,28 @@ shippingApproveDto.setShippingProductDetailDtoList(dateilByShippingNo); return shippingApproveDto; } @Override public boolean addReq(ShippingInfoDto req) { LoginUser loginUser = SecurityUtils.getLoginUser(); String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no",req.getCreateTime()); // 先保存发货单,再发起审批;无审核人自动通过时需要按发货编号回写发货状态。 req.setShippingNo(sh); req.setStatus("待审核"); boolean save = this.add(req); // 发货审批 ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto(); approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId()); approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName()); approvalInstance.setBusinessId(req.getId()); approvalInstance.setBusinessType(7L); approvalInstance.setCurrentLevel(1); approvalInstance.setTitle(sh+"审批"); approvalInstance.setApplicantId(loginUser.getUserId()); approvalInstance.setApplicantName(loginUser.getNickName()); approvalInstance.setApplyTime(LocalDateTime.now()); approvalInstanceService.add(approvalInstance); return true; } }