sangwenwei 1 год назад
Родитель
Сommit
9d3cf92c4c
18 измененных файлов с 2120 добавлено и 0 удалено
  1. 84 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/controller/TenderBidController.java
  2. 79 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/domain/JyTenderBidDetail.java
  3. 61 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/domain/TenderBidBasic.java
  4. 28 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/TenderBidBasicMapper.java
  5. 20 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/TenderBidDetailMapper.java
  6. 96 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/xml/TenderBidBasicMapper.xml
  7. 44 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/xml/TenderBidDetailMapper.xml
  8. 518 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/service/TenderBidService.java
  9. 136 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/service/dto/TenderBidDTO.java
  10. 131 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/controller/TenderController.java
  11. 80 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/domain/BidDetail.java
  12. 53 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/domain/Tender.java
  13. 19 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/BidDetailMapper.java
  14. 29 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/TenderMapper.java
  15. 44 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/xml/BidDetailMapper.xml
  16. 89 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/xml/TenderMapper.xml
  17. 158 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/service/DTO/TenderDTO.java
  18. 451 0
      jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/service/TenderService.java

+ 84 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/controller/TenderBidController.java

@@ -0,0 +1,84 @@
+package com.jeeplus.business.bid.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.business.bid.service.TenderBidService;
+import com.jeeplus.business.bid.service.dto.TenderBidDTO;
+import com.jeeplus.business.tender.service.DTO.TenderDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@Api(tags ="中标")
+@RequestMapping(value = "/bid")
+public class TenderBidController {
+
+    @Resource
+    private TenderBidService tenderBidService;
+
+
+    /**
+     * 中标列表
+     */
+    @ApiOperation(value = "中标列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<IPage<TenderBidDTO>> list(Page<TenderBidDTO> page, TenderBidDTO dto) throws Exception{
+        IPage<TenderBidDTO> iPage = tenderBidService.list(page, dto);
+
+        return ResponseEntity.ok(iPage);
+    }
+
+
+    /**
+     * 查询中标详情
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询中标详情")
+    @GetMapping("/findById")
+    public ResponseEntity<TenderBidDTO> findBidById(@RequestParam String id) throws Exception{
+        TenderBidDTO dto = tenderBidService.findBidById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 新增/修改
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody TenderBidDTO dto) throws Exception{
+        String s = tenderBidService.save(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = tenderBidService.remove(id);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 根据投标id查询中标记录
+     */
+    @ApiOperation(value = "根据投标id查询中标记录")
+    @GetMapping("/bidList")
+    public ResponseEntity<IPage<TenderBidDTO>> bidList(Page<TenderBidDTO> page, TenderBidDTO dto) throws Exception{
+        IPage<TenderBidDTO> iPage = tenderBidService.bidList(page, dto);
+
+        return ResponseEntity.ok(iPage);
+    }
+
+
+}

+ 79 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/domain/JyTenderBidDetail.java

@@ -0,0 +1,79 @@
+package com.jeeplus.business.bid.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 中标详情表
+ */
+@Data
+@TableName("jy_tender_bid_detail")
+public class JyTenderBidDetail extends BaseEntity {
+    /**
+     *采购申请编号
+     */
+    private String purchaseNumber;
+
+    /*
+    分标编号
+     */
+    private String subscaleNumber;
+
+    /**
+     *分标名称
+     */
+    private String subscaleName;
+
+    /**
+     * 包号
+     */
+    private String packageNumber;
+
+    /**
+     * 招标项目标段名称
+     */
+    private String sectionName;
+
+    /**
+     * 采购金额(元)
+     */
+    private String money;
+
+    /**
+     * 基础表id
+     */
+    private String basicId;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+
+    /*
+    采购总金额(元)
+     */
+    private String totalMoney;
+
+    /**
+     * 投标人
+     */
+    private String bidMan;
+
+    /**
+     * 中标附件
+     */
+    @TableField(exist = false)
+    private List<WorkAttachmentDto> bidFiles;
+
+    @TableField(exist = false)
+    private String createName;
+
+    @TableField(exist = false)
+    private String officeName;
+}

+ 61 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/domain/TenderBidBasic.java

@@ -0,0 +1,61 @@
+package com.jeeplus.business.bid.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 中标基础表
+ */
+@Data
+@TableName("jy_tender_bid_basic")
+public class TenderBidBasic extends BaseEntity {
+
+    /**
+     * 投标表id
+     */
+    private String tenderId;
+
+    /**
+     * 投标批次
+     */
+    private String batch;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 报名截止时间
+     */
+    @TableField(exist = false)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date applicationDeadline;
+
+    /**
+     * 截标时间
+     */
+    @TableField(exist = false)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date bidClosingTime;
+
+    /**
+     * 创建人姓名
+     */
+    @TableField(exist = false)
+    private String createName;
+    /*
+    创建人部门
+     */
+    @TableField(exist = false)
+    private String officeName;
+
+}

+ 28 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/TenderBidBasicMapper.java

@@ -0,0 +1,28 @@
+package com.jeeplus.business.bid.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.business.bid.domain.TenderBidBasic;
+import com.jeeplus.business.bid.service.dto.TenderBidDTO;
+import com.jeeplus.business.tender.domain.Tender;
+import com.jeeplus.pubmodules.oss.domain.WorkAttachment;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface TenderBidBasicMapper extends BaseMapper<TenderBidBasic> {
+    TenderBidBasic findById(@Param("id") String id);
+
+    List<WorkAttachment> findFileList(@Param("id") String id);
+
+    Integer findIsExit(@Param("id") String id, @Param("name")String name);
+
+    IPage<TenderBidDTO> findPageList(@Param(Constants.WRAPPER)QueryWrapper<TenderBidDTO> queryWrapper, Page<TenderBidDTO> page);
+    //根据投标id查询中标记录
+    IPage<TenderBidDTO> bidList(@Param(Constants.WRAPPER)QueryWrapper<TenderBidDTO> queryWrapper, Page<TenderBidDTO> page);
+}

+ 20 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/TenderBidDetailMapper.java

@@ -0,0 +1,20 @@
+package com.jeeplus.business.bid.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.business.bid.domain.JyTenderBidDetail;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface TenderBidDetailMapper extends BaseMapper<JyTenderBidDetail> {
+
+    //查出附件信息
+    List<WorkAttachmentDto> getByAttachmentId(String id);
+    //获取中标详情
+    List<JyTenderBidDetail> findByBasicId(@Param("id") String id);
+    //根据基础表id查询详情id
+    List<String> getByBasicId(@Param("id")String id);
+}

