Browse Source

Merge branch 'master' of http://219.147.85.210:8080/gmcs/HongHu-PSM

zzs 3 months ago
parent
commit
882f831e07
71 changed files with 3595 additions and 232 deletions
  1. 1 1
      bidding-ui/src/components/detail/BsicInfo.vue
  2. 4 4
      bidding-ui/src/views/mine/components/CompAchievement.vue
  3. 4 4
      bidding-ui/src/views/mine/components/CompFinancialStatus.vue
  4. 1 6
      bidding-ui/src/views/mine/gonggao.vue
  5. 6 6
      bidding-ui/src/views/mine/tender.vue
  6. 8 2
      bidding-ui/src/views/winresultdetail.vue
  7. 0 1
      ruoyi-api/pom.xml
  8. 31 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteTenderpubService.java
  9. 233 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/BankTenderdel.java
  10. 641 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/BankTenderedit.java
  11. 543 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/BankTenderpub.java
  12. 45 0
      ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteTenderpubFallbackFactory.java
  13. 2 1
      ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  14. 37 45
      ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
  15. 0 6
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidApprovalRecordController.java
  16. 5 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidCommitteeController.java
  17. 72 37
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidNoticeController.java
  18. 297 4
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidTenderController.java
  19. 58 8
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidWinningResultsController.java
  20. 10 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidCommittee.java
  21. 30 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidExpertExamine.java
  22. 30 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidExpertRespond.java
  23. 30 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidExpertTech.java
  24. 20 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidTender.java
  25. 10 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/Mark.java
  26. 83 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/QuoteScore.java
  27. 4 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/mapper/BidCommitteeMapper.java
  28. 6 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/mapper/BidQuoteMapper.java
  29. 4 1
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/mapper/BidTenderMapper.java
  30. 3 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/IBidCommitteeService.java
  31. 5 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/IBidQuoteService.java
  32. 4 1
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/IBidTenderService.java
  33. 5 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/impl/BidCommitteeServiceImpl.java
  34. 6 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/impl/BidQuoteServiceImpl.java
  35. 7 2
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/impl/BidTenderServiceImpl.java
  36. 10 2
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidCommitteeMapper.xml
  37. 14 1
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidExpertExamineMapper.xml
  38. 16 1
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidExpertRespondMapper.xml
  39. 16 1
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidExpertTechMapper.xml
  40. 4 0
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidQuoteMapper.xml
  41. 24 3
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidTenderMapper.xml
  42. 78 36
      ruoyi-modules/hh-mast/src/main/java/com/ruoyi/mast/bank/controller/BankTenderpubController.java
  43. 20 0
      ruoyi-modules/hh-procure/src/main/java/com/hh/procure/domain/PpmProcurementPlan.java
  44. 3 2
      ruoyi-modules/hh-procure/src/main/resources/mapper/PpmProcurementPlanMapper.xml
  45. 1 1
      ruoyi-ui/src/api/bank/tenderpub.js
  46. 66 0
      ruoyi-ui/src/api/system/plan.js
  47. 1 1
      ruoyi-ui/src/components/tender/bidEval.vue
  48. 1 1
      ruoyi-ui/src/components/tender/candidateNotice.vue
  49. 1 1
      ruoyi-ui/src/components/tender/determineWin.vue
  50. 1 1
      ruoyi-ui/src/components/tender/winningBid.vue
  51. 1 1
      ruoyi-ui/src/components/tender/winningBidNotice.vue
  52. 28 28
      ruoyi-ui/src/views/bank/tenderpub/index.vue
  53. 12 3
      ruoyi-ui/src/views/bidding/BidWinning/components/CompPurchase.vue
  54. 24 6
      ruoyi-ui/src/views/bidding/BidWinning/components/CompSearchProject.vue
  55. 1 1
      ruoyi-ui/src/views/bidding/notice/caigounotice.vue
  56. 1 1
      ruoyi-ui/src/views/bidding/notice/components/CompPurchase.vue
  57. 1 1
      ruoyi-ui/src/views/bidding/notice/purchase2.vue
  58. 1 1
      ruoyi-ui/src/views/invoice/list/components/Compkaipiao.vue
  59. 234 0
      ruoyi-ui/src/views/purchase/stop/bidWinningChange.vue
  60. 341 0
      ruoyi-ui/src/views/purchase/stop/bidWinningDetail.vue
  61. 133 0
      ruoyi-ui/src/views/purchase/stop/bidWinningStop.vue
  62. 1 1
      ruoyi-ui/src/views/purchase/stop/components/CompTobeSubmitted.vue
  63. 71 0
      ruoyi-ui/src/views/purchase/stop/components/winEffective.vue
  64. 80 0
      ruoyi-ui/src/views/purchase/stop/components/winPendingApproval.vue
  65. 153 0
      ruoyi-ui/src/views/purchase/stop/components/winTodoSubmitted.vue
  66. 1 1
      ruoyi-ui/src/views/purchase/stop/index.vue
  67. 2 2
      ruoyi-ui/src/views/supplier/sqe/detail.vue
  68. 2 2
      ruoyi-ui/src/views/supplier/sqe/process.vue
  69. 4 1
      ruoyi-ui/src/views/tender/tender1/components/CompExpert.vue
  70. 1 1
      ruoyi-ui/src/views/tender/tender1/components/CompWinningBid.vue
  71. 2 2
      ruoyi-ui/src/views/winfile/components/CompWinFile.vue

+ 1 - 1
bidding-ui/src/components/detail/BsicInfo.vue

@@ -52,7 +52,7 @@
                     <span>{{ scope.row.hName || '——' }}</span>
                   </template>
                 </el-table-column>
-                <el-table-column label="最终报价(万元)" align="center" prop="zFinal">
+                <el-table-column label="最终报价" align="center" prop="zFinal">
                   <template slot-scope="scope">
                     <span>{{ scope.row.zFinal || '——' }}</span>
                   </template>

+ 4 - 4
bidding-ui/src/views/mine/components/CompAchievement.vue

@@ -8,7 +8,7 @@
       <el-table-column label="采购单位" align="center" prop="yjUnit" />
       <el-table-column label="合作方" align="center" prop="yjPartner" />
       <el-table-column label="签订日期" align="center" prop="yjDate" />
-      <el-table-column label="合同金额(万元)" align="center" prop="yjRmb" />
+      <el-table-column label="合同金额" align="center" prop="yjRmb" />
       <el-table-column label="买方业务代表" align="center" prop="yjBbr" />
       <el-table-column label="买方业务代表联系电话" align="center" prop="yjPhone" />
       <el-table-column label="操作" align="center" prop="handle">
@@ -36,8 +36,8 @@
           <el-date-picker v-model="form.yjDate" type="date" placeholder="请选择签订日期"
             value-format="yyyy-MM-dd"></el-date-picker>
         </el-form-item>
-        <el-form-item label="合同金额(万元)" prop="yjRmb">
-          <el-input-number v-model="form.yjRmb" placeholder="请输入合同金额(万元)" />
+        <el-form-item label="合同金额" prop="yjRmb">
+          <el-input-number v-model="form.yjRmb" placeholder="请输入合同金额" />
         </el-form-item>
         <el-form-item label="买方业务代表" prop="yjBbr">
           <el-input v-model="form.yjBbr" placeholder="请输入买方业务代表" />
