Jelajahi Sumber

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

zzs 2 bulan lalu
induk
melakukan
6f9e729589
28 mengubah file dengan 694 tambahan dan 44 penghapusan
  1. 3 3
      bidding-ui/src/views/mine/tenderOfferDetail.vue
  2. 1 1
      bidding-ui/src/views/mine/tenderOfferResult.vue
  3. 93 0
      ruoyi-modules/hh-basic/src/main/resources/logback.xml
  4. 21 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidCommitteeController.java
  5. 0 3
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidIvrController.java
  6. 3 3
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidTenderController.java
  7. 50 18
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidWinningResultsController.java
  8. 10 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/BidCommittee.java
  9. 11 0
      ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/Earnest.java
  10. 93 0
      ruoyi-modules/hh-bidding/src/main/resources/logback.xml
  11. 4 1
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidCommitteeMapper.xml
  12. 2 1
      ruoyi-modules/hh-bidding/src/main/resources/mapper/BidQuoteMapper.xml
  13. 93 0
      ruoyi-modules/hh-mast/src/main/resources/logback.xml
  14. 20 0
      ruoyi-modules/hh-procure/src/main/java/com/hh/procure/domain/PpmProcurementPlan.java
  15. 93 0
      ruoyi-modules/hh-procure/src/main/resources/logback.xml
  16. 2 1
      ruoyi-modules/hh-procure/src/main/resources/mapper/PpmProcurementPlanMapper.xml
  17. 9 0
      ruoyi-ui/src/api/system/expert.js
  18. 6 0
      ruoyi-ui/src/views/guarantee/examine/index.vue
  19. 1 1
      ruoyi-ui/src/views/procurementSourcing/detail.vue
  20. 1 1
      ruoyi-ui/src/views/purchase/otb/detail.vue
  21. 1 1
      ruoyi-ui/src/views/purchase/otb/insert.vue
  22. 2 2
      ruoyi-ui/src/views/purchase/stop/bidWinningChange.vue
  23. 14 0
      ruoyi-ui/src/views/purchase/stop/bidWinningDetail.vue
  24. 5 0
      ruoyi-ui/src/views/purchase/stop/components/winEffective.vue
  25. 32 5
      ruoyi-ui/src/views/tender/tender1/components/CompExpert.vue
  26. 1 1
      ruoyi-ui/src/views/tender/tender1/components/CompPlanDetails.vue
  27. 121 0
      ruoyi-ui/src/views/tender/tender1/components/CompSearchProject.vue
  28. 2 2
      ruoyi-ui/src/views/tender/tender1/index.vue

+ 3 - 3
bidding-ui/src/views/mine/tenderOfferDetail.vue

@@ -10,7 +10,7 @@
       当前时间:<span class="time">{{ currentTime }}</span>
     </div>
     <div class="quote-info">第{{ form.quoteNumber }}次报价,截至时间:{{ endTime }}</div>
-    <el-table max-height="250" :data="data" border style="margin-top: 20px;width: 100%">
+    <el-table max-height="740" :data="data" border style="margin-top: 20px;width: 100%">
       <el-table-column label="序号" align="center" width="80">
         <template slot-scope="scope">
           <span>{{ scope.$index + 1 }}</span>
@@ -45,7 +45,7 @@
     <div v-if="quoteMode != '1' && form.quoteNumber == 3" style="margin-top: 10px;">
       <el-divider></el-divider>
       <div>第二次报价</div>
-      <el-table max-height="250" :data="secondData" border style="margin-top: 20px;width: 100%">
+      <el-table max-height="740" :data="secondData" border style="margin-top: 20px;width: 100%">
         <el-table-column label="序号" align="center" width="80">
           <template slot-scope="scope">
             <span>{{ scope.$index + 1 }}</span>
@@ -71,7 +71,7 @@
     <div v-if="quoteMode != '1' && (form.quoteNumber == 2 || form.quoteNumber == 3)" style="margin-top: 10px;">
       <el-divider></el-divider>
       <div>第一次报价</div>
-      <el-table max-height="250" :data="firstData" border style="margin-top: 20px;width: 100%">
+      <el-table max-height="740" :data="firstData" border style="margin-top: 20px;width: 100%">
         <el-table-column label="序号" align="center" width="80">
           <template slot-scope="scope">
             <span>{{ scope.$index + 1 }}</span>