+ 96 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/xml/TenderBidBasicMapper.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.business.bid.mapper.TenderBidBasicMapper">
+
+    <select id="findById" resultType="com.jeeplus.business.bid.domain.TenderBidBasic">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_time,
+            a.update_by_id,
+            a.batch,
+            a.tender_id,
+            b.application_deadline,
+            b.bid_closing_time,
+            su.name as createName,
+            so.name as officeName
+        from jy_tender_bid_basic a
+            left join sys_user su on a.create_by_id = su.id
+			left join sys_office so on su.office_id = so.id
+			left join jy_tender b on a.tender_id = b.id and b.del_flag = '0'
+        where a.id = #{id}
+
+    </select>
+
+    <select id="findFileList" resultType="com.jeeplus.pubmodules.oss.domain.WorkAttachment">
+		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id}
+	</select>
+    <select id="findIsExit" resultType="java.lang.Integer">
+		SELECT
+			COUNT( 0 )
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+			AND attachment_name = #{name}
+	</select>
+
+    <select id="findPageList" resultType="com.jeeplus.business.bid.service.dto.TenderBidDTO">
+        select distinct
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_time,
+            a.update_by_id,
+            a.purchase_number,
+            a.subscale_number,
+            a.subscale_name,
+            a.package_number,
+            a.section_name,
+            a.money,
+            a.basic_id,
+            b.tender_id,
+            b.batch,
+            su.name as createName,
+            so.name as officeName
+        from jy_tender_bid_detail a
+            left join sys_user su on a.create_by_id = su.id
+			left join sys_office so on su.office_id = so.id
+			left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+			left join jy_tender_bid_basic b
+			on b.id = a.basic_id and b.del_flag = '0'
+			${ew.customSqlSegment}
+		ORDER BY a.create_time DESC
+    </select>
+
+    <select id="bidList" resultType="com.jeeplus.business.bid.service.dto.TenderBidDTO">
+        select distinct
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_time,
+            a.update_by_id,
+            a.purchase_number,
+            a.subscale_number,
+            a.subscale_name,
+            a.package_number,
+            a.section_name,
+            a.money,
+            a.basic_id,
+            b.tender_id,
+            b.batch,
+            su.name as createName,
+            so.name as officeName
+        from jy_tender_bid_detail a
+            left join sys_user su on a.create_by_id = su.id
+			left join sys_office so on su.office_id = so.id
+			left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+			left join jy_tender_bid_basic b
+			on b.id = a.basic_id and b.del_flag = '0'
+			${ew.customSqlSegment}
+		ORDER BY a.create_time DESC
+    </select>
+
+</mapper>

+ 44 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/mapper/xml/TenderBidDetailMapper.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.business.bid.mapper.TenderBidDetailMapper">
+
+    <select id="getByAttachmentId" resultType="com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto">
+        SELECT
+			id,
+			url,
+			attachment_name AS `name`,
+			create_by_id AS `by`,
+			create_time
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+    </select>
+
+    <select id="findByBasicId" resultType="com.jeeplus.business.bid.domain.JyTenderBidDetail">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.bid_man,
+            a.purchase_number,
+            a.subscale_number,
+            a.subscale_name,
+            a.package_number,
+            a.section_name,
+            a.money,
+            a.remarks,
+            su.name as createName,
+            so.name as officeName
+        from jy_tender_bid_detail a
+        left join sys_user su on a.bid_man = su.id
+        left join sys_office so on su.office_id = so.id
+        where a.basic_id = #{id} and a.del_flag = '0'
+    </select>
+
+    <select id="getByBasicId" resultType="java.lang.String">
+        select id from jy_tender_bid_detail where basic_id = #{id} and del_flag = '0'
+ </select>
+
+</mapper>

+ 518 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/service/TenderBidService.java