@@ -84,7 +84,7 @@ export default {
           { required: true, message: '请输入合作方', trigger: 'blur' },
         ],
         yjRmb: [
-          { required: true, message: '请输入合同金额(万元)', trigger: 'blur' },
+          { required: true, message: '请输入合同金额', trigger: 'blur' },
         ],
         yjDate: [
           { required: true, message: '请选择签订日期', trigger: 'blur' },

+ 4 - 4
bidding-ui/src/views/mine/components/CompFinancialStatus.vue

@@ -6,7 +6,7 @@
         <template slot-scope="scope">{{ scope.$index + 1 }}</template>
       </el-table-column>
       <el-table-column label="年度" align="center" prop="cAnnual" />
-      <el-table-column label="净利润(万元)" align="center" prop="cNetProfit" />
+      <el-table-column label="净利润" align="center" prop="cNetProfit" />
       <el-table-column label="资产负债率(%)" align="center" prop="cLev" />
       <el-table-column label="操作" align="center" prop="handle">
         <template slot-scope="scope">
@@ -26,8 +26,8 @@
         <el-form-item label="年度" prop="cAnnual">
           <el-input-number v-model="form.cAnnual" placeholder="请输入年度" />
         </el-form-item>
-        <el-form-item label="净利润(万元)" prop="cNetProfit">
-          <el-input-number v-model="form.cNetProfit" placeholder="请输入净利润(万元)" />
+        <el-form-item label="净利润" prop="cNetProfit">
+          <el-input-number v-model="form.cNetProfit" placeholder="请输入净利润" />
         </el-form-item>
         <el-form-item label="资产负债率(%)" prop="cLev">
           <el-input-number v-model="form.cLev" placeholder="请输入资产负债率(%)" />
@@ -64,7 +64,7 @@ export default {
           { required: true, message: '请输入年度', trigger: 'blur' },
         ],
         cNetProfit: [
-          { required: true, message: '请输入净利润(万元)', trigger: 'blur' },
+          { required: true, message: '请输入净利润', trigger: 'blur' },
         ],
         cLev: [
           { required: true, message: '请输入资产负债率(%)', trigger: 'blur' },

+ 1 - 6
bidding-ui/src/views/mine/gonggao.vue

@@ -69,11 +69,6 @@
             <dict-tag :options="dict.type.bid_tender_state" :value="scope.row.sProjectState" />
           </template>
         </el-table-column>
-        <!-- <el-table-column label="投标状态">
-          <template slot-scope="scope">
-            <dict-tag :options="dict.type.supplier_quotation_status" :value="scope.row.status" />
-          </template>
-        </el-table-column> -->
   
         <el-table-column label="操作" align="center" width="200px">
           <template slot-scope="scope">
@@ -303,7 +298,7 @@
       handelSurety (row) {
         this.btnLoading = true
         updateQuote({ qid: row.qid, sid: row.sid, hid: this.hid, status: 2 }).then(res => {
-          this.$message.success('保证金模拟缴纳完成')
+          this.$message.success('保证金缴纳完成,待审核')
           this.getList()
         }).finally(() => {
           this.btnLoading = false

+ 6 - 6
bidding-ui/src/views/mine/tender.vue

@@ -72,12 +72,12 @@
       <el-table-column label="操作" align="center" width="200px">
         <template slot-scope="scope">
           <span v-if="scope.row.status == 2">已缴纳待审核</span>
-          <!-- <el-button
-            v-if="scope.row.qid && (scope.row.status === 3 || scope.row.status === 4) && scope.row.sProjectState == 3"
-            type="text" size="mini" @click="handleTendering(scope.row)">招标文件</el-button> -->
-          <el-button
-            v-if="scope.row.qid && (scope.row.status === 3 || scope.row.status === 4) && scope.row.sProjectState == 3"
-            type="text" size="mini" @click="handleBid(scope.row)">投递标书</el-button>
+          <template v-if="scope.row.buyingMode != 1">
+            <el-button v-if="false"
+              type="text" size="mini" @click="handleTendering(scope.row)">招标文件</el-button>
+            <el-button v-if="scope.row.qid && (scope.row.status === 3 || scope.row.status === 4) && scope.row.sProjectState == 3"
+              type="text" size="mini" @click="handleBid(scope.row)">投递标书</el-button>
+          </template>
           <el-button
             v-if="scope.row.qid && (scope.row.status === 3 || scope.row.status === 4) && scope.row.sProjectState == 3"
             type="text" size="mini" @click="handelOffer(scope.row)">报价</el-button>

+ 8 - 2
bidding-ui/src/views/winresultdetail.vue

@@ -33,8 +33,14 @@
       <el-descriptions-item label="中标服务费">
         {{ detail.serviceFee }}
       </el-descriptions-item>
-      <el-descriptions-item label="虚拟子账户">
-        562070100100202720
+      <el-descriptions-item label="服务费汇款账户名">
+        黑龙江省国辰工程项目管理有限责任公司
+      </el-descriptions-item>
+      <el-descriptions-item label="开户银行">
+        兴业银行哈尔滨和平支行
+      </el-descriptions-item>
+      <el-descriptions-item label="服务费汇款账号">
+        562070100100202720  &nbsp;&nbsp; ( 汇款时必须注明资金用途:<strong>【代理服务费】</strong> )
       </el-descriptions-item>
     </el-descriptions>
 

+ 0 - 1
ruoyi-api/pom.xml

@@ -10,7 +10,6 @@
 
     <modules>
         <module>ruoyi-api-system</module>
-
     </modules>
 
     <artifactId>ruoyi-api</artifactId>

+ 31 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteTenderpubService.java

@@ -0,0 +1,31 @@
+package com.ruoyi.system.api;
+
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.BankTenderpub;
+import com.ruoyi.system.api.factory.RemoteTenderpubFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 用户服务
+ *
+ * @author ruoyi
+ */
+@FeignClient(contextId = "remoteTenderpubService", value = ServiceNameConstants.HH_MAST,
+        fallbackFactory = RemoteTenderpubFallbackFactory.class)
+public interface RemoteTenderpubService {
+
+    @GetMapping(value = "/{tenderpubid}")
+    public R<BankTenderpub> getInfo(@RequestParam("tenderpubid") String tenderpubid, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @PostMapping(value="/tenderpub/addInnerAuth")
+    public R<String> addInnerAuth(@RequestBody BankTenderpub bankTenderpub, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @PutMapping(value="/tenderpub")
+    public int editInnerAuth(@RequestBody BankTenderpub bankTenderpub, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @DeleteMapping("/{tenderpubids}")
+    public int remove(@RequestParam("tenderpubids") String[] tenderpubids, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+}

+ 233 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/BankTenderdel.java

@@ -0,0 +1,233 @@
+package com.ruoyi.system.api.domain;
+
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 删除标段对象 bank_tenderdel
+ * 
+ * @author ruoyi
+ * @date 2024-09-03
+ */
+public class BankTenderdel extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 删除标段id */
+    private String tenderdelid;
+
+    /** 采购计划id */
+    @Excel(name = "采购计划id")
+    private Long ppid;
+
+    /** 客户端交易的唯一流水号建议值为YYYYMMDD+序号 */
+    @Excel(name = "客户端交易的唯一流水号建议值为YYYYMMDD+序号")
+    private String trnuid;
+
+    /** 报文节点 */
+    @Excel(name = "报文节点")
+    private String rqbody;
+
+    /** 标段ID */
+    @Excel(name = "标段ID")
+    private String sgtid;
+
+    /** 客户端交易的唯一标志 */
+    @Excel(name = "客户端交易的唯一标志")
+    private String rtnTrnuid;
+
+    /** 交易处理状态 */
+    @Excel(name = "交易处理状态")
+    private String rtnStatus;
+
+    /** 处理结果码 */
+    @Excel(name = "处理结果码")
+    private String rtnCode;
+
+    /** 处理结果等级(INFO/WARN/ERROR) */
+    @Excel(name = "处理结果等级(INFO/WARN/ERROR)")
+    private String rtnSeverity;
+
+    /** 报文节点 */
+    @Excel(name = "报文节点")
+    private String rtnRsbody;
+
+    /** 标段ID */
+    @Excel(name = "标段ID")
+    private String rtnSgtid;
+
+    /** 指令处理状态报文标识 */
+    @Excel(name = "指令处理状态报文标识")
+    private String rtnXferprcsts;
+
+    /** 指令状态编码 */
+    @Excel(name = "指令状态编码")
+    private String rtnXferprccode;
+
+    /** 指令处理时间yyyyMMdd HHmmss	 */
+    @Excel(name = "指令处理时间yyyyMMdd HHmmss	")
+    private String rtnDtxferprc;
+
+    /** 指令处理信息	 */
+    @Excel(name = "指令处理信息	")
+    private String rtnMessage;
+
+    public void setTenderdelid(String tenderdelid) 
+    {
+        this.tenderdelid = tenderdelid;
+    }
+
+    public String getTenderdelid() 
+    {
+        return tenderdelid;
+    }
+    public void setPpid(Long ppid) 
+    {
+        this.ppid = ppid;
+    }
+
+    public Long getPpid() 
+    {
+        return ppid;
+    }
+    public void setTrnuid(String trnuid) 
+    {
+        this.trnuid = trnuid;
+    }
+
+    public String getTrnuid() 
+    {
+        return trnuid;
+    }
+    public void setRqbody(String rqbody) 
+    {
+        this.rqbody = rqbody;
+    }
+
+    public String getRqbody() 
+    {
+        return rqbody;
+    }
+    public void setSgtid(String sgtid) 
+    {
+        this.sgtid = sgtid;
+    }
+
+    public String getSgtid() 
+    {
+        return sgtid;
+    }
+    public void setRtnTrnuid(String rtnTrnuid) 
+    {
+        this.rtnTrnuid = rtnTrnuid;
+    }
+
+    public String getRtnTrnuid() 
+    {
+        return rtnTrnuid;
+    }
+    public void setRtnStatus(String rtnStatus) 
+    {
+        this.rtnStatus = rtnStatus;
+    }
+
+    public String getRtnStatus() 
+    {
+        return rtnStatus;
+    }
+    public void setRtnCode(String rtnCode) 
+    {
+        this.rtnCode = rtnCode;
+    }
+
+    public String getRtnCode() 
+    {
+        return rtnCode;
+    }
+    public void setRtnSeverity(String rtnSeverity) 
+    {
+        this.rtnSeverity = rtnSeverity;
+    }
+
+    public String getRtnSeverity() 
+    {
+        return rtnSeverity;
+    }
+    public void setRtnRsbody(String rtnRsbody) 
+    {
+        this.rtnRsbody = rtnRsbody;
+    }
+
+    public String getRtnRsbody() 
+    {
+        return rtnRsbody;
+    }
+    public void setRtnSgtid(String rtnSgtid) 
+    {
+        this.rtnSgtid = rtnSgtid;
+    }
+
+    public String getRtnSgtid() 
+    {
+        return rtnSgtid;
+    }
+    public void setRtnXferprcsts(String rtnXferprcsts) 
+    {
+        this.rtnXferprcsts = rtnXferprcsts;
+    }
+
+    public String getRtnXferprcsts() 
+    {
+        return rtnXferprcsts;
+    }
+    public void setRtnXferprccode(String rtnXferprccode) 
+    {
+        this.rtnXferprccode = rtnXferprccode;
+    }
+
+    public String getRtnXferprccode() 
+    {
+        return rtnXferprccode;
+    }
+    public void setRtnDtxferprc(String rtnDtxferprc) 
+    {
+        this.rtnDtxferprc = rtnDtxferprc;
+    }
+
+    public String getRtnDtxferprc() 
+    {
+        return rtnDtxferprc;
+    }
+    public void setRtnMessage(String rtnMessage) 
+    {
+        this.rtnMessage = rtnMessage;
+    }
+
+    public String getRtnMessage() 
+    {
+        return rtnMessage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("tenderdelid", getTenderdelid())
+            .append("ppid", getPpid())
+            .append("trnuid", getTrnuid())
+            .append("rqbody", getRqbody())
+            .append("sgtid", getSgtid())
+            .append("rtnTrnuid", getRtnTrnuid())
+            .append("rtnStatus", getRtnStatus())
+            .append("rtnCode", getRtnCode())
+            .append("rtnSeverity", getRtnSeverity())
+            .append("rtnRsbody", getRtnRsbody())
+            .append("rtnSgtid", getRtnSgtid())
+            .append("rtnXferprcsts", getRtnXferprcsts())
+            .append("rtnXferprccode", getRtnXferprccode())
+            .append("rtnDtxferprc", getRtnDtxferprc())
+            .append("rtnMessage", getRtnMessage())
+            .toString();
+    }
+}

+ 641 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/BankTenderedit.java

@@ -0,0 +1,641 @@
+package com.ruoyi.system.api.domain;
+
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+
+/**
+ * 标段修改对象 bank_tenderedit
+ * 
+ * @author ruoyi
+ * @date 2024-09-03
+ */
+public class BankTenderedit extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 标段修改id */
+    private String tendereditid;
+
+    /** 采购计划id */
+    @Excel(name = "采购计划id")
+    private Long ppid;
+
+    /** 客户端交易的唯一流水号建议值为yyyymmdd+序号 */
+    @Excel(name = "客户端交易的唯一流水号建议值为yyyymmdd+序号")
+    private String trnuid;
+
+    /** 标段id */
+    @Excel(name = "标段id")
+    private String sgtid;
+
+    /** 标段编号 */
+    @Excel(name = "标段编号")
+    private String sgtno;
+
+    /** 标段名称 */
+    @Excel(name = "标段名称")
+    private String sgtnm;
+
+    /** 标段类型0-非会员模式、 2-公共标段模式 */
+    @Excel(name = "标段类型0-非会员模式、 2-公共标段模式")
+    private String sgttp;
+
+    /** 保密类型0-不保密 1-保密(保密标段只能开标后查标) */
+    @Excel(name = "保密类型0-不保密 1-保密", readConverterExp = "保=密标段只能开标后查标")
+    private String secrettp;
+
+    /** 投标账号白名单校验标志0-不校验 1-校验 (默认校验 1) */
+    @Excel(name = "投标账号白名单校验标志0-不校验 1-校验 ", readConverterExp = "默=认校验,1=")
+    private String tdracctnovrfyflg;
+
+    /** 允许截止后投标标志0-不允许 1-允许 (默认允许 1) */
+    @Excel(name = "允许截止后投标标志0-不允许 1-允许 ", readConverterExp = "默=认允许,1=")
+    private String alwafddlntdrflg;
+
+    /** 银行退款确认标志0-不确认 1-确认 (默认确认 1) */
+    @Excel(name = "银行退款确认标志0-不确认 1-确认 ", readConverterExp = "默=认确认,1=")
+    private String bnkrfndcfrmflg;
+
+    /** 计息标志0-不计息 1-计息(默认计息 1) */
+    @Excel(name = "计息标志0-不计息 1-计息", readConverterExp = "默=认计息,1=")
+    private String intacrlflg;
+
+    /** 保证金金额,double */
+    @Excel(name = "保证金金额,double")
+    private BigDecimal mrgnamt;
+
+    /** 发标日期yyyymmdd */
+    @Excel(name = "发标日期yyyymmdd")
+    private String strtsgtdt;
+
+    /** 到期日期yyyymmdd */
+    @Excel(name = "到期日期yyyymmdd")
+    private String expdt;
+
+    /** 保证金缴纳截止日期yyyymmdd */
+    @Excel(name = "保证金缴纳截止日期yyyymmdd")
+    private String mrgnduestopdt;
+
+    /** 保证金缴纳截止时间hhmmss */
+    @Excel(name = "保证金缴纳截止时间hhmmss")
+    private String mrgnduestoptm;
+
+    /** 开标日期,yyyymmdd */
+    @Excel(name = "开标日期,yyyymmdd")
+    private String opntdrdt;
+
+    /** 开标时间,hhmmss */
+    @Excel(name = "开标时间,hhmmss")
+    private String opntdrtm;
+
+    /** 客户端交易的唯一标志 */
+    @Excel(name = "客户端交易的唯一标志")
+    private String rtnTrnuid;
+
+    /** 交易处理状态 */
+    @Excel(name = "交易处理状态")
+    private String rtnStatus;
+
+    /** 处理结果码 */
+    @Excel(name = "处理结果码")
+    private String rtnCode;
+
+    /** 处理结果等级(info/warn/error) */
+    @Excel(name = "处理结果等级(info/warn/error)")
+    private String rtnSeverity;
+
+    /** 报文节点 */
+    @Excel(name = "报文节点")
+    private String rtnRsbody;
+
+    /** 标段id */
+    @Excel(name = "标段id")
+    private String rtnSgtid;
+
+    /** 标段编号 */
+    @Excel(name = "标段编号")
+    private String rtnSgtno;
+
+    /** 标段名称 */
+    @Excel(name = "标段名称")
+    private String rtnSgtnm;
+
+    /** 标段类型0-非会员模式 、2-公共标段模式 */
+    @Excel(name = "标段类型0-非会员模式 、2-公共标段模式")
+    private String rtnSgttp;
+
+    /** 保密类型0-不保密 1-保密 */
+    @Excel(name = "保密类型0-不保密 1-保密")
+    private String rtnSecrettp;
+
+    /** 投标账号白名单校验标志0-不校验 1-校验 (默认校验 1) */
+    @Excel(name = "投标账号白名单校验标志0-不校验 1-校验 ", readConverterExp = "默=认校验,1=")
+    private String rtnTdracctnovrfyflg;
+
+    /** 允许截止后投标标志0-不允许 1-允许 (默认允许 1) */
+    @Excel(name = "允许截止后投标标志0-不允许 1-允许 ", readConverterExp = "默=认允许,1=")
+    private String rtnAlwafddlntdrflg;
+
+    /** 银行退款确认标志0-不确认 1-确认 (默认确认 1) */
+    @Excel(name = "银行退款确认标志0-不确认 1-确认 ", readConverterExp = "默=认确认,1=")
+    private String rtnBnkrfndcfrmflg;
+
+    /** 计息标志0-不计息 1-计息(默认计息 1) */
+    @Excel(name = "计息标志0-不计息 1-计息", readConverterExp = "默=认计息,1=")
+    private String rtnIntacrlflg;
+
+    /** 保证金金额 double */
+    @Excel(name = "保证金金额 double")
+    private BigDecimal rtnMrgnamt;
+
+    /** 发标日期yyyymmdd */
+    @Excel(name = "发标日期yyyymmdd")
+    private String rtnStrtsgtdt;
+
+    /** 到期日期yyyymmdd */
+    @Excel(name = "到期日期yyyymmdd")
+    private String rtnExpdt;
+
+    /** 保证金缴纳截止日期yyyymmdd */
+    @Excel(name = "保证金缴纳截止日期yyyymmdd")
+    private String rtnMrgnduestopdt;
+
+    /** 保证金缴纳截止时间hhmmss */
+    @Excel(name = "保证金缴纳截止时间hhmmss")
+    private String rtnMrgnduestoptm;
+
+    /** 开标日期,yyyymmdd */
+    @Excel(name = "开标日期,yyyymmdd")
+    private String rtnOpntdrdt;
+
+    /** 开标时间,hhmmss */
+    @Excel(name = "开标时间,hhmmss")
+    private String rtnOpntdrtm;
+
+    /** 指令处理状态报文标识 */
+    @Excel(name = "指令处理状态报文标识")
+    private String rtnXferprcsts;
+
+    /** 指令状态编码 */
+    @Excel(name = "指令状态编码")
+    private String rtnXferprccode;
+
+    /** 指令处理时间yyyymmdd hhmmss */
+    @Excel(name = "指令处理时间yyyymmdd hhmmss")
+    private String rtnDtxferprc;
+
+    /** 指令处理信息 */
+    @Excel(name = "指令处理信息")
+    private String rtnMessage;
+
+    public void setTendereditid(String tendereditid) 
+    {
+        this.tendereditid = tendereditid;
+    }
+
+    public String getTendereditid() 
+    {
+        return tendereditid;
+    }
+    public void setPpid(Long ppid) 
+    {
+        this.ppid = ppid;
+    }
+
+    public Long getPpid() 
+    {
+        return ppid;
+    }
+    public void setTrnuid(String trnuid) 
+    {
+        this.trnuid = trnuid;
+    }
+
+    public String getTrnuid() 
+    {
+        return trnuid;
+    }
+    public void setSgtid(String sgtid) 
+    {
+        this.sgtid = sgtid;
+    }
+
+    public String getSgtid() 
+    {
+        return sgtid;
+    }
+    public void setSgtno(String sgtno) 
+    {
+        this.sgtno = sgtno;
+    }
+
+    public String getSgtno() 
+    {
+        return sgtno;
+    }
+    public void setSgtnm(String sgtnm) 
+    {
+        this.sgtnm = sgtnm;
+    }
+
+    public String getSgtnm() 
+    {
+        return sgtnm;
+    }
+    public void setSgttp(String sgttp) 
+    {
+        this.sgttp = sgttp;
+    }
+
+    public String getSgttp() 
+    {
+        return sgttp;
+    }
+    public void setSecrettp(String secrettp) 
+    {
+        this.secrettp = secrettp;
+    }
+
+    public String getSecrettp() 
+    {
+        return secrettp;
+    }
+    public void setTdracctnovrfyflg(String tdracctnovrfyflg) 
+    {
+        this.tdracctnovrfyflg = tdracctnovrfyflg;
+    }
+
+    public String getTdracctnovrfyflg() 
+    {
+        return tdracctnovrfyflg;
+    }
+    public void setAlwafddlntdrflg(String alwafddlntdrflg) 
+    {
+        this.alwafddlntdrflg = alwafddlntdrflg;
+    }
+
+    public String getAlwafddlntdrflg() 
+    {
+        return alwafddlntdrflg;
+    }
+    public void setBnkrfndcfrmflg(String bnkrfndcfrmflg) 
+    {
+        this.bnkrfndcfrmflg = bnkrfndcfrmflg;
+    }
+
+    public String getBnkrfndcfrmflg() 
+    {
+        return bnkrfndcfrmflg;
+    }
+    public void setIntacrlflg(String intacrlflg) 
+    {
+        this.intacrlflg = intacrlflg;
+    }
+
+    public String getIntacrlflg() 
+    {
+        return intacrlflg;
+    }
+    public void setMrgnamt(BigDecimal mrgnamt) 
+    {
+        this.mrgnamt = mrgnamt;
+    }
+
+    public BigDecimal getMrgnamt() 
+    {
+        return mrgnamt;
+    }
+    public void setStrtsgtdt(String strtsgtdt) 
+    {
+        this.strtsgtdt = strtsgtdt;
+    }
+
+    public String getStrtsgtdt() 
+    {
+        return strtsgtdt;
+    }
+    public void setExpdt(String expdt) 
+    {
+        this.expdt = expdt;
+    }
+
+    public String getExpdt() 
+    {
+        return expdt;
+    }
+    public void setMrgnduestopdt(String mrgnduestopdt) 
+    {
+        this.mrgnduestopdt = mrgnduestopdt;
+    }
+
+    public String getMrgnduestopdt() 
+    {
+        return mrgnduestopdt;
+    }
+    public void setMrgnduestoptm(String mrgnduestoptm) 
+    {
+        this.mrgnduestoptm = mrgnduestoptm;
+    }
+
+    public String getMrgnduestoptm() 
+    {
+        return mrgnduestoptm;
+    }
+    public void setOpntdrdt(String opntdrdt) 
+    {
+        this.opntdrdt = opntdrdt;
+    }
+
+    public String getOpntdrdt() 
+    {
+        return opntdrdt;
+    }
+    public void setOpntdrtm(String opntdrtm) 
+    {
+        this.opntdrtm = opntdrtm;
+    }
+
+    public String getOpntdrtm() 
+    {
+        return opntdrtm;
+    }
+    public void setRtnTrnuid(String rtnTrnuid) 
+    {
+        this.rtnTrnuid = rtnTrnuid;
+    }
+
+    public String getRtnTrnuid() 
+    {
+        return rtnTrnuid;
+    }
+    public void setRtnStatus(String rtnStatus) 
+    {
+        this.rtnStatus = rtnStatus;
+    }
+
+    public String getRtnStatus() 
+    {
+        return rtnStatus;
+    }
+    public void setRtnCode(String rtnCode) 
+    {
+        this.rtnCode = rtnCode;
+    }
+
+    public String getRtnCode() 
+    {
+        return rtnCode;
+    }
+    public void setRtnSeverity(String rtnSeverity) 
+    {
+        this.rtnSeverity = rtnSeverity;
+    }
+
+    public String getRtnSeverity() 
+    {
+        return rtnSeverity;
+    }
+    public void setRtnRsbody(String rtnRsbody) 
+    {
+        this.rtnRsbody = rtnRsbody;
+    }
+
+    public String getRtnRsbody() 
+    {
+        return rtnRsbody;
+    }
+    public void setRtnSgtid(String rtnSgtid) 
+    {
+        this.rtnSgtid = rtnSgtid;
+    }
+
+    public String getRtnSgtid() 
+    {
+        return rtnSgtid;
+    }
+    public void setRtnSgtno(String rtnSgtno) 
+    {
+        this.rtnSgtno = rtnSgtno;
+    }
+
+    public String getRtnSgtno() 
+    {
+        return rtnSgtno;
+    }
+    public void setRtnSgtnm(String rtnSgtnm) 
+    {
+        this.rtnSgtnm = rtnSgtnm;
+    }
+
+    public String getRtnSgtnm() 
+    {
+        return rtnSgtnm;
+    }
+    public void setRtnSgttp(String rtnSgttp) 
+    {
+        this.rtnSgttp = rtnSgttp;
+    }
+
+    public String getRtnSgttp() 
+    {
+        return rtnSgttp;
+    }
+    public void setRtnSecrettp(String rtnSecrettp) 
+    {
+        this.rtnSecrettp = rtnSecrettp;
+    }
+
+    public String getRtnSecrettp() 
+    {
+        return rtnSecrettp;
+    }
+    public void setRtnTdracctnovrfyflg(String rtnTdracctnovrfyflg) 
+    {
+        this.rtnTdracctnovrfyflg = rtnTdracctnovrfyflg;
+    }
+
+    public String getRtnTdracctnovrfyflg() 
+    {
+        return rtnTdracctnovrfyflg;
+    }
+    public void setRtnAlwafddlntdrflg(String rtnAlwafddlntdrflg) 
+    {
+        this.rtnAlwafddlntdrflg = rtnAlwafddlntdrflg;
+    }
+
+    public String getRtnAlwafddlntdrflg() 
+    {
+        return rtnAlwafddlntdrflg;
+    }
+    public void setRtnBnkrfndcfrmflg(String rtnBnkrfndcfrmflg) 
+    {
+        this.rtnBnkrfndcfrmflg = rtnBnkrfndcfrmflg;
+    }
+
+    public String getRtnBnkrfndcfrmflg() 
+    {
+        return rtnBnkrfndcfrmflg;
+    }
+
+    public void setRtnMrgnamt(BigDecimal rtnMrgnamt) 
+    {
+        this.rtnMrgnamt = rtnMrgnamt;
+    }
+
+    public BigDecimal getRtnMrgnamt() 
+    {
+        return rtnMrgnamt;
+    }
+    public void setRtnStrtsgtdt(String rtnStrtsgtdt) 
+    {
+        this.rtnStrtsgtdt = rtnStrtsgtdt;
+    }
+
+    public String getRtnStrtsgtdt() 
+    {
+        return rtnStrtsgtdt;
+    }
+    public void setRtnExpdt(String rtnExpdt) 
+    {
+        this.rtnExpdt = rtnExpdt;
+    }
+
+    public String getRtnExpdt() 
+    {
+        return rtnExpdt;
+    }
+    public void setRtnMrgnduestopdt(String rtnMrgnduestopdt) 
+    {
+        this.rtnMrgnduestopdt = rtnMrgnduestopdt;
+    }
+
+    public String getRtnMrgnduestopdt() 
+    {
+        return rtnMrgnduestopdt;
+    }
+    public void setRtnMrgnduestoptm(String rtnMrgnduestoptm) 
+    {
+        this.rtnMrgnduestoptm = rtnMrgnduestoptm;
+    }
+
+    public String getRtnMrgnduestoptm() 
+    {
+        return rtnMrgnduestoptm;
+    }
+    public void setRtnOpntdrdt(String rtnOpntdrdt) 
+    {
+        this.rtnOpntdrdt = rtnOpntdrdt;
+    }
+
+    public String getRtnOpntdrdt() 
+    {
+        return rtnOpntdrdt;
+    }
+    public void setRtnOpntdrtm(String rtnOpntdrtm) 
+    {
+        this.rtnOpntdrtm = rtnOpntdrtm;
+    }
+
+    public String getRtnOpntdrtm() 
+    {
+        return rtnOpntdrtm;
+    }
+    public void setRtnXferprcsts(String rtnXferprcsts) 
+    {
+        this.rtnXferprcsts = rtnXferprcsts;
+    }
+
+    public String getRtnXferprcsts() 
+    {
+        return rtnXferprcsts;
+    }
+    public void setRtnXferprccode(String rtnXferprccode) 
+    {
+        this.rtnXferprccode = rtnXferprccode;
+    }
+
+    public String getRtnXferprccode() 
+    {
+        return rtnXferprccode;
+    }
+    public void setRtnDtxferprc(String rtnDtxferprc) 
+    {
+        this.rtnDtxferprc = rtnDtxferprc;
+    }
+
+    public String getRtnDtxferprc() 
+    {
+        return rtnDtxferprc;
+    }
+    public void setRtnMessage(String rtnMessage) 
+    {
+        this.rtnMessage = rtnMessage;
+    }
+
+    public String getRtnMessage() 
+    {
+        return rtnMessage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("tendereditid", getTendereditid())
+            .append("ppid", getPpid())
+            .append("trnuid", getTrnuid())
+            .append("sgtid", getSgtid())
+            .append("sgtno", getSgtno())
+            .append("sgtnm", getSgtnm())
+            .append("sgttp", getSgttp())
+            .append("secrettp", getSecrettp())
+            .append("tdracctnovrfyflg", getTdracctnovrfyflg())
+            .append("alwafddlntdrflg", getAlwafddlntdrflg())
+            .append("bnkrfndcfrmflg", getBnkrfndcfrmflg())
+            .append("intacrlflg", getIntacrlflg())
+            .append("mrgnamt", getMrgnamt())
+            .append("strtsgtdt", getStrtsgtdt())
+            .append("expdt", getExpdt())
+            .append("mrgnduestopdt", getMrgnduestopdt())
+            .append("mrgnduestoptm", getMrgnduestoptm())
+            .append("opntdrdt", getOpntdrdt())
+            .append("opntdrtm", getOpntdrtm())
+            .append("rtnTrnuid", getRtnTrnuid())
+            .append("rtnStatus", getRtnStatus())
+            .append("rtnCode", getRtnCode())
+            .append("rtnSeverity", getRtnSeverity())
+            .append("rtnRsbody", getRtnRsbody())
+            .append("rtnSgtid", getRtnSgtid())
+            .append("rtnSgtno", getRtnSgtno())
+            .append("rtnSgtnm", getRtnSgtnm())
+            .append("rtnSgttp", getRtnSgttp())
+            .append("rtnSecrettp", getRtnSecrettp())
+            .append("rtnTdracctnovrfyflg", getRtnTdracctnovrfyflg())
+            .append("rtnAlwafddlntdrflg", getRtnAlwafddlntdrflg())
+            .append("rtnBnkrfndcfrmflg", getRtnBnkrfndcfrmflg())
+            .append("rtnIntacrlflg", getRtnIntacrlflg())
+            .append("rtnMrgnamt", getRtnMrgnamt())
+            .append("rtnStrtsgtdt", getRtnStrtsgtdt())
+            .append("rtnExpdt", getRtnExpdt())
+            .append("rtnMrgnduestopdt", getRtnMrgnduestopdt())
+            .append("rtnMrgnduestoptm", getRtnMrgnduestoptm())
+            .append("rtnOpntdrdt", getRtnOpntdrdt())
+            .append("rtnOpntdrtm", getRtnOpntdrtm())
+            .append("rtnXferprcsts", getRtnXferprcsts())
+            .append("rtnXferprccode", getRtnXferprccode())
+            .append("rtnDtxferprc", getRtnDtxferprc())
+            .append("rtnMessage", getRtnMessage())
+            .toString();
+    }
+
+    public String getRtnIntacrlflg() {
+        return rtnIntacrlflg;
+    }
+
+    public void setRtnIntacrlflg(String rtnIntacrlflg) {
+        this.rtnIntacrlflg = rtnIntacrlflg;
+    }
+}

+ 543 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/BankTenderpub.java

@@ -0,0 +1,543 @@
+package com.ruoyi.system.api.domain;
+
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.math.BigDecimal;
+
+/**
+ * 标段发布对象 bank_tenderpub
+ * 
+ * @author ruoyi
+ * @date 2024-09-03
+ */
+public class BankTenderpub extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 标段发布id */
+    private String tenderpubid;
+
+    /** 采购计划id */
+    @Excel(name = "采购计划id")
+    private Long ppid;
+
+    /** 客户端交易的唯一流水号建议值为YYYYMMDD+序号 */
+    @Excel(name = "客户端交易的唯一流水号建议值为YYYYMMDD+序号")
+    private String trnuid;
+
+    /** 账号 */
+    @Excel(name = "账号")
+    private String acctno;
+
+    /** 币种01-人民币 */
+    @Excel(name = "币种01-人民币")
+    private String ccycd;
+
+    /** 项目编号 */
+    @Excel(name = "项目编号")
+    private String prjno;
+
+    /** 标段编号 */
+    @Excel(name = "标段编号")
+    private String sgtno;
+
+    /** 标段名称 */
+    @Excel(name = "标段名称")
+    private String sgtnm;
+
+    /** 标段账户生成类型0-自动生成 1-自定义账号 */
+    @Excel(name = "标段账户生成类型0-自动生成 1-自定义账号")
+    private String sgtacctgentp;
+
+    /** 标段账号:标段账户生成类型为1时必输,为0时不能传入 */
+    @Excel(name = "标段账号:标段账户生成类型为1时必输,为0时不能传入")
+    private String sgtacctno;
+
+    /** 标段类型0-非会员模式 1-会员模式 2-公共标段模式 */
+    @Excel(name = "标段类型0-非会员模式 1-会员模式 2-公共标段模式")
+    private String sgttp;
+
+    /** 计息标志0-不计息 1-计息(默认计息 1) */
+    @Excel(name = "计息标志0-不计息 1-计息", readConverterExp = "默=认计息,1=")
+    private String intacrlflg;
+
+    /** 保密类型0-不保密 1-保密(默认保密 1)(保密标段只能开标后查标) */
+    @Excel(name = "保密类型0-不保密 1-保密", readConverterExp = "默=认保密,1=")
+    private String secrettp;
+
+    /** 投标账号白名单校验标志0-不校验 1-校验 (默认校验 1) */
+    @Excel(name = "投标账号白名单校验标志0-不校验 1-校验 ", readConverterExp = "默=认校验,1=")
+    private String tdracctnovrfyflg;
+
+    /** 允许截止后投标标志0-不允许 1-允许 (默认允许 1) */
+    @Excel(name = "允许截止后投标标志0-不允许 1-允许 ", readConverterExp = "默=认允许,1=")
+    private String alwafddlntdrflg;
+
+    /** 银行退款确认标志0-不确认 1-确认 (默认确认 1) */
+    @Excel(name = "银行退款确认标志0-不确认 1-确认 ", readConverterExp = "默=认确认,1=")
+    private String bnkrfndcfrmflg;
+
+    /** 保证金金额,double */
+    @Excel(name = "保证金金额,double")
+    private BigDecimal mrgnamt;
+
+    /** 发标日期 yyyyMMdd */
+    @Excel(name = "发标日期 yyyyMMdd")
+    private String strtsgtdt;
+
+    /** 到期日期 yyyyMMdd */
+    @Excel(name = "到期日期 yyyyMMdd")
+    private String expdt;
+
+    /** 保证金缴纳截止日期yyyyMMdd */
+    @Excel(name = "保证金缴纳截止日期yyyyMMdd")
+    private String mrgnduestopdt;
+
+    /** 保证金缴纳截止时间HHmmss */
+    @Excel(name = "保证金缴纳截止时间HHmmss")
+    private String mrgnduestoptm;
+
+    /** 开标日期,yyyyMMdd */
+    @Excel(name = "开标日期,yyyyMMdd")
+    private String opntdrdt;
+
+    /** 开标时间,HHmmss */
+    @Excel(name = "开标时间,HHmmss")
+    private String opntdrtm;
+
+    /** 客户端交易的唯一标志 */
+    @Excel(name = "客户端交易的唯一标志")
+    private String rtnTrnuid;
+
+    /** 交易处理状态 */
+    @Excel(name = "交易处理状态")
+    private String rtnStatus;
+
+    /** 处理结果码 */
+    @Excel(name = "处理结果码")
+    private String rtnCode;
+
+    /** 处理结果等级(info/warn/error) */
+    @Excel(name = "处理结果等级(info/warn/error)")
+    private String rtnSeverity;
+
+    /** 处理信息描述 */
+    @Excel(name = "处理信息描述")
+    private String rtnMessage;
+
+    /** 账号 */
+    @Excel(name = "账号")
+    private String rtnAcctno;
+
+    /** 项目编号 */
+    @Excel(name = "项目编号")
+    private String rtnPrjno;
+
+    /** 标段编号 */
+    @Excel(name = "标段编号")
+    private String rtnSgtno;
+
+    /** 标段名称 */
+    @Excel(name = "标段名称")
+    private String rtnSgtnm;
+
+    /** 标段id */
+    @Excel(name = "标段id")
+    private String rtnSgtid;
+
+    /** 6位子账户序号 */
+    @Excel(name = "6位子账户序号")
+    private String rtnSgtvrtlno;
+
+    /** 指令处理状态报文标识 */
+    @Excel(name = "指令处理状态报文标识")
+    private String rtnXferprcsts;
+
+    /** 指令状态编码 */
+    @Excel(name = "指令状态编码")
+    private String rtnXferprccode;
+
+    /** 指令处理时间yyyymmdd hhmmss */
+    @Excel(name = "指令处理时间yyyymmdd hhmmss")
+    private String rtnDtxferprc;
+
+    public void setTenderpubid(String tenderpubid) 
+    {
+        this.tenderpubid = tenderpubid;
+    }
+
+    public String getTenderpubid() 
+    {
+        return tenderpubid;
+    }
+    public void setPpid(Long ppid) 
+    {
+        this.ppid = ppid;
+    }
+
+    public Long getPpid() 
+    {
+        return ppid;
+    }
+    public void setTrnuid(String trnuid) 
+    {
+        this.trnuid = trnuid;
+    }
+
+    public String getTrnuid() 
+    {
+        return trnuid;
+    }
+    public void setAcctno(String acctno) 
+    {
+        this.acctno = acctno;
+    }
+
+    public String getAcctno() 
+    {
+        return acctno;
+    }
+    public void setCcycd(String ccycd) 
+    {
+        this.ccycd = ccycd;
+    }
+
+    public String getCcycd() 
+    {
+        return ccycd;
+    }
+    public void setPrjno(String prjno) 
+    {
+        this.prjno = prjno;
+    }
+
+    public String getPrjno() 
+    {
+        return prjno;
+    }
+    public void setSgtno(String sgtno) 
+    {
+        this.sgtno = sgtno;
+    }
+
+    public String getSgtno() 
+    {
+        return sgtno;
+    }
+    public void setSgtnm(String sgtnm) 
+    {
+        this.sgtnm = sgtnm;
+    }
+
+    public String getSgtnm() 
+    {
+        return sgtnm;
+    }
+    public void setSgtacctgentp(String sgtacctgentp) 
+    {
+        this.sgtacctgentp = sgtacctgentp;
+    }
+
+    public String getSgtacctgentp() 
+    {
+        return sgtacctgentp;
+    }
+    public void setSgtacctno(String sgtacctno) 
+    {
+        this.sgtacctno = sgtacctno;
+    }
+
+    public String getSgtacctno() 
+    {
+        return sgtacctno;
+    }
+    public void setSgttp(String sgttp) 
+    {
+        this.sgttp = sgttp;
+    }
+
+    public String getSgttp() 
+    {
+        return sgttp;
+    }
+    public void setIntacrlflg(String intacrlflg) 
+    {
+        this.intacrlflg = intacrlflg;
+    }
+
+    public String getIntacrlflg() 
+    {
+        return intacrlflg;
+    }
+    public void setSecrettp(String secrettp) 
+    {
+        this.secrettp = secrettp;
+    }
+
+    public String getSecrettp() 
+    {
+        return secrettp;
+    }
+    public void setTdracctnovrfyflg(String tdracctnovrfyflg) 
+    {
+        this.tdracctnovrfyflg = tdracctnovrfyflg;
+    }
+
+    public String getTdracctnovrfyflg() 
+    {
+        return tdracctnovrfyflg;
+    }
+    public void setAlwafddlntdrflg(String alwafddlntdrflg) 
+    {
+        this.alwafddlntdrflg = alwafddlntdrflg;
+    }
+
+    public String getAlwafddlntdrflg() 
+    {
+        return alwafddlntdrflg;
+    }
+    public void setBnkrfndcfrmflg(String bnkrfndcfrmflg) 
+    {
+        this.bnkrfndcfrmflg = bnkrfndcfrmflg;
+    }
+
+    public String getBnkrfndcfrmflg() 
+    {
+        return bnkrfndcfrmflg;
+    }
+    public void setMrgnamt(BigDecimal mrgnamt) 
+    {
+        this.mrgnamt = mrgnamt;
+    }
+
+    public BigDecimal getMrgnamt() 
+    {
+        return mrgnamt;
+    }
+    public void setStrtsgtdt(String strtsgtdt) 
+    {
+        this.strtsgtdt = strtsgtdt;
+    }
+
+    public String getStrtsgtdt() 
+    {
+        return strtsgtdt;
+    }
+    public void setExpdt(String expdt) 
+    {
+        this.expdt = expdt;
+    }
+
+    public String getExpdt() 
+    {
+        return expdt;
+    }
+    public void setMrgnduestopdt(String mrgnduestopdt) 
+    {
+        this.mrgnduestopdt = mrgnduestopdt;
+    }
+
+    public String getMrgnduestopdt() 
+    {
+        return mrgnduestopdt;
+    }
+    public void setMrgnduestoptm(String mrgnduestoptm) 
+    {
+        this.mrgnduestoptm = mrgnduestoptm;
+    }
+
+    public String getMrgnduestoptm() 
+    {
+        return mrgnduestoptm;
+    }
+    public void setOpntdrdt(String opntdrdt) 
+    {
+        this.opntdrdt = opntdrdt;
+    }
+
+    public String getOpntdrdt() 
+    {
+        return opntdrdt;
+    }
+    public void setOpntdrtm(String opntdrtm) 
+    {
+        this.opntdrtm = opntdrtm;
+    }
+
+    public String getOpntdrtm() 
+    {
+        return opntdrtm;
+    }
+    public void setRtnTrnuid(String rtnTrnuid) 
+    {
+        this.rtnTrnuid = rtnTrnuid;
+    }
+
+    public String getRtnTrnuid() 
+    {
+        return rtnTrnuid;
+    }
+    public void setRtnStatus(String rtnStatus) 
+    {
+        this.rtnStatus = rtnStatus;
+    }
+
+    public String getRtnStatus() 
+    {
+        return rtnStatus;
+    }
+    public void setRtnCode(String rtnCode) 
+    {
+        this.rtnCode = rtnCode;
+    }
+
+    public String getRtnCode() 
+    {
+        return rtnCode;
+    }
+    public void setRtnSeverity(String rtnSeverity) 
+    {
+        this.rtnSeverity = rtnSeverity;
+    }
+
+    public String getRtnSeverity() 
+    {
+        return rtnSeverity;
+    }
+    public void setRtnMessage(String rtnMessage) 
+    {
+        this.rtnMessage = rtnMessage;
+    }
+
+    public String getRtnMessage() 
+    {
+        return rtnMessage;
+    }
+    public void setRtnAcctno(String rtnAcctno) 
+    {
+        this.rtnAcctno = rtnAcctno;
+    }
+
+    public String getRtnAcctno() 
+    {
+        return rtnAcctno;
+    }
+    public void setRtnPrjno(String rtnPrjno) 
+    {
+        this.rtnPrjno = rtnPrjno;
+    }
+
+    public String getRtnPrjno() 
+    {
+        return rtnPrjno;
+    }
+    public void setRtnSgtno(String rtnSgtno) 
+    {
+        this.rtnSgtno = rtnSgtno;
+    }
+
+    public String getRtnSgtno() 
+    {
+        return rtnSgtno;
+    }
+    public void setRtnSgtnm(String rtnSgtnm) 
+    {
+        this.rtnSgtnm = rtnSgtnm;
+    }
+
+    public String getRtnSgtnm() 
+    {
+        return rtnSgtnm;
+    }
+    public void setRtnSgtid(String rtnSgtid) 
+    {
+        this.rtnSgtid = rtnSgtid;
+    }
+
+    public String getRtnSgtid() 
+    {
+        return rtnSgtid;
+    }
+    public void setRtnSgtvrtlno(String rtnSgtvrtlno) 
+    {
+        this.rtnSgtvrtlno = rtnSgtvrtlno;
+    }
+
+    public String getRtnSgtvrtlno() 
+    {
+        return rtnSgtvrtlno;
+    }
+    public void setRtnXferprcsts(String rtnXferprcsts) 
+    {
+        this.rtnXferprcsts = rtnXferprcsts;
+    }
+
+    public String getRtnXferprcsts() 
+    {
+        return rtnXferprcsts;
+    }
+    public void setRtnXferprccode(String rtnXferprccode) 
+    {
+        this.rtnXferprccode = rtnXferprccode;
+    }
+
+    public String getRtnXferprccode() 
+    {
+        return rtnXferprccode;
+    }
+    public void setRtnDtxferprc(String rtnDtxferprc) 
+    {
+        this.rtnDtxferprc = rtnDtxferprc;
+    }
+
+    public String getRtnDtxferprc() 
+    {
+        return rtnDtxferprc;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("tenderpubid", getTenderpubid())
+            .append("ppid", getPpid())
+            .append("trnuid", getTrnuid())
+            .append("acctno", getAcctno())
+            .append("ccycd", getCcycd())
+            .append("prjno", getPrjno())
+            .append("sgtno", getSgtno())
+            .append("sgtnm", getSgtnm())
+            .append("sgtacctgentp", getSgtacctgentp())
+            .append("sgtacctno", getSgtacctno())
+            .append("sgttp", getSgttp())
+            .append("intacrlflg", getIntacrlflg())
+            .append("secrettp", getSecrettp())
+            .append("tdracctnovrfyflg", getTdracctnovrfyflg())
+            .append("alwafddlntdrflg", getAlwafddlntdrflg())
+            .append("bnkrfndcfrmflg", getBnkrfndcfrmflg())
+            .append("mrgnamt", getMrgnamt())
+            .append("strtsgtdt", getStrtsgtdt())
+            .append("expdt", getExpdt())
+            .append("mrgnduestopdt", getMrgnduestopdt())
+            .append("mrgnduestoptm", getMrgnduestoptm())
+            .append("opntdrdt", getOpntdrdt())
+            .append("opntdrtm", getOpntdrtm())
+            .append("rtnTrnuid", getRtnTrnuid())
+            .append("rtnStatus", getRtnStatus())
+            .append("rtnCode", getRtnCode())
+            .append("rtnSeverity", getRtnSeverity())
+            .append("rtnMessage", getRtnMessage())
+            .append("rtnAcctno", getRtnAcctno())
+            .append("rtnPrjno", getRtnPrjno())
+            .append("rtnSgtno", getRtnSgtno())
+            .append("rtnSgtnm", getRtnSgtnm())
+            .append("rtnSgtid", getRtnSgtid())
+            .append("rtnSgtvrtlno", getRtnSgtvrtlno())
+            .append("rtnXferprcsts", getRtnXferprcsts())
+            .append("rtnXferprccode", getRtnXferprccode())
+            .append("rtnDtxferprc", getRtnDtxferprc())
+            .toString();
+    }
+}

+ 45 - 0
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteTenderpubFallbackFactory.java

@@ -0,0 +1,45 @@
+package com.ruoyi.system.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.RemoteTenderpubService;
+import com.ruoyi.system.api.domain.BankTenderpub;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteTenderpubFallbackFactory implements FallbackFactory<RemoteTenderpubService> {
+    private static final Logger log = LoggerFactory.getLogger(RemoteTenderpubFallbackFactory.class);
+
+    @Override
+    public RemoteTenderpubService create(Throwable throwable) {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteTenderpubService() {
+            @Override
+            public R<BankTenderpub> getInfo(String tenderpubid, String source) {
+                return R.fail("获取标段发布失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public R<String> addInnerAuth(BankTenderpub bankTenderpub, String source) {
+                return R.fail("添加标段发布失败:" + throwable.getMessage());
+            }
+
+            @Override
+            public int editInnerAuth(BankTenderpub bankTenderpub, String source) {
+                return 0;
+            }
+
+            @Override
+            public int remove(String[] tenderpubids, String source) {
+                return 0;
+            }
+        };
+    }
+}

+ 2 - 1
ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -6,4 +6,5 @@ com.ruoyi.system.api.factory.RemotePlanFallbackFactory
 com.ruoyi.system.api.factory.RemoteMaterialFallbackFactory
 com.ruoyi.system.api.factory.RemoteApprovalRecordFallbackFactory
 com.ruoyi.system.api.factory.RemoteBidTenderFallbackFactory
-com.ruoyi.system.api.factory.RemoteExpertFallbackFactory
+com.ruoyi.system.api.factory.RemoteExpertFallbackFactory
+com.ruoyi.system.api.factory.RemoteTenderpubFallbackFactory

+ 37 - 45
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java

@@ -8,7 +8,9 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
+import java.util.Calendar;
 import java.util.Date;
+
 import org.apache.commons.lang3.time.DateFormatUtils;
 
 
@@ -17,8 +19,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
  *
  * @author ruoyi
  */
-public class DateUtils extends org.apache.commons.lang3.time.DateUtils
-{
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
     public static String YYYY = "yyyy";
 
     public static String YYYY_MM = "yyyy-MM";
@@ -39,8 +40,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
      *
      * @return Date() 当前日期
      */
-    public static Date getNowDate()
-    {
+    public static Date getNowDate() {
         return new Date();
     }
 
@@ -49,44 +49,34 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
      *
      * @return String
      */
-    public static String getDate()
-    {
+    public static String getDate() {
         return dateTimeNow(YYYY_MM_DD);
     }
 
-    public static final String getTime()
-    {
+    public static final String getTime() {
         return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
     }
 
-    public static final String dateTimeNow()
-    {
+    public static final String dateTimeNow() {
         return dateTimeNow(YYYYMMDDHHMMSS);
     }
 
-    public static final String dateTimeNow(final String format)
-    {
+    public static final String dateTimeNow(final String format) {
         return parseDateToStr(format, new Date());
     }
 
-    public static final String dateTime(final Date date)
-    {
+    public static final String dateTime(final Date date) {
         return parseDateToStr(YYYY_MM_DD, date);
     }
 
-    public static final String parseDateToStr(final String format, final Date date)
-    {
+    public static final String parseDateToStr(final String format, final Date date) {
         return new SimpleDateFormat(format).format(date);
     }
 
-    public static final Date dateTime(final String format, final String ts)
-    {
-        try
-        {
+    public static final Date dateTime(final String format, final String ts) {
+        try {
             return new SimpleDateFormat(format).parse(ts);
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             throw new RuntimeException(e);
         }
     }
@@ -94,8 +84,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 日期路径 即年/月/日 如2018/08/08
      */
-    public static final String datePath()
-    {
+    public static final String datePath() {
         Date now = new Date();
         return DateFormatUtils.format(now, "yyyy/MM/dd");
     }
@@ -103,8 +92,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 日期路径 即年/月/日 如20180808
      */
-    public static final String dateTime()
-    {
+    public static final String dateTime() {
         Date now = new Date();
         return DateFormatUtils.format(now, "yyyyMMdd");
     }
@@ -112,18 +100,13 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 日期型字符串转化为日期 格式
      */
-    public static Date parseDate(Object str)
-    {
-        if (str == null)
-        {
+    public static Date parseDate(Object str) {
+        if (str == null) {
             return null;
         }
-        try
-        {
+        try {
             return parseDate(str.toString(), parsePatterns);
-        }
-        catch (ParseException e)
-        {
+        } catch (ParseException e) {
             return null;
         }
     }
@@ -131,8 +114,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 获取服务器启动时间
      */
-    public static Date getServerStartDate()
-    {
+    public static Date getServerStartDate() {
         long time = ManagementFactory.getRuntimeMXBean().getStartTime();
         return new Date(time);
     }
@@ -140,12 +122,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 计算时间差
      *
-     * @param endDate 最后时间
+     * @param endDate   最后时间
      * @param startTime 开始时间
      * @return 时间差(天/小时/分钟)
      */
-    public static String timeDistance(Date endDate, Date startTime)
-    {
+    public static String timeDistance(Date endDate, Date startTime) {
         long nd = 1000 * 24 * 60 * 60;
         long nh = 1000 * 60 * 60;
         long nm = 1000 * 60;
@@ -166,8 +147,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 增加 LocalDateTime ==> Date
      */
-    public static Date toDate(LocalDateTime temporalAccessor)
-    {
+    public static Date toDate(LocalDateTime temporalAccessor) {
         ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
@@ -175,10 +155,22 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     /**
      * 增加 LocalDate ==> Date
      */
-    public static Date toDate(LocalDate temporalAccessor)
-    {
+    public static Date toDate(LocalDate temporalAccessor) {
         LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    /**
+     * 日期时间加减
+     * 单位类型: Calendar.HOUR_OF_DAY   等
+     * 单位数量
+     * @return
+     */
+    public static Date add(Date date, int dwType, int i) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(dwType, i);
+        return c.getTime();
+    }
 }

+ 0 - 6
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidApprovalRecordController.java

@@ -38,7 +38,6 @@ public class BidApprovalRecordController extends BaseController
     /**
      * 查询项目审核列表
      */
-    @RequiresPermissions("bidding:record:list")
     @GetMapping("/list")
     public TableDataInfo list(BidApprovalRecord bidApprovalRecord)
     {
@@ -50,7 +49,6 @@ public class BidApprovalRecordController extends BaseController
     /**
      * 导出项目审核列表
      */
-    @RequiresPermissions("bidding:record:export")
     @Log(title = "项目审核", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, BidApprovalRecord bidApprovalRecord)
@@ -63,7 +61,6 @@ public class BidApprovalRecordController extends BaseController
     /**
      * 获取项目审核详细信息
      */
-    @RequiresPermissions("bidding:record:query")
     @GetMapping(value = "/{id}")
     public AjaxResult getInfo(@PathVariable("id") Long id)
     {
@@ -73,7 +70,6 @@ public class BidApprovalRecordController extends BaseController
     /**
      * 新增项目审核
      */
-    @RequiresPermissions("bidding:record:add")
     @Log(title = "项目审核", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody BidApprovalRecord bidApprovalRecord)
@@ -84,7 +80,6 @@ public class BidApprovalRecordController extends BaseController
     /**
      * 修改项目审核
      */
-    @RequiresPermissions("bidding:record:edit")
     @Log(title = "项目审核", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody BidApprovalRecord bidApprovalRecord)
@@ -95,7 +90,6 @@ public class BidApprovalRecordController extends BaseController
     /**
      * 删除项目审核
      */
-    @RequiresPermissions("bidding:record:remove")
     @Log(title = "项目审核", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable Long[] ids)

+ 5 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidCommitteeController.java

@@ -170,4 +170,9 @@ public class BidCommitteeController extends BaseController
         List<BidTender> list = bidCommitteeService.getProjectByUserId(loginUser.getSysUser().getUserId());
         return getDataTable(list);
     }
+
+    @PutMapping("/updateLeader")
+    public AjaxResult updateLeader(@RequestParam("pbId") Long pbId){
+        return toAjax(bidCommitteeService.updateLeader(pbId));
+    }
 }

+ 72 - 37
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidNoticeController.java

@@ -1,9 +1,7 @@
 package com.hh.bidding.controller;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 import javax.servlet.http.HttpServletResponse;
 
 import com.alibaba.fastjson.JSON;
@@ -11,19 +9,15 @@ import com.hh.bidding.domain.*;
 import com.hh.bidding.domain.BidTender;
 import com.hh.bidding.service.IBidTenderService;
 import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.system.api.RemotePlanService;
-import com.ruoyi.system.api.RemoteMaterialService;
-import com.ruoyi.system.api.RemoteApprovalRecordService;
-import com.ruoyi.system.api.RemoteUserService;
+import com.ruoyi.system.api.*;
 import com.ruoyi.system.api.domain.*;
-import io.lettuce.core.ScriptOutputType;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.log.annotation.Log;
@@ -62,6 +56,9 @@ public class BidNoticeController extends BaseController {
     @Autowired
     private RemoteUserService remoteUserService;
 
+    @Autowired
+    private RemoteTenderpubService remoteTenderpubService;
+
     @Autowired
     private TokenService tokenService;
 
@@ -88,13 +85,13 @@ public class BidNoticeController extends BaseController {
         SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
         List<SysRole> roles = sysUser.getRoles();
         Boolean flag = false;
-        for(SysRole role : roles){
-            if("purchaser".equals(role.getRoleKey())){
+        for (SysRole role : roles) {
+            if ("purchaser".equals(role.getRoleKey())) {
                 flag = true;
                 break;
             }
         }
-        if(flag) {
+        if (flag) {
             Long userId = sysUser.getUserId();
             List<Long> ids = remoteUserService.getDeptIds(userId, 10, "ALL", SecurityConstants.INNER);
             System.out.println(ids);
@@ -193,13 +190,45 @@ public class BidNoticeController extends BaseController {
     @Log(title = "招标公告", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Validated @RequestBody BidNotice bidNotice) {
-        if(bidNotice.getFjType() == 1){
+        if (bidNotice.getFjType() == 1) {
             Long i = bidNoticeService.selectCount(bidNotice.getSid());
-            if(i > 0){
+            if (i > 0) {
                 return error("此项目已发布采购公告,禁止重复发布!");
             }
         }
 
+        /**添加标段银行接口*/
+//        BidTender bt = bidTenderService.selectBidTenderBySid(bidNotice.getSid());
+//        if (bt == null) return error("招标项目不可用!");
+//        PpmProcurementPlan ppp = remotePlanService.getPlan(bt.getXyId(), SecurityConstants.INNER);
+//
+//        BankTenderpub btp = new BankTenderpub();
+//
+//        btp.setPpid(bt.getSid());
+//        btp.setPrjno(bt.getsCode());
+//        btp.setSgtno("BD" + DateUtils.dateTimeNow());
+//        btp.setSgtnm(bt.getsName());
+//
+//        btp.setMrgnamt(BigDecimal.valueOf(ppp.getEarnestMoney()));
+//
+//        btp.setStrtsgtdt(DateUtils.parseDateToStr("yyyyMMdd", bidNotice.getuGetTime()));    //发标日期
+//
+//        /** 保证金截至时间为开标时间前一小时 **/
+//        Calendar c = Calendar.getInstance();
+//        c.setTime(bidNotice.getuKaiTime());
+//        c.add(Calendar.HOUR_OF_DAY, -1);
+//        btp.setMrgnduestopdt(DateUtils.parseDateToStr("yyyyMMdd", c.getTime()));   //保证金缴纳截至日期
+//        btp.setMrgnduestoptm(DateUtils.parseDateToStr("HHmmss", c.getTime()));     //保证金缴纳截至时间
+//        btp.setOpntdrdt(DateUtils.parseDateToStr("yyyyMMdd", bidNotice.getuKaiTime()));        //开标日期
+//        btp.setOpntdrtm(DateUtils.parseDateToStr("HHmmss", bidNotice.getuKaiTime()));          //开标时间
+//
+//        R<String> s = remoteTenderpubService.addInnerAuth(btp, SecurityConstants.INNER);
+//
+//        if (s.getMsg().contains("成功"))
+//            return toAjax(bidNoticeService.insertBidNotice(bidNotice));
+//        else
+//            return error(s.getMsg());
+
         return toAjax(bidNoticeService.insertBidNotice(bidNotice));
     }
 
@@ -213,14 +242,14 @@ public class BidNoticeController extends BaseController {
     public AjaxResult edit(@Validated @RequestBody BidNotice bidNotice) throws Exception {
         BidNotice notice = bidNoticeService.selectBidNoticeByUid(bidNotice.getUid());
 
-        if(notice.getFjType() == 3 && bidNotice.getFjStatus() == 3 ){
-            bidTenderService.updateTenderStatus(9L,notice.getSid());
+        if (notice.getFjType() == 3 && bidNotice.getFjStatus() == 3) {
+            bidTenderService.updateTenderStatus(9L, notice.getSid());
         }
 
         if (!notice.getFjStatus().equals(bidNotice.getFjStatus())) {
-            PpmApprovalRecord obj = bidNotice.getEditor() == null?new PpmApprovalRecord():bidNotice.getEditor();
+            PpmApprovalRecord obj = bidNotice.getEditor() == null ? new PpmApprovalRecord() : bidNotice.getEditor();
             obj.setProcessedBy(tokenService.getLoginUser().getSysUser().getNickName());
-            obj.setProcessedRoles(StringUtils.join(tokenService.getLoginUser().getRoles(),","));
+            obj.setProcessedRoles(StringUtils.join(tokenService.getLoginUser().getRoles(), ","));
             obj.setAid(Math.toIntExact(bidNotice.getUid()));
             obj.setDepnt(SecurityUtils.getLoginUser().getSysUser().getDept().getDeptName());
             obj.setUpdateTime(DateUtils.getNowDate());
@@ -248,7 +277,13 @@ public class BidNoticeController extends BaseController {
             remoteApprovalRecordService.add(obj, SecurityConstants.INNER);
         }
         int i = bidNoticeService.updateBidNotice(bidNotice);
-        if(i == 0){
+
+        /**修改标段银行接口*/
+
+
+        /***/
+
+        if (i == 0) {
             throw new Exception("更新失败");
         }
         return toAjax(i);
@@ -308,7 +343,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  获取某种分包下的公告信息
+     * 获取某种分包下的公告信息
      *
      * @param bidNoticeAndMaterial
      * @return
@@ -321,7 +356,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  通过Sid获取对应项目的公告信息
+     * 通过Sid获取对应项目的公告信息
      *
      * @param sid
      * @return
@@ -329,7 +364,7 @@ public class BidNoticeController extends BaseController {
     @GetMapping(value = "/selectBidNoticeBySid/{sid}")
     public AjaxResult selectBidNoticeBySid(@PathVariable("sid") Long sid) {
         BidNotice bidNotice = bidNoticeService.selectBidNoticeBySid(sid);
-        if(bidNotice == null){
+        if (bidNotice == null) {
             bidNotice = new BidNotice();
         }
         BidTender bidTender = bidTenderService.selectBidTenderBySid(sid);
@@ -341,7 +376,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  查询采购公告
+     * 查询采购公告
      *
      * @param bidNotice
      * @return
@@ -354,13 +389,13 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  通过uid获取公告信息
+     * 通过uid获取公告信息
      *
      * @param uid
      * @return
      */
     @PostMapping(value = "/selectPurchaseById")
-    public AjaxResult selectPurchaseById(@RequestParam ("uid") Long uid) {
+    public AjaxResult selectPurchaseById(@RequestParam("uid") Long uid) {
         BidNotice bidNotice = bidNoticeService.selectPurchaseById(uid);
         Long sid = bidNotice.getSid();
         BidTender bidTender = bidTenderService.selectBidTenderBySid(sid);
@@ -371,7 +406,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  查询可终止公告
+     * 查询可终止公告
      *
      * @param bidNotice
      * @return
@@ -381,9 +416,9 @@ public class BidNoticeController extends BaseController {
         startPage();
         List<BidNotice> list = bidNoticeService.findStopTender(bidNotice);
         List<BidNotice> res = new ArrayList<>();
-        for(BidNotice item : list){
+        for (BidNotice item : list) {
             Long sid = item.getSid();
-            if(bidNoticeService.selectBidNoticeBySid(sid) != null){
+            if (bidNoticeService.selectBidNoticeBySid(sid) != null) {
                 res.add(item);
             }
         }
@@ -391,7 +426,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  查询可变更公告
+     * 查询可变更公告
      *
      * @param bidNotice
      * @return
@@ -401,9 +436,9 @@ public class BidNoticeController extends BaseController {
         startPage();
         List<BidNotice> list = bidNoticeService.findChangeTender(bidNotice);
         List<BidNotice> res = new ArrayList<>();
-        for(BidNotice item : list){
+        for (BidNotice item : list) {
             Long sid = item.getSid();
-            if(bidNoticeService.selectBidNoticeBySid(sid) == null){
+            if (bidNoticeService.selectBidNoticeBySid(sid) == null) {
                 res.add(item);
             }
         }
@@ -411,7 +446,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  供应商平台 公告管理
+     * 供应商平台 公告管理
      *
      * @param bidNoticeAndMaterial
      * @return
@@ -420,7 +455,7 @@ public class BidNoticeController extends BaseController {
     public TableDataInfo findNoticesBySupplier(BidNoticeAndMaterial bidNoticeAndMaterial) {
         startPage();
         List<BidNotice> list = bidNoticeService.findNoticesBySupplier(bidNoticeAndMaterial);
-        for (BidNotice item : list){
+        for (BidNotice item : list) {
             Long ownerDept = item.getOwnerDept();
             SysDept sysDept = remoteUserService.getInfoById(ownerDept, SecurityConstants.INNER);
             System.out.println(sysDept.toString());
@@ -431,7 +466,7 @@ public class BidNoticeController extends BaseController {
     }
 
     /**
-     *  供应商平台 开标管理
+     * 供应商平台 开标管理
      *
      * @param bidNoticeAndMaterial
      * @return
@@ -440,11 +475,11 @@ public class BidNoticeController extends BaseController {
     public TableDataInfo findBidOpenBySupplier(BidNoticeAndMaterial bidNoticeAndMaterial) {
         startPage();
         List<BidNotice> list = bidNoticeService.findBidOpenBySupplier(bidNoticeAndMaterial);
-        for (BidNotice item : list){
+        for (BidNotice item : list) {
             Long ownerDept = item.getOwnerDept();
             SysDept sysDept = remoteUserService.getInfoById(ownerDept, SecurityConstants.INNER);
             item.setsUnit(sysDept.getDeptName());
-            if(item.gethName() != null && "".equals(item.gethName()) == false){
+            if (item.gethName() != null && "".equals(item.gethName()) == false) {
                 item.sethName(item.gethName() + " 中标");
             }
         }

+ 297 - 4
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidTenderController.java

@@ -3,6 +3,7 @@ package com.hh.bidding.controller;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.security.NoSuchAlgorithmException;
@@ -14,6 +15,7 @@ import com.alibaba.nacos.common.utils.MD5Utils;
 import com.hh.bidding.domain.*;
 import com.hh.bidding.domain.BidTender;
 import com.hh.bidding.service.*;
+import com.ruoyi.common.core.constant.PriceConstants;
 import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.DateUtils;
@@ -23,6 +25,7 @@ import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.system.api.RemoteBidTenderService;
 import com.ruoyi.system.api.RemoteMaterialService;
+import com.ruoyi.system.api.RemotePlanService;
 import com.ruoyi.system.api.RemoteUserService;
 import com.ruoyi.system.api.domain.*;
 import com.ruoyi.system.api.util.DeptUtil;
@@ -78,6 +81,9 @@ public class BidTenderController extends BaseController {
     @Autowired
     private RemoteMaterialService remoteMaterialService;
 
+    @Autowired
+    private RemotePlanService remotePlanService;
+
     @Autowired
     private TokenService tokenService;
 
@@ -625,9 +631,13 @@ public class BidTenderController extends BaseController {
 
     // 查询可终止项目
     @GetMapping("/selectTenderByState")
-    public TableDataInfo selectTenderByState(@RequestParam("sState") Long sState) {
+    public TableDataInfo selectTenderByState(BidTender bidTender) {
         System.out.println(SecurityUtils.getUserId());
 
+        Long sState = bidTender.getsState();
+        String sName = bidTender.getsName();
+        String sCode = bidTender.getsCode();
+
         startPage();
         Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId();
         List<Long> childrenCompany = remoteUserService.getDeptIds(userId, 10, "CHILDREN_COMPANY", SecurityConstants.INNER);
@@ -639,6 +649,8 @@ public class BidTenderController extends BaseController {
         join = "("+join+")";
         Map<String,Object> map = new HashMap<>();
         map.put("sState",sState);
+        map.put("sName",sName);
+        map.put("sCode",sCode);
         map.put("join",join);
         List<BidTender> bidTenderList = bidTenderService.selectTenderByState(map);
         for(BidTender item : bidTenderList){
@@ -684,10 +696,14 @@ public class BidTenderController extends BaseController {
     }
 
     // 查询中标后可变更项目
-    @GetMapping("selectTenderByChange")
-    public TableDataInfo selectTenderByChange(){
+    @GetMapping("/selectTenderByChange")
+    public TableDataInfo selectTenderByChange(BidTender bidTender){
         System.out.println(SecurityUtils.getUserId());
 
+        Long cState = bidTender.getcState();
+        String sName = bidTender.getsName();
+        String sCode = bidTender.getsCode();
+
         startPage();
         Long userId = SecurityUtils.getLoginUser().getSysUser().getUserId();
         List<Long> childrenCompany = remoteUserService.getDeptIds(userId, 10, "CHILDREN_COMPANY", SecurityConstants.INNER);
@@ -697,7 +713,12 @@ public class BidTenderController extends BaseController {
         }
         String join = String.join(",", deptIds);
         join = "("+join+")";
-        List<BidTender> bidTenders = bidTenderService.selectTenderByChange(join);
+        Map<String,Object> map = new HashMap<>();
+        map.put("cState",cState);
+        map.put("sName",sName);
+        map.put("sCode",sCode);
+        map.put("join",join);
+        List<BidTender> bidTenders = bidTenderService.selectTenderByChange(map);
         for (BidTender item : bidTenders){
             Long ownerDept = item.getOwnerDept();
             SysDept info = remoteUserService.getInfoById(ownerDept,SecurityConstants.INNER);
@@ -708,6 +729,278 @@ public class BidTenderController extends BaseController {
         return getDataTable(bidTenders);
     }
 
+    // 中标变更申请
+    @Transactional(rollbackFor = Exception.class)
+    @PutMapping("/updateTenderByCState")
+    public AjaxResult updateTenderByCState(@RequestBody BidTender bidTender){
+        BidTender res = bidTenderService.selectBidTenderBySid(bidTender.getSid());
+        if(res.getsState().equals(bidTender.getsState())){
+            return toAjax(bidTenderService.updateBidTender(bidTender));
+        }
+
+        BidApprovalRecord bidApprovalRecord = new BidApprovalRecord();
+        bidApprovalRecord.setSid(bidTender.getSid());
+        bidApprovalRecord.setProcessedBy(SecurityUtils.getLoginUser().getSysUser().getUserName());
+        bidApprovalRecord.setDepnt(SecurityUtils.getLoginUser().getSysUser().getDept().getDeptName());
+        bidApprovalRecord.setFlagType("ChangeTender"); //中标终止标记
+        bidApprovalRecord.setNode("采购人申请");
+        bidApprovalRecord.setOpinion("中标变更");
+        bidApprovalRecordService.insertBidApprovalRecord(bidApprovalRecord);
+        return toAjax(bidTenderService.updateBidTender(bidTender));
+    }
+
+    // 中标变更服务费计算
+    @GetMapping("getServicePrice")
+    public AjaxResult getServicePrice(@RequestParam("sid") Long sid,@RequestParam("hid") Long hid){
+        BidTender bidTender = bidTenderService.selectBidTenderBySid(sid);
+        PpmProcurementPlan plan = remotePlanService.getPlan(bidTender.getXyId(), SecurityConstants.INNER);
+        Long materialId = plan.getMaterialId();
+        String buyingMode = plan.getBuyingMode();
+        Map<String,Long> map = new HashMap<>();
+        map.put("sid",sid);
+        map.put("hid",hid);
+        BidQuote bidQuote = bidQuoteService.selectQuoteBySupplier(map);
+        BigDecimal finalPrice = bidQuote.getQuotePrice();
+        BigDecimal servicePrice = new BigDecimal(0);
+        if (buyingMode.equals("1")) {
+            // 服务取费
+            if (materialId == 39 || materialId == 40 || materialId == 41 || materialId == 42) {
+                if (finalPrice.compareTo(new BigDecimal(1000000)) <= 0) {
+                    servicePrice = finalPrice.multiply(PriceConstants.SERVICE_PERCENT_ONE).multiply(PriceConstants.SERVICE_SAVE_ONE).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(1000000)) > 0 && finalPrice.compareTo(new BigDecimal(5000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE.add(
+                            finalPrice.subtract(new BigDecimal(1000000)).multiply(PriceConstants.SERVICE_PERCENT_TWO)
+                    ).multiply(PriceConstants.SERVICE_SAVE_TWO).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(5000000)) > 0 && finalPrice.compareTo(new BigDecimal(10000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE.add(PriceConstants.SERVICE_PRICE_TWO).add(
+                            finalPrice.subtract(new BigDecimal(5000000)).multiply(PriceConstants.SERVICE_PERCENT_THREE)
+                    ).multiply(PriceConstants.SERVICE_SAVE_TWO).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(10000000)) > 0 && finalPrice.compareTo(new BigDecimal(50000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE
+                            .add(PriceConstants.SERVICE_PRICE_TWO)
+                            .add(PriceConstants.SERVICE_PRICE_THREE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(10000000)).multiply(PriceConstants.SERVICE_PERCENT_FOUR)
+                            ).multiply(PriceConstants.SERVICE_SAVE_TWO).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(50000000)) > 0 && finalPrice.compareTo(new BigDecimal(100000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE
+                            .add(PriceConstants.SERVICE_PRICE_TWO)
+                            .add(PriceConstants.SERVICE_PRICE_THREE)
+                            .add(PriceConstants.SERVICE_PRICE_FOUR)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(50000000)).multiply(PriceConstants.SERVICE_PERCENT_FIVE)
+                            ).multiply(PriceConstants.SERVICE_SAVE_TWO).multiply(PriceConstants.SAVE);
+                } else {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE
+                            .add(PriceConstants.SERVICE_PRICE_TWO)
+                            .add(PriceConstants.SERVICE_PRICE_THREE)
+                            .add(PriceConstants.SERVICE_PRICE_FOUR)
+                            .add(PriceConstants.SERVICE_PRICE_FIVE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(100000000)).multiply(PriceConstants.SERVICE_PERCENT_SIX)
+                            ).multiply(PriceConstants.SERVICE_SAVE_TWO).multiply(PriceConstants.SAVE);
+                }
+                // 工程取费
+            } else if (materialId == 35 || materialId == 36 || materialId == 37 || materialId == 38) {
+                if (finalPrice.compareTo(new BigDecimal(1000000)) < 0) {
+                    servicePrice = finalPrice.multiply(PriceConstants.PROJECT_PERCENT_ONE).multiply(PriceConstants.PROJECT_SAVE_ONE).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(1000000)) > 0 && finalPrice.compareTo(new BigDecimal(5000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE.add(
+                            finalPrice.subtract(new BigDecimal(1000000)).multiply(PriceConstants.PROJECT_PERCENT_TWO)
+                    ).multiply(PriceConstants.PROJECT_SAVE_TWO).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(5000000)) > 0 && finalPrice.compareTo(new BigDecimal(10000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(5000000)).multiply(PriceConstants.PROJECT_PERCENT_THREE)
+                            ).multiply(PriceConstants.PROJECT_SAVE_THREE).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(10000000)) > 0 && finalPrice.compareTo(new BigDecimal(50000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(PriceConstants.PROJECT_PRICE_THREE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(10000000)).multiply(PriceConstants.PROJECT_PERCENT_FOUR)
+                            ).multiply(PriceConstants.PROJECT_SAVE_FOUR);
+                } else if (finalPrice.compareTo(new BigDecimal(50000000)) > 0 && finalPrice.compareTo(new BigDecimal(100000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(PriceConstants.PROJECT_PRICE_THREE)
+                            .add(PriceConstants.PROJECT_PRICE_FOUR)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(50000000)).multiply(PriceConstants.PROJECT_PERCENT_FIVE)
+                            ).multiply(PriceConstants.PROJECT_SAVE_FOUR).multiply(PriceConstants.SAVE);
+                } else {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(PriceConstants.PROJECT_PRICE_THREE)
+                            .add(PriceConstants.PROJECT_PRICE_FOUR)
+                            .add(PriceConstants.PROJECT_PRICE_FIVE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(100000000)).multiply(PriceConstants.PROJECT_PERCENT_SIX)
+                            ).multiply(PriceConstants.PROJECT_SAVE_FOUR).multiply(PriceConstants.SAVE);
+                }
+                // 货物取费
+            } else {
+                if (finalPrice.compareTo(new BigDecimal(1000000)) < 0) {
+                    servicePrice = finalPrice.multiply(PriceConstants.GOOD_PERCENT_ONE).multiply(PriceConstants.GOOD_SAVE_ONE).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(1000000)) > 0 && finalPrice.compareTo(new BigDecimal(5000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE.add(
+                            finalPrice.subtract(new BigDecimal(1000000)).multiply(PriceConstants.GOOD_PERCENT_TWO)
+                    ).multiply(PriceConstants.GOOD_SAVE_TWO).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(5000000)) > 0 && finalPrice.compareTo(new BigDecimal(10000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(5000000)).multiply(PriceConstants.GOOD_PERCENT_THREE)
+                            ).multiply(PriceConstants.GOOD_SAVE_THREE).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(10000000)) > 0 && finalPrice.compareTo(new BigDecimal(50000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(PriceConstants.GOOD_PRICE_THREE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(10000000)).multiply(PriceConstants.GOOD_PERCENT_FOUR)
+                            ).multiply(PriceConstants.GOOD_SAVE_FOUR).multiply(PriceConstants.SAVE);
+                } else if (finalPrice.compareTo(new BigDecimal(50000000)) > 0 && finalPrice.compareTo(new BigDecimal(100000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(PriceConstants.GOOD_PRICE_THREE)
+                            .add(PriceConstants.GOOD_PRICE_FOUR)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(50000000)).multiply(PriceConstants.GOOD_PERCENT_FIVE)
+                            ).multiply(PriceConstants.GOOD_SAVE_FOUR).multiply(PriceConstants.SAVE);
+                } else {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(PriceConstants.GOOD_PRICE_THREE)
+                            .add(PriceConstants.GOOD_PRICE_FOUR)
+                            .add(PriceConstants.GOOD_PRICE_FIVE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(100000000)).multiply(PriceConstants.GOOD_PERCENT_SIX)
+                            ).multiply(PriceConstants.GOOD_SAVE_FOUR).multiply(PriceConstants.SAVE);
+                }
+            }
+        } else {
+            // 服务取费
+            if (materialId == 39 || materialId == 40 || materialId == 41 || materialId == 42) {
+                if (finalPrice.compareTo(new BigDecimal(1000000)) <= 0) {
+                    servicePrice = finalPrice.multiply(PriceConstants.SERVICE_PERCENT_ONE).multiply(PriceConstants.SERVICE_SAVE_ONE);
+                } else if (finalPrice.compareTo(new BigDecimal(1000000)) > 0 && finalPrice.compareTo(new BigDecimal(5000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE.add(
+                            finalPrice.subtract(new BigDecimal(1000000)).multiply(PriceConstants.SERVICE_PERCENT_TWO)
+                    ).multiply(PriceConstants.SERVICE_SAVE_TWO);
+                } else if (finalPrice.compareTo(new BigDecimal(5000000)) > 0 && finalPrice.compareTo(new BigDecimal(10000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE.add(PriceConstants.SERVICE_PRICE_TWO).add(
+                            finalPrice.subtract(new BigDecimal(5000000)).multiply(PriceConstants.SERVICE_PERCENT_THREE)
+                    ).multiply(PriceConstants.SERVICE_SAVE_TWO);
+                } else if (finalPrice.compareTo(new BigDecimal(10000000)) > 0 && finalPrice.compareTo(new BigDecimal(50000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE
+                            .add(PriceConstants.SERVICE_PRICE_TWO)
+                            .add(PriceConstants.SERVICE_PRICE_THREE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(10000000)).multiply(PriceConstants.SERVICE_PERCENT_FOUR)
+                            ).multiply(PriceConstants.SERVICE_SAVE_TWO);
+                } else if (finalPrice.compareTo(new BigDecimal(50000000)) > 0 && finalPrice.compareTo(new BigDecimal(100000000)) <= 0) {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE
+                            .add(PriceConstants.SERVICE_PRICE_TWO)
+                            .add(PriceConstants.SERVICE_PRICE_THREE)
+                            .add(PriceConstants.SERVICE_PRICE_FOUR)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(50000000)).multiply(PriceConstants.SERVICE_PERCENT_FIVE)
+                            ).multiply(PriceConstants.SERVICE_SAVE_TWO);
+                } else {
+                    servicePrice = PriceConstants.SERVICE_PRICE_ONE
+                            .add(PriceConstants.SERVICE_PRICE_TWO)
+                            .add(PriceConstants.SERVICE_PRICE_THREE)
+                            .add(PriceConstants.SERVICE_PRICE_FOUR)
+                            .add(PriceConstants.SERVICE_PRICE_FIVE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(100000000)).multiply(PriceConstants.SERVICE_PERCENT_SIX)
+                            ).multiply(PriceConstants.SERVICE_SAVE_TWO);
+                }
+                // 工程取费
+            } else if (materialId == 35 || materialId == 36 || materialId == 37 || materialId == 38) {
+                if (finalPrice.compareTo(new BigDecimal(1000000)) < 0) {
+                    servicePrice = finalPrice.multiply(PriceConstants.PROJECT_PERCENT_ONE).multiply(PriceConstants.PROJECT_SAVE_ONE);
+                } else if (finalPrice.compareTo(new BigDecimal(1000000)) > 0 && finalPrice.compareTo(new BigDecimal(5000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE.add(
+                            finalPrice.subtract(new BigDecimal(1000000)).multiply(PriceConstants.PROJECT_PERCENT_TWO)
+                    ).multiply(PriceConstants.PROJECT_SAVE_TWO);
+                } else if (finalPrice.compareTo(new BigDecimal(5000000)) > 0 && finalPrice.compareTo(new BigDecimal(10000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(5000000)).multiply(PriceConstants.PROJECT_PERCENT_THREE)
+                            ).multiply(PriceConstants.PROJECT_SAVE_THREE);
+                } else if (finalPrice.compareTo(new BigDecimal(10000000)) > 0 && finalPrice.compareTo(new BigDecimal(50000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(PriceConstants.PROJECT_PRICE_THREE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(10000000)).multiply(PriceConstants.PROJECT_PERCENT_FOUR)
+                            ).multiply(PriceConstants.PROJECT_SAVE_FOUR);
+                } else if (finalPrice.compareTo(new BigDecimal(50000000)) > 0 && finalPrice.compareTo(new BigDecimal(100000000)) <= 0) {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(PriceConstants.PROJECT_PRICE_THREE)
+                            .add(PriceConstants.PROJECT_PRICE_FOUR)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(50000000)).multiply(PriceConstants.PROJECT_PERCENT_FIVE)
+                            ).multiply(PriceConstants.PROJECT_SAVE_FOUR);
+                } else {
+                    servicePrice = PriceConstants.PROJECT_PRICE_ONE
+                            .add(PriceConstants.PROJECT_PRICE_TWO)
+                            .add(PriceConstants.PROJECT_PRICE_THREE)
+                            .add(PriceConstants.PROJECT_PRICE_FOUR)
+                            .add(PriceConstants.PROJECT_PRICE_FIVE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(100000000)).multiply(PriceConstants.PROJECT_PERCENT_SIX)
+                            ).multiply(PriceConstants.PROJECT_SAVE_FOUR);
+                }
+                // 货物取费
+            } else {
+                if (finalPrice.compareTo(new BigDecimal(1000000)) < 0) {
+                    servicePrice = finalPrice.multiply(PriceConstants.GOOD_PERCENT_ONE).multiply(PriceConstants.GOOD_SAVE_ONE);
+                } else if (finalPrice.compareTo(new BigDecimal(1000000)) > 0 && finalPrice.compareTo(new BigDecimal(5000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE.add(
+                            finalPrice.subtract(new BigDecimal(1000000)).multiply(PriceConstants.GOOD_PERCENT_TWO)
+                    ).multiply(PriceConstants.GOOD_SAVE_TWO);
+                } else if (finalPrice.compareTo(new BigDecimal(5000000)) > 0 && finalPrice.compareTo(new BigDecimal(10000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(5000000)).multiply(PriceConstants.GOOD_PERCENT_THREE)
+                            ).multiply(PriceConstants.GOOD_SAVE_THREE);
+                } else if (finalPrice.compareTo(new BigDecimal(10000000)) > 0 && finalPrice.compareTo(new BigDecimal(50000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(PriceConstants.GOOD_PRICE_THREE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(10000000)).multiply(PriceConstants.GOOD_PERCENT_FOUR)
+                            ).multiply(PriceConstants.GOOD_SAVE_FOUR);
+                } else if (finalPrice.compareTo(new BigDecimal(50000000)) > 0 && finalPrice.compareTo(new BigDecimal(100000000)) <= 0) {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(PriceConstants.GOOD_PRICE_THREE)
+                            .add(PriceConstants.GOOD_PRICE_FOUR)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(50000000)).multiply(PriceConstants.GOOD_PERCENT_FIVE)
+                            ).multiply(PriceConstants.GOOD_SAVE_FOUR);
+                } else {
+                    servicePrice = PriceConstants.GOOD_PRICE_ONE
+                            .add(PriceConstants.GOOD_PRICE_TWO)
+                            .add(PriceConstants.GOOD_PRICE_THREE)
+                            .add(PriceConstants.GOOD_PRICE_FOUR)
+                            .add(PriceConstants.GOOD_PRICE_FIVE)
+                            .add(
+                                    finalPrice.subtract(new BigDecimal(100000000)).multiply(PriceConstants.GOOD_PERCENT_SIX)
+                            ).multiply(PriceConstants.GOOD_SAVE_FOUR);
+                }
+            }
+        }
+        return success(servicePrice);
+
+    }
+
     /**
      * 获取招标项目详细信息
      */

+ 58 - 8
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidWinningResultsController.java

@@ -1,25 +1,25 @@
 package com.hh.bidding.controller;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
 import java.io.IOException;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
 import com.hh.bidding.domain.*;
+import com.hh.bidding.domain.BidTender;
+import com.hh.bidding.domain.BidWinningResults;
 import com.hh.bidding.service.*;
+import com.ruoyi.common.core.constant.PriceConstants;
 import com.ruoyi.common.core.constant.SecurityConstants;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.system.api.RemoteApprovalRecordService;
+import com.ruoyi.system.api.RemotePlanService;
 import com.ruoyi.system.api.RemoteUserService;
-import com.ruoyi.system.api.domain.PpmApprovalRecord;
-import com.ruoyi.system.api.domain.SysDept;
-import com.ruoyi.system.api.domain.SysRole;
-import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.domain.*;
 import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -68,6 +68,9 @@ public class BidWinningResultsController extends BaseController {
     @Autowired
     private RemoteUserService remoteUserService;
 
+    @Autowired
+    private RemotePlanService remotePlanService;
+
     @Autowired
     private IBidTenderService bidTenderService;
 
@@ -139,12 +142,59 @@ public class BidWinningResultsController extends BaseController {
     }
 
     /**
-     * 新增中标公告
+     * 新增中标公告 + 变更中标公告
      */
     @RequiresPermissions("bidding:BidWinning:add")
     @Log(title = "中标公告", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody BidWinningResults bidWinningResults) {
+        Long gsState = bidWinningResults.getGsState();
+        if(gsState == 2){
+            Long sid = bidWinningResults.getSid();
+            String sName = bidWinningResults.getTenderName();
+            Long oid = bidWinningResults.getHid();
+            String oName = bidWinningResults.gethName();
+            Long cid = bidWinningResults.getSuppliersChange();
+            String cName = bidWinningResults.getSupplierNameChange();
+            BidChangeRecord bidChangeRecord = new BidChangeRecord();
+
+            bidChangeRecord.setSid(sid);
+            bidChangeRecord.setsName(sName);
+            bidChangeRecord.setOid(oid);
+            bidChangeRecord.setoName(oName);
+            bidChangeRecord.setCid(cid);
+            bidChangeRecord.setcName(cName);
+
+            Map<String,Long> map = new HashMap<>();
+            map.put("sid",sid);
+            map.put("hid",cid);
+            BidQuote bidQuote = bidQuoteService.selectQuoteBySupplier(map);
+
+            BigDecimal finalPrice = bidQuote.getQuotePrice();
+
+            BidWinner bidWinner = bidWinnerService.selectBidWinnerBySid(sid);
+            Long wid = bidWinner.getWid();
+
+            BidWinner bidWinnerNew = new BidWinner();
+            bidWinnerNew.setWid(wid);
+            bidWinnerNew.setHid(cid);
+            bidWinnerNew.setSid(sid);
+            bidWinnerNew.sethName(cName);
+            bidWinnerNew.setsName(sName);
+            bidWinnerNew.setStatus(0L);
+            bidWinnerNew.setContract(null);
+            bidWinnerNew.setFinalPrice(finalPrice);
+            bidWinnerNew.setWinFile(null);
+            bidWinnerNew.setExamine(0L);
+            bidWinnerNew.setExamineOption(null);
+            bidWinnerNew.setsCode(bidWinner.getsCode());
+            bidWinnerService.updateBidWinner(bidWinnerNew);
+
+            // 存储变更记录
+            int i = bidChangeRecordService.insertBidChangeRecord(bidChangeRecord);
+            return success("变更成功");
+
+        }
         return toAjax(bidWinningResultsService.insertBidWinningResults(bidWinningResults));
     }
 

+ 10 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidCommittee.java

@@ -61,6 +61,8 @@ public class BidCommittee extends BaseEntity
     @Excel(name = "招标项目Id")
     private Long sid;
 
+    private Integer isLeader;
+
     private com.ruoyi.system.api.domain.BsExpert bsExpert;
 
     private List<BsExpert> expertList;
@@ -202,4 +204,12 @@ public class BidCommittee extends BaseEntity
     public void setExpertList(List<BsExpert> expertList) {
         this.expertList = expertList;
     }
+
+    public Integer getIsLeader() {
+        return isLeader;
+    }
+
+    public void setIsLeader(Integer isLeader) {
+        this.isLeader = isLeader;
+    }
 }

+ 30 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidExpertExamine.java

@@ -46,6 +46,12 @@ public class BidExpertExamine extends BaseEntity
     @Excel(name = "用户ID")
     private Long userId;
 
+    private String isOk;
+
+    private Long hid;
+
+    private String hName;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -119,6 +125,30 @@ public class BidExpertExamine extends BaseEntity
         return userId;
     }
 
+    public String getIsOk() {
+        return isOk;
+    }
+
+    public void setIsOk(String isOk) {
+        this.isOk = isOk;
+    }
+
+    public Long getHid() {
+        return hid;
+    }
+
+    public void setHid(Long hid) {
+        this.hid = hid;
+    }
+
+    public String gethName() {
+        return hName;
+    }
+
+    public void sethName(String hName) {
+        this.hName = hName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 30 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidExpertRespond.java

@@ -46,6 +46,12 @@ public class BidExpertRespond extends BaseEntity
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private Long userId;
 
+    private String isOk;
+
+    private Long hid;
+
+    private String hName;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -119,6 +125,30 @@ public class BidExpertRespond extends BaseEntity
         return userId;
     }
 
+    public String getIsOk() {
+        return isOk;
+    }
+
+    public void setIsOk(String isOk) {
+        this.isOk = isOk;
+    }
+
+    public Long getHid() {
+        return hid;
+    }
+
+    public void setHid(Long hid) {
+        this.hid = hid;
+    }
+
+    public String gethName() {
+        return hName;
+    }
+
+    public void sethName(String hName) {
+        this.hName = hName;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 30 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidExpertTech.java

@@ -52,6 +52,12 @@ public class BidExpertTech extends BaseEntity
     @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
     private Double value;
 
+    private Long hid;
+
+    private String hName;
+
+    private String reason;
+
     public void setId(Long id)
     {
         this.id = id;
@@ -132,6 +138,30 @@ public class BidExpertTech extends BaseEntity
         this.value = value;
     }
 
+    public Long getHid() {
+        return hid;
+    }
+
+    public void setHid(Long hid) {
+        this.hid = hid;
+    }
+
+    public String gethName() {
+        return hName;
+    }
+
+    public void sethName(String hName) {
+        this.hName = hName;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 20 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidTender.java

@@ -244,6 +244,10 @@ public class BidTender extends BaseEntity {
 
     private Long projectId;
 
+    private Long cState;
+
+    private String changeFile;
+
     public void setBidNotices(List<BidNotice> bidNotices) {
         this.bidNotices = bidNotices;
     }
@@ -639,4 +643,20 @@ public class BidTender extends BaseEntity {
     public void setProjectId(Long projectId) {
         this.projectId = projectId;
     }
+
+    public Long getcState() {
+        return cState;
+    }
+
+    public void setcState(Long cState) {
+        this.cState = cState;
+    }
+
+    public String getChangeFile() {
+        return changeFile;
+    }
+
+    public void setChangeFile(String changeFile) {
+        this.changeFile = changeFile;
+    }
 }

+ 10 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/Mark.java

@@ -38,6 +38,8 @@ public class Mark {
 
     private List<BidExpertTech> bidExpertTeches;
 
+    private Long isLeader;
+
     public Long getSid() {
         return sid;
     }
@@ -141,4 +143,12 @@ public class Mark {
     public void setBidExpertTeches(List<BidExpertTech> bidExpertTeches) {
         this.bidExpertTeches = bidExpertTeches;
     }
+
+    public Long getIsLeader() {
+        return isLeader;
+    }
+
+    public void setIsLeader(Long isLeader) {
+        this.isLeader = isLeader;
+    }
 }

+ 83 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/QuoteScore.java

@@ -0,0 +1,83 @@
+package com.hh.bidding.domain;
+
+import java.math.BigDecimal;
+
+/**
+ * @author GMCS
+ * @version 1.0
+ * @title QuoteScore
+ * @description
+ * @create 2024/9/7 16:19
+ */
+public class QuoteScore {
+
+    private Long hid;
+
+    private Long sid;
+
+    private String hName;
+
+    private BigDecimal quotePrice;
+
+    private BigDecimal level;
+
+    private BigDecimal percent;
+
+    private Double score;
+
+    public Long getHid() {
+        return hid;
+    }
+
+    public void setHid(Long hid) {
+        this.hid = hid;
+    }
+
+    public Long getSid() {
+        return sid;
+    }
+
+    public void setSid(Long sid) {
+        this.sid = sid;
+    }
+
+    public String gethName() {
+        return hName;
+    }
+
+    public void sethName(String hName) {
+        this.hName = hName;
+    }
+
+    public BigDecimal getQuotePrice() {
+        return quotePrice;
+    }
+
+    public void setQuotePrice(BigDecimal quotePrice) {
+        this.quotePrice = quotePrice;
+    }
+
+    public BigDecimal getLevel() {
+        return level;
+    }
+
+    public void setLevel(BigDecimal level) {
+        this.level = level;
+    }
+
+    public BigDecimal getPercent() {
+        return percent;
+    }
+
+    public void setPercent(BigDecimal percent) {
+        this.percent = percent;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+}

+ 4 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/mapper/BidCommitteeMapper.java

@@ -65,4 +65,8 @@ public interface BidCommitteeMapper
     public List<BidCommittee> findCommitteeAndExpert(Long sid);
 
     public List<BidTender> getProjectByUserId(Long userId);
+
+    // 确定组长
+    public int updateLeader(Long pbId);
+
 }

+ 6 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/mapper/BidQuoteMapper.java

@@ -1,6 +1,8 @@
 package com.hh.bidding.mapper;
 
 import java.util.List;
+import java.util.Map;
+
 import com.hh.bidding.domain.BidQuote;
 import com.hh.bidding.domain.Earnest;
 
@@ -74,4 +76,8 @@ public interface BidQuoteMapper
      * @return
      */
     public List<Earnest> selectEarnList();
+
+    // 查询供应商报价
+    public BidQuote selectQuoteBySupplier(Map map);
+
 }

+ 4 - 1
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/mapper/BidTenderMapper.java

@@ -205,8 +205,11 @@ public interface BidTenderMapper
     public int updateTenderByState(BidTender bidTender);
 
     // 查询可中标变更的项目
-    public List<BidTender> selectTenderByChange(String join);
+    public List<BidTender> selectTenderByChange(Map map);
 
     // 删除项目同步更新采购计划状态
     public Integer updatePpmPlan(Long aid);
+
+    // 更新中标变更审核状态
+    public int updateTenderByCState(BidTender bidTender);
 }

+ 3 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/IBidCommitteeService.java

@@ -65,4 +65,7 @@ public interface IBidCommitteeService
     public List<BidCommittee> findCommitteeAndExpert(Long sid);
 
     public List<BidTender> getProjectByUserId(Long userId);
+
+    // 确定组长
+    public int updateLeader(Long pbId);
 }

+ 5 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/IBidQuoteService.java

@@ -1,6 +1,8 @@
 package com.hh.bidding.service;
 
 import java.util.List;
+import java.util.Map;
+
 import com.hh.bidding.domain.BidQuote;
 import com.hh.bidding.domain.Earnest;
 
@@ -74,4 +76,7 @@ public interface IBidQuoteService
      * @return
      */
     public List<Earnest> selectEarnList();
+
+    // 查询供应商报价
+    public BidQuote selectQuoteBySupplier(Map map);
 }

+ 4 - 1
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/IBidTenderService.java

@@ -203,8 +203,11 @@ public interface IBidTenderService
     public int updateTenderByState(BidTender bidTender);
 
     // 查询可中标变更的项目
-    public List<BidTender> selectTenderByChange(String join);
+    public List<BidTender> selectTenderByChange(Map map);
 
     // 删除项目同步更新采购计划状态
     public Integer updatePpmPlan(Long aid);
+
+    // 更新中标变更审核状态
+    public int updateTenderByCState(BidTender bidTender);
 }

+ 5 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/impl/BidCommitteeServiceImpl.java

@@ -107,4 +107,9 @@ public class BidCommitteeServiceImpl implements IBidCommitteeService
     public List<BidTender> getProjectByUserId(Long userId) {
         return bidCommitteeMapper.getProjectByUserId(userId);
     }
+
+    @Override
+    public int updateLeader(Long pbId) {
+        return bidCommitteeMapper.updateLeader(pbId);
+    }
 }

+ 6 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/impl/BidQuoteServiceImpl.java

@@ -1,6 +1,7 @@
 package com.hh.bidding.service.impl;
 
 import java.util.List;
+import java.util.Map;
 
 import com.hh.bidding.domain.Earnest;
 import com.ruoyi.common.core.utils.DateUtils;
@@ -105,4 +106,9 @@ public class BidQuoteServiceImpl implements IBidQuoteService
     public List<Earnest> selectEarnList() {
         return bidQuoteMapper.selectEarnList();
     }
+
+    @Override
+    public BidQuote selectQuoteBySupplier(Map map) {
+        return bidQuoteMapper.selectQuoteBySupplier(map);
+    }
 }

+ 7 - 2
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/service/impl/BidTenderServiceImpl.java

@@ -218,12 +218,17 @@ public class BidTenderServiceImpl implements IBidTenderService {
     }
 
     @Override
-    public List<BidTender> selectTenderByChange(String join) {
-        return bidTenderMapper.selectTenderByChange(join);
+    public List<BidTender> selectTenderByChange(Map map) {
+        return bidTenderMapper.selectTenderByChange(map);
     }
 
     @Override
     public Integer updatePpmPlan(Long aid) {
         return bidTenderMapper.updatePpmPlan(aid);
     }
+
+    @Override
+    public int updateTenderByCState(BidTender bidTender) {
+        return bidTenderMapper.updateTenderByCState(bidTender);
+    }
 }

+ 10 - 2
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidCommitteeMapper.xml

@@ -15,10 +15,11 @@
         <result property="pbTypes"    column="pb_types"    />
         <result property="jid"    column="jid"    />
         <result property="sid"    column="sid"    />
+        <result property="isLeader" column="is_leader" />
     </resultMap>
 
     <sql id="selectBidCommitteeVo">
-        select pb_id, xid, pb_name, pb_sex, pb_idcard, pb_phone, pb_genre, pb_types, jid,sid from bid_committee
+        select pb_id, xid, pb_name, pb_sex, pb_idcard, pb_phone, pb_genre, pb_types, jid,sid,is_leader from bid_committee
     </sql>
 
     <select id="selectBidCommitteeList" parameterType="com.hh.bidding.domain.BidCommittee" resultMap="BidCommitteeResult">
@@ -33,6 +34,7 @@
             <if test="pbTypes != null  and pbTypes != ''"> and pb_types = #{pbTypes}</if>
             <if test="jid != null "> and jid = #{jid}</if>
             <if test="sid != null "> and sid = #{sid}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
         </where>
     </select>
 
@@ -108,12 +110,18 @@
     </delete>
 
     <select id="findCommitteeAndExpert" parameterType="Long" resultMap="twoComAndExp">
-        select c.pb_id,c.xid,c.sid,c.status,e.* from bid_committee c
+        select c.pb_id,c.xid,c.sid,c.status,c.is_leader,e.* from bid_committee c
                                                 inner join bs_expert e on e.jid = c.jid where c.sid=#{sid}
     </select>
     <resultMap id="twoComAndExp" type="com.hh.bidding.domain.BidCommittee">
         <id column="pb_id" property="pbId"/>
         <id column="status" property="status"/>
+        <id column="is_leader" property="isLeader" />
         <association property="bsExpert"/>
     </resultMap>
+
+    <update id="updateLeader" parameterType="com.hh.bidding.domain.BidCommittee">
+        update bid_committee set is_leader = 1
+        where pb_id = #{pbId}
+    </update>
 </mapper>

+ 14 - 1
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidExpertExamineMapper.xml

@@ -15,10 +15,13 @@
         <result property="userId"    column="user_id"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
+        <result property="hid"    column="hid"    />
+        <result property="hName"    column="h_name"    />
+        <result property="isOk"    column="is_ok"    />
     </resultMap>
 
     <sql id="selectBidExpertExamineVo">
-        select id, sid, jid, s_name, j_name, score, eid, user_id, create_time, update_time from bid_expert_examine
+        select * from bid_expert_examine
     </sql>
 
     <select id="selectBidExpertExamineList" parameterType="com.hh.bidding.domain.BidExpertExamine" resultMap="BidExpertExamineResult">
@@ -31,6 +34,7 @@
             <if test="score != null "> and score = #{score}</if>
             <if test="eid != null "> and eid = #{eid}</if>
             <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="hid != null "> and hid = #{hid}</if>
         </where>
     </select>
 
@@ -51,6 +55,9 @@
             <if test="userId != null">user_id,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateTime != null">update_time,</if>
+            <if test="hid != null">hid,</if>
+            <if test="hName != null">h_name,</if>
+            <if test="isOk != null">is_ok,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="sid != null">#{sid},</if>
@@ -62,6 +69,9 @@
             <if test="userId != null">#{userId},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateTime != null">#{updateTime},</if>
+            <if test="hid != null">#{hid},</if>
+            <if test="hName != null">#{hName},</if>
+            <if test="isOk != null">#{isOk},</if>
         </trim>
     </insert>
 
@@ -77,6 +87,9 @@
             <if test="userId != null">user_id = #{userId},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="hid != null">hid = #{hid},</if>
+            <if test="hName != null">h_name = #{hName},</if>
+            <if test="isOk != null">is_ok = #{isOk},</if>
         </trim>
         where id = #{id}
     </update>

+ 16 - 1
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidExpertRespondMapper.xml

@@ -15,10 +15,13 @@
         <result property="userId"    column="user_id"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
+        <result property="hid"    column="hid"    />
+        <result property="hName"    column="h_name"    />
+        <result property="isOk"    column="is_ok"    />
     </resultMap>
 
     <sql id="selectBidExpertRespondVo">
-        select id, sid, jid, s_name, j_name, score, rid, user_id, create_time, update_time from bid_expert_respond
+        select id, sid, jid, s_name, j_name, score, rid, user_id, create_time, update_time, hid, h_name, is_ok from bid_expert_respond
     </sql>
 
     <select id="selectBidExpertRespondList" parameterType="com.hh.bidding.domain.BidExpertRespond" resultMap="BidExpertRespondResult">
@@ -31,6 +34,9 @@
             <if test="score != null "> and score = #{score}</if>
             <if test="rid != null "> and rid = #{rid}</if>
             <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="hid != null "> and hid = #{hid}</if>
+            <if test="hName != null  and hName != ''"> and h_name like concat('%', #{hName}, '%')</if>
+            <if test="isOk != null  and isOk != ''"> and is_ok = #{isOk}</if>
         </where>
     </select>
 
@@ -51,6 +57,9 @@
             <if test="userId != null">user_id,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateTime != null">update_time,</if>
+            <if test="hid != null">hid,</if>
+            <if test="hName != null">h_name,</if>
+            <if test="isOk != null">is_ok,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="sid != null">#{sid},</if>
@@ -62,6 +71,9 @@
             <if test="userId != null">#{userId},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateTime != null">#{updateTime},</if>
+            <if test="hid != null">#{hid},</if>
+            <if test="hName != null">#{hName},</if>
+            <if test="isOk != null">#{isOk},</if>
         </trim>
     </insert>
 
@@ -77,6 +89,9 @@
             <if test="userId != null">user_id = #{userId},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="hid != null">hid = #{hid},</if>
+            <if test="hName != null">h_name = #{hName},</if>
+            <if test="isOk != null">is_ok = #{isOk},</if>
         </trim>
         where id = #{id}
     </update>

+ 16 - 1
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidExpertTechMapper.xml

@@ -16,10 +16,13 @@
         <result property="value"    column="value"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
+        <result property="hid"    column="hid"    />
+        <result property="hName"    column="h_name"    />
+        <result property="reason"    column="reason"    />
     </resultMap>
 
     <sql id="selectBidExpertTechVo">
-        select id, sid, jid, user_id, s_name, j_name, tid, score, value, create_time, update_time from bid_expert_tech
+        select id, sid, jid, user_id, s_name, j_name, tid, score, value, create_time, update_time, hid, h_name, reason from bid_expert_tech
     </sql>
 
     <select id="selectBidExpertTechList" parameterType="com.hh.bidding.domain.BidExpertTech" resultMap="BidExpertTechResult">
@@ -33,6 +36,9 @@
             <if test="tid != null "> and tid = #{tid}</if>
             <if test="score != null "> and score = #{score}</if>
             <if test="value != null "> and value = #{value}</if>
+            <if test="hid != null "> and hid = #{hid}</if>
+            <if test="hName != null  and hName != ''"> and h_name like concat('%', #{hName}, '%')</if>
+            <if test="reason != null  and reason != ''"> and reason = #{reason}</if>
         </where>
     </select>
 
@@ -54,6 +60,9 @@
             <if test="value != null">value,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateTime != null">update_time,</if>
+            <if test="hid != null">hid,</if>
+            <if test="hName != null">h_name,</if>
+            <if test="reason != null">reason,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="sid != null">#{sid},</if>
@@ -66,6 +75,9 @@
             <if test="value != null">#{value},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateTime != null">#{updateTime},</if>
+            <if test="hid != null">#{hid},</if>
+            <if test="hName != null">#{hName},</if>
+            <if test="reason != null">#{reason},</if>
         </trim>
     </insert>
 
@@ -82,6 +94,9 @@
             <if test="value != null">value = #{value},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="hid != null">hid = #{hid},</if>
+            <if test="hName != null">h_name = #{hName},</if>
+            <if test="reason != null">reason = #{reason},</if>
         </trim>
         where id = #{id}
     </update>

+ 4 - 0
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidQuoteMapper.xml

@@ -136,4 +136,8 @@
         where q.status = 2
     </select>
 
+    <select id = "selectQuoteBySupplier" parameterType="map">
+        select * from bid_quote where sid = #{sid} and hid = #{hid}
+    </select>
+
 </mapper>

+ 24 - 3
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidTenderMapper.xml

@@ -516,7 +516,12 @@
     <select id="selectTenderByState" parameterType="map">
         select t.*,p.project_id from bid_tender t
         inner join ppm_procurement_plan p on t.xy_id = p.aid
-        where t.s_state = #{sState} and t.s_project_state = 7 and t.owner_dept in ${join}
+        <where>
+            <if test="sName != null  and sName != ''">and t.s_name like concat('%', #{sName}, '%')</if>
+            <if test="sCode != null  and sCode != ''">and t.s_code like concat('%', #{sCode}, '%')</if>
+            and t.s_state = #{sState} and t.s_project_state = 7 and t.owner_dept in ${join}
+        </where>
+
     </select>
 
     <update id="updateTenderByState" parameterType="com.hh.bidding.domain.BidTender">
@@ -524,18 +529,34 @@
         <trim prefix="SET" suffixOverrides=",">
             <if test="sProjectState != null">s_project_state = #{sProjectState},</if>
             <if test="sState != null">s_state = #{sState},</if>
+            <if test="stopFile != null">stop_file = #{stopFile}</if>
         </trim>
         where sid = #{sid}
     </update>
 
-    <select id="selectTenderByChange" parameterType="String">
+    <select id="selectTenderByChange" parameterType="map">
         select t.*,p.project_id from bid_tender t
                  left join bid_winner w on t.sid = w.sid
                  left join bid_winnotice n on w.wid = n.wid
                  inner join ppm_procurement_plan p on t.xy_id = p.aid
-                 where t.s_project_state = 7 and t.owner_dept in ${join} and (n.examine = 1 or n.examine is null)
+        <where>
+            <if test="sName != null  and sName != ''">and t.s_name like concat('%', #{sName}, '%')</if>
+            <if test="sCode != null  and sCode != ''">and t.s_code like concat('%', #{sCode}, '%')</if>
+            <if test="cState != null">c_state = #{cState},</if>
+            and t.s_project_state = 7 and t.owner_dept in ${join} and (n.examine = 1 or n.examine is null)
+            and t.s_state != 1 and t.s_state != 2
+        </where>
     </select>
 
+    <update id="updateTenderByCState" parameterType="com.hh.bidding.domain.BidTender">
+        update bid_tender
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="cState != null">c_state = #{cState},</if>
+            <if test="changeFile != null">change_file = #{changeFile}</if>
+        </trim>
+        where sid = #{sid}
+    </update>
+
     <update id="updatePpmPlan" parameterType="Long">
         update ppm_procurement_plan set a_astate = 0 where aid = #{aid}
     </update>

+ 78 - 36
ruoyi-modules/hh-mast/src/main/java/com/ruoyi/mast/bank/controller/BankTenderpubController.java

@@ -1,18 +1,19 @@
 package com.ruoyi.mast.bank.controller;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Random;
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.utils.uuid.UUID;
+import com.ruoyi.common.security.annotation.InnerAuth;
 import com.ruoyi.mast.bank.utils.JsonUtils;
 import com.ruoyi.system.api.RemotePlanService;
 import kong.unirest.core.HttpResponse;
 import kong.unirest.core.Unirest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
@@ -72,6 +73,13 @@ public class BankTenderpubController extends BaseController {
         util.exportExcel(response, list, "标段发布数据");
     }
 
+
+    @InnerAuth
+    @GetMapping(value = "/getInfoInnerAuth/{tenderpubid}")
+    public AjaxResult getInfoInnerAuth(@PathVariable("id") String tenderpubid){
+        return getInfo(tenderpubid);
+    }
+
     /**
      * 获取标段发布详细信息
      */
@@ -81,58 +89,71 @@ public class BankTenderpubController extends BaseController {
         return success(bankTenderpubService.selectBankTenderpubByTenderpubid(tenderpubid));
     }
 
+    /**
+     * 内部调用
+     * @param bankTenderpub
+     * @return
+     */
+    @InnerAuth
+    @Log(title = "标段发布InnerAuth", businessType = BusinessType.INSERT)
+    @PostMapping("/addInnerAuth")
+    public AjaxResult addInnerAuth(@RequestBody BankTenderpub bankTenderpub) {
+        return add(bankTenderpub);
+    }
+
     /**
      * 新增标段发布
+     * web 接口
      */
-    @RequiresPermissions("bank:tenderpub:add")
+    @Transactional
+//    @RequiresPermissions("bank:tenderpub:add")
     @Log(title = "标段发布", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody BankTenderpub bankTenderpub) {
-
-        BankTenderpub bt = new BankTenderpub();
         // 流水号
         String TRNUID = "BDP" + System.currentTimeMillis() + (new Random().nextInt(1000) + 1);
+        bankTenderpub.setTenderpubid(UUID.randomUUID().toString(true));
+        bankTenderpub.setTrnuid(TRNUID);
+        bankTenderpub.setAcctno(env.getProperty("BANK.ACCTNO"));
+        bankTenderpub.setSgtacctgentp("0");
+        bankTenderpub.setSgttp("0");
+        bankTenderpub.setIntacrlflg("0");          //计息标志0-不计息 1-计息(默认计息 1)
+        bankTenderpub.setSecrettp("0");
+        bankTenderpub.setTdracctnovrfyflg("0");
+        bankTenderpub.setAlwafddlntdrflg("0");
+        bankTenderpub.setBnkrfndcfrmflg("0");
 
-        bt.setTenderpubid(UUID.randomUUID().toString(true));
-        bt.setTrnuid(TRNUID);
-        bt.setPpid(Long.valueOf(115));
-        bt.setAcctno("117010100102244796");
-        bt.setPrjno("321432178911");
-        bt.setSgtno("BD2024082811531");
-        bt.setRtnSgtnm("阳光采购技术服务");
-        bt.setSgtacctgentp("0");
-        bt.setSgttp("0");
-        bt.setIntacrlflg("0");          //计息标志0-不计息 1-计息(默认计息 1)
-        bt.setSecrettp("0");
-        bt.setTdracctnovrfyflg("0");
-        bt.setAlwafddlntdrflg("0");
-        bt.setBnkrfndcfrmflg("0");
-        bt.setMrgnamt(BigDecimal.valueOf(10000));
-        bt.setStrtsgtdt("20240905");
-        bt.setMrgnduestopdt("20240906");
-        bt.setMrgnduestoptm("230001");
-        bt.setOpntdrdt("20240907");
-        bt.setOpntdrtm("090000");
-
-        String rtnxml = postBank(bt);
+        String rtnxml = postBank(bankTenderpub);
 
         String rtn = JsonUtils.getStatus(rtnxml);
 
         if (rtn.contains("成功")) {
-            bankTenderpubService.insertBankTenderpub(bt);
-            update(bt, rtnxml);
+            bankTenderpubService.insertBankTenderpub(bankTenderpub);
+            update(bankTenderpub, rtnxml);
             return AjaxResult.success(rtn);
         }
         else return AjaxResult.error(rtn);
     }
 
+    /**
+     * 内部调用
+     * @param bankTenderpub
+     * @return
+     */
+    @InnerAuth
+    @Log(title = "标段修改InnerAuth", businessType = BusinessType.INSERT)
+    @PutMapping("/editInnerAuth")
+    public AjaxResult editInnerAuth(@RequestBody BankTenderpub bankTenderpub) {
+        return edit(bankTenderpub);
+    }
+
     /**
      * 修改标段发布
      * 同步数据
      */
-    @RequiresPermissions("bank:tenderpub:edit")
-    @Log(title = "标段发布", businessType = BusinessType.UPDATE)
-    @PutMapping
+//    @RequiresPermissions("bank:tenderpub:edit")
+    @Log(title = "标段修改", businessType = BusinessType.UPDATE)
+    @PutMapping("/edit")
     public AjaxResult edit(@RequestBody BankTenderpub bankTenderpub) {
         List<BankTenderpub> list = bankTenderpubService.selectBankTenderpubList(bankTenderpub);
         if (list.isEmpty()) return AjaxResult.error("");
@@ -140,7 +161,15 @@ public class BankTenderpubController extends BaseController {
 
         String rtnxml = postBank(bt);
 
-        return toAjax(update(bt, rtnxml));
+        String rtn = JsonUtils.getStatus(rtnxml);
+
+        if (rtn.contains("成功")) {
+            return toAjax(update(bt, rtnxml));
+        }else if(rtn.contains("流水号TRNUID值已被使用")){
+            return error(rtn);
+        }else{
+            return error(rtn);
+        }
     }
 
     private int update(BankTenderpub bankTenderpub, String rtnxml) {
@@ -153,9 +182,9 @@ public class BankTenderpubController extends BaseController {
         bt.setRtnCode(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/STATUS/CODE"));
         bt.setRtnSeverity(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/STATUS/SEVERITY"));
         bt.setRtnMessage(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/STATUS/MESSAGE"));
-        bt.setAcctno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/ACCTNO"));
-        bt.setPrjno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/PRJNO"));
-        bt.setSgtno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/SGTNO"));
+        bt.setRtnAcctno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/ACCTNO"));
+        bt.setRtnPrjno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/PRJNO"));
+        bt.setRtnSgtno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/SGTNO"));
         bt.setRtnSgtnm(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/SGTNM"));
         bt.setRtnSgtid(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/SGTID"));
         bt.setRtnSgtvrtlno(JsonUtils.findXML(rtnxml, "FOX/SECURITIES_MSGSRSV1/OPENTENDERTRNRS/RSBODY/SGTVRTLNO"));
@@ -188,7 +217,7 @@ public class BankTenderpubController extends BaseController {
                 "                <CCYCD>01</CCYCD>\n" +
                 "                <PRJNO>" + bankTenderpub.getPrjno() + "</PRJNO>\n" +
                 "                <SGTNO>" + bankTenderpub.getSgtno() + "</SGTNO>\n" +
-                "                <SGTNM>" + bankTenderpub.getRtnSgtnm() + "</SGTNM>\n" +
+                "                <SGTNM>" + bankTenderpub.getSgtnm() + "</SGTNM>\n" +
                 "                <SGTACCTGENTP>" + bankTenderpub.getSgtacctgentp() + "</SGTACCTGENTP>\n" +
                 "                <SGTTP>" + bankTenderpub.getSgttp() + "</SGTTP>\n" +
                 "                <INTACRLFLG>" + bankTenderpub.getIntacrlflg() + "</INTACRLFLG>\n" +
@@ -219,4 +248,17 @@ public class BankTenderpubController extends BaseController {
     public AjaxResult remove(@PathVariable String[] tenderpubids) {
         return toAjax(bankTenderpubService.deleteBankTenderpubByTenderpubids(tenderpubids));
     }
+
+    /**
+     * 内部调用
+     * @param ids
+     * @return
+     */
+    @InnerAuth
+    @Log(title = "标段发布", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult removeInnerAuth(@PathVariable String[] ids){
+        return remove(ids);
+    }
+
 }

+ 20 - 0
ruoyi-modules/hh-procure/src/main/java/com/hh/procure/domain/PpmProcurementPlan.java

@@ -151,6 +151,10 @@ public class PpmProcurementPlan extends BaseEntity
 
     private String projIds;
 
+    private String stopFile;
+
+    private Integer sState;
+
     public Long getOwnerDept() {
         return ownerDept;
     }
@@ -464,6 +468,22 @@ public class PpmProcurementPlan extends BaseEntity
         this.changeAnnex = changeAnnex;
     }
 
+    public String getStopFile() {
+        return stopFile;
+    }
+
+    public void setStopFile(String stopFile) {
+        this.stopFile = stopFile;
+    }
+
+    public Integer getsState() {
+        return sState;
+    }
+
+    public void setsState(Integer sState) {
+        this.sState = sState;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 3 - 2
ruoyi-modules/hh-procure/src/main/resources/mapper/PpmProcurementPlanMapper.xml

@@ -101,9 +101,10 @@
         </where>
     </select>
 
-    <select id="selectPpmProcurementPlanByAid" parameterType="Integer" resultMap="PpmProcurementPlanResult">
-        select p.aid,p.a_code,p.a_name,p.create_by,p.a_create_dept,p.create_time,p.update_by,p.update_time,p.fj_annex,p.a_opinion,p.a_project_count,p.a_btype,p.a_astate,p.fj_file_name,p.project_id,m.proj_name as project_name,p.fund_source,p.buying_mode,p.quote_mode,p.material_id,p.material_name,p.allow_tender_amount,p.earnest_money,p.enroll_starttime,p.enroll_endtime,p.interval_time,p.is_start_enroll,p.bank_account,p.o_state,p.owner_dept,p.stop_annex,p.change_annex
+    <select id="selectPpmProcurementPlanByAid" parameterType="Integer" resultType="com.hh.procure.domain.PpmProcurementPlan">
+        select p.aid,p.a_code,p.a_name,p.create_by,p.a_create_dept,p.create_time,p.update_by,p.update_time,p.fj_annex,p.a_opinion,p.a_project_count,p.a_btype,p.a_astate,p.fj_file_name,p.project_id,m.proj_name as project_name,p.fund_source,p.buying_mode,p.quote_mode,p.material_id,p.material_name,p.allow_tender_amount,p.earnest_money,p.enroll_starttime,p.enroll_endtime,p.interval_time,p.is_start_enroll,p.bank_account,p.o_state,p.owner_dept,p.stop_annex,p.change_annex,t.stop_file,t.s_state
         from ppm_procurement_plan p inner join mast_project m on p.project_id = m.proj_id
+                                    left join bid_tender t on p.aid = t.xy_id
         where aid = #{aid}
     </select>
 

+ 1 - 1
ruoyi-ui/src/api/bank/tenderpub.js

@@ -29,7 +29,7 @@ export function addTenderpub(data) {
 // 修改标段发布
 export function updateTenderpub(data) {
   return request({
-    url: '/bank/tenderpub',
+    url: '/bank/tenderpub/edit',
     method: 'put',
     data: data
   })

+ 66 - 0
ruoyi-ui/src/api/system/plan.js

@@ -172,6 +172,7 @@ export function selectTenderByStateCount(data) {
   });
 }
 
+// 获取可变更/终止采购需求
 export function getStopPlan(data) {
   return request({
     url: "/ppm/plan/getStopPlan",
@@ -180,6 +181,7 @@ export function getStopPlan(data) {
   });
 }
 
+// 提交变更/终止需求
 export function editStopPlan(data) {
   return request({
     url: "/ppm/plan/editStopPlan",
@@ -187,3 +189,67 @@ export function editStopPlan(data) {
     data: data,
   });
 }
+
+// 查询供应商服务费
+export function getServicePrice(data) {
+  return request({
+    url: "/bidding/tender/getServicePrice",
+    method: "GET",
+    params: data,
+  });
+}
+
+// 获取可中标变更项目
+export function selectTenderByChange(data) {
+  return request({
+    url: "/bidding/tender/selectTenderByChange",
+    method: "GET",
+    params: data,
+  });
+}
+
+// 提交中标变更需求
+export function postAlterBid(data) {
+  return request({
+    url: "/bidding/tender/updateTenderByCState",
+    method: "put",
+    data: data,
+  });
+}
+
+// 获取中标变更记录
+export function selectChangelist(query) {
+  console.log(query);
+  return request({
+    url: "/bidding/changeRecord/selectChangelist",
+    method: "get",
+    params: query
+  });
+}
+
+// 查询可中标终止项目
+export function getSelectTenderByState(data) {
+  return request({
+    url: "/bidding/tender/selectTenderByState",
+    method: "GET",
+    params: data,
+  });
+}
+
+// 中标终止审核
+export function updateTenderByState(data) {
+  return request({
+    url: "/bidding/tender/updateTenderByState",
+    method: "put",
+    data: data,
+  });
+}
+
+// 查询中标终止审批记录
+export function getRecordList(data) {
+  return request({
+    url: "/bidding/record/list",
+    method: "GET",
+    params: data,
+  });
+}

+ 1 - 1
ruoyi-ui/src/components/tender/bidEval.vue

@@ -18,7 +18,7 @@
      <el-table v-loading="loading" :data="candidateList" :default-sort = "{prop: 'zRanking', order: 'ascending'}">
        <el-table-column label="序号" type="index" align="center"/>
        <el-table-column label="供应商名称" align="center" prop="hName"/>
-       <el-table-column label="最终报价(万元)" align="center" prop="zFinal" />
+       <el-table-column label="最终报价" align="center" prop="zFinal" />
        <el-table-column label="最终得分" align="center" prop="zFraction" sortable/>
        <el-table-column label="是否推荐" align="center" prop="zRecommend" >
          <template slot-scope="scope">

+ 1 - 1
ruoyi-ui/src/components/tender/candidateNotice.vue

@@ -3,7 +3,7 @@
     <el-table v-loading="loading" :data="candidateList" :default-sort = "{prop: 'zRanking', order: 'ascending'}">
       <el-table-column label="序号" type="index" align="center" />
       <el-table-column label="供应商名称" align="center" prop="hName"/>
-      <el-table-column label="最终报价(万元)" align="center" prop="zFinal" />
+      <el-table-column label="最终报价" align="center" prop="zFinal" />
       <el-table-column label="最终得分" align="center" prop="zFraction" sortable/>
       <el-table-column label="是否推荐" align="center" prop="zRecommend" >
         <template slot-scope="scope">

+ 1 - 1
ruoyi-ui/src/components/tender/determineWin.vue

@@ -16,7 +16,7 @@
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="序号" type="index" align="center" />
       <el-table-column label="供应商名称" align="center" prop="hName"/>
-      <el-table-column label="最终报价(万元)" align="center" prop="zFinal" />
+      <el-table-column label="最终报价" align="center" prop="zFinal" />
       <el-table-column label="最终得分" align="center" prop="zFraction" sortable/>
       <el-table-column label="是否推荐" align="center" prop="zRecommend" >
         <template slot-scope="scope">

+ 1 - 1
ruoyi-ui/src/components/tender/winningBid.vue

@@ -6,7 +6,7 @@
     <el-table v-loading="loading" :data="candidateList">
       <el-table-column label="序号" type="index" align="center" />
       <el-table-column label="供应商名称" align="center" prop="hName"/>
-      <el-table-column label="最终报价(万元)" align="center" prop="zFinal" />
+      <el-table-column label="最终报价" align="center" prop="zFinal" />
       <el-table-column label="最终得分" align="center" prop="zFraction" />
       <el-table-column label="是否推荐" align="center" prop="zRecommend" >
         <template slot-scope="scope">

+ 1 - 1
ruoyi-ui/src/components/tender/winningBidNotice.vue

@@ -17,7 +17,7 @@
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="序号" type="index" align="center" />
         <el-table-column label="供应商名称" align="center" prop="hName"/>
-        <el-table-column label="最终报价(万元)" align="center" prop="zFinal" />
+        <el-table-column label="最终报价" align="center" prop="zFinal" />
         <el-table-column label="最终得分" align="center" prop="zFraction" />
         <el-table-column label="是否推荐" align="center" prop="zRecommend" >
           <template slot-scope="scope">

+ 28 - 28
ruoyi-ui/src/views/bank/tenderpub/index.vue

@@ -129,44 +129,44 @@
 
     <el-table v-loading="loading" :data="tenderpubList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="标段发布id" align="center" prop="tenderpubid" />
-      <el-table-column label="采购计划id" align="center" prop="ppid" />
-      <el-table-column label="客户端交易的唯一流水号建议值为YYYYMMDD+序号" align="center" prop="trnuid" />
+      <el-table-column label="标段发布id" align="center" prop="tenderpubid" v-if="false"/>
+      <el-table-column label="招标项目" align="center" prop="ppid" />
+      <el-table-column label="银行流水" align="center" prop="trnuid" />
       <el-table-column label="账号" align="center" prop="acctno" />
-      <el-table-column label="币种01-人民币" align="center" prop="ccycd" />
+      <el-table-column label="币种01-人民币" align="center" prop="ccycd" v-if="false"/>
       <el-table-column label="项目编号" align="center" prop="prjno" />
       <el-table-column label="标段编号" align="center" prop="sgtno" />
-      <el-table-column label="标段名称" align="center" prop="sgtnm" />
-      <el-table-column label="标段账户生成类型0-自动生成 1-自定义账号" align="center" prop="sgtacctgentp" />
-      <el-table-column label="标段账号:标段账户生成类型为1时必输,为0时不能传入" align="center" prop="sgtacctno" />
-      <el-table-column label="标段类型0-非会员模式 1-会员模式 2-公共标段模式" align="center" prop="sgttp" />
-      <el-table-column label="计息标志0-不计息 1-计息" align="center" prop="intacrlflg" />
-      <el-table-column label="保密类型0-不保密 1-保密" align="center" prop="secrettp" />
-      <el-table-column label="投标账号白名单校验标志0-不校验 1-校验 " align="center" prop="tdracctnovrfyflg" />
-      <el-table-column label="允许截止后投标标志0-不允许 1-允许 " align="center" prop="alwafddlntdrflg" />
-      <el-table-column label="银行退款确认标志0-不确认 1-确认 " align="center" prop="bnkrfndcfrmflg" />
-      <el-table-column label="保证金金额,double" align="center" prop="mrgnamt" />
-      <el-table-column label="发标日期 yyyyMMdd" align="center" prop="strtsgtdt" />
-      <el-table-column label="到期日期 yyyyMMdd" align="center" prop="expdt" />
-      <el-table-column label="保证金缴纳截止日期yyyyMMdd" align="center" prop="mrgnduestopdt" />
-      <el-table-column label="保证金缴纳截止时间HHmmss" align="center" prop="mrgnduestoptm" />
-      <el-table-column label="开标日期,yyyyMMdd" align="center" prop="opntdrdt" />
-      <el-table-column label="开标时间,HHmmss" align="center" prop="opntdrtm" />
-      <el-table-column label="客户端交易的唯一标志" align="center" prop="rtnTrnuid" />
-      <el-table-column label="交易处理状态" align="center" prop="rtnStatus" />
-      <el-table-column label="处理结果码" align="center" prop="rtnCode" />
-      <el-table-column label="处理结果等级(info/warn/error)" align="center" prop="rtnSeverity" />
+      <el-table-column label="标段名称" align="center" prop="sgtnm" width="150"/>
+      <el-table-column label="标段账户生成类型0-自动生成 1-自定义账号" align="center" prop="sgtacctgentp"  v-if="false"/>
+      <el-table-column label="标段账号:标段账户生成类型为1时必输,为0时不能传入" align="center" prop="sgtacctno"  v-if="false"/>
+      <el-table-column label="标段类型0-非会员模式 1-会员模式 2-公共标段模式" align="center" prop="sgttp"  v-if="false"/>
+      <el-table-column label="计息标志0-不计息 1-计息" align="center" prop="intacrlflg"  v-if="false"/>
+      <el-table-column label="保密类型0-不保密 1-保密" align="center" prop="secrettp"  v-if="false"/>
+      <el-table-column label="投标账号白名单校验标志0-不校验 1-校验 " align="center" prop="tdracctnovrfyflg"  v-if="false"/>
+      <el-table-column label="允许截止后投标标志0-不允许 1-允许 " align="center" prop="alwafddlntdrflg"  v-if="false"/>
+      <el-table-column label="银行退款确认标志0-不确认 1-确认 " align="center" prop="bnkrfndcfrmflg"  v-if="false"/>
+      <el-table-column label="保证金金额" align="center" prop="mrgnamt"  width="100"/>
+      <el-table-column label="发标日期" align="center" prop="strtsgtdt"  width="100"/>
+      <el-table-column label="到期日期 yyyyMMdd" align="center" prop="expdt"  v-if="false"/>
+      <el-table-column label="保证金缴纳截止日期" align="center" prop="mrgnduestopdt"  width="100"/>
+      <el-table-column label="保证金缴纳截止时间" align="center" prop="mrgnduestoptm" width="100"/>
+      <el-table-column label="开标日期" align="center" prop="opntdrdt" width="100"/>
+      <el-table-column label="开标时间" align="center" prop="opntdrtm" width="100"/>
+      <el-table-column label="客户端交易的唯一标志" align="center" prop="rtnTrnuid" width="150"/>
+      <el-table-column label="交易处理状态" align="center" prop="rtnStatus"  v-if="false"/>
+      <el-table-column label="处理结果码" align="center" prop="rtnCode"  v-if="false"/>
+		<el-table-column label="处理结果等级" align="center" prop="rtnSeverity"  v-if="false"/>
       <el-table-column label="处理信息描述" align="center" prop="rtnMessage" />
       <el-table-column label="账号" align="center" prop="rtnAcctno" />
       <el-table-column label="项目编号" align="center" prop="rtnPrjno" />
       <el-table-column label="标段编号" align="center" prop="rtnSgtno" />
       <el-table-column label="标段名称" align="center" prop="rtnSgtnm" />
-      <el-table-column label="标段id" align="center" prop="rtnSgtid" />
+      <el-table-column label="标段ID" align="center" prop="rtnSgtid" width="150"/>
       <el-table-column label="6位子账户序号" align="center" prop="rtnSgtvrtlno" />
-      <el-table-column label="指令处理状态报文标识" align="center" prop="rtnXferprcsts" />
+		<el-table-column label="指令处理状态报文标识" align="center" prop="rtnXferprcsts" v-if="false"/>
       <el-table-column label="指令状态编码" align="center" prop="rtnXferprccode" />
-      <el-table-column label="指令处理时间yyyymmdd hhmmss" align="center" prop="rtnDtxferprc" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="指令处理时间" align="center" prop="rtnDtxferprc" width="100"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100">
         <template slot-scope="scope">
           <el-button
             size="mini"

+ 12 - 3
ruoyi-ui/src/views/bidding/BidWinning/components/CompPurchase.vue

@@ -105,7 +105,8 @@
     </el-dialog>
     <el-dialog v-if="gsApproveState === 1" title="招标项目选择" :visible.sync="dialogSelectedProject.visible" width="42%"
       append-to-body>
-      <CompSearchProject v-if="dialogSelectedProject.visible" @selectedProject="handleSelectedProject" />
+      <CompSearchProject v-if="dialogSelectedProject.visible" :gonggaoType="form.gsState" 
+        @selectedProject="handleSelectedProject" />
     </el-dialog>
     <el-dialog v-if="gsApproveState === 1" title="选择供应商" :visible.sync="dialogSelectedSuppliers.visible" width="42%"
       append-to-body>
@@ -323,6 +324,7 @@ export default {
         gsAnnex: null
       },
       rules: {
+        resultTitle: [{ required: true, message: "公告标题不能为空", trigger: "blur" }],
         sid: [
           { required: true, message: "招标项目不能为空", trigger: "blur" }
         ],
@@ -487,8 +489,15 @@ export default {
       this.gsAnnex.filesLength = fileList.length;
     },
     /** 搜索icon 显示搜索窗口 */
-    handleSearchProject () {
-      this.dialogSelectedProject.visible = true;
+    handleSearchProject() {
+      if (this.form.gsState) {
+        this.dialogSelectedProject.visible = true;
+      } else {
+        this.$message({
+          message: '请先选择公告类型',
+          type: 'warning'
+        });
+      }
     },
     /** 选中项目事件 */
     handleSelectedProject (row) {

+ 24 - 6
ruoyi-ui/src/views/bidding/BidWinning/components/CompSearchProject.vue

@@ -41,7 +41,8 @@
 </template>
 
 <script>
-import {listOrigin} from '@/api/system/tender/tender'
+import { listOrigin } from '@/api/system/tender/tender'
+import { getSelectTenderByState } from "@/api/system/plan";
 
 export default {
 	model: {
@@ -50,6 +51,10 @@ export default {
 	},
 	props: {
 		search: String,
+
+		gonggaoType: {
+			type: String
+		}
 	},
 	data() {
 		return {
@@ -82,11 +87,24 @@ export default {
 	methods: {
 		getList() {
 			this.loading = true;
-			listOrigin(this.queryParams).then(response => {
-				this.data = response.rows;
-				this.total = response.total;
-				this.loading = false;
-			});
+			
+			if (this.gonggaoType == 3) {
+			    delete this.queryParams.sProjectState
+				getSelectTenderByState({
+					...this.queryParams,
+					sState: 2
+				}).then(res => {
+					this.data = res.rows
+					this.total = res.total
+					this.loading = false;
+				});
+			} else {
+				listOrigin(this.queryParams).then(response => {
+					this.data = response.rows;
+					this.total = response.total;
+					this.loading = false;
+				});
+			}
 		},
 		handleQuery() {
 			this.queryParams.pageNum = 1;

+ 1 - 1
ruoyi-ui/src/views/bidding/notice/caigounotice.vue

@@ -58,7 +58,7 @@
           <el-table-column label="序号" type="index" align="center" />
           <el-table-column label="供应商名称" align="center" prop="hName" />
           <el-table-column
-            label="最终报价(万元)"
+            label="最终报价"
             align="center"
             prop="zFinal"
           />

+ 1 - 1
ruoyi-ui/src/views/bidding/notice/components/CompPurchase.vue

@@ -145,7 +145,7 @@
             <el-descriptions-item label="公告类型">
               <dict-tag :options="dict.type.jc_publicity_type" :value="dialogDetail.detail.fjType" />
             </el-descriptions-item>
-            <!-- <el-descriptions-item label="项目资金(万元)" v-if="dialogDetail.detail.fjType==='1'">
+            <!-- <el-descriptions-item label="项目资金" v-if="dialogDetail.detail.fjType==='1'">
 							{{ dialogDetail.detail.uMoney }}
 						</el-descriptions-item> -->
             <el-descriptions-item label="公告发布时间">

+ 1 - 1
ruoyi-ui/src/views/bidding/notice/purchase2.vue

@@ -116,7 +116,7 @@
                   :value="fjType.value" />
               </el-select>
             </el-form-item>
-            <el-form-item label="项目资金(万元)" prop="uMoney" class="form-input">
+            <el-form-item label="项目资金" prop="uMoney" class="form-input">
               <el-input v-model="form.uMoney" placeholder="请输入项目资金" :disabled="noUpdate" />
             </el-form-item>
             <el-form-item label="标书获取时间" prop="uGetTime" class="form-input">

+ 1 - 1
ruoyi-ui/src/views/invoice/list/components/Compkaipiao.vue

@@ -40,7 +40,7 @@
       </el-table-column>
     </el-table>
     <pagination v-show="total > 0" :total="total" :page.sync="query.pageNum" :limit.sync="query.pageSize"
-      @pagination="getList" />
+      :page-sizes="[5, 10, 20, 30, 50]" @pagination="getList" />
     <!-- 申请开票或不开票对话框 -->
     <el-dialog title="开票信息" :visible.sync="dialog.visible" width="80%" append-to-body :close-on-click-modal="false"
       :close-on-press-escape="false">

+ 234 - 0
ruoyi-ui/src/views/purchase/stop/bidWinningChange.vue

@@ -0,0 +1,234 @@
+<template>
+    <div class="app-container">
+      <div>
+        <el-form inline ref="elForm" :model="queryParams" size="medium" label-width="100px">
+          <el-form-item label="采购计划编码" prop="sCode">
+            <el-input v-model.trim="queryParams.sCode" placeholder="请输入采购计划编码" clearable :style="{ width: '100%' }"></el-input>
+          </el-form-item>
+          <el-form-item label="采购事项">
+            <el-input v-model.trim="queryParams.sName" placeholder="请输入采购事项"></el-input>
+          </el-form-item>
+          <el-form-item size="medium">
+            <el-button type="primary" @click="handleQuery">查询</el-button>
+            <el-button @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+  
+      <el-tabs v-model="activeName" @tab-click="handleClick">
+        <el-tab-pane label="待提交" name="first"></el-tab-pane>
+        <el-tab-pane label="已生效" name="second"></el-tab-pane>
+      </el-tabs>
+
+      <el-table :data="data">
+        <el-table-column label="序号" align="center" prop="aid" width="80">
+          <template slot-scope="scope">
+            {{ scope.$index + 1 }}
+          </template>
+        </el-table-column>
+        <el-table-column label="项目编号" align="center" prop="sCode" width="170" />
+        <el-table-column label="项目名称" align="center" prop="sName" min-width="150">
+          <template slot-scope="scope">
+            <el-button @click="handleInfo(scope.row)" type="text">{{ scope.row.sName }}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column label="采购单位" align="center" prop="sUnit" min-width="150" />
+        <el-table-column label="工程项目" align="center" prop="projectName" min-width="150" />
+        <el-table-column label="项目状态" align="center" prop="sProjectState">
+          <template slot-scope="scope">
+            <dict-tag :options="dict.type.bid_tender_state" :value="scope.row.sProjectState" />
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
+          <template slot-scope="scope">
+            <!-- <el-button @click="handleInfo(scope.row)" type="text" size="small">查看详情</el-button> -->
+            <el-button @click="applyTermination(scope.row)" type="text" size="small">申请变更</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+
+      <el-dialog title="申请变更" :visible.sync="dialogFormVisible.visible">
+        <el-form>
+          <el-form-item label="情况说明" prop="fjAnnex">
+            <file-upload-json @input="handleUploadUpdate" :limit="1" :value="fjAnnex.uploadFiles" :file-size="500"
+              :file-type="['pdf', 'png', 'jpg']" />
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" v-loading.fullscreen.lock="fullscreenLoading"
+            @click="submitApply">提交{{ dialogFormVisible.title }}</el-button>
+          <el-button @click="dialogFormVisible.visible = false">取 消</el-button>
+        </div>
+      </el-dialog>
+    </div>
+</template>
+  
+  <script>
+  import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+  import { selectTenderByChange, postAlterBid, selectChangelist } from '@/api/system/plan'
+  
+  export default {
+    name: 'BidWinningChange',
+    components: {
+    },
+    dicts: ['bid_tender_state'],
+    props: [],
+    data () {
+      return {
+        activeName: 'first',
+        // 查询参数
+        queryParams: {
+          sName: '',
+          sCode: '',
+          cState: 0
+        },
+
+        data: [],
+        total: 0,
+
+        dialogFormVisible: {
+          visible: false,
+          title: ''
+        },
+        fjAnnex: {
+          filesLength: 0,
+          uploadFiles: [],
+        },
+        changeAnnex: [],
+
+        fullscreenLoading: false
+      }
+    },
+    async created() {
+      if (checkRole(['purchaser'])) {
+        this.activeName = 'first'
+        this.queryParams.cState = 0
+      } else {
+        this.activeName = 'second'
+        this.queryParams.cState = 1
+      }
+
+      await this.getList()
+    },
+    methods: {
+      checkPermi,
+  
+      /*查看采购计划*/
+      handleClick (activeName, oldActiveName) {
+        switch (activeName.name) {
+          case 'first':
+            this.queryParams.cState = 0
+            break
+          case 'second':
+            this.queryParams.cState = 1
+            break
+        }
+      },
+      //搜索按钮
+      handleQuery () {
+        this.queryParams.pageNum = 1
+        this.queryParams.sCode = queryParams.sCode
+        this.queryParams.sName = queryParams.sName
+        this.queryParams.cState = this.activeName == 'first' ? 0 : 1
+        this.getList()
+  
+      },
+      /** 重置按钮操作 */
+      resetQuery () {
+        this.queryParams.sCode = null
+        this.queryParams.sName = null
+        this.handleQuery()
+      },
+
+      // 获取可中标变更项目
+      async getList() {
+        await selectTenderByChange(this.queryParams)
+        .then(res => {
+          this.data = res.rows
+          this.total = res.total
+        })
+      },
+
+      handleInfo(row) {
+        this.$router.push({ path: '/purchase/stopBidWinningDetail', query: { aid: row.xyId, sid: row.sid } })
+      },
+
+      /** 上传组件数据更新 */
+      handleUploadUpdate(fileList) {
+        this.changeAnnex = JSON.stringify(fileList);
+        this.fjAnnex.filesLength = fileList.length;
+      },
+
+      // 申请变更
+      applyTermination(row) {
+        this.dialogFormVisible.visible = true;
+        this.applyForm = {
+          sid: row.sid,
+          file: row.aAstate
+        };
+        this.changeAnnex = []
+        this.fjAnnex = {
+          filesLength: 0,
+          uploadFiles: [],
+        }
+      },
+
+      submitApply () {
+        if (this.changeAnnex && this.changeAnnex.length > 0) {
+            this.applyForm.file = this.changeAnnex
+
+          this.$modal.confirm('你确定要中标变更吗?').then(() => {
+            this.fullscreenLoading = true;
+            let obj = this.applyForm;
+
+            postAlterBid(obj).then(res => {
+              this.fullscreenLoading = false;
+              this.dialogFormVisible.visible = false;
+              this.$message.success("操作成功!!");
+              this.getList()
+            }).catch(err => {
+              this.fullscreenLoading = false;
+              this.dialogFormVisible.visible = false;
+            })
+          })
+        } else {
+          this.$message.error("请上传加盖公章附件!");
+        }
+      },
+
+      // 查询变更记录
+      handleGetSelectChangelist() {
+        const param = {"sName":"","sCode":""}
+        selectChangelist(param)
+        .then(res => {
+          console.log(res);
+        })
+      }
+    }
+  }
+  </script>
+  
+  <style scoped>
+  .demo-table-expand {
+    font-size: 0;
+  }
+  
+  .demo-table-expand label {
+    width: 90px;
+    color: #99a9bf;
+  }
+  
+  .demo-table-expand .el-form-item {
+    margin-right: 0;
+    margin-bottom: 0;
+    width: 50%;
+  }
+  
+  .file_icon {
+    cursor: pointer;
+    margin-left: 20px;
+  }
+  </style>
+  

+ 341 - 0
ruoyi-ui/src/views/purchase/stop/bidWinningDetail.vue

@@ -0,0 +1,341 @@
+<template>
+    <div class="app-container">
+      <el-tabs v-model="paneName">
+        <el-tab-pane label="基础资料" name="basic">
+          <el-descriptions title="项目概况" :column="3" border>
+            <el-descriptions-item label="采购事项" :span="3">
+              {{ detail.aName }}
+            </el-descriptions-item>
+            <el-descriptions-item label="工程项目">
+              {{ detail.projectName }}
+            </el-descriptions-item>
+            <el-descriptions-item label="项目编号">
+              {{ detail.aCode }}
+            </el-descriptions-item>
+            <el-descriptions-item label="供应商库">
+              {{ detail.materialName }}
+            </el-descriptions-item>
+            <el-descriptions-item label="采购方式">
+              <dict-tag :options="dict.type.buying_mode" :value="detail.buyingMode" />
+            </el-descriptions-item>
+            <el-descriptions-item label="报价方式">
+              <dict-tag :options="dict.type.quote_mode" :value="detail.quoteMode" />
+            </el-descriptions-item>
+            <el-descriptions-item label="间隔时间">
+                {{ detail.intervalTime }}
+            </el-descriptions-item>
+            <el-descriptions-item label="满足开标报名数量">
+              {{ detail.allowTenderAmount }}
+            </el-descriptions-item>
+            <el-descriptions-item label="投标保证金">
+              {{ detail.earnestMoney }}
+            </el-descriptions-item>
+            <el-descriptions-item label="采购单位">
+              {{ detail.aCreateDept }}
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions style="margin-top: 20px;" title="采购概况" :column="3" border>
+            <el-descriptions-item label="付款方式">
+              {{ detail.ppmProcurementProfile.paymentMode }}
+            </el-descriptions-item>
+            <el-descriptions-item label="供货/服务时间">
+              {{ detail.ppmProcurementProfile.supplyTime }}
+            </el-descriptions-item>
+            <el-descriptions-item label="供货地点">
+              {{ detail.ppmProcurementProfile.supplyAddress }}
+            </el-descriptions-item>
+            <el-descriptions-item label="质量要求" :span="3">
+              {{ detail.ppmProcurementProfile.qualityRequire }}
+            </el-descriptions-item>
+            <el-descriptions-item label="其它要求" :span="3">
+              {{ detail.ppmProcurementProfile.otherRequire }}
+            </el-descriptions-item>
+            <el-descriptions-item label="附件" :span="3">
+              <div v-for="item, index in detail.uploadFiles" :key="index" style="color: blue;margin-bottom: 5px;"><a
+                  :href="item.url" target="_blank" :download="item.name">{{ item.name }}</a></div>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div style="margin-top: 20px;">采购明细</div>
+          <el-divider></el-divider>
+          <el-table ref="elTable" max-height="250" :data="detail.ppmProcurementDetailList" border
+            style="margin-top: 20px">
+            <el-table-column label="序号" align="center" width="80">
+              <template slot-scope="scope">
+                <span>{{ scope.$index + 1 }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="采购内容" align="center" prop="buyingContent" />
+            <el-table-column label="物料子类" align="center" prop="materialName" />
+            <el-table-column v-if="materielType == '1'" label="规格型号" align="center" prop="brandModel" />
+            <el-table-column v-if="materielType == '1'" label="技术参数" align="center" prop="technical" />
+            <el-table-column v-if="materielType != '1'" label="服务要求" align="center" prop="servicRequire" />
+            <el-table-column v-if="materielType == '3'" label="时间单位" align="center" prop="timeUnit" />
+            <el-table-column v-if="materielType == '3'" label="租赁时间" align="center" prop="times" />
+            <el-table-column label="数量单位" align="center" prop="unit" />
+            <el-table-column label="数量" align="center" prop="amount" />
+            <el-table-column label="预算单价(含税)" align="center" prop="unitPrice" />
+          </el-table>
+          <div style="text-align: right;margin-top: 10px;font-size: 14px;">合计预算金额:{{ totalAmount }}</div>
+  
+          <div v-if="detail.stopFile && detail.stopFile.length > 0" style="margin-top: 20px;">
+            <div>申请中标终止附件</div>
+            <el-divider></el-divider>
+            <div v-for="item, index in detail.stopFile" :key="index" style="color: blue;margin-bottom: 5px;">
+                <a :href="item.url" target="_blank" :download="item.name">{{ item.name }}</a>
+            </div>
+          </div>
+  
+          <el-card v-if="sState == 1" v-hasRole="['centerFuzong']" ref="card" style="margin-top: 20px" class="never">
+            <div slot="header" class="clearfix">
+              <span>审核意见</span>
+              <el-button @click="item.show = !item.show" style="float: right; padding: 3px 0" type="text">
+                {{ item.show ? '隐藏意见' : '显示意见' }}
+              </el-button>
+            </div>
+            <div v-if="item.show" class="text item">
+              <editor v-model="form.bidEditor" :min-height="120" />
+            </div>
+          </el-card>
+  
+          <div v-hasRole="['centerFuzong']" style="text-align: right;margin-top: 10px;">
+            <div style=" display: inline-block;margin-right: 10px" v-if="sState == 1">
+              <el-button type="primary" @click="approved"
+                v-loading.fullscreen.lock="fullscreenLoading">审核
+              </el-button>
+              <el-button type="danger" @click="rejectPlan"
+                v-loading.fullscreen.lock="fullscreenLoading">驳回
+              </el-button>
+            </div>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane label="审批记录" name="record_approval">
+          <el-steps space="200" simple :active="sState + 1">
+            <el-step title="待提交"></el-step>
+            <el-step title="待审核"></el-step>
+            <el-step title="已生效"></el-step>
+          </el-steps>
+  
+          <el-table style="margin-top: 20px" max-height="250" :data="record_approval">
+            <el-table-column type="expand">
+              <template slot-scope="scope">
+                <el-card class="box-card">
+                  <div slot="header" class="clearfix">
+                    <span>意见详情</span>
+                    <el-button @click="expand(scope.row.opinionDetails)" style="float: right; padding: 3px 0"
+                      type="text">查看更多
+                    </el-button>
+                  </div>
+                  <div style="height: 100px" v-html="scope.row.opinionDetails" class="text item"></div>
+                </el-card>
+              </template>
+            </el-table-column>
+            <el-table-column label="序号" align="center" prop="rid">
+              <template slot-scope="scope">
+                {{ scope.$index + 1 }}
+              </template>
+            </el-table-column>
+            <el-table-column label="流程节点" align="center" prop="node" width="135" />
+            <el-table-column label="处理人" align="center" prop="processedBy" />
+            <el-table-column label="所属部门" align="center" prop="depnt" />
+            <el-table-column label="处理时间" align="center" prop="updateTime" width="180">
+              <template slot-scope="scope">
+                <span>{{ scope.row.updateTime }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="状态" align="center" prop="opinion" />
+          </el-table>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </template>
+  
+  <script>
+  
+  import Decimal from "decimal.js";
+  import { getPlan, editStopPlan, getRecordList, updateTenderByState } from '@/api/system/plan'
+  import { getPlanProfileByAid } from "@/api/system/planprofile"
+  import { getPlanDetailsByAid } from "@/api/system/plandetail"
+  
+  import { getMateriel } from "@/api/mast/materiel";
+  import { add, multiply } from "@/utils/decimal";
+  import { listRecord } from "@/api/system/approval";
+  export default {
+    dicts: ['ppm_procurement_plan', 'funding_source', 'quote_mode', 'buying_mode'],
+    data () {
+      return {
+        aid: this.$route.query.aid,
+        sid: this.$route.query.sid,
+        paneName: 'basic',
+        sState: 0,
+        oState: null,
+        detail: {
+          aid: null,
+          aCode: '',
+          aName: '',
+          projectName: '',
+          fundSource: '',
+          materialName: '',
+          quoteMode: '',
+          allowTenderAmount: 1,
+          buyingMode: '',
+          earnestMoney: 0,
+          intervalTime: '',
+          aCreateDept: '',
+          materialType: null,
+          uploadFiles: [],
+          stopAnnex: [],
+          changeAnnex: [],
+          stopFile: [],
+          ppmProcurementProfile: {
+            paymentMode: '',
+            supplyTime: '',
+            supplyAddress: '',
+            qualityRequire: '',
+            otherRequire: '',
+          },
+          ppmProcurementDetailList: []
+        },
+        materielType: '1',
+        totalAmount: 0,
+        form: {
+          sid: '',
+          sState: '',
+          bidEditor: '',
+        },
+        item: {
+          show: true
+        },
+        record_approval: [],
+        fullscreenLoading: false,
+      }
+    },
+    created () {
+      this.getPlan()
+      this.getRecordApproval()
+      this.form.sid = this.sid;
+    },
+    methods: {
+      /** 根据计划id查询计划信息 */
+      async getPlan () {
+        const res = await getPlan(this.aid)
+        const data = res.data;
+        this.sState = data.sState
+        this.oState = data.oState
+        
+        this.detail.aName = data.aName;
+        this.detail.aCode = data.aCode;
+        this.detail.projectName = data.projectName;
+        this.detail.fundSource = data.fundSource;
+  
+        getMateriel(data.materialId).then(resMateriel => {
+          this.materielType = resMateriel.data.materielType
+          this.detail.materialName = resMateriel.data.materielName
+        })
+        this.detail.quoteMode = data.quoteMode;
+        this.detail.allowTenderAmount = data.allowTenderAmount;
+        this.detail.buyingMode = data.buyingMode;
+        this.detail.earnestMoney = data.earnestMoney;
+        this.detail.aCreateDept = data.aCreateDept;
+        this.detail.intervalTime = data.intervalTime;
+  
+        const res1 = await getPlanProfileByAid(this.aid)
+        const data1 = res1.data;
+        this.detail.ppmProcurementProfile.paymentMode = data1?.paymentMode;
+        this.detail.ppmProcurementProfile.supplyTime = data1?.supplyTime;
+        this.detail.ppmProcurementProfile.supplyAddress = data1?.supplyAddress;
+        this.detail.ppmProcurementProfile.qualityRequire = data1?.qualityRequire;
+        this.detail.ppmProcurementProfile.otherRequire = data1?.otherRequire;
+  
+        const fjAnnex = data.fjAnnex
+        if (fjAnnex) {
+          const fjAnnexArr = JSON.parse(fjAnnex);
+  
+          this.detail.uploadFiles = fjAnnexArr;
+        }
+  
+        const stopAnnex = data.stopAnnex
+        if (stopAnnex) {
+          const stopAnnexArr = JSON.parse(stopAnnex);
+          this.detail.stopAnnex = stopAnnexArr;
+        }
+  
+        const changeAnnex = data.changeAnnex
+        if (changeAnnex) {
+          const changeAnnexArr = JSON.parse(changeAnnex);
+          this.detail.changeAnnex = changeAnnexArr;
+        }
+
+        const stopFile = data.stopFile
+        if (stopFile) {
+            const stopFileArr = JSON.parse(stopFile);
+            this.detail.stopFile = stopFileArr;
+        }
+  
+        const res2 = await getPlanDetailsByAid(this.aid)
+        this.detail.ppmProcurementDetailList = res2.rows
+  
+        this.totalAmount = res2.rows.reduce((acc, cur) => this.getTotal(acc, cur), 0)
+      },
+      getRecordApproval () {
+        getRecordList({ sid: this.sid, flagType: 'StopTender' }).then((res) => {
+  
+          this.record_approval = res.rows;
+        }).catch(err => {
+          this.$modal.msgError("服务器出错,请联系管理员!!!");
+        })
+      },
+      
+      //审核采购计划
+      approved () {
+        if (!this.form.bidEditor) {
+          this.$modal.msgError("请输入审核意见")
+          return;
+        }
+        this.$modal.confirm("你确定要审核终止该采购计划吗?").then(() => {
+          this.handleExamineApply(2);
+        })
+      },
+      //驳回采购计划
+      rejectPlan () {
+        if (!this.form.bidEditor) {
+          this.$modal.msgError("请输入审核意见")
+          return;
+        }
+        this.$modal.confirm("你确定要驳回终止采购计划吗?").then(() => {
+          this.handleExamineApply(0);
+        })
+      },
+
+      //审核终止申请
+      handleExamineApply(state) {
+        this.fullscreenLoading = true;
+        let obj = { ...this.form };
+        obj['sState'] = state;
+        obj['bidEditor'] = {
+          opinionDetails: this.form.bidEditor
+        }
+  
+        updateTenderByState(obj).then(res => {
+          this.fullscreenLoading = false;
+          this.$message.success("操作成功!!");
+          this.$tab.closePage()
+        }).catch(err => {
+          this.fullscreenLoading = false;
+          this.$modal.msgError("服务器出错,请联系管理员!!!");
+        })
+      },
+
+      getTotal (acc, cur) {
+        let price = new Decimal(cur.amount || 0).mul(cur.unitPrice || 0)
+        if (this.materielType == 3) {
+          price = price.mul(cur.times || 1)
+        }
+        return Number(add(acc, price))
+      }
+    }
+  }
+  </script>
+  
+  <style lang="scss" scoped>
+  </style>
+  

+ 133 - 0
ruoyi-ui/src/views/purchase/stop/bidWinningStop.vue

@@ -0,0 +1,133 @@
+<template>
+    <div class="app-container">
+      <div>
+        <el-form inline ref="elForm" :model="queryParams" size="medium" label-width="100px">
+          <el-form-item label="采购计划编码" prop="sCode">
+            <el-input v-model.trim="queryParams.sCode" placeholder="请输入采购计划编码" clearable :style="{ width: '100%' }"></el-input>
+          </el-form-item>
+          <el-form-item label="采购事项">
+            <el-input v-model.trim="queryParams.sName" placeholder="请输入采购事项"></el-input>
+          </el-form-item>
+          <el-form-item size="medium">
+            <el-button type="primary" @click="handleQuery">查询</el-button>
+            <el-button @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+  
+      <div class="tcl">
+        <el-tabs v-model="activeName" @tab-click="handleClick">
+          <el-tab-pane label="待提交" name="first" v-if="checkRole(['purchaser'])">
+            <WinTodoSubmitted ref="refWinToBeSubmitted" />
+          </el-tab-pane>
+  
+          <el-tab-pane label="待审批" name="second" v-if="checkRole(['purchaser', 'centerFuzong'])">
+            <WinPendingApproval ref="refWinPendingApproval" />
+          </el-tab-pane>
+  
+          <el-tab-pane label="已生效" name="third">
+            <WinEffective ref="refWinEffective" />
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+  </template>
+  
+<script>
+  import { checkRole } from "@/utils/permission"; // 权限判断函数
+  import WinTodoSubmitted from './components/winTodoSubmitted';
+  import WinPendingApproval from './components/winPendingApproval'
+  import WinEffective from './components/winEffective.vue'
+  
+  export default {
+    dicts: ['ppm_procurement_plan'],
+    name: 'BidWinningStop',
+    components: {
+        WinTodoSubmitted,
+        WinPendingApproval,
+        WinEffective
+    },
+    props: [],
+    data () {
+      return {
+        activeName: 'first',
+        // 查询参数
+        queryParams: {
+          sCode: null,
+          sName: null,
+        },
+      }
+    },
+    created () {
+      if (checkRole(['purchaser'])) {
+        this.activeName = 'first'
+      } else if (checkRole(['centerFuzong'])) {
+        this.activeName = 'second'
+      } else {
+        this.activeName = 'third'
+      }
+    },
+    methods: {
+      checkRole,
+  
+      /*查看采购计划*/
+      handleClick (activeName, oldActiveName) {
+        switch (activeName.name) {
+          case 'first':
+            this.$refs.refWinToBeSubmitted.handleQuery(this.queryParams)
+            break
+          case 'second':
+            this.$refs.refWinPendingApproval.handleQuery(this.queryParams)
+            break
+          case 'third':
+            this.$refs.refWinEffective.handleQuery(this.queryParams)
+            break
+        }
+      },
+      //搜索按钮
+      handleQuery () {
+        switch (this.activeName) {
+          case 'first':
+            this.$refs.refWinToBeSubmitted.handleQuery(this.queryParams)
+            break
+          case 'second':
+            this.$refs.refWinPendingApproval.handleQuery(this.queryParams)
+            break
+          case 'third':
+            this.$refs.refWinEffective.handleQuery(this.queryParams)
+            break
+        }
+  
+      },
+      /** 重置按钮操作 */
+      resetQuery () {
+        this.queryParams.sCode = null
+        this.queryParams.sName = null
+        this.handleQuery()
+      },
+    }
+  }
+  </script>
+  
+  <style scoped>
+  .demo-table-expand {
+    font-size: 0;
+  }
+  
+  .demo-table-expand label {
+    width: 90px;
+    color: #99a9bf;
+  }
+  
+  .demo-table-expand .el-form-item {
+    margin-right: 0;
+    margin-bottom: 0;
+    width: 50%;
+  }
+  
+  .file_icon {
+    cursor: pointer;
+    margin-left: 20px;
+  }
+  </style>
+  

+ 1 - 1
ruoyi-ui/src/views/purchase/stop/components/CompTobeSubmitted.vue

@@ -50,7 +50,7 @@
       <el-form>
         <el-form-item label="情况说明" prop="fjAnnex">
           <file-upload-json @input="handleUploadUpdate" :limit="4" :value="fjAnnex.uploadFiles" :file-size="500"
-            :file-type="['doc', 'docx', 'xls', 'xlsx', 'ppt', 'txt', 'pdf', 'rar', 'png', 'jpg']" />
+            :file-type="['pdf', 'png', 'jpg']" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">

+ 71 - 0
ruoyi-ui/src/views/purchase/stop/components/winEffective.vue

@@ -0,0 +1,71 @@
+<template>
+    <div>
+      <el-table :data="data">
+        <el-table-column label="序号" align="center" prop="aid" width="80">
+          <template slot-scope="scope">
+            {{ scope.$index + 1 }}
+          </template>
+        </el-table-column>
+        <el-table-column label="项目编号" align="center" prop="sCode" width="170" />
+        <el-table-column label="项目名称" align="center" prop="sName" min-width="150">
+            <template slot-scope="scope">
+            <el-button @click="handleInfo(scope.row)" type="text">{{ scope.row.sName }}</el-button>
+            </template>
+        </el-table-column>
+        <el-table-column label="采购单位" align="center" prop="sUnit" min-width="150" />
+        <el-table-column label="工程项目" align="center" prop="projectName" min-width="150" />
+        <el-table-column label="项目状态" align="center" prop="sProjectState">
+            <template slot-scope="scope">
+            <dict-tag :options="dict.type.bid_tender_state" :value="scope.row.sProjectState" />
+            </template>
+        </el-table-column>
+      </el-table>
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+    </div>
+  </template>
+  
+<script>
+  import { getSelectTenderByState as apiList, delPlan as apiDel } from "@/api/system/plan";
+  export default {
+    props: {
+    },
+    components: {
+  
+    },
+    dicts: ['bid_tender_state'],
+    data () {
+      return {
+        data: [],
+        total: 0,
+        queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            sState: 2
+        },
+      }
+    },
+    created() {
+      this.getList()
+    },
+    methods: {
+      /** 获取数据 */
+      getList() {
+        apiList(this.queryParams).then(res => {
+          this.data = res.rows
+          this.total = res.total
+        });
+      },
+      handleInfo(row) {
+        this.$router.push({ path: '/purchase/stopBidWinningDetail', query: { aid: row.xyId, sid: row.sid } })
+      },
+      handleQuery(queryParams) {
+        this.queryParams.pageNum = 1
+        this.queryParams.sCode = queryParams.sCode
+        this.queryParams.sName = queryParams.sName
+        this.getList()
+      },
+    }
+  }
+  </script>
+  

+ 80 - 0
ruoyi-ui/src/views/purchase/stop/components/winPendingApproval.vue

@@ -0,0 +1,80 @@
+<template>
+  <div>
+    <el-table :data="data">
+      <el-table-column label="序号" align="center" prop="aid" width="80">
+        <template slot-scope="scope">
+          {{ scope.$index + 1 }}
+        </template>
+      </el-table-column>
+      <el-table-column label="项目编号" align="center" prop="sCode" width="170" />
+      <el-table-column label="项目名称" align="center" prop="sName" min-width="150">
+        <template slot-scope="scope">
+          <el-button @click="handleInfo(scope.row)" type="text">{{ scope.row.sName }}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="采购单位" align="center" prop="sUnit" min-width="150" />
+      <el-table-column label="工程项目" align="center" prop="projectName" min-width="150" />
+      <el-table-column label="项目状态" align="center" prop="sProjectState">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.bid_tender_state" :value="scope.row.sProjectState" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button @click="handleInfo(scope.row)" type="text" size="small">查看</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+  </div>
+</template>
+
+<script>
+
+import { getSelectTenderByState as apiList } from "@/api/system/plan";
+export default {
+  dicts: ['bid_tender_state'],
+  data () {
+    return {
+      data: [],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        sState: 1
+      }
+    }
+  },
+  created () {
+    this.getList()
+  },
+  methods: {
+    /** 获取数据 */
+    getList () {
+      apiList(this.queryParams).then(res => {
+        this.data = res.rows.map(item => {
+          let fj = []
+          const fjAnnex = item.stopFile
+          if (fjAnnex) {
+            const fjAnnexArr = JSON.parse(fjAnnex);
+            fj = fjAnnexArr;
+          }
+          item.fjAnnex = fj
+          return item
+        })
+        this.total = res.total
+      });
+    },
+    handleInfo (row) {
+      this.$router.push({ path: '/purchase/stopBidWinningDetail', query: { aid: row.xyId, sid: row.sid } })
+    },
+    handleQuery (queryParams) {
+      this.queryParams.pageNum = 1
+      this.queryParams.sCode = queryParams.sCode
+      this.queryParams.sName = queryParams.sName
+      this.getList()
+    },
+  }
+}
+</script>

+ 153 - 0
ruoyi-ui/src/views/purchase/stop/components/winTodoSubmitted.vue

@@ -0,0 +1,153 @@
+<template>
+    <div>
+      <el-table :data="data">
+        <el-table-column label="序号" align="center" prop="aid" width="80">
+          <template slot-scope="scope">
+            {{ scope.$index + 1 }}
+          </template>
+        </el-table-column>
+        <el-table-column label="项目编号" align="center" prop="sCode" width="170" />
+        <el-table-column label="项目名称" align="center" prop="sName" min-width="150">
+          <template slot-scope="scope">
+            <el-button @click="handleInfo(scope.row)" type="text">{{ scope.row.sName }}</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column label="采购单位" align="center" prop="sUnit" min-width="150" />
+        <el-table-column label="工程项目" align="center" prop="projectName" min-width="150" />
+        <el-table-column label="项目状态" align="center" prop="sProjectState">
+          <template slot-scope="scope">
+            <dict-tag :options="dict.type.bid_tender_state" :value="scope.row.sProjectState" />
+          </template>
+        </el-table-column>
+
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button v-hasPermi="['system:attachments:list']" @click="applyTermination(scope.row)" type="text"
+              size="small">申请终止</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+  
+      <el-dialog :title="dialogFormVisible.title" :visible.sync="dialogFormVisible.visible">
+        <el-form>
+          <el-form-item label="情况说明" prop="fjAnnex">
+            <file-upload-json @input="handleUploadUpdate" :limit="4" :value="fjAnnex.uploadFiles" :file-size="500"
+              :file-type="['pdf', 'png', 'jpg']" />
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" v-loading.fullscreen.lock="fullscreenLoading"
+            @click="submitApply">提交{{ dialogFormVisible.title }}</el-button>
+          <el-button @click="dialogFormVisible.visible = false">取 消</el-button>
+        </div>
+      </el-dialog>
+    </div>
+  </template>
+  
+<script>
+  import { getSelectTenderByState as apiList, updateTenderByState } from "@/api/system/plan";
+
+  export default {
+    dicts: ['bid_tender_state'],
+    data () {
+      return {
+        data: [],
+        total: 0,
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          sState: 0
+        },
+  
+        dialogFormVisible: {
+          visible: false,
+          title: ''
+        },
+        fjAnnex: {
+          filesLength: 0,
+          uploadFiles: [],
+        },
+        changeAnnex: [],
+        applyForm: {
+          sState: null,
+          sid: null,
+          fjAnnex: null
+        },
+        fullscreenLoading: false
+      }
+    },
+    created () {
+      this.getList()
+    },
+    methods: {
+      /** 获取数据 */
+      getList() {
+        apiList(this.queryParams).then(res => {
+          this.data = res.rows
+          this.total = res.total
+        });
+      },
+      
+      handleInfo(row) {
+        this.$router.push({ path: '/purchase/stopBidWinningDetail', query: { aid: row.xyId, sid: row.sid } })
+      },
+
+      handleQuery(queryParams) {
+        this.queryParams.pageNum = 1
+        this.queryParams.sCode = queryParams.sCode
+        this.queryParams.sName = queryParams.sName
+        this.getList()
+      },
+  
+      /** 上传组件数据更新 */
+      handleUploadUpdate(fileList) {
+        this.changeAnnex = JSON.stringify(fileList);
+        this.fjAnnex.filesLength = fileList.length;
+      },
+  
+      applyTermination(row) {
+        this.dialogFormVisible.visible = true;
+        this.dialogFormVisible.title = '申请终止';
+        this.applyForm = {
+          sState: 1,
+          sid: row.sid
+        };
+        this.changeAnnex = []
+        this.fjAnnex = {
+          filesLength: 0,
+          uploadFiles: [],
+        }
+      },
+  
+      submitApply() {
+        if (this.changeAnnex && this.changeAnnex.length > 0) {
+          this.applyForm.stopFile = this.changeAnnex
+          this.$modal.confirm('你确定要提交中标终止吗?')
+          .then(() => {
+            this.fullscreenLoading = true;
+            let obj = this.applyForm;
+            obj['bidEditor'] = {
+              opinionDetails: ''
+            }
+  
+            updateTenderByState(obj).then(res => {
+              this.fullscreenLoading = false;
+              this.dialogFormVisible.visible = false;
+              this.$message.success("操作成功!!");
+              this.getList()
+            }).catch(err => {
+              this.fullscreenLoading = false;
+              this.dialogFormVisible.visible = false;
+              this.$modal.msgError("服务器出错,请联系管理员!!!");
+            })
+          })
+        } else {
+          this.$message.error("请上传加盖公章附件!");
+        }
+      },
+    }
+  }
+  </script>
+  

+ 1 - 1
ruoyi-ui/src/views/purchase/stop/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <div>
-      <el-form inline ref="elForm" :model="queryParams" size="medium" label-width="150px">
+      <el-form inline ref="elForm" :model="queryParams" size="medium" label-width="100px">
         <el-form-item label="采购计划编码" prop="aCode">
           <el-input v-model.trim="queryParams.aCode" placeholder="请输入采购计划编码" clearable :style="{ width: '100%' }">
           </el-input>

+ 2 - 2
ruoyi-ui/src/views/supplier/sqe/detail.vue

@@ -283,7 +283,7 @@
               <el-table-column label="采购单位" align="center" prop="yjUnit" />
               <el-table-column label="合作方" align="center" prop="yjPartner" />
               <el-table-column label="签订日期" align="center" prop="yjDate" />
-              <el-table-column label="合同金额(万元)" align="center" prop="yjRmb" />
+              <el-table-column label="合同金额" align="center" prop="yjRmb" />
               <el-table-column label="买方业务代表" align="center" prop="yjBbr" />
               <el-table-column label="买方业务代表联系电话" align="center" prop="yjPhone" />
             </el-table>
@@ -301,7 +301,7 @@
             <el-table stripe v-loading="loading" :data="financialStatusList">
               <el-table-column type="index" label="序号" align="center" width="80" />
               <el-table-column label="年度" align="center" prop="cAnnual" />
-              <el-table-column label="净利润(万元)" align="center" prop="cNetProfit" />
+              <el-table-column label="净利润" align="center" prop="cNetProfit" />
               <el-table-column label="资产负债率(%)" align="center" prop="cLev" />
             </el-table>
             <pagination v-show="total3 > 0" :total="total3" :page.sync="financialStatus.pageNum"

+ 2 - 2
ruoyi-ui/src/views/supplier/sqe/process.vue

@@ -235,7 +235,7 @@
               <el-table-column label="采购单位" align="center" prop="yjUnit" />
               <el-table-column label="合作方" align="center" prop="yjPartner" />
               <el-table-column label="签订日期" align="center" prop="yjDate" />
-              <el-table-column label="合同金额(万元)" align="center" prop="yjRmb" />
+              <el-table-column label="合同金额" align="center" prop="yjRmb" />
               <el-table-column label="买方业务代表" align="center" prop="yjBbr" />
               <el-table-column label="买方业务代表联系电话" align="center" prop="yjPhone" />
             </el-table>
@@ -248,7 +248,7 @@
             <el-table stripe v-loading="loading" :data="financialStatusList">
               <el-table-column type="index" label="序号" align="center" width="80" />
               <el-table-column label="年度" align="center" prop="cAnnual" />
-              <el-table-column label="净利润(万元)" align="center" prop="cNetProfit" />
+              <el-table-column label="净利润" align="center" prop="cNetProfit" />
               <el-table-column label="资产负债率(%)" align="center" prop="cLev" />
             </el-table>
             <pagination v-show="total3 > 0" :total="total3" :page.sync="financialStatus.pageNum"

+ 4 - 1
ruoyi-ui/src/views/tender/tender1/components/CompExpert.vue

@@ -56,7 +56,8 @@
         </el-table-column>
         <el-table-column label="确认到场" align="center" prop="pbTypes">
           <template slot-scope="scope">
-            <span>{{ scope.row.status == '1' ? '确认到场' : (scope.row.status == '2' ? '已拒绝' : '待确认') }}</span>
+            <dict-tag :options="dict.type.expert_confirm_status" :value="scope.row.status" />
+            <!-- <span>{{ scope.row.status == '1' ? '确认到场' : (scope.row.status == '3' ? '确认到场并发送短信' : (scope.row.status == '2' ? '已拒绝' : '待确认')) }}</span> -->
           </template>
         </el-table-column>
         <el-table-column label="组长" align="center" prop="isLeader">
@@ -106,6 +107,8 @@ export default {
     },
   },
 
+  dicts: ['expert_confirm_status'],
+
   data () {
     return {
       // 遮罩层

+ 1 - 1
ruoyi-ui/src/views/tender/tender1/components/CompWinningBid.vue

@@ -7,7 +7,7 @@
         </template>
       </el-table-column>
       <el-table-column label="供应商名称" align="center" prop="hName" />
-      <el-table-column label="最终报价(万元)" align="center" prop="finalPrice" />
+      <el-table-column label="最终报价" align="center" prop="finalPrice" />
 
       <el-table-column label="中标通知书" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">

+ 2 - 2
ruoyi-ui/src/views/winfile/components/CompWinFile.vue

@@ -444,8 +444,8 @@ export default {
         return;
       }
 
-      let content = `<h1 style="width: 100%;text-align: center;border-bottom: 1px solid #000;">成交通知书</h1><p style="font-size: 26px">${fileData.hName}:</p>`;
-      content += `<div style="font-size: 26px"><p style="text-indent: 42px;line-height:38px">由我公司组织<span style="text-decoration: underline;">${fileData.sName}</span>
+      let content = `<h1 style="width: 100%;text-align: center;border-bottom: 1px solid #000;">成交通知书</h1><p style="font-size: 15pt">${fileData.hName}:</p>`;
+      content += `<div style="font-size: 15pt"><p style="text-indent: 42px;line-height:38px">由我公司组织<span style="text-decoration: underline;">${fileData.sName}</span>
             经评定,确定贵公司为成交供应商。成交金额为人民币:<span style="text-decoration: underline;">${fileData.finalPrice}</span>元。
             供货期限<span style="text-decoration: underline;">${fileData.gongTime}</span>。
             供货地点<span style="text-decoration: underline;">${fileData.gongAdress}</span>。</p>`