| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | |
| | | @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); |
| | | } |
| | | |
| | |
| | | @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.getCurrentDeptId()); |
| | | 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); |
| | |
| | | @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.setStatus("已发货"); |
| | | 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") |
| | |
| | | @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 |
| | |
| | | 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("批量发货失败"); |
| | | } |
| | | } |