@@ -0,0 +1,518 @@
+package com.jeeplus.business.bid.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.business.bid.domain.JyTenderBidDetail;
+import com.jeeplus.business.bid.domain.TenderBidBasic;
+import com.jeeplus.business.bid.mapper.TenderBidBasicMapper;
+import com.jeeplus.business.bid.mapper.TenderBidDetailMapper;
+import com.jeeplus.business.bid.service.dto.TenderBidDTO;
+import com.jeeplus.business.tender.domain.BidDetail;
+import com.jeeplus.business.tender.domain.Tender;
+import com.jeeplus.business.tender.mapper.BidDetailMapper;
+import com.jeeplus.business.tender.service.DTO.TenderDTO;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.pubmodules.oss.domain.WorkAttachment;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import com.jeeplus.sys.feign.IPostApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.feign.IWorkAttachmentApi;
+import com.jeeplus.sys.service.dto.FlowCopy;
+import com.jeeplus.sys.service.dto.PostDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@Service
+public class TenderBidService {
+
+    @Resource
+    private TenderBidBasicMapper basicMapper;
+
+    @Resource
+    private TenderBidDetailMapper detailMapper;
+
+    @Resource
+    private BidDetailMapper bidDetailMapper;
+
+    /**
+     * 查询中标详情
+     * @param id
+     * @return
+     */
+    public TenderBidDTO findBidById(String id) {
+        //查询基础表信息
+        TenderBidDTO tenderBidDTO = new TenderBidDTO();
+
+        ArrayList<JyTenderBidDetail> bids = new ArrayList<>();
+
+        TenderBidBasic tender = basicMapper.findById(id);
+        if (ObjectUtil.isNotEmpty(tender)){
+            BeanUtils.copyProperties(tender,tenderBidDTO);
+            //获取投标详情信息
+            List<BidDetail> bidDetails = bidDetailMapper.findByTenderId(tender.getTenderId());
+            if (CollectionUtils.isNotEmpty(bidDetails)){
+                bidDetails.stream().forEach(detail->{
+                    //附件信息
+                    List<WorkAttachmentDto> acList = detailMapper.getByAttachmentId(detail.getId());
+                    if (CollectionUtils.isNotEmpty(acList)) {
+                        for (WorkAttachmentDto i : acList) {
+                            i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                        }
+                    }
+                    detail.setBidFiles(acList);
+                    tenderBidDTO.setTotalMoney(detail.getTotalMoney());
+                });
+            }
+            tenderBidDTO.setTenderList(bidDetails);//投标详情
+            //获取中标详情
+            List<JyTenderBidDetail> details=detailMapper.findByBasicId(id);
+            for (JyTenderBidDetail bidDetail : details) {
+                //附件信息
+                List<WorkAttachmentDto> acList = detailMapper.getByAttachmentId(bidDetail.getId());
+                if (CollectionUtils.isNotEmpty(acList)) {
+                    for (WorkAttachmentDto i : acList) {
+                        i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                    }
+                }
+                bidDetail.setBidFiles(acList);
+                bids.add(bidDetail);
+            }
+            tenderBidDTO.setBidDetails(details); //中标详情
+            //附件信息
+            List<WorkAttachmentDto> files = detailMapper.getByAttachmentId(tender.getId());
+            if (CollectionUtils.isNotEmpty(files)) {
+                for (WorkAttachmentDto i : files) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                }
+            }
+            tenderBidDTO.setFiles(files);
+        }
+        return tenderBidDTO;
+    }
+
+    /**
+     * 新增或修改
+     * @param dto
+     * @return
+     */
+    public String save(TenderBidDTO dto) {
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        if (StringUtils.isNotBlank(dto.getId())){
+            return update(dto,userDTO);
+        }else {
+            return add(dto,userDTO);
+        }
+    }
+
+    public String add(TenderBidDTO dto, UserDTO userDTO) {
+        // 生成id
+        String id = UUID.randomUUID().toString().replace("-", "");
+        //保存基础表信息
+        TenderBidBasic tender = new TenderBidBasic();
+        BeanUtils.copyProperties(dto,tender);
+        tender.setId(id);
+        tender.setCreateById(userDTO.getId());
+        tender.setCreateTime(new Date());
+        tender.setUpdateById(userDTO.getId());
+        tender.setUpdateTime(new Date());
+        tender.setDelFlag(0);
+        basicMapper.insert(tender);
+        //保存详情列表信息
+        if (CollectionUtils.isNotEmpty(dto.getBidDetails())){
+            for (JyTenderBidDetail bidDetail : dto.getBidDetails()) {
+                // 生成id
+                String detailId = UUID.randomUUID().toString().replace("-", "");
+                bidDetail.setId(detailId);
+                bidDetail.setBidMan(bidDetail.getBidMan());//投标人
+                bidDetail.setCreateById(userDTO.getId());
+                bidDetail.setCreateTime(new Date());
+                bidDetail.setUpdateById(userDTO.getId());
+                bidDetail.setUpdateTime(new Date());
+                bidDetail.setDelFlag(0);
+
+                bidDetail.setTotalMoney(dto.getTotalMoney());
+                bidDetail.setBasicId(id); //基础表id
+                detailMapper.insert(bidDetail);
+                //保存详情列表附件信息
+                if (CollectionUtils.isNotEmpty(bidDetail.getBidFiles())){
+                    saveFiles(bidDetail.getBidFiles(), userDTO, detailId);
+                }
+
+            }
+        }
+        // 保存附件列表信息
+        if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+            saveFiles(dto.getFiles(), userDTO, id);
+        }
+
+        //抄送部门主任,分管领导,办公室
+        ArrayList<UserDTO> userDTOS = new ArrayList<>();
+
+        PostDTO postDTOByName = SpringUtil.getBean(IPostApi.class).getPostDTOByName("办公室(嘉溢)");
+        List<UserDTO> listByPostId = SpringUtil.getBean(IUserApi.class).findListByPostId(postDTOByName.getId());
+        listByPostId.stream().forEach(item->{
+            userDTOS.add(item);
+        });
+        //获取嘉溢所有人员信息
+        List<UserDTO> allUserInfo = SpringUtil.getBean(IUserApi.class).findListByCompanyId(userDTO.getCompanyDTO().getId());
+        //分管领导
+        for (UserDTO userDTO1 : allUserInfo) {
+            if (StringUtils.isNotBlank(userDTO1.getManageOfficeIds())){
+                String manageOfficeIds = userDTO1.getManageOfficeIds();
+                if (manageOfficeIds.contains(",")){
+                    String[] split = manageOfficeIds.split(",");
+                    //获取分管领导所分管的部门
+                    for (String s : split) {
+                        //判断分管部门与项目创建人所在的部门是否一致
+                        if (s.equals(userDTO.getOfficeDTO().getId())) {
+                            userDTOS.add(userDTO1);
+                        }
+                    }
+                }else {
+                    if (manageOfficeIds.equals(userDTO.getOfficeDTO().getId())) {
+                        userDTOS.add(userDTO1);
+                    }
+                }
+
+            }
+        }
+
+        for (UserDTO user : userDTOS) {
+            String id1 = UUID.randomUUID().toString().replace("-", "");
+            FlowCopy flowCopy = new FlowCopy();
+            flowCopy.setCreateById(userDTO.getId());
+            flowCopy.setCreateTime(new Date());
+            flowCopy.setUpdateById(userDTO.getId());
+            flowCopy.setUpdateTime(new Date());
+            String tenderName = tender.getBatch()+"已中标";
+            flowCopy.setProcInsName(tenderName);
+            flowCopy.setProcInsId(id);
+            flowCopy.setProcDefId(id);
+            flowCopy.setUserId(user.getId());
+            flowCopy.setId(id1);
+            flowCopy.setDelFlag(0);
+            SpringUtil.getBean(IFlowableApi.class).add(flowCopy);
+        }
+
+        return "添加成功";
+    }
+
+    public String update(TenderBidDTO dto, UserDTO userDTO) {
+        //保存基础表信息
+        TenderBidBasic tender = new TenderBidBasic();
+        BeanUtils.copyProperties(dto,tender);
+        tender.setUpdateById(userDTO.getId());
+        tender.setUpdateTime(new Date());
+        basicMapper.updateById(tender);
+        //修改中标详情列表信息
+        if (CollectionUtils.isNotEmpty(dto.getBidDetails())){
+            //根据基础表id获取所有的详情表id
+            List<String> idList = detailMapper.getByBasicId(dto.getId());
+            for (JyTenderBidDetail bidDetail : dto.getBidDetails()) {
+                //删除掉多余的详情信息
+                if (null != idList) {
+                    if (idList.contains(bidDetail.getId())){
+                        idList.remove(bidDetail.getId());
+                    }
+                }
+            }
+            if (null != idList & idList.size()>0) {
+                idList.forEach(id->{
+                    detailMapper.deleteById(id);
+                });
+            }
+
+            for (JyTenderBidDetail bidDetail : dto.getBidDetails()) {
+                JyTenderBidDetail detail = detailMapper.selectById(bidDetail.getId());
+                if (null == detail){
+                    // 生成id
+                    String detailId = UUID.randomUUID().toString().replace("-", "");
+                    bidDetail.setId(detailId);
+                    bidDetail.setBidMan(bidDetail.getBidMan());//投标人
+                    bidDetail.setCreateById(userDTO.getId());
+                    bidDetail.setCreateTime(new Date());
+                    bidDetail.setUpdateById(userDTO.getId());
+                    bidDetail.setUpdateTime(new Date());
+                    bidDetail.setDelFlag(0);
+
+                    bidDetail.setTotalMoney(dto.getTotalMoney());
+                    bidDetail.setBasicId(dto.getId()); //基础表id
+                    detailMapper.insert(bidDetail);
+                    //保存详情列表附件信息
+                    if (CollectionUtils.isNotEmpty(bidDetail.getBidFiles())){
+                        saveFiles(bidDetail.getBidFiles(), userDTO, detailId);
+                    }
+                }else {
+                    bidDetail.setUpdateById(userDTO.getId());
+                    bidDetail.setUpdateTime(new Date());
+                    bidDetail.setTotalMoney(dto.getTotalMoney());
+                    detailMapper.updateById(bidDetail);
+                    if (CollectionUtils.isNotEmpty(bidDetail.getBidFiles())) {
+                        updateFiles(bidDetail.getBidFiles(), userDTO, bidDetail.getId());
+                    }
+                }
+            }
+
+        }
+        // 修改附件信息列表
+        if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+            updateFiles(dto.getFiles(), userDTO, dto.getId());
+        }
+        //抄送前先进行删除
+        SpringUtil.getBean(IFlowableApi.class).remove(dto.getId());
+        //抄送部门主任,分管领导,办公室
+        ArrayList<UserDTO> userDTOS = new ArrayList<>();
+
+        PostDTO postDTOByName = SpringUtil.getBean(IPostApi.class).getPostDTOByName("办公室(嘉溢)");
+        List<UserDTO> listByPostId = SpringUtil.getBean(IUserApi.class).findListByPostId(postDTOByName.getId());
+        listByPostId.stream().forEach(item->{
+            userDTOS.add(item);
+        });
+        //获取嘉溢所有人员信息
+        List<UserDTO> allUserInfo = SpringUtil.getBean(IUserApi.class).findListByCompanyId(userDTO.getCompanyDTO().getId());
+        //分管领导
+        for (UserDTO userDTO1 : allUserInfo) {
+            if (StringUtils.isNotBlank(userDTO1.getManageOfficeIds())){
+                String manageOfficeIds = userDTO1.getManageOfficeIds();
+                if (manageOfficeIds.contains(",")){
+                    String[] split = manageOfficeIds.split(",");
+                    //获取分管领导所分管的部门
+                    for (String s : split) {
+                        //判断分管部门与项目创建人所在的部门是否一致
+                        if (s.equals(userDTO.getOfficeDTO().getId())) {
+                            userDTOS.add(userDTO1);
+                        }
+                    }
+                }else {
+                    if (manageOfficeIds.equals(userDTO.getOfficeDTO().getId())) {
+                        userDTOS.add(userDTO1);
+                    }
+                }
+
+            }
+        }
+
+        for (UserDTO user : userDTOS) {
+            String id1 = UUID.randomUUID().toString().replace("-", "");
+            FlowCopy flowCopy = new FlowCopy();
+            flowCopy.setCreateById(userDTO.getId());
+            flowCopy.setCreateTime(new Date());
+            flowCopy.setUpdateById(userDTO.getId());
+            flowCopy.setUpdateTime(new Date());
+            String tenderName = "投标项目--"+tender.getBatch()+"已中标";
+            flowCopy.setProcInsName(tenderName);
+            flowCopy.setProcInsId(dto.getId());
+            flowCopy.setProcDefId(dto.getId());
+            flowCopy.setUserId(user.getId());
+            flowCopy.setId(id1);
+            flowCopy.setDelFlag(0);
+            SpringUtil.getBean(IFlowableApi.class).add(flowCopy);
+        }
+
+        return "修改成功";
+    }
+
+    /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentDto> list, UserDTO userDTO, String id) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentDto dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachment> infoList = basicMapper.findFileList(id);
+        if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(infoList)) {
+            for (WorkAttachment i : infoList) {
+                if (!names.contains(i.getUrl())) {
+//                    ossServiceMapper.deleteById(i.getId());
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentDto dto : list) {
+            //判断是否存在
+            Integer isExit = basicMapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachment i = new WorkAttachment();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag("tenderBidFile");
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                Map<String,String> map = new HashMap<>();
+                String workAttachment = JSON.toJSONString((i));
+                String userDTOInfo = JSON.toJSONString((userDTO));
+                map.put("workAttachment",workAttachment);
+                map.put("userDTO",userDTOInfo);
+                SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+//                ossServiceMapper.insertWorkAttachment(i, userDTO);
+                j++;
+            }
+        }
+    }
+
+    /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentDto> list, UserDTO userDTO, String id) {
+        int j = 1;
+        for (WorkAttachmentDto dto : list) {
+            WorkAttachment i = new WorkAttachment();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag("tenderBidFile");
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+            Map<String,String> map = new HashMap<>();
+            String workAttachment = JSON.toJSONString((i));
+            String userDTOInfo = JSON.toJSONString((userDTO));
+            map.put("workAttachment",workAttachment);
+            map.put("userDTO",userDTOInfo);
+            SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+//            ossServiceMapper.insertWorkAttachment(i, userDTO);
+            j++;
+        }
+    }
+
+    /**
+     * 中标列表查询
+     * @param page
+     * @param dto
+     * @return
+     */
+    public IPage<TenderBidDTO> list(Page<TenderBidDTO> page, TenderBidDTO dto) throws Exception {
+        QueryWrapper<TenderBidDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, TenderBidDTO.class);
+        queryWrapper.eq("a.del_flag", 0);
+        // 创建时间
+        if (dto.getDates() != null) {
+            queryWrapper.between("a.create_time", dto.getDates()[0], dto.getDates()[1]);
+        }
+        // 创建人
+        if (StringUtils.isNotEmpty(dto.getCreateById())) {
+            queryWrapper.eq("a.create_by_id ", dto.getCreateById());
+        }
+        //批次
+        if (StringUtils.isNotEmpty(dto.getBatch())) {
+            queryWrapper.like("b.batch", dto.getBatch());
+        }
+        //采购金额
+        if (null !=dto.getTotalMoneys()){
+            if (StringUtils.isNotEmpty(dto.getTotalMoneys()[0])) {
+                queryWrapper.ge("a.money",Double.parseDouble(dto.getTotalMoneys()[0]));
+            }
+            if (dto.getTotalMoneys().length>1 && StringUtils.isNotEmpty(dto.getTotalMoneys()[1])) {
+                queryWrapper.le("a.money", Double.parseDouble(dto.getTotalMoneys()[1]));
+            }
+        }
+        //采购申请号
+        if (StringUtils.isNotEmpty(dto.getPurchaseNumber())) {
+            queryWrapper.like("a.purchase_number", dto.getPurchaseNumber());
+        }
+        //分标编号
+        if (StringUtils.isNotEmpty(dto.getSubscaleNumber())) {
+            queryWrapper.like("a.subscale_number", dto.getSubscaleNumber());
+        }
+        //分标名称
+        if (StringUtils.isNotEmpty(dto.getSubscaleName())) {
+            queryWrapper.like("a.subscale_name", dto.getSubscaleName());
+        }
+        IPage<TenderBidDTO> iPage=basicMapper.findPageList(queryWrapper,page);
+        return iPage;
+    }
+
+    /**
+     * 根据id进行删除
+     * @param id
+     * @return
+     */
+    public String remove(String id) {
+        // 删除基础信息表
+        basicMapper.deleteById(id);
+        // 删除详情列表 及对应附件信息
+        List<JyTenderBidDetail> detailedList = detailMapper.findByBasicId(id);
+        if (null != detailedList){
+            detailedList.forEach(de->{
+                //附件
+                List<WorkAttachmentDto> fileList = detailMapper.getByAttachmentId(de.getId());
+                if ( null != fileList ){
+                    fileList.forEach(f->{
+                        SpringUtil.getBean(IWorkAttachmentApi.class).deleteById(f.getId());
+                    });
+                }
+                detailMapper.deleteById(de.getId());
+            });
+        }
+        // 删除附件信息
+        SpringUtil.getBean(IWorkAttachmentApi.class).deleteByAttachmentId(id);
+        //删除抄送信息
+        SpringUtil.getBean(IFlowableApi.class).remove(id);
+
+        return "删除成功";
+    }
+
+    /**
+     * 根据投标id查询中标记录
+     * @param page
+     * @param dto
+     * @return
+     */
+    public IPage<TenderBidDTO> bidList(Page<TenderBidDTO> page, TenderBidDTO dto) throws Exception {
+        QueryWrapper<TenderBidDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, TenderBidDTO.class);
+        queryWrapper.eq("a.del_flag", 0);
+        queryWrapper.eq("b.tender_id",dto.getTenderId());
+        IPage<TenderBidDTO> iPage=basicMapper.bidList(queryWrapper,page);
+        return iPage;
+    }
+}