+ 1 - 1
bidding-ui/src/views/mine/tenderOfferResult.vue

@@ -11,7 +11,7 @@
     <div v-for="(key, index) in Object.keys(dataObj)" :key="index" style="margin-bottom: 20px;">
       <div>第{{ dataObj[key].title }}次报价</div>
       <div style="margin-top: 10px;">供应商报价时间:{{ dataObj[key].quoteTime }}</div>
-      <el-table max-height="250" :data="dataObj[key].data" border style="margin-top: 20px;width: 100%">
+      <el-table max-height="740" :data="dataObj[key].data" border style="margin-top: 20px;width: 100%">
         <el-table-column label="序号" align="center" width="80">
           <template slot-scope="scope">
             <span>{{ scope.$index + 1 }}</span>

+ 93 - 0
ruoyi-modules/hh-basic/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/home/ruoyi/logs" />
+    <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+	
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+	
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+	
+	<!-- 系统模块日志级别控制  -->
+	<logger name="com.ruoyi" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+	
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration> 

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

@@ -211,4 +211,25 @@ public class BidCommitteeController extends BaseController
     public AjaxResult updateLeader(@RequestParam("pbId") Long pbId){
         return toAjax(bidCommitteeService.updateLeader(pbId));
     }
+
+    @Log(title = "同步评标委员会信息",businessType = BusinessType.INSERT)
+    @PostMapping("/follow")
+    public AjaxResult follow(@RequestBody BidCommittee bidCommittee){
+        Long csid = bidCommittee.getCsid();
+        List<BidCommittee> bidCommittees = bidCommitteeService.selectBidCommitteeList(bidCommittee);
+
+        for(BidCommittee item : bidCommittees){
+            if(item.getStatus() == 3){
+                BidCommittee bc = new BidCommittee();
+                bc.setJid(item.getJid());
+                bc.setSid(csid);
+                bc.setStatus(3L);
+                bc.setUserId(item.getUserId());
+                bc.setIsLeader(item.getIsLeader());
+                bidCommitteeService.insertBidCommittee(bc);
+            }
+        }
+
+        return success(bidCommittees.size());
+    }
 }

+ 0 - 3
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidIvrController.java

@@ -225,7 +225,6 @@ public class BidIvrController extends BaseController
     }
 
     // 短信回执信息地址
-    @Log(title = "短信回执", businessType = BusinessType.INSERT)
     @PostMapping("/smsMes")
     public void getSmsMessage(@RequestBody SmsMessage smsMessage){
         String mobile = smsMessage.getMobile();
@@ -246,7 +245,6 @@ public class BidIvrController extends BaseController
     }
 
     // 短信发送接口(专家)
-    @Log(title = "短信发送", businessType = BusinessType.OTHER)
     @PostMapping("/sendSmsExpert")
     public AjaxResult sendSmsExpert(SmsParam smsParam) throws UnsupportedEncodingException, NoSuchAlgorithmException {
         String[] param = new String[8];
@@ -314,7 +312,6 @@ public class BidIvrController extends BaseController
     }
 
     // 短信发送接口 (供应商)
