package com.by4cloud.platformx.business.controller; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.by4cloud.platformx.admin.api.entity.SysDept; import com.by4cloud.platformx.admin.api.feign.RemoteDeptService; import com.by4cloud.platformx.business.entity.*; import com.by4cloud.platformx.business.service.*; import com.by4cloud.platformx.business.vo.ContractOutBoundVo; import com.by4cloud.platformx.common.core.util.R; import com.by4cloud.platformx.common.excel.annotation.ResponseExcel; import com.by4cloud.platformx.common.log.annotation.SysLog; import com.by4cloud.platformx.common.security.annotation.Inner; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; /** * 销售挂账 * * @author wjli * @date 2026-05-21 16:16:31 */ @RestController @RequiredArgsConstructor @RequestMapping("/saleCredit" ) @Tag(description = "saleCredit" , name = "销售挂账管理" ) @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class SaleCreditController { private final SaleCreditService saleCreditService; private final ContractService contractService; private final BusinessCustomerService businessCustomerService; private final ContractOutBoundService contractOutBoundService; private final ProductService productService; private final ContractSubjectMatterService contractSubjectMatterService; private final RemoteDeptService remoteDeptService; /** * 分页查询 * @param page 分页对象 * @param saleCredit 销售挂账 * @return */ @Operation(summary = "分页查询" , description = "分页查询" ) @GetMapping("/page" ) @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" ) public R getSaleCreditPage(@ParameterObject Page page, @ParameterObject SaleCredit saleCredit) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); return R.ok(saleCreditService.page(page, wrapper)); } /** * 通过id查询销售挂账 * @param id id * @return R */ @Operation(summary = "通过id查询" , description = "通过id查询" ) @GetMapping("/{id}" ) @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" ) public R getById(@PathVariable("id" ) Long id) { return R.ok(saleCreditService.getById(id)); } /** * 新增销售挂账 * @param saleCredit 销售挂账 * @return R */ @Operation(summary = "新增销售挂账" , description = "新增销售挂账" ) @SysLog("新增销售挂账" ) @PostMapping @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" ) public R save(@RequestBody SaleCredit saleCredit) { return R.ok(saleCreditService.save(saleCredit)); } /** * 新增销售挂账 * @param saleCredit 销售挂账 * @return R */ @Operation(summary = "销售挂账生成" , description = "销售挂账生成" ) @SysLog("销售挂账生成" ) @PostMapping("/saveSaleCredit") @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" ) public R saveInvoice(@RequestBody SaleCredit saleCredit) { //开票中 saleCredit.setStatus(1); saleCreditService.save(saleCredit); //标记出库单被标识 List contractOutBoundList = saleCredit.getContractOutBoundList(); if(contractOutBoundList==null){ return R.failed("请选择出库单!"); } if(contractOutBoundList.size()==0){ return R.failed("请选择出库单!"); } String outBoundIds = ""; for(ContractOutBoundVo vo : contractOutBoundList){ if(StrUtil.isEmpty(outBoundIds)){ outBoundIds = "" + vo.getId(); }else{ outBoundIds += "," + vo.getId(); } ContractOutBound outBound = contractOutBoundService.getById(vo.getId()); outBound.setSaleCreditId(saleCredit.getId()); outBound.setTotalPrice(vo.getTotalPrice()); outBound.setTotalTax(vo.getTotalTax()); outBound.setProductId(vo.getProductId()); outBound.setTaxRate(vo.getTaxRate()); outBound.setTaxClass(vo.getTaxClass()); outBound.setTaxCode(vo.getTaxCode()); outBound.setSpecification(vo.getSpecification()); outBound.setUnit(vo.getUnit()); outBound.setUnitPrice(vo.getUnitPrice()); outBound.setInvoiceSatus(1); contractOutBoundService.updateById(outBound); } saleCredit.setOutBoundIds(outBoundIds); saleCreditService.save(saleCredit); return R.ok("销售挂账生成!"); } /** * 拼接销售挂账 * @param saleCredit 销售挂账 * @return R */ @Operation(summary = "拼接销售挂账" , description = "拼接销售挂账" ) @SysLog("拼接销售挂账" ) @GetMapping("/generatorInvoice") @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" ) @Inner(value = false) public R generatorInvoice(@ParameterObject SaleCredit saleCredit) { if(saleCredit.getContractId()==null){ return R.failed("合同id不能为空"); } Contract contract = contractService.getById(saleCredit.getContractId()); if(contract==null){ return R.failed("合同id错误"); } saleCredit.setContractName(contract.getContractName()); saleCredit.setContractNo(contract.getContractNo()); BusinessCustomer partA = businessCustomerService.getById(contract.getPartyAId()); if(partA!=null){ saleCredit.setPartyA(partA.getCompanyName()); saleCredit.setCreditCodeA(partA.getCreditCode()); saleCredit.setBankAccountA(partA.getBankAccount()); saleCredit.setBankNameA(partA.getBankName()); } R r = remoteDeptService.getById(contract.getPartyBId()); SysDept dept = r.getData(); if(dept!=null){ saleCredit.setPartyB(dept.getOrgName()); saleCredit.setCreditCodeB(dept.getOrgCode()); saleCredit.setBankAccountB(dept.getOrgBankAccount()); saleCredit.setBankNameB(dept.getOrgBank()); } List outBoundList = contractOutBoundService.list(new LambdaQueryWrapper() .eq(ContractOutBound::getContractId,contract.getId()) .eq(ContractOutBound::getInvoiceSatus,0) .orderByAsc(ContractOutBound::getOutBoundTime) ); if(outBoundList!=null){ if(!outBoundList.isEmpty()){ List list = new ArrayList<>(); for(ContractOutBound outBound : outBoundList){ ContractOutBoundVo vo = new ContractOutBoundVo(); BeanUtil.copyProperties(outBound,vo); Product product = productService.getOne(new LambdaQueryWrapper().eq(Product::getErpCode,outBound.getSubjectMatterCode()).last("limit 1")); if(product!=null){ vo.setProductId(product.getId()); vo.setTaxClass(product.getTaxClass()); vo.setTaxCode(product.getTaxCode()); vo.setTaxRate(product.getTaxRate()); } ContractSubjectMatter matter = contractSubjectMatterService.getOne(new LambdaQueryWrapper() .eq(ContractSubjectMatter::getContractId,contract.getId()) .eq(ContractSubjectMatter::getMaterialCode,outBound.getSubjectMatterCode()) .last("limit 1") ); if(matter!=null){ vo.setSpecification(matter.getSpecification()); vo.setUnit(matter.getUnit()); vo.setUnitPrice(matter.getUnitPrice()); } list.add(vo); } saleCredit.setContractOutBoundList(list); } } return R.ok(saleCredit); } /** * 修改销售挂账 * @param saleCredit 销售挂账 * @return R */ @Operation(summary = "修改销售挂账" , description = "修改销售挂账" ) @SysLog("修改销售挂账" ) @PutMapping @PreAuthorize("@pms.hasPermission('business_saleCredit_edit')" ) public R updateById(@RequestBody SaleCredit saleCredit) { return R.ok(saleCreditService.updateById(saleCredit)); } /** * 通过id删除销售挂账 * @param ids id列表 * @return R */ @Operation(summary = "通过id删除销售挂账" , description = "通过id删除销售挂账" ) @SysLog("通过id删除销售挂账" ) @DeleteMapping @PreAuthorize("@pms.hasPermission('business_saleCredit_del')" ) public R removeById(@RequestBody Long[] ids) { return R.ok(saleCreditService.removeBatchByIds(CollUtil.toList(ids))); } /** * 导出excel 表格 * @param saleCredit 查询条件 * @param ids 导出指定ID * @return excel 文件流 */ @ResponseExcel @GetMapping("/export") @PreAuthorize("@pms.hasPermission('business_saleCredit_export')" ) public List export(SaleCredit saleCredit,Long[] ids) { return saleCreditService.list(Wrappers.lambdaQuery(saleCredit).in(ArrayUtil.isNotEmpty(ids), SaleCredit::getId, ids)); } }