+ 136 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/bid/service/dto/TenderBidDTO.java

@@ -0,0 +1,136 @@
+package com.jeeplus.business.bid.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.business.bid.domain.JyTenderBidDetail;
+import com.jeeplus.business.tender.domain.BidDetail;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class TenderBidDTO extends BaseEntity {
+
+
+
+    /**
+     * 投标表id
+     */
+    private String tenderId;
+
+    /**
+     * 投标批次
+     */
+    private String batch;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     *采购申请编号
+     */
+    private String purchaseNumber;
+
+    /*
+    分标编号
+     */
+    private String subscaleNumber;
+
+    /**
+     *分标名称
+     */
+    private String subscaleName;
+
+    /**
+     * 包号
+     */
+    private String packageNumber;
+
+    /**
+     * 招标项目标段名称
+     */
+    private String sectionName;
+
+    /**
+     * 采购金额(元)
+     */
+    private String money;
+
+    /**
+     * 基础表id
+     */
+    private String basicId;
+
+    /**
+     * 创建时间
+     */
+    private String[] dates;
+
+    /**
+     * 创建人部门
+     */
+    private String officeId;
+
+    /**
+     * 中标附件
+     */
+    private List<WorkAttachmentDto> files;
+
+
+    /**
+     * 投标明细列表
+     */
+    private List<BidDetail> tenderList;
+
+    /**
+     * 中标明细列表
+     */
+    private List<JyTenderBidDetail> bidDetails;
+
+    /*
+    采购总金额(元)
+     */
+    private String totalMoney;
+    /**
+     * 创建人姓名
+     */
+    private String createName;
+    /*
+    创建人部门
+     */
+    private String officeName;
+
+    /**
+     * 采购金额查询
+     */
+    private String[] totalMoneys;
+
+    /**
+     * 投标人
+     */
+    private String bidMan;
+
+    /**
+     * 报名截止时间
+     */
+    @TableField(exist = false)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date applicationDeadline;
+
+    /**
+     * 截标时间
+     */
+    @TableField(exist = false)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date bidClosingTime;
+
+
+}

