天津-智科电子
1.协同办公-协同审批:待审批节点,第三人账号不可进行修改
2.营销管理-销售台账:勾选单个导出会出现整个导出的情况,但只能显示父项、不能显示子项
3.营销管理-销售台账:点击下拉没有价格,点击详情有价格
已修改4个文件
已添加1个文件
203 ■■■■■ 文件已修改
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/vo/SalesLedgerExportVo.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -184,6 +184,10 @@
        if (approvalInstanceDto == null || approvalInstanceDto.getId() == null) {
            return false;
        }
        ApprovalInstance existing = this.getById(approvalInstanceDto.getId());
        if (existing == null) {
            return false;
        }
        // åˆ¤æ–­æ˜¯å¦æœ‰æ­£åœ¨è¿›è¡Œçš„审批任务,有则不允许修改
        long pendingTaskCount = approvalTaskService.count(
                Wrappers.<ApprovalTask>lambdaQuery()
@@ -194,10 +198,48 @@
        if (pendingTaskCount > 0) {
            throw new ServiceException("该审批单有正在进行的审批任务,不允许修改");
        }
        // æœªé€šè¿‡ä¸”当前没有待处理节点,说明流程已终止(已驳回),
        // ä¿®æ”¹ä¿å­˜å³è§†ä¸ºé‡æ–°æäº¤ï¼Œæµç¨‹ä»Žç¬¬ä¸€çº§é‡æ–°å¼€å§‹
        boolean resubmit = !"APPROVED".equals(existing.getStatus())
                && approveProcessConfigNodeUtils.getCurrentNode(existing.getId()) == null;
        if (resubmit) {
            // è½¯åˆ é™¤æ—§çš„节点与任务(审批记录保留,时间线叠加)
            LambdaUpdateWrapper<ApprovalInstanceNode> nodeUpdateWrapper = Wrappers.lambdaUpdate();
            nodeUpdateWrapper.eq(ApprovalInstanceNode::getInstanceId, approvalInstanceDto.getId())
                    .eq(ApprovalInstanceNode::getDeleted, 0)
                    .set(ApprovalInstanceNode::getDeleted, (byte) 1);
            approvalInstanceNodeService.update(nodeUpdateWrapper);
            LambdaUpdateWrapper<ApprovalTask> taskUpdateWrapper = Wrappers.lambdaUpdate();
            taskUpdateWrapper.eq(ApprovalTask::getInstanceId, approvalInstanceDto.getId())
                    .eq(ApprovalTask::getDeleted, 0)
                    .set(ApprovalTask::getDeleted, (byte) 1);
            approvalTaskService.update(taskUpdateWrapper);
            approvalInstanceDto.setStatus("PENDING");
            approvalInstanceDto.setCurrentLevel(1);
            approvalInstanceDto.setFinishTime(null);
            approvalInstanceDto.setInstanceNo(existing.getInstanceNo());
            approvalInstanceDto.setApplicantId(existing.getApplicantId());
            approvalInstanceDto.setApplicantName(existing.getApplicantName());
        }
        boolean updated = this.updateById(approvalInstanceDto);
        if (!updated) {
            return false;
        }
        if (resubmit) {
            // updateById å¿½ç•¥ null,finishTime éœ€ç”¨æ˜¾å¼ set æ‰èƒ½æ¸…空
            this.update(
                    Wrappers.<ApprovalInstance>lambdaUpdate()
                            .eq(ApprovalInstance::getId, approvalInstanceDto.getId())
                            .set(ApprovalInstance::getFinishTime, null)
            );
            // é‡å»ºç¬¬ä¸€çº§èŠ‚ç‚¹ä¸Žå®¡æ‰¹ä»»åŠ¡ï¼Œå¹¶è¿½åŠ ä¸€æ¡å‘èµ·å®¡æ‰¹è®°å½•
            approveProcessConfigNodeUtils.createCurrentNodeAndTasks(approvalInstanceDto, true);
            sendApproveNotice(approvalInstanceDto, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId()));
        }
        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_INSTANCE, approvalInstanceDto.getId(), approvalInstanceDto.getStorageBlobDTOs());
        return true;
    }
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -15,8 +15,11 @@
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import com.ruoyi.sales.service.ISalesLedgerService;
import com.ruoyi.sales.vo.SalesLedgerExportVo;
import com.ruoyi.sales.vo.SalesLedgerVo;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.Operation;
@@ -52,6 +55,7 @@
    private ISalesLedgerService salesLedgerService;
    private ICommonFileService commonFileService;
    private final ISalesLedgerProductService salesLedgerProductService;
    private final FileUtil fileUtil;
    /**
@@ -127,20 +131,35 @@
    }
    /**
     * å¯¼å‡ºé”€å”®å°è´¦åˆ—表
     * å¯¼å‡ºé”€å”®å°è´¦åˆ—表。
     * ä¼ äº† ids åªå¯¼å‹¾é€‰çš„台账,否则按搜索条件导出全部;导出内容为父项(台账)与子项(产品)分行。
     */
    @Log(title = "销售台账", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SalesLedgerDto salesLedgerDto) {
        Page page = new Page(-1,-1);
        IPage<SalesLedgerVo> salesLedgerIPage = listPage(page, salesLedgerDto);
        ExcelUtil<SalesLedgerVo> util = new ExcelUtil<SalesLedgerVo>(SalesLedgerVo.class);
        if(salesLedgerIPage == null){
            util.exportExcel(response, new ArrayList<>(), "销售台账数据");
            return;
        Page page = new Page(-1, -1);
        IPage<SalesLedgerVo> salesLedgerIPage = salesLedgerService.selectSalesLedgerListPage(page, salesLedgerDto);
        List<SalesLedgerExportVo> rows = new ArrayList<>();
        if (salesLedgerIPage != null && !CollectionUtils.isEmpty(salesLedgerIPage.getRecords())) {
            for (SalesLedgerVo ledger : salesLedgerIPage.getRecords()) {
                SalesLedgerExportVo row = SalesLedgerExportVo.fromLedger(ledger);
                SalesLedgerProduct productQuery = new SalesLedgerProduct();
                productQuery.setSalesLedgerId(ledger.getId());
                productQuery.setType(1);
                List<SalesLedgerProduct> products = salesLedgerProductService.selectSalesLedgerProductList(productQuery);
                if (!CollectionUtils.isEmpty(products)) {
                    for (SalesLedgerProduct product : products) {
                        row.addProduct(product);
                    }
                }
                rows.add(row);
            }
        }
        List<SalesLedgerVo> list = salesLedgerIPage.getRecords();
        util.exportExcel(response, list, "销售台账数据");
        ExcelUtil<SalesLedgerExportVo> util = new ExcelUtil<SalesLedgerExportVo>(SalesLedgerExportVo.class);
        util.exportExcel(response, rows, "销售台账数据");
    }
    /**
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -16,6 +16,10 @@
@Data
public class SalesLedgerDto {
    private Long id;
    /**
     * å¯¼å‡ºæ—¶æŒ‰å‹¾é€‰çš„台账ID过滤,为空则按搜索条件导出全部
     */
    private List<Long> ids;
    private String salesContractNo;
    private String customerContractNo;
    private String projectName;
src/main/java/com/ruoyi/sales/vo/SalesLedgerExportVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package com.ruoyi.sales.vo;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * é”€å”®å°è´¦å¯¼å‡ºå¯¹è±¡ï¼ˆä¸»ä»Žè¡¨æ ¼ï¼‰ã€‚
 * <p>
 * å°è´¦å­—段做纵向合并居中,右侧同行展开该台账下的产品明细,避免出现大片空白单元格。
 * products å¿…须是最后一个字段:无产品的台账不会输出产品列,若其后面还有字段会导致列错位。
 */
@Data
public class SalesLedgerExportVo {
    @Excel(name = "销售合同号", needMerge = true)
    private String salesContractNo;
    @Excel(name = "项目名称", needMerge = true)
    private String projectName;
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd", needMerge = true)
    private Date entryDate;
    @Excel(name = "业务员", needMerge = true)
    private String salesman;
    @Excel(name = "客户名称", needMerge = true)
    private String customerName;
    @Excel(name = "录入人", needMerge = true)
    private String entryPersonName;
    @Excel(name = "合同金额", scale = 2, needMerge = true)
    private BigDecimal contractAmount;
    @Excel(name = "备注", needMerge = true)
    private String remarks;
    @Excel(name = "产品明细")
    private List<Item> products = new ArrayList<>();
    @Data
    public static class Item {
        @Excel(name = "产品大类")
        private String productCategory;
        @Excel(name = "规格型号")
        private String specificationModel;
        @Excel(name = "单位")
        private String unit;
        @Excel(name = "数量", cellType = Excel.ColumnType.NUMERIC)
        private BigDecimal quantity;
        @Excel(name = "待发货数量", cellType = Excel.ColumnType.NUMERIC)
        private BigDecimal noQuantity;
        @Excel(name = "发货状态")
        private String shippingStatus;
        @Excel(name = "税率(%)", cellType = Excel.ColumnType.NUMERIC)
        private BigDecimal taxRate;
        @Excel(name = "含税单价(元)", scale = 2)
        private BigDecimal taxInclusiveUnitPrice;
        @Excel(name = "含税总价(元)", scale = 2)
        private BigDecimal taxInclusiveTotalPrice;
        @Excel(name = "不含税总价(元)", scale = 2)
        private BigDecimal taxExclusiveTotalPrice;
        public static Item fromProduct(SalesLedgerProduct product) {
            Item item = new Item();
            item.setProductCategory(product.getProductCategory());
            item.setSpecificationModel(product.getSpecificationModel());
            item.setUnit(product.getUnit());
            item.setQuantity(product.getQuantity());
            item.setNoQuantity(product.getNoQuantity());
            item.setShippingStatus(product.getShippingStatus());
            item.setTaxRate(product.getTaxRate());
            item.setTaxInclusiveUnitPrice(product.getTaxInclusiveUnitPrice());
            item.setTaxInclusiveTotalPrice(product.getTaxInclusiveTotalPrice());
            item.setTaxExclusiveTotalPrice(product.getTaxExclusiveTotalPrice());
            return item;
        }
    }
    public static SalesLedgerExportVo fromLedger(SalesLedger ledger) {
        SalesLedgerExportVo vo = new SalesLedgerExportVo();
        vo.setSalesContractNo(ledger.getSalesContractNo());
        vo.setProjectName(ledger.getProjectName());
        vo.setEntryDate(ledger.getEntryDate());
        vo.setSalesman(ledger.getSalesman());
        vo.setCustomerName(ledger.getCustomerName());
        vo.setEntryPersonName(ledger.getEntryPersonName());
        vo.setContractAmount(ledger.getContractAmount());
        vo.setRemarks(ledger.getRemarks());
        return vo;
    }
    public void addProduct(SalesLedgerProduct product) {
        this.products.add(Item.fromProduct(product));
    }
}
src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -95,6 +95,12 @@
            <if test="salesLedgerDto.entryDateEnd != null and salesLedgerDto.entryDateEnd != '' ">
                AND T1.entry_date &lt;= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d')
            </if>
            <if test="salesLedgerDto.ids != null and salesLedgerDto.ids.size() > 0">
                AND T1.id IN
                <foreach collection="salesLedgerDto.ids" item="ledgerId" open="(" separator="," close=")">
                    #{ledgerId}
                </foreach>
            </if>
        </where>
        order by T1.entry_date desc
    </select>