-    @Log(title = "供应商发送短信", businessType = BusinessType.OTHER)
     @PostMapping("/sendSmsSupplier")
     public AjaxResult sendSmsSupplier(@RequestBody SmsParam smsParam) throws UnsupportedEncodingException, NoSuchAlgorithmException {
         String[] param = new String[6];

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

@@ -782,7 +782,7 @@ public class BidTenderController extends BaseController {
                 bankDepositdescr.setRtnCode(item.getRtnCode());
                 bankDepositdescr.setRtnSeverity(item.getRtnSeverity());
                 bankDepositdescr.setRtnMessage(item.getRtnMessage());
-                bankDepositdescr.setRtnRsbody(item.getRtnRsbody());
+//                bankDepositdescr.setRtnRsbody(item.getRtnRsbody());
                 bankDepositdescr.setRtnRcrdtotnum(item.getRtnRcrdtotnum());
                 bankDepositdescr.setRtnCrnpgno(item.getRtnCrnpgno());
                 bankDepositdescr.setRtnPgrcrdnum(item.getRtnPgrcrdnum());
@@ -836,7 +836,7 @@ public class BidTenderController extends BaseController {
                 bankDepositdescr.setRtnCode(item.getRtnCode());
                 bankDepositdescr.setRtnSeverity(item.getRtnSeverity());
                 bankDepositdescr.setRtnMessage(item.getRtnMessage());
-                bankDepositdescr.setRtnRsbody(item.getRtnRsbody());
+//                bankDepositdescr.setRtnRsbody(item.getRtnRsbody());
                 bankDepositdescr.setRtnRcrdtotnum(item.getRtnRcrdtotnum());
                 bankDepositdescr.setRtnCrnpgno(item.getRtnCrnpgno());
                 bankDepositdescr.setRtnPgrcrdnum(item.getRtnPgrcrdnum());
@@ -867,7 +867,7 @@ public class BidTenderController extends BaseController {
                 bankDepositdescr.setRtnMbrshpno(item.getRtnMbrshpno());
                 bankDepositdescr.setRtnSvcfee(item.getRtnSvcfee());
                 bankDepositdescr.setRtnRemark(item.getRtnRemark());
-                bankDepositdescr.setReason("供应商修改信息异常");
+                bankDepositdescr.setReason("供应商银行信息已录入,无须退款");
                 remoteDepositService.insertDepositReason(bankDepositdescr,SecurityConstants.INNER);
                 continue;
             }

+ 50 - 18
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/controller/BidWinningResultsController.java

@@ -178,28 +178,27 @@ public class BidWinningResultsController extends BaseController {
 
             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);
+//            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());
 
             // 存储变更记录
             int i = bidChangeRecordService.insertBidChangeRecord(bidChangeRecord);
+            bidWinningResultsService.insertBidWinningResults(bidWinningResults);
             return success("变更成功");
-
         }
         return toAjax(bidWinningResultsService.insertBidWinningResults(bidWinningResults));
     }
@@ -235,6 +234,39 @@ public class BidWinningResultsController extends BaseController {
                 case 3:
                     obj.setNode("通过审核");
                     obj.setOpinion("生效");
+                    BidWinningResults bidWinningResults1 = bidWinningResultsService.selectBidWinningResultsByGsId(bidWinningResults.getGsId());
+                    if(bidWinningResults1.getGsState() == 2) {
+                        Long sid = bidWinningResults1.getSid();
+                        String sName = bidWinningResults1.getTenderName();
+                        Long oid = bidWinningResults1.getHid();
+                        String oName = bidWinningResults1.gethName();
+                        Long cid = bidWinningResults1.getSuppliersChange();
+                        String cName = bidWinningResults1.getSupplierNameChange();
+                        BidWinner bidWinner = bidWinnerService.selectBidWinnerBySid(sid);
+                        Long wid = bidWinner.getWid();
+
+                        Map<String,Long> map = new HashMap<>();
+                        map.put("sid",sid);
+                        map.put("hid",cid);
+                        BidQuote bidQuote = bidQuoteService.selectQuoteBySupplier(map);
+
+                        BigDecimal finalPrice = bidQuote.getQuotePrice();
+
+                        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);
+                    }
                     break;
                 case 5:
                     obj.setNode("通过审核");

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

@@ -63,6 +63,8 @@ public class BidCommittee extends BaseEntity
 
     private Integer isLeader;
 
+    private Long csid;
+
     private com.ruoyi.system.api.domain.BsExpert bsExpert;
 
     private List<BsExpert> expertList;
@@ -212,4 +214,12 @@ public class BidCommittee extends BaseEntity
     public void setIsLeader(Integer isLeader) {
         this.isLeader = isLeader;
     }
+
+    public Long getCsid() {
+        return csid;
+    }
+
+    public void setCsid(Long csid) {
+        this.csid = csid;
+    }
 }

+ 11 - 0
ruoyi-modules/hh-bidding/src/main/java/com/hh/bidding/domain/Earnest.java

@@ -1,6 +1,7 @@
 package com.hh.bidding.domain;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @author GMCS