+ 131 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/controller/TenderController.java

@@ -0,0 +1,131 @@
+package com.jeeplus.business.tender.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.business.finance.util.EasyPoiUtil;
+import com.jeeplus.business.reimbursement.service.dto.JyReimbursementInfoDTO;
+import com.jeeplus.business.tender.service.DTO.TenderDTO;
+import com.jeeplus.business.tender.service.TenderService;
+import com.jeeplus.business.useSeal.service.dto.SignetDTO;
+import com.jeeplus.common.excel.ExcelOptions;
+import com.jeeplus.common.excel.annotation.ExportMode;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.pubmodules.purchase.service.dto.MaterialInfoDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@Api(tags ="招投标")
+@RequestMapping(value = "/tender")
+public class TenderController {
+
+    @Resource
+    private TenderService tenderService;
+
+
+
+
+
+    /**
+     * 投标列表
+     */
+    @ApiOperation(value = "投标列表查询")
+    @GetMapping("/list")
+    public ResponseEntity<IPage<TenderDTO>> list(Page<TenderDTO> page, TenderDTO dto) throws Exception{
+        IPage<TenderDTO> iPage = tenderService.list(page, dto);
+
+        return ResponseEntity.ok(iPage);
+    }
+
+    /**
+     * 新增/修改
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "新增、修改")
+    @PostMapping("/save")
+    public ResponseEntity<String> save(@RequestBody TenderDTO dto) throws Exception{
+        String s = tenderService.save(dto);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "查询")
+    @GetMapping("/findById")
+    public ResponseEntity<TenderDTO> findById(@RequestParam String id) throws Exception{
+        TenderDTO dto = tenderService.findById(id);
+        return ResponseEntity.ok(dto);
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/remove")
+    public ResponseEntity<String> remove(@RequestParam String id){
+        String s = tenderService.remove(id);
+        return ResponseEntity.ok(s);
+    }
+
+    /**
+     * 抄送
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "删除")
+    @GetMapping("/copyToLeader")
+    public ResponseEntity<String> copyToLeader(@RequestParam String id){
+        String s = tenderService.copyToLeader(id);
+        return ResponseEntity.ok(s);
+    }
+
+    @ApiLog(value = "导出用印数据", type = LogTypeEnum.EXPORT)
+    @GetMapping("export")
+    @ApiOperation(value = "导出用印数据")
+    public void exportFile(Page<TenderDTO> page, TenderDTO dto, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename();
+        String sheetName = options.getSheetName();
+        List<TenderDTO> result = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode() ) ) {
+            result = tenderService.findList(page,dto).getRecords();
+        } else if (ExportMode.selected.equals ( options.getMode() )) {
+            result = tenderService.findList(page,dto).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            result = tenderService.findList(page,dto).getRecords();
+        }
+        EasyPoiUtil.exportExcel ( result, sheetName,  sheetName, TenderDTO.class, fileName, response );
+
+    }
+
+
+
+
+
+
+
+
+
+
+
+}

+ 80 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/domain/BidDetail.java

@@ -0,0 +1,80 @@
+package com.jeeplus.business.tender.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 投标详情表
+ */
+@Data
+@TableName("jy_tender_detail")
+public class BidDetail extends BaseEntity {
+
+    /**
+     *采购申请编号
+     */
+    private String purchaseNumber;
+
+    /*
+    分标编号
+     */
+    private String subscaleNumber;
+
+    /**
+     *分标名称
+     */
+    private String subscaleName;
+
+    /**
+     * 包号
+     */
+    private String packageNumber;
+
+    /**
+     * 招标项目标段名称
+     */
+    private String sectionName;
+
+    /**
+     * 采购金额(元)
+     */
+    private String money;
+
+    /**
+     * 基础表id
+     */
+    private String tenderId;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /*
+    采购总金额(元)
+     */
+    private String totalMoney;
+
+    /**
+     * 投标人
+     */
+    private String bidMan;
+
+    /**
+     * 投标附件
+     */
+    @TableField(exist = false)
+    private List<WorkAttachmentDto> bidFiles;
+
+    @TableField(exist = false)
+    private String createName;
+
+    @TableField(exist = false)
+    private String officeName;
+}

+ 53 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/domain/Tender.java

@@ -0,0 +1,53 @@
+package com.jeeplus.business.tender.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 招投标基础表
+ */
+@Data
+@TableName("jy_tender")
+public class Tender extends BaseEntity {
+
+    /**
+     *批次
+     */
+    private String batch;
+
+    /**
+     * 报名截止时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date applicationDeadline;
+
+    /**
+     * 截标时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date bidClosingTime;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 创建人姓名
+     */
+    @TableField(exist = false)
+    private String createName;
+    /*
+    创建人部门
+     */
+    @TableField(exist = false)
+    private String officeName;
+}

+ 19 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/BidDetailMapper.java

@@ -0,0 +1,19 @@
+package com.jeeplus.business.tender.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.business.tender.domain.BidDetail;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BidDetailMapper extends BaseMapper<BidDetail> {
+    List<String> getByTenderId(@Param("id") String id);
+
+    List<BidDetail> findByTenderId(@Param("id") String id);
+
+    //查出附件信息
+    List<WorkAttachmentDto> getByAttachmentId(String id);
+}

+ 29 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/TenderMapper.java

@@ -0,0 +1,29 @@
+package com.jeeplus.business.tender.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.business.tender.domain.Tender;
+import com.jeeplus.business.tender.service.DTO.TenderDTO;
+import com.jeeplus.pubmodules.oss.domain.WorkAttachment;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import javax.swing.text.AbstractDocument;
+import java.util.List;
+
+@Mapper
+public interface TenderMapper extends BaseMapper<Tender> {
+
+    IPage<TenderDTO> findPageList(@Param(Constants.WRAPPER) QueryWrapper<TenderDTO> queryWrapper, Page<TenderDTO> page);
+
+    Integer findIsExit(@Param("id") String id, @Param("name")String name);
+
+    List<WorkAttachment> findFileList(@Param("id") String id);
+
+    Tender findById(@Param("id") String id);
+    //导出列表查询
+    IPage<TenderDTO> findList(@Param(Constants.WRAPPER)QueryWrapper<TenderDTO> queryWrapper, Page<TenderDTO> page);
+}

+ 44 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/xml/BidDetailMapper.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.business.tender.mapper.BidDetailMapper">
+
+    <select id="getByTenderId" resultType="java.lang.String">
+        select id from jy_tender_detail where tender_id = #{id} and del_flag = '0'
+    </select>
+
+    <select id="findByTenderId" resultType="com.jeeplus.business.tender.domain.BidDetail">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.bid_man,
+            a.purchase_number,
+            a.subscale_number,
+            a.subscale_name,
+            a.package_number,
+            a.section_name,
+            a.money,
+            a.remarks,
+            su.name as createName,
+            so.name as officeName
+        from jy_tender_detail a
+        left join sys_user su on a.bid_man = su.id
+        left join sys_office so on su.office_id = so.id
+        where a.tender_id = #{id} and a.del_flag = '0'
+    </select>
+
+    <select id="getByAttachmentId" resultType="com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto">
+        SELECT
+			id,
+			url,
+			attachment_name AS `name`,
+			create_by_id AS `by`,
+			create_time
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+    </select>
+
+</mapper>

+ 89 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/mapper/xml/TenderMapper.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.business.tender.mapper.TenderMapper">
+
+    <select id="findPageList" resultType="com.jeeplus.business.tender.service.DTO.TenderDTO">
+        select distinct
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_time,
+            a.update_by_id,
+            a.batch,
+            a.application_deadline,
+            a.bid_closing_time,
+            su.name as createName,
+            so.name as officeName,
+            b.total_money as totalMoney
+        from jy_tender a
+            left join sys_user su on a.create_by_id = su.id
+			left join sys_office so on su.office_id = so.id
+			left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+			left join jy_tender_detail b
+			on a.id = b.tender_id and b.del_flag = '0'
+			${ew.customSqlSegment}
+		ORDER BY a.create_time DESC
+    </select>
+
+    <select id="findList" resultType="com.jeeplus.business.tender.service.DTO.TenderDTO">
+        select distinct
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_time,
+            a.update_by_id,
+            a.batch,
+            a.application_deadline,
+            a.bid_closing_time,
+            su.name as createName,
+            so.name as officeName,
+            b.total_money as totalMoney,
+            b.money,
+            b.purchase_number,
+            b.subscale_number,
+            b.subscale_name,
+            b.package_number,
+            b.section_name
+        from jy_tender a
+            left join sys_user su on a.create_by_id = su.id
+			left join sys_office so on su.office_id = so.id
+			left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+			left join jy_tender_detail b
+			on a.id = b.tender_id and b.del_flag = '0'
+			${ew.customSqlSegment}
+		ORDER BY a.create_time DESC
+    </select>
+
+    <select id="findFileList" resultType="com.jeeplus.pubmodules.oss.domain.WorkAttachment">
+		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id}
+	</select>
+    <select id="findIsExit" resultType="java.lang.Integer">
+		SELECT
+			COUNT( 0 )
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+			AND attachment_name = #{name}
+	</select>
+
+    <select id="findById" resultType="com.jeeplus.business.tender.domain.Tender">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.update_time,
+            a.update_by_id,
+            a.batch,
+            a.application_deadline,
+            a.bid_closing_time,
+            su.name as createName,
+            so.name as officeName
+        from jy_tender a
+            left join sys_user su on a.create_by_id = su.id
+			left join sys_office so on su.office_id = so.id
+        where a.id = #{id}
+    </select>
+
+</mapper>

