buhuazhen
3 天以前 99c61e2e4c5aabe594ff8a463a45f3a6b5cb9add
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.enums.FileNameType;
@@ -16,6 +17,7 @@
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.sales.dto.ShippingInfoDto;
import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
@@ -50,25 +52,22 @@
    @Autowired
    private ShippingInfoService shippingInfoService;
    @Autowired
    private ShipmentApprovalMapper shipmentApprovalMapper;
    @Autowired
    private ISalesLedgerProductService salesLedgerProductService;
    @Autowired
    private TempFileServiceImpl tempFileService;
    @Autowired
    private CommonFileServiceImpl commonFileService;
    @Autowired
    private ApproveProcessServiceImpl approveProcessService;
    @Autowired
    private StockUtils stockUtils;
    @Autowired
    private ISalesLedgerService salesLedgerService;
    @GetMapping("/listPage")
    @ApiOperation("发货信息列表")
    public AjaxResult listPage(Page page, ShippingInfo req) {
        IPage<ShippingInfo> listPage = shippingInfoService.listPage(page,req);
        IPage<ShippingInfoDto> listPage = shippingInfoService.listPage(page,req);
        return AjaxResult.success(listPage);
    }
@@ -78,17 +77,73 @@
    @Log(title = "发货信息管理", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody ShippingInfoDto req) throws Exception {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH");
        // 发货审批
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(7);
        approveProcessVO.setApproveDeptId(loginUser.getTenantId());
        approveProcessVO.setApproveReason(req.getType() + ":" +sh);
        approveProcessVO.setApproveUserIds(req.getApproveUserIds());
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        approveProcessService.addApprove(approveProcessVO);
        // 添加发货消息
        // 查询销售单号
        String salesContractNo = "";
        if (req.getSalesLedgerId() != null) {
            SalesLedger salesLedger = salesLedgerService.getById(req.getSalesLedgerId());
            if (salesLedger != null) {
                salesContractNo = salesLedger.getSalesContractNo();
            }
        }
        String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH", "shipping_no");
        // 查询该销售合同下是否有"待审核"的发货记录,用于合并审批(需审批人相同)
        boolean shouldMergeApproval = false;
        ApproveProcess existingApprove = null;
        List<ShippingInfo> pendingShippings = shippingInfoMapper.selectList(
            new LambdaQueryWrapper<ShippingInfo>()
                .eq(ShippingInfo::getSalesLedgerId, req.getSalesLedgerId())
                .eq(ShippingInfo::getStatus, "待审核")
        );
        if (!CollectionUtils.isEmpty(pendingShippings) && salesContractNo != null && !salesContractNo.isEmpty()) {
            // 找到对应的审批流程(通过销售单号匹配,且审批人相同)
            existingApprove = approveProcessService.getOne(
                new LambdaQueryWrapper<ApproveProcess>()
                    .like(ApproveProcess::getApproveReason, "销售单号:" + salesContractNo)
                    .eq(ApproveProcess::getApproveType, 7) // 发货审批类型
                    .eq(ApproveProcess::getApproveStatus, 0) // 待审核状态
                    .eq(ApproveProcess::getApproveUser, loginUser.getUserId()) // 审批人相同
                    .orderByDesc(ApproveProcess::getCreateTime)
                    .last("limit 1")
            );
            if (existingApprove != null) {
                shouldMergeApproval = true;
            }
        }
        // 生成当前发货信息的描述
        StringBuilder currentShippingDesc = new StringBuilder();
        currentShippingDesc.append("发货单号:").append(sh);
        if (salesContractNo != null && !salesContractNo.isEmpty()) {
            currentShippingDesc.append("\n销售单号:").append(salesContractNo);
        }
        currentShippingDesc.append("\n").append(req.getType());
        if ("货车".equals(req.getType()) && req.getShippingCarNumber() != null && !req.getShippingCarNumber().isEmpty()) {
            currentShippingDesc.append(":").append(req.getShippingCarNumber());
        } else if ("快递".equals(req.getType()) && req.getExpressCompany() != null && !req.getExpressCompany().isEmpty()) {
            currentShippingDesc.append(":").append(req.getExpressCompany());
        }
        if (shouldMergeApproval && existingApprove != null) {
            // 合并审批:将被合并的发货单号添加到审批原因中
            String updatedReason = existingApprove.getApproveReason() + "\n\n" + currentShippingDesc.toString();
            existingApprove.setApproveReason(updatedReason);
            approveProcessService.updateById(existingApprove);
        } else {
            // 创建新的审批流程
            ApproveProcessVO approveProcessVO = new ApproveProcessVO();
            approveProcessVO.setApproveType(7);
            approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
            approveProcessVO.setApproveReason(currentShippingDesc.toString());
            approveProcessVO.setApproveUserIds(req.getApproveUserIds());
            approveProcessVO.setApproveUser(loginUser.getUserId());
            approveProcessVO.setApproveTime(LocalDate.now().toString());
            approveProcessService.addApprove(approveProcessVO);
        }
        // 添加发货记录
        req.setShippingNo(sh);
        req.setStatus("待审核");
        boolean save = shippingInfoService.save(req);
@@ -100,19 +155,7 @@
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "发货信息管理", businessType = BusinessType.UPDATE)
    public AjaxResult deductStock(@RequestBody ShippingInfoDto req) throws IOException {
        ShippingInfo byId = shippingInfoService.getById(req.getId());
        if (byId == null) {
            return AjaxResult.error("发货信息不存在");
        }
        byId.setExpressNumber(req.getExpressNumber());
        byId.setExpressCompany(req.getExpressCompany());
        byId.setShippingCarNumber(req.getShippingCarNumber());
        boolean update = shippingInfoService.updateById(req);
        // 迁移文件
        if(CollectionUtils.isNotEmpty(req.getTempFileIds())){
            tempFileService.migrateTempFilesToFormal(req.getId(), req.getTempFileIds(), FileNameType.SHIP.getValue());
        }
        return update ? AjaxResult.success() : AjaxResult.error();
        return shippingInfoService.deductStock( req) ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
@@ -133,9 +176,8 @@
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "发货信息管理", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        commonFileService.deleteByBusinessIds(ids, FileNameType.SHIP.getValue());
        boolean delete = shippingInfoService.removeBatchByIds(ids);
        return delete ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
        return shippingInfoService.delete(ids) ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
    }
    @Autowired