@@ -37,6 +38,8 @@ public class Earnest {
 
     private Long hid;
 
+    private Date createTime;
+
     public Long getSid() {
         return sid;
     }
@@ -141,6 +144,14 @@ public class Earnest {
         this.hid = hid;
     }
 
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
     @Override
     public String toString() {
         return "Earnest{" +

+ 93 - 0
ruoyi-modules/hh-bidding/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/home/ruoyi/logs" />
+    <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+	
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+	
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+	
+	<!-- 系统模块日志级别控制  -->
+	<logger name="com.ruoyi" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+	
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration> 

+ 4 - 1
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidCommitteeMapper.xml

@@ -16,10 +16,11 @@
         <result property="jid"    column="jid"    />
         <result property="sid"    column="sid"    />
         <result property="isLeader" column="is_leader" />
+        <result property="status" column="status" />
     </resultMap>
 
     <sql id="selectBidCommitteeVo">
-        select pb_id, xid, pb_name, pb_sex, pb_idcard, pb_phone, pb_genre, pb_types, jid,sid,is_leader from bid_committee
+        select pb_id, xid, pb_name, pb_sex, pb_idcard, pb_phone, pb_genre, pb_types, jid,sid,is_leader,status from bid_committee
     </sql>
 
     <select id="selectBidCommitteeList" parameterType="com.hh.bidding.domain.BidCommittee" resultMap="BidCommitteeResult">
@@ -64,6 +65,7 @@
             <if test="sid != null">sid,</if>
             <if test="userId != null">user_id,</if>
             <if test="status != null">status,</if>
+            <if test="isLeader != null">is_leader,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="pbId != null">#{pbId},</if>
@@ -78,6 +80,7 @@
             <if test="sid != null">#{sid},</if>
             <if test="userId != null">#{userId},</if>
             <if test="status != null">#{status},</if>
+            <if test="isLeader != null">#{isLeader},</if>
         </trim>
     </insert>
 

+ 2 - 1
ruoyi-modules/hh-bidding/src/main/resources/mapper/BidQuoteMapper.xml

@@ -123,7 +123,7 @@
     </delete>
 
     <select id="selectEarnList" parameterType="com.hh.bidding.domain.EarnParam" resultType="com.hh.bidding.domain.Earnest">
-        select q.sid,q.status,q.contact,q.contact_phone,q.qid,q.hid,
+        select q.sid,q.status,q.contact,q.contact_phone,q.qid,q.hid,q.create_time,
                t.s_code,t.owner_dept,
                n.u_title,
                p.a_name,p.earnest_money,
@@ -140,6 +140,7 @@
             <if test="supplier != null  and supplier != ''">and s.h_name like concat('%', #{supplier}, '%')</if>
             and q.status = 2
         </where>
+        order by q.create_time desc
     </select>
 
     <select id = "selectQuoteBySupplier" parameterType="map">

+ 93 - 0
ruoyi-modules/hh-mast/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/home/ruoyi/logs" />
+    <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+	
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+	
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+	
+	<!-- 系统模块日志级别控制  -->
+	<logger name="com.ruoyi" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+	
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration> 

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

@@ -156,6 +156,10 @@ public class PpmProcurementPlan extends BaseEntity
 
     private Integer sState;
 
+    private String changeFile;
+
+    private Integer cState;
+
     public Long getOwnerDept() {
         return ownerDept;
     }
@@ -485,6 +489,22 @@ public class PpmProcurementPlan extends BaseEntity
         this.sState = sState;
     }
 
+    public String getChangeFile() {
+        return changeFile;
+    }
+
+    public void setChangeFile(String changeFile) {
+        this.changeFile = changeFile;
+    }
+
+    public Integer getcState() {
+        return cState;
+    }
+
+    public void setcState(Integer cState) {
+        this.cState = cState;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 93 - 0
ruoyi-modules/hh-procure/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/home/ruoyi/logs" />
+    <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+	
+	<!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+	
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+	
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+	
+	<!-- 系统模块日志级别控制  -->
+	<logger name="com.ruoyi" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+	
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration> 

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

@@ -102,7 +102,8 @@
     </select>
 
     <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
+        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,
+               t.c_state,t.change_file
         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}

+ 9 - 0
ruoyi-ui/src/api/system/expert.js

@@ -42,3 +42,12 @@ export function delExpert(jid) {
     method: "delete",
   });
 }