+ 158 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/service/DTO/TenderDTO.java

@@ -0,0 +1,158 @@
+package com.jeeplus.business.tender.service.DTO;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.business.tender.domain.BidDetail;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class TenderDTO extends BaseEntity {
+    /**
+     *批次
+     */
+    @Excel(name = "批次",width = 16)
+    private String batch;
+
+
+    /**
+     *采购申请编号
+     */
+    @Excel(name = "采购申请编号",width = 16)
+    private String purchaseNumber;
+
+    /*
+    分标编号
+     */
+    @Excel(name = "分标编号",width = 16)
+    private String subscaleNumber;
+
+    /**
+     *分标名称
+     */
+    @Excel(name = "分标名称",width = 16)
+    private String subscaleName;
+
+    /**
+     * 包号
+     */
+    @Excel(name = "包号",width = 16)
+    private String packageNumber;
+
+    /**
+     * 招标项目标段名称
+     */
+    @Excel(name = "招标项目标段名称",width = 40)
+    private String sectionName;
+
+    /**
+     * 采购金额(元)
+     */
+    @Excel(name = "采购金额(元)",width = 40)
+    private String money;
+
+    /**
+     * 报名截止时间
+     */
+    @Excel(name = "报名截止时间",width = 16,exportFormat = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date applicationDeadline;
+
+    /**
+     * 截标时间
+     */
+    @Excel(name = "截标时间",width = 16,exportFormat = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date bidClosingTime;
+
+    /**
+     * 基础表id
+     */
+    private String tenderId;
+
+    /**
+     * 创建时间
+     */
+    private String[] dates;
+
+    /**
+     * 报明截止时间
+     */
+    private String[] deadlineDates;
+
+    /**
+     * 截标时间
+     */
+    private String[] closingDates;
+
+    /**
+     * 创建人部门
+     */
+    private String officeId;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 中标备注
+     */
+    private String bidRemarks;
+
+    /**
+     * 招投标附件
+     */
+    private List<WorkAttachmentDto> files;
+    /**
+     * 投标附件
+     */
+    private List<WorkAttachmentDto> bidFiles;
+    /**
+     * 投标详情附件
+     */
+    private List<WorkAttachmentDto> detatilFiles;
+
+    /**
+     * 投标明细列表
+     */
+    private List<BidDetail> tenderList;
+
+    /**
+     * 中标明细列表
+     */
+    private List<BidDetail> bidDetails;
+
+    /*
+    采购总金额(元)
+     */
+    private String totalMoney;
+    /**
+     * 创建人姓名
+     */
+    private String createName;
+    /*
+    创建人部门
+     */
+    private String officeName;
+
+    /**
+     * 采购金额查询
+     */
+    private String[] totalMoneys;
+
+    /**
+     * 投标人
+     */
+    private String bidMan;
+
+
+}

+ 451 - 0
jeeplus-modules/jeeplus-business/src/main/java/com/jeeplus/business/tender/service/TenderService.java

@@ -0,0 +1,451 @@
+package com.jeeplus.business.tender.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.business.drive.service.dto.DriveApplyDTO;
+import com.jeeplus.business.reimbursement.service.dto.JyReimbursementInfoDTO;
+import com.jeeplus.business.tender.domain.BidDetail;
+import com.jeeplus.business.tender.domain.Tender;
+import com.jeeplus.business.tender.mapper.BidDetailMapper;
+import com.jeeplus.business.tender.mapper.TenderMapper;
+import com.jeeplus.business.tender.service.DTO.TenderDTO;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.pubmodules.oss.domain.WorkAttachment;
+import com.jeeplus.pubmodules.oss.service.dto.WorkAttachmentDto;
+import com.jeeplus.pubmodules.wareHouse.domain.WareHouseDetailed;
+import com.jeeplus.sys.feign.IPostApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.feign.IWorkAttachmentApi;
+import com.jeeplus.sys.service.dto.FlowCopy;
+import com.jeeplus.sys.service.dto.PostDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@Service
+public class TenderService {
+
+    @Resource
+    private TenderMapper tenderMapper;
+
+    @Resource
+    private BidDetailMapper bidDetailMapper;
+
+    /**
+     * 招投标列表查询
+     * @param page
+     * @param dto
+     * @return
+     */
+    public IPage<TenderDTO> list(Page<TenderDTO> page, TenderDTO dto) throws Exception {
+        QueryWrapper<TenderDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, TenderDTO.class);
+        queryWrapper.eq("a.del_flag", 0);
+        // 创建时间
+        if (dto.getDates() != null) {
+            queryWrapper.between("a.create_time", dto.getDates()[0], dto.getDates()[1]);
+        }
+        // 创建人
+        if (StringUtils.isNotEmpty(dto.getCreateById())) {
+            queryWrapper.eq("a.create_by_id ", dto.getCreateById());
+        }
+        //批次
+        if (StringUtils.isNotEmpty(dto.getBatch())) {
+            queryWrapper.like("a.batch ", dto.getBatch());
+        }
+        //采购金额
+        if (null !=dto.getTotalMoneys()){
+            if (StringUtils.isNotEmpty(dto.getTotalMoneys()[0])) {
+                queryWrapper.ge("b.total_money",Double.parseDouble(dto.getTotalMoneys()[0]));
+            }
+            if (dto.getTotalMoneys().length>1 && StringUtils.isNotEmpty(dto.getTotalMoneys()[1])) {
+                queryWrapper.le("b.total_money", Double.parseDouble(dto.getTotalMoneys()[1]));
+            }
+        }
+        //报名截止时间
+        if (dto.getDeadlineDates() != null) {
+            queryWrapper.between("a.application_deadline", dto.getDeadlineDates()[0], dto.getDeadlineDates()[1]);
+        }
+        //截标时间
+        if (dto.getClosingDates() != null) {
+            queryWrapper.between("a.bid_closing_time", dto.getClosingDates()[0], dto.getClosingDates()[1]);
+        }
+        IPage<TenderDTO> iPage=tenderMapper.findPageList(queryWrapper,page);
+        return iPage;
+
+
+
+
+
+    }
+
+    /**
+     * 新增或修改
+     * @param dto
+     * @return
+     */
+    public String save(TenderDTO dto) {
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        if (StringUtils.isNotBlank(dto.getId())){
+            return update(dto,userDTO);
+        }else {
+            return add(dto,userDTO);
+        }
+    }
+
+    public String add(TenderDTO dto, UserDTO userDTO) {
+        // 生成id
+        String id = UUID.randomUUID().toString().replace("-", "");
+        //保存基础表信息
+        Tender tender = new Tender();
+        BeanUtils.copyProperties(dto,tender);
+        tender.setId(id);
+        tender.setCreateById(userDTO.getId());
+        tender.setCreateTime(new Date());
+        tender.setUpdateById(userDTO.getId());
+        tender.setUpdateTime(new Date());
+        tender.setDelFlag(0);
+        tenderMapper.insert(tender);
+        //保存详情列表信息
+        if (CollectionUtils.isNotEmpty(dto.getTenderList())){
+            for (BidDetail bidDetail : dto.getTenderList()) {
+                // 生成id
+                String detailId = UUID.randomUUID().toString().replace("-", "");
+                bidDetail.setId(detailId);
+                bidDetail.setBidMan(bidDetail.getBidMan());//投标人
+                bidDetail.setCreateById(userDTO.getId());
+                bidDetail.setCreateTime(new Date());
+                bidDetail.setUpdateById(userDTO.getId());
+                bidDetail.setUpdateTime(new Date());
+                bidDetail.setDelFlag(0);
+
+                bidDetail.setTotalMoney(dto.getTotalMoney());
+                bidDetail.setTenderId(id); //基础表id
+                bidDetailMapper.insert(bidDetail);
+                //保存详情列表附件信息
+                if (CollectionUtils.isNotEmpty(bidDetail.getBidFiles())){
+                    saveFiles(bidDetail.getBidFiles(), userDTO, detailId);
+                }
+
+            }
+        }
+        // 保存附件列表信息
+        if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+            saveFiles(dto.getFiles(), userDTO, id);
+        }
+        return "添加成功";
+    }
+
+    public String update(TenderDTO dto, UserDTO userDTO) {
+        //保存基础表信息
+        Tender tender = new Tender();
+        BeanUtils.copyProperties(dto,tender);
+        tender.setUpdateById(userDTO.getId());
+        tender.setUpdateTime(new Date());
+        tenderMapper.updateById(tender);
+        //修改投标详情列表信息
+        if (CollectionUtils.isNotEmpty(dto.getTenderList())){
+            //根据基础表id获取所有的详情表id
+            List<String> idList = bidDetailMapper.getByTenderId(dto.getId());
+            for (BidDetail bidDetail : dto.getTenderList()) {
+                //删除掉多余的详情信息
+                if (null != idList) {
+                    if (idList.contains(bidDetail.getId())){
+                        idList.remove(bidDetail.getId());
+                    }
+                }
+            }
+            if (null != idList & idList.size()>0) {
+                idList.forEach(id->{
+                    bidDetailMapper.deleteById(id);
+                });
+            }
+
+            for (BidDetail bidDetail : dto.getTenderList()) {
+                BidDetail detail = bidDetailMapper.selectById(bidDetail.getId());
+                if (null == detail){
+                    // 生成id
+                    String detailId = UUID.randomUUID().toString().replace("-", "");
+                    bidDetail.setId(detailId);
+                    bidDetail.setBidMan(bidDetail.getBidMan());//投标人
+                    bidDetail.setCreateById(userDTO.getId());
+                    bidDetail.setCreateTime(new Date());
+                    bidDetail.setUpdateById(userDTO.getId());
+                    bidDetail.setUpdateTime(new Date());
+                    bidDetail.setDelFlag(0);
+
+                    bidDetail.setTotalMoney(dto.getTotalMoney());
+                    bidDetail.setTenderId(dto.getId()); //基础表id
+                    bidDetailMapper.insert(bidDetail);
+                    //保存详情列表附件信息
+                    if (CollectionUtils.isNotEmpty(bidDetail.getBidFiles())){
+                        saveFiles(bidDetail.getBidFiles(), userDTO, detailId);
+                    }
+                }else {
+                    bidDetail.setUpdateById(userDTO.getId());
+                    bidDetail.setUpdateTime(new Date());
+                    bidDetail.setTotalMoney(dto.getTotalMoney());
+                    bidDetailMapper.updateById(bidDetail);
+                    if (CollectionUtils.isNotEmpty(bidDetail.getBidFiles())) {
+                        updateFiles(bidDetail.getBidFiles(), userDTO, bidDetail.getId());
+                    }
+                }
+            }
+
+        }
+        // 修改附件信息列表
+        if (CollectionUtils.isNotEmpty(dto.getFiles())) {
+            updateFiles(dto.getFiles(), userDTO, dto.getId());
+        }
+        return "修改成功";
+    }
+
+    /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentDto> list, UserDTO userDTO, String id) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentDto dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachment> infoList = tenderMapper.findFileList(id);
+        if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(infoList)) {
+            for (WorkAttachment i : infoList) {
+                if (!names.contains(i.getUrl())) {
+//                    ossServiceMapper.deleteById(i.getId());
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentDto dto : list) {
+            //判断是否存在
+            Integer isExit = tenderMapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachment i = new WorkAttachment();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag("bidFile");
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                Map<String,String> map = new HashMap<>();
+                String workAttachment = JSON.toJSONString((i));
+                String userDTOInfo = JSON.toJSONString((userDTO));
+                map.put("workAttachment",workAttachment);
+                map.put("userDTO",userDTOInfo);
+                SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+//                ossServiceMapper.insertWorkAttachment(i, userDTO);
+                j++;
+            }
+        }
+    }
+
+    /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentDto> list, UserDTO userDTO, String id) {
+        int j = 1;
+        for (WorkAttachmentDto dto : list) {
+            WorkAttachment i = new WorkAttachment();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (org.flowable.editor.language.json.converter.util.CollectionUtils.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag("bidFile");
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+            Map<String,String> map = new HashMap<>();
+            String workAttachment = JSON.toJSONString((i));
+            String userDTOInfo = JSON.toJSONString((userDTO));
+            map.put("workAttachment",workAttachment);
+            map.put("userDTO",userDTOInfo);
+            SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+//            ossServiceMapper.insertWorkAttachment(i, userDTO);
+            j++;
+        }
+    }
+
+    /*8
+    根据id查询
+     */
+    public TenderDTO findById(String id) {
+        //查询基础表信息
+        TenderDTO tenderDTO = new TenderDTO();
+
+        Tender tender = tenderMapper.findById(id);
+        if (ObjectUtil.isNotEmpty(tender)){
+            BeanUtils.copyProperties(tender,tenderDTO);
+            //获取投标详情信息
+            List<BidDetail> bidDetails = bidDetailMapper.findByTenderId(id);
+            if (CollectionUtils.isNotEmpty(bidDetails)){
+                bidDetails.stream().forEach(detail->{
+                    //附件信息
+                    List<WorkAttachmentDto> acList = bidDetailMapper.getByAttachmentId(detail.getId());
+                    if (CollectionUtils.isNotEmpty(acList)) {
+                        for (WorkAttachmentDto i : acList) {
+                            i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                        }
+                    }
+                    detail.setBidFiles(acList);
+                    tenderDTO.setTotalMoney(detail.getTotalMoney());
+                });
+            }
+            tenderDTO.setTenderList(bidDetails);
+            //附件信息
+            List<WorkAttachmentDto> files = bidDetailMapper.getByAttachmentId(tender.getId());
+            if (CollectionUtils.isNotEmpty(files)) {
+                for (WorkAttachmentDto i : files) {
+                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+                }
+            }
+            tenderDTO.setFiles(files);
+        }
+        return tenderDTO;
+    }
+
+    public String remove(String id) {
+        // 删除基础信息表
+        tenderMapper.deleteById(id);
+        // 删除详情列表 及对应附件信息
+        List<BidDetail> detailedList = bidDetailMapper.findByTenderId(id);
+        if (null != detailedList){
+            detailedList.forEach(de->{
+                //附件
+                List<WorkAttachmentDto> fileList = bidDetailMapper.getByAttachmentId(de.getId());
+                if ( null != fileList ){
+                    fileList.forEach(f->{
+                        SpringUtil.getBean(IWorkAttachmentApi.class).deleteById(f.getId());
+                    });
+                }
+                bidDetailMapper.deleteById(de.getId());
+            });
+        }
+        // 删除附件信息
+        SpringUtil.getBean(IWorkAttachmentApi.class).deleteByAttachmentId(id);
+        //删除抄送信息
+        SpringUtil.getBean(IFlowableApi.class).remove(id);
+
+        return "删除成功";
+    }
+
+
+    public String copyToLeader(String id) {
+        //根据id查询投标信息
+        Tender tender = tenderMapper.selectById(id);
+
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        //抄送前先进行删除
+        SpringUtil.getBean(IFlowableApi.class).remove(id);
+        //抄送部门主任,分管领导,办公室
+        ArrayList<UserDTO> userDTOS = new ArrayList<>();
+
+        PostDTO postDTOByName = SpringUtil.getBean(IPostApi.class).getPostDTOByName("办公室(嘉溢)");
+        List<UserDTO> listByPostId = SpringUtil.getBean(IUserApi.class).findListByPostId(postDTOByName.getId());
+        listByPostId.stream().forEach(item->{
+            userDTOS.add(item);
+        });
+        //获取嘉溢所有人员信息
+        List<UserDTO> allUserInfo = SpringUtil.getBean(IUserApi.class).findListByCompanyId(userDTO.getCompanyDTO().getId());
+        //分管领导
+        for (UserDTO dto : allUserInfo) {
+            if (StringUtils.isNotBlank(dto.getManageOfficeIds())){
+                String manageOfficeIds = dto.getManageOfficeIds();
+                if (manageOfficeIds.contains(",")){
+                    String[] split = manageOfficeIds.split(",");
+                    //获取分管领导所分管的部门
+                    for (String s : split) {
+                        //判断分管部门与项目创建人所在的部门是否一致
+                        if (s.equals(userDTO.getOfficeDTO().getId())) {
+                           userDTOS.add(dto);
+                        }
+                    }
+                }else {
+                    if (manageOfficeIds.equals(userDTO.getOfficeDTO().getId())) {
+                        userDTOS.add(dto);
+                    }
+                }
+
+            }
+        }
+
+        for (UserDTO dto : userDTOS) {
+            String id1 = UUID.randomUUID().toString().replace("-", "");
+            FlowCopy flowCopy = new FlowCopy();
+            flowCopy.setCreateById(userDTO.getId());
+            flowCopy.setCreateTime(new Date());
+            flowCopy.setUpdateById(userDTO.getId());
+            flowCopy.setUpdateTime(new Date());
+            String tenderName = "投标批次:"+tender.getBatch()+"已投标完成";
+            flowCopy.setProcInsName(tenderName);
+            flowCopy.setProcInsId(id);
+            flowCopy.setProcDefId(id);
+            flowCopy.setUserId(dto.getId());
+            flowCopy.setId(id1);
+            flowCopy.setDelFlag(0);
+            SpringUtil.getBean(IFlowableApi.class).add(flowCopy);
+        }
+        return "抄送成功";
+    }
+
+
+    /**
+     * 导出数据查询
+     * @param page
+     * @param dto
+     * @return
+     */
+    public IPage<TenderDTO> findList(Page<TenderDTO> page, TenderDTO dto) throws Exception {
+        QueryWrapper<TenderDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, TenderDTO.class);
+        queryWrapper.eq("a.del_flag", 0);
+        IPage<TenderDTO> iPage=tenderMapper.findList(queryWrapper,page);
+        return iPage;
+    }
+}