@@ -152,4 +194,35 @@
        util.exportExcel(response, list, "发货信息");
    }
    @GetMapping("/getByCustomerName")
    @ApiOperation("通过客户名称查询")
    public AjaxResult getByCustomerName(String customerName) {
        return AjaxResult.success(shippingInfoService.getShippingInfoByCustomerName(customerName));
    }
    /**
     * 一键发货 - 自动审批通过并出库
     */
    @PostMapping("/oneClickShipping")
    @ApiOperation("一键发货")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "发货信息管理", businessType = BusinessType.INSERT)
    public AjaxResult oneClickShipping(@RequestBody ShippingInfoDto req) throws IOException {
        return shippingInfoService.oneClickShipping(req) ? AjaxResult.success("发货成功") : AjaxResult.error("发货失败");
    }
    /**
     * 批量一键发货 - 将销售台账下所有未发货的产品全部发货
     */
    @PostMapping("/batchOneClickShipping")
    @ApiOperation("批量一键发货")
    @Transactional(rollbackFor = Exception.class)
    @Log(title = "发货信息管理", businessType = BusinessType.INSERT)
    public AjaxResult batchOneClickShipping(@RequestBody ShippingInfoDto req) throws IOException {
        if (req.getSalesLedgerId() == null) {
            return AjaxResult.error("销售台账ID不能为空");
        }
        return shippingInfoService.batchOneClickShipping(req.getSalesLedgerId(), req) ? AjaxResult.success("批量发货成功") : AjaxResult.error("批量发货失败");
    }
}