+
+// 同步项目专家
+export function followExpert(data) {
+  return request({
+    url: "/bidding/committee/follow",
+    method: "post",
+    data: data,
+  });
+}

+ 6 - 0
ruoyi-ui/src/views/guarantee/examine/index.vue

@@ -30,6 +30,7 @@
         <el-table-column label="供应商联系人" align="center" prop="contact" />
         <el-table-column label="供应商联系电话" align="center" prop="contactPhone" />
         <el-table-column label="应交保证金" align="center" prop="earnestMoney" />
+        <el-table-column label="创建时间" align="center" prop="createTime" :formatter="formatterDate" />
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template slot-scope="scope">
             <el-button
@@ -52,6 +53,7 @@
 import { selectEarnList } from "@/api/guarantee/guarantee";
 import { UpdateQuote } from '@/api/system/quote'
 import { checkRole } from "@/utils/permission";
+import dayjs from 'dayjs'
   
   export default {
     name: "Baozhengjin",
@@ -82,6 +84,10 @@ import { checkRole } from "@/utils/permission";
     },
     methods: {
       checkRole,
+
+      formatterDate(row, column) {
+        return dayjs(row.createTime).format('YYYY-MM-DD HH:mm');
+      },
       
       /** 查询公告列表 */
       getList() {

+ 1 - 1
ruoyi-ui/src/views/procurementSourcing/detail.vue

@@ -60,7 +60,7 @@
         </el-descriptions>
         <div style="margin-top: 20px;">采购明细</div>
         <el-divider></el-divider>
-        <el-table ref="elTable" max-height="250" :data="detail.ppmProcurementDetailList" border
+        <el-table ref="elTable" max-height="500" :data="detail.ppmProcurementDetailList" border
           style="margin-top: 20px">
           <el-table-column label="序号" align="center" width="80">
             <template slot-scope="scope">

+ 1 - 1
ruoyi-ui/src/views/purchase/otb/detail.vue

@@ -60,7 +60,7 @@
         </el-descriptions>
         <div style="margin-top: 20px;">采购明细</div>
         <el-divider></el-divider>
-        <el-table ref="elTable" max-height="250" :data="detail.ppmProcurementDetailList" border
+        <el-table ref="elTable" max-height="500" :data="detail.ppmProcurementDetailList" border
           style="margin-top: 20px">
           <el-table-column label="序号" align="center" width="80">
             <template slot-scope="scope">

+ 1 - 1
ruoyi-ui/src/views/purchase/otb/insert.vue

@@ -156,7 +156,7 @@
           <el-button type="success" icon="el-icon-plus" @click="addMaterial" size="mini">新增一行</el-button>
           <el-button type="primary" icon="el-icon-upload2" @click="importMaterial" size="mini">导入</el-button>
         </div>
-        <el-table ref="elTable" max-height="250" :data="form.ppmProcurementDetailList" border style="margin-top: 20px">
+        <el-table ref="elTable" max-height="620" :data="form.ppmProcurementDetailList" border style="margin-top: 20px">
           <el-table-column label="序号" align="center" width="80">
             <template slot-scope="scope">
               <span>{{ scope.$index + 1 }}</span>

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

@@ -41,8 +41,8 @@
         </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>
+            <el-button v-if="activeName == 'second'" @click="handleInfo(scope.row)" type="text" size="small">查看详情</el-button>
+            <el-button v-if="activeName == 'first'" @click="applyTermination(scope.row)" type="text" size="small">申请变更</el-button>
           </template>
         </el-table-column>
       </el-table>

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

@@ -84,6 +84,14 @@
                 <a :href="item.url" target="_blank" :download="item.name">{{ item.name }}</a>
             </div>
           </div>
+
+          <div v-if="detail.changeFile && detail.changeFile.length > 0" style="margin-top: 20px;">
+            <div>申请中标变更附件</div>
+            <el-divider></el-divider>
+            <div v-for="item, index in detail.changeFile" :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">
@@ -270,6 +278,12 @@
             const stopFileArr = JSON.parse(stopFile);
             this.detail.stopFile = stopFileArr;
         }
+
+        const changeFile = data.changeFile
+        if (changeFile) {
+            const changeFileArr = JSON.parse(changeFile);
+            this.detail.changeFile = changeFileArr;
+        }
   
         const res2 = await getPlanDetailsByAid(this.aid)
         this.detail.ppmProcurementDetailList = res2.rows

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

@@ -19,6 +19,11 @@
             <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" />

+ 32 - 5
ruoyi-ui/src/views/tender/tender1/components/CompExpert.vue

@@ -7,6 +7,8 @@
     <el-button v-if="queryParams.status != 1 && checkRole(['operator', 'commander'])" type="primary" plain
       @click="openExtractExpert">申请开始专家抽取流程</el-button>
 
+      
+    <el-button v-if="checkRole(['operator', 'commander'])" type="primary" plain @click="openAppointExpert">直接指定专家</el-button>
     <el-button v-if="queryParams.status == 1 && checkRole(['operator', 'commander'])" type="primary" plain
       icon="el-icon-plus" @click="startExtractExpert">抽取/补抽专家</el-button>
 
@@ -14,7 +16,7 @@
       <el-button v-if="queryParams.status == 1 && checkRole(['operator', 'commander'])" type="primary" plain
         icon="el-icon-bell" @click="batchNotification"
         :disabled="multipleSelection && multipleSelection.length == 0">批量通知专家</el-button>
-      <el-button v-if="queryParams.status == 1 && checkRole(['operator', 'commander'])" type="danger" plain
+      <el-button v-if="checkRole(['operator', 'commander'])" type="danger" plain
         icon="el-icon-delete" @click="handleDelete()"
         :disabled="multipleSelection && multipleSelection.length == 0">批量删除</el-button>
 
@@ -86,6 +88,10 @@
       <CompExtractCondition :sName="sName" :tenderList="tenderList" @closeApplication="closeApplication">
       </CompExtractCondition>
     </el-dialog>
+
+    <el-dialog title="同步项目专家" :visible.sync="openAppointExpertDialog" width="60%">
+      <CompSearchProject @selectedProject="handleSelectedProject" />
+    </el-dialog>
   </div>
 </template>
 
@@ -95,11 +101,12 @@ import {
   findCommitAndExpert, updateLeader, getCommitteeList, saveAddCommittee
 } from "@/api/system/tender/committee";
 import { findTenderNotice, getTender, updateIsApply } from "@/api/system/tender/tender";
-import { listExpert } from "@/api/system/expert";
+import { listExpert, followExpert } from "@/api/system/expert";
 import { sendCall } from "@/api/contact/contact";
 import { addApplications, getmaxApp, listApplications, updateApplications } from "@/api/system/tender/bidApplication";
 import { checkRole } from "@/utils/permission"; // 权限判断函数
 import CompExtractCondition from './CompExtractCondition.vue'
+import CompSearchProject from "./CompSearchProject.vue";
 
 export default {
   props: {
@@ -160,11 +167,14 @@ export default {
       openExtractExpertDialog: false,
       multipleSelection: [],
       // 专家通知列表
-      expertPhoneList: []
+      expertPhoneList: [],
+
+      openAppointExpertDialog: false
     };
   },
   components: {
-    CompExtractCondition
+    CompExtractCondition,
+    CompSearchProject
   },
   async created () {
     this.queryParams.sid = this.$route.query.sid;
@@ -187,6 +197,10 @@ export default {
       this.getExerptList(this.queryParams.sid);
     },
 
+    openAppointExpert() {
+      this.openAppointExpertDialog = true
+    },
+
     startExtractExpert () {
       // 随机抽取专家
       getCommitteeList({
@@ -321,7 +335,20 @@ export default {
             this.getExerptList(this.queryParams.sid);
           }
         })
-    }
+    },
+
+    /** 选中项目事件 */
+    handleSelectedProject (row) {
+      console.log("选中项目事件", row);
+      this.openAppointExpertDialog = false;
+      this.loading = true;
+      followExpert({
+        sid: row.sid,
+        csid: this.queryParams.sid
+      }).then(res => {
+        this.getExerptList()
+      })
+    },
   }
 };
 </script>

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

@@ -1,7 +1,7 @@
 <template>
   <div style="margin: 10px 10px 10px 20px">
     <div class="box">采购明细</div>
-    <el-table ref="elTable" max-height="250" :data="tableData" border style="margin-top: 20px">
+    <el-table ref="elTable" max-height="500" :data="tableData" border style="margin-top: 20px">
       <el-table-column label="序号" align="center" width="80">
         <template slot-scope="scope">
           <span>{{ scope.$index + 1 }}</span>

+ 121 - 0
ruoyi-ui/src/views/tender/tender1/components/CompSearchProject.vue

@@ -0,0 +1,121 @@
+<template>
+	<div>
+		<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
+			<el-form-item label="项目编码" prop="sCode">
+				<el-input
+					v-model="queryParams.sCode"
+					placeholder="请输入项目编码"
+					clearable
+					@keyup.enter.native="handleQuery"
+				/>
+			</el-form-item>
+			<el-form-item label="项目名称" prop="sName">
+				<el-input
+					v-model="queryParams.sName"
+					placeholder="请输入项目名称"
+					clearable
+					@keyup.enter.native="handleQuery"
+				/>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+				<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+			</el-form-item>
+		</el-form>
+		<el-table border :data="data" v-loading="loading">
+			<el-table-column label="项目编码" align="center" prop="sCode"/>
+			<el-table-column label="项目名称" align="center" prop="sName"/>
+      		<el-table-column label="采购单位" align="center" prop="sUnit" />
+			<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 size="mini" type="text" icon="el-icon-check"
+						@click="handleSelectedProject(scope.row)">同步该项目专家</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 { listTender } from '@/api/system/tender/tender'
+
+export default {
+	model: {
+		prop: 'value',
+		event: 'changeValue'
+	},
+	props: {
+		search: String
+	},
+	data() {
+		return {
+			queryParams: {
+				pageNum: 1,
+				pageSize: 10,
+				sCode: '',
+				sName: ''
+			},
+			total: 0,
+			data: [],
+			loading: false,
+		}
+	},
+	dicts: ["bid_tender_state"],
+	computed: {
+		project: {
+			get() {
+				return this.value
+			},
+			set(value) {
+				this.$emit('changeValue', value)
+			}
+		}
+	},
+	created() {
+		// this.getList()
+	},
+	methods: {
+		getList() {
+			this.loading = true;
+			
+			listTender(this.queryParams).then(response => {
+				this.data = response.rows;
+				this.total = response.total;
+				this.loading = false;
+			});
+		},
+		handleQuery() {
+			this.queryParams.pageNum = 1;
+			this.getList()
+		},
+		resetQuery() {
+			this.queryParams.sCode = ''
+			this.queryParams.sName = ''
+			this.queryParams.pageNum = 1;
+			this.getList()
+		},
+		handleSelectedProject(row, column, cell, event) {
+			this.$modal.confirm('确认同步项目名为"' + row.sName + '"的评标委员会?')
+			.then(() => {
+				this.$emit('selectedProject', row)
+			}).catch(() => { });
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 2 - 2
ruoyi-ui/src/views/tender/tender1/index.vue

@@ -38,7 +38,7 @@
       </el-tab-pane>
     </el-tabs>
 
-    <el-table v-loading="loading" :data="tenderList">
+    <el-table v-loading="loading" :data="tenderList" :default-sort="{prop: 'uKaiTime', order: 'descending'}">
       <el-table-column label="序号" align="center" prop="orderNum" width="60" />
       <el-table-column label="项目编号" align="center" prop="sCode" width="170" />
       <el-table-column label="项目名称" align="center" prop="sName" min-width="150" />
@@ -54,7 +54,7 @@
           <dict-tag :options="dict.type.quote_mode" :value="scope.row.quoteMode" />
         </template>
       </el-table-column>
-      <el-table-column label="开标时间" align="center" prop="uKaiTime" width="100" />
+      <el-table-column label="开标时间" align="center" prop="uKaiTime" width="100" sortable />
       <el-table-column label="项目状态" align="center" prop="sProjectState">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.bid_tender_state" :value="scope.row.sProjectState" />