فهرست منبع

Merge branch 'product' of http://1.116.113.26:8088/zhuliu/xiaoshi_system into product

zhuliu 1 سال پیش
والد
کامیت
135b464e87

+ 1 - 1
src/views/product/components/dialog/addEditProduct.vue

@@ -127,7 +127,7 @@ export default {
       productCategoryList:[],
       //产品类别分页信息
       queryParams:{
-        size:10,
+        size:3,
         current:1
       },
       //是否懒加载

+ 191 - 16
src/views/report/components/dialog/addAndEditReport.vue

@@ -160,13 +160,50 @@
         <el-button type="primary" @click="submit" v-else>确 定</el-button>
       </div>
     </el-dialog>
+
+    <!-- 审核弹窗 -->
+    <el-dialog title="添加审核任务" :visible.sync="showTask" width="500px" @close="handleCloseTask">
+      <el-form :model="taskForm" :rules="TaskRules" ref="TaskForm" label-width="120px" v-loading="loading">
+        <el-form-item label="任务名称:" prop="taskName">
+          <el-input v-model="taskForm.taskName" type="text" placeholder="输入任务名称" />
+        </el-form-item>
+        <el-form-item label="审核人:" prop="personnelId">
+          <el-select style="width:100%;" ref="select1" v-model="taskForm.personnelId" clearable filterable remote
+            :remote-method="remoteMethodPerson" v-SelectLazyLoading="lazyLoadingPerson">
+            <el-option v-for="item in personnelList" :key="item.id" :label="item.personnelName" :value="item.id"
+              placeholder="请选择审核人"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="完成日期:" prop="endTime">
+          <el-date-picker style="width:100%" v-model="taskForm.endTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
+            placeholder="选择日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="审核备注:" prop="remark">
+          <el-input v-model="taskForm.remark" type="textarea" placeholder="输入备注" />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleCloseTask">取 消</el-button>
+        <el-button type="primary" @click="submitTask">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 无效应对报告下一步所打开弹窗 -->
+    <el-dialog :visible.sync="showEvidenceAndRequest" width="1000px" :close-on-click-modal="false">
+      <evidenceAndRequest ref="evidence" :examine="true" :reportId="reportId" @show="showEvidenceAndRequest = false"></evidenceAndRequest>
+    </el-dialog>
+
   </div>
 </template>
 
 <script>
 import { mapGetters } from 'vuex'
+import evidenceAndRequest from './evidenceAndRequest.vue'
 export default {
-  components: {},
+  components: {
+    evidenceAndRequest,
+  },
   props: {},
   data() {
     const isExist = (rule, value, callback) => {
@@ -180,6 +217,22 @@ export default {
         callback(new Error(text))
       }
     }
+    const isTime = (rule, value, callback) => {
+      if (this.isEndTime) {
+        this.isEndTimes = Date.parse(new Date)
+      }
+
+      let b = Date.parse(value)
+      if (value) {
+        if (b < this.isEndTimes) {
+          callback(new Error('禁止选择现在及以前时间,请重新选择'))
+        } else {
+          callback()
+        }
+      } else {
+        callback(new Error('请选择时间'))
+      }
+    }
     return {
       //弹窗标题
       title: '',
@@ -237,6 +290,23 @@ export default {
       },
       //是否懒加载
       isLazy: true,
+      matterType: null,
+      // 报告id
+      reportId:null,
+      /*审核弹窗所需变量start*/
+      showTask: false,
+      taskForm: {},
+      isEndTime: true,
+      isEndTimes: null,
+      TaskForm: {
+        taskName: [{ required: true, message: '请输入任务名称', trigger: 'blur' },],
+        personnelId: [{ required: true, message: '请选择审核人', trigger: 'change' },],
+        endTime: [{ required: true, validator: isTime, trigger: 'change' }],
+      },
+      /*审核弹窗所需变量end*/
+      /*无效应对报告下一步弹窗所需变量start*/
+      showEvidenceAndRequest:false,
+      /*无效应对报告下一步弹窗所需变量end*/
     };
   },
   watch: {},
@@ -388,15 +458,21 @@ export default {
         this.$message.error(error.message)
       })
     },
-    //关闭弹窗
-    handleClose() {
-      this.$refs.reportForm.resetFields()
-      this.form = {}
-      this.showDialog = false
-    },
     //切换是否完成状态
     changeStatus(val) {
-      this.form.status = val
+      if (val == 3) {
+        this.rules.personId[0].required = false
+        this.rules.clientId[0].required = false
+        if (!this.form.id) {
+          this.$set(this.form, 'conclusionIds', [])
+        }
+        this.conclusion = this.dictMessage[this.reportAsDicItem[this.form.type]]
+        this.matterType = 2
+      } else {
+        this.rules.personId[0].required = true
+        this.rules.clientId[0].required = true
+        this.matterType = null
+      }
     },
     //获取专利号且填入报告名称
     getPatentNo() {
@@ -495,8 +571,6 @@ export default {
       })
       window.open(router.href, '_blank');
     },
-    //创建无效应对报告下一步
-    ifNext() { },
     //提交填写的信息
     submit() {
       this.$refs.reportForm.validate(valid => {
@@ -507,23 +581,124 @@ export default {
               formData.append("files", this.files[i]);
             }
           }
-          formData.append('report',this.form)
+          formData.append('report', this.form)
           if (!this.form.id) {//新增报告
-            this.$api.AddReport(formData).then(response => {
+            this.$confirm('是否需要进行审核?', '提示', {
+              confirmButtonText: '是',
+              cancelButtonText: '否',
+              closeOnClickModal: false,
+              distinguishCancelAndClose: true,
+            }).then(() => {//审核打开审核弹窗
+              this.showTask = true
+              this.$set(this.taskForm, 'taskName', this.form.name + '审核')
+            }).catch(action => {//不审核直接创建报告
+              // 调用创建报告公用,接口
+              this.addReport(formData)
+            });
+
+          } else {//编辑报告
+            this.$api.UpdateReport(formData).then(response => {
               if (response.code == 200) {
                 this.files = []
-                this.$message.success('报告创建成功')
+                this.$message.success('报告更新成功')
                 this.$emit('getList', true)
                 this.handleClose()
               }
             })
-
-          } else {//编辑报告
-
           }
         }
       })
     },
+    //关闭弹窗
+    handleClose(val) {
+      if (this.form.type == 7 && val) {
+        this.showEvidenceAndRequest = true
+        this.$s.setSession('params', {})
+        this.reportId=val
+      }
+      this.$refs.reportForm.resetFields()
+      this.form = {}
+      this.showDialog = false
+    },
+    // 创建报告创建接口公用
+    addReport(formData) {
+      this.$api.AddReport(formData).then(response => {
+        if (response.code == 200) {
+          this.files = []
+          this.$message.success('报告创建成功')
+          this.$emit('getList', true)
+          // response.data是创建成功后返回的报告id
+          this.handleClose(response.data)
+        }
+      })
+    },
+    //提交审核任务
+    submitTask() {
+      this.isEndTime = false
+      this.$refs.TaskForm.validate((valid) => {
+        if (valid) {
+          let formData = new FormData()
+          if (this.files && this.files.length > 0) {
+            for (var i = 0; i < this.files.length; i++) {
+              formData.append("files", this.files[i]);
+            }
+          }
+          let a = {
+            report: this.form,
+            personIds: [this.taskForm.personnelId],
+            taskName: this.taskForm.taskName,
+            endTime: this.taskForm.endTime,
+            remark: this.taskForm.remark,
+            type: 0,
+          }
+          formData.append('taskVO', JSON.stringify(a))
+          this.$api.AddTask(formData).then(response => {
+            if (response.code == 200) {
+              this.files = []
+              this.$message.success('报告创建成功并发送审核')
+              this.$emit('getList', true)
+              this.handleCloseTask()
+              this.handleClose()
+            }
+          }).catch(error => {
+            this.$message.error('报告创建失败')
+            this.handleCloseTask()
+          })
+        }
+      })
+    },
+    //关闭审核弹窗
+    handleCloseTask() {
+      this.matterType = null
+      this.$refs.TaskForm.resetFields()
+      this.taskForm = {}
+      this.showTask = false
+      this.isEndTime = true
+    },
+    // 创建无效应对报告下一步
+    ifNext() {
+      this.$refs.reportForm.validate((valid) => {
+        if (valid) {
+          let formData = new FormData()
+          if (this.files && this.files.length > 0) {
+            for (var i = 0; i < this.files.length; i++) {
+              formData.append("files", this.files[i]);
+            }
+          }
+          formData.append('report', this.form)
+          this.addReport(formData)
+        } else {
+          this.loading = false
+          this.$alert('校验未通过,请按照要求创建报告', '提示', {
+            confirmButtonText: '确定',
+            type: 'warning',
+            callback: action => {
+            }
+          });
+          return false;
+        }
+      })
+    },
   },
 };
 </script>

+ 372 - 0
src/views/report/components/dialog/evidenceAndRequest.vue

@@ -0,0 +1,372 @@
+<template>
+  <div>
+    <div style="margin-bottom: 10px;float: right;" v-if="$reportPermission(reportId, [0, 1])">
+      <el-button type="primary" size="small" v-if="examine" @click="andClick('1')">上传无效请求书</el-button>
+      <el-dropdown trigger="click" @command="andClick($event)" :hide-on-click="false" type="primary" size="small">
+        <el-button type="primary" size="small">
+          上传证据文献<i class="el-icon-arrow-down el-icon--right"></i>
+        </el-button>
+        <el-dropdown-menu slot="dropdown" class="text-align_center">
+          <el-dropdown-item>
+            <el-dropdown @command="andClick($event)" placement="right-start">
+              <span class="el-dropdown-link"> 上传专利文件 </span>
+              <el-dropdown-menu class="children_item">
+                <el-dropdown-item command="3">专利号导入</el-dropdown-item>
+                <el-dropdown-item command="2">Excel导入</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </el-dropdown-item>
+          <el-dropdown-item command="5">上传非专利文件</el-dropdown-item>
+        </el-dropdown-menu>
+      </el-dropdown>
+
+      <el-button class="margin-left_10" type="primary" size="small" v-if="examine" @click="isExamine">报告审核</el-button>
+    </div>
+    <div>
+      <el-table :data="tableData" border style="width: 100%" v-if="show">
+        <el-table-column prop="sortStr" align="center" label="排序" min-width="180">
+          <template slot-scope="scope">
+            <div>
+              <el-link type="primary" @click="check(scope.row)">{{ scope.row.sortStr }}</el-link>
+              <el-popover placement="bottom" width="200" trigger="click" v-if="$reportPermission(reportId, [0, 1])">
+                <p>将本文件(<span style="color:red">{{ scope.row.sortStr }}</span>)作为:</p>
+                <el-tree ref="tree" :data="tableAll" :props="{ label: 'sortStr', value: 'id' }" :allow-drop="allowDrop"
+                  draggable style="height: 300px;overflow: auto;">
+                  <span class="custom-tree-node" slot-scope="{ node, data }"><el-radio v-model="val"
+                      @input="changeRadio(scope.row, data)" :label="data.id">{{ data.sortStr }}</el-radio></span>
+                </el-tree>
+                <p style="color:red">备注:选择其中一个文件与其交换位置</p>
+                <i class="el-icon-arrow-down el-icon--right" @click="getVal(scope.row)" slot="reference"></i>
+              </el-popover>
+            </div>
+          </template>
+
+        </el-table-column>
+        <el-table-column prop="proofName" align="center" label="名称" min-width="180"> </el-table-column>
+        <el-table-column prop="proofType" align="center" label="文件类型" min-width="180"> </el-table-column>
+        <el-table-column prop="remark" align="center" label="备注" min-width="180">
+          <template slot-scope="scope">
+            <div>{{ scope.row.remark ? scope.row.remark : '——' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="操作" width="100" v-if="$reportPermission(reportId, [0, 1])">
+          <template slot-scope="scope">
+            <div>
+              <el-button type="text" size="small" @click="handleDelete(scope.row)" style="color:red"> 删 除 </el-button>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="text-align: center;margin-top: 10px;">
+        <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
+          :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="queryParams.total">
+        </el-pagination>
+      </div>
+    </div>
+
+    <responseDialog ref="responseDialog" :reportId='reportId' @isFinish="handleFinish"></responseDialog>
+
+    <el-dialog title="添加审核任务" :visible.sync="showTask" width="500px" @close="handleCloseTask" append-to-body
+      :close-on-click-modal="false">
+      <el-form :model="task" :rules="TaskRules" ref="TaskForm" label-width="120px">
+        <el-form-item label="任务名称 :" prop="taskName">
+          <el-input v-model="task.taskName" type="text" placeholder="输入主题" />
+        </el-form-item>
+        <el-form-item label="审核人 :" prop="personnelId">
+          <el-select style="width:100%;" ref="select1" v-model="task.personnelId" clearable filterable>
+            <el-option v-for="item in personnelList" :key="item.id" :label="item.personnelName"
+              :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="完成日期 :" prop="endTime">
+          <el-date-picker style="width:100%" v-model="task.endTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
+            placeholder="选择日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注 :" prop="remark">
+          <el-input v-model="task.remark" type="textarea" placeholder="输入备注" />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleCloseTask">取 消</el-button>
+        <el-button type="primary" @click="submitTask">确 定</el-button>
+      </span>
+    </el-dialog>
+
+
+    <el-dialog :title="title" :visible.sync="showFile" width="1200px" @close="handleFile" append-to-body
+      :close-on-click-modal="false">
+      <!-- <importPatent :reportId="this.queryParams.reportId"></importPatent> -->
+      <component :is='isComponent' :reportId="this.queryParams.reportId" :downloadId="8"></component>
+      <!-- <span slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitFile" >确 定</el-button>
+        </span> -->
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import responseDialog from "./responseDialog.vue"
+// import ExcelImport from "@/views/components/import/excelImport/importPatent.vue"
+// import PatentNoImport from "@/views/components/import/PatentNoImport/download.vue"
+
+export default {
+  props: ['reportId', 'signPatentNo', 'examine'],
+  components: {
+    responseDialog,
+    // ExcelImport,
+    // PatentNoImport
+  },
+  data() {
+    const isTime = (rule, value, callback) => {
+      if (this.isEndTime) {
+        this.isEndTimes = Date.parse(new Date)
+      }
+
+      let b = Date.parse(value)
+      if (value) {
+        if (b < this.isEndTimes) {
+          callback(new Error('禁止选择现在及以前时间,请重新选择'))
+        } else {
+          callback()
+        }
+      } else {
+        callback(new Error('请选择时间'))
+      }
+    }
+    return {
+      tableData: [],
+      tableAll: [],//排序所用,全部的证据文献
+      queryParams: {
+        reportId: this.reportId,
+        signPatentNo: this.signPatentNo,
+        size: 10,
+        current: 1,
+        orderType: '',//asc,desc
+        total: 0,
+      },
+      form: {},
+      showTask: false,
+      showFile: false,
+      title: '',
+      isComponent: '',
+      task: {},
+      TaskRules: {
+        taskName: [{ required: true, message: '请输入任务名称', trigger: 'blur' },],
+        personnelId: [{ required: true, message: '请选择审核人', trigger: 'change' },],
+        endTime: [{ required: true, validator: isTime, trigger: 'change' }],
+      },
+      personnelList: [],//全部人员
+      val: null,
+      show: true,
+    }
+  },
+  computed: {
+  },
+  watch: {
+  },
+  mounted() {
+    this.getList()
+    this.getListTable()
+    //创建报告时打开
+    if (this.examine) {
+      this.getAllPersonnelList()
+    }
+  },
+  methods: {
+    // 删除证据文献
+    handleDelete(row) {
+      this.$confirm('此操作将删除该证据文献, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let ids = [row.id]
+        var index = this.tableAll.findIndex(item => {
+          return item.id == row.id
+        })
+        this.tableAll.splice(index, 1)
+        this.$api.deleteCompareFile(ids).then(response => {
+          if (response.code == 200) {
+            // this.getList()
+            this.$message.success('删除证据文献成功')
+            this.addOrder()
+          }
+        })
+      }).catch(() => {
+        this.$message.info('已取消删除');
+      });
+    },
+    //查看证据文献
+    check(val) {
+      // var router = this.$router.resolve({
+      //   path: '/ContrastIndex/' + val.id,
+      // })
+      var router = this.$router.resolve({
+        path: '/checkFileDetails/' + val.id,
+      })
+      let params = this.$s.getSession('params')
+      params.type = 7
+      params.reportType = 7
+      params.aid = val.id
+      params.signPatentNo = this.signPatentNo || val.proofConditions
+      params.reportId = this.queryParams.reportId
+      this.$s.setSession('params', params)
+      window.open(router.href, '_blank');
+    },
+    //获取当前文献id
+    getVal(val) {
+      this.val = val.id
+    },
+    //上下拖动
+    allowDrop(draggingNode, dropNode, type) {
+      if (draggingNode.level == dropNode.level) {
+        return type === 'next' || type === 'prev'
+      } else {
+        return type === 'prev'
+      }
+    },
+    //交换文献
+    changeRadio(val1, node) {
+      var index1 = this.tableAll.findIndex(item => {//获取当前专利位置
+        return item.id == val1.id
+      })
+      var index2 = this.tableAll.findIndex(item => {//获取选中专利位置
+        return item.id == node.id
+      })
+      this.tableAll[index1] = this.tableAll.splice(index2, 1, this.tableAll[index1])[0]
+      this.addOrder()
+    },
+    //证据文献排序
+    addOrder() {
+      var params = {
+        "report": this.queryParams.reportId,
+        "orders": this.tableAll.map((item, index) => {
+          return {
+            id: item.id,
+            order: index + 1
+          }
+        })
+      }
+      this.$api.addProodOrder(params).then(response => {
+        if (response.code == 200) {
+          this.show = false
+          this.getList()
+          this.getListTable()
+          this.$nextTick(() => {
+            this.show = true
+          })
+        }
+      }).catch(error => {
+
+      })
+    },
+
+    // 报告审核按钮,打开审核弹窗
+    isExamine() {
+      this.showTask = true
+    },
+    // 审核确认
+    submitTask() {
+      this.$refs.TaskForm.validate((valid) => {
+        if (valid) {
+          let formData = new FormData()
+          let a = this.task
+          a.reportId = this.queryParams.reportId
+          a.personIds = [this.task.personnelId]
+          a.type = 0
+          formData.append('taskVO', JSON.stringify(a))
+          this.$api.AddTask(formData).then(response => {
+            if (response.code == 200) {
+              this.$message.success('报告创建成功并发送审核')
+              this.handleCloseTask()
+              this.$emit('show', false)
+            }
+          }).catch(error => {
+            this.$message.error('报告创建失败')
+          })
+        }
+      })
+    },
+    // 审核取消,关闭审核弹窗
+    handleCloseTask() {
+      this.$refs.TaskForm.resetFields()
+      this.task = {}
+      this.showTask = false
+    },
+    //获取全部人员
+    getAllPersonnelList() {
+      this.$api.getTenantPersonnel().then(response => {
+        this.personnelList = response.data
+      })
+    },
+    // 上传证据文献成功弹窗关闭
+    handleFinish(val) {
+      this.getList();
+      this.getListTable()
+    },
+    //分页查询证据文献
+    getList() {
+      this.$api.queryProof(this.queryParams).then((res) => {
+        if (res.code == 200) {
+          this.tableData = res.data
+          this.queryParams.size = res.pageColumn.size
+          this.queryParams.current = res.pageColumn.current
+          this.queryParams.total = res.pageColumn.total
+        }
+      }).catch((error) => {
+
+      })
+    },
+    //查询所有证据文献
+    getListTable() {
+      var params = {
+        size: 999,
+        current: 1,
+        reportId: this.queryParams.reportId
+      }
+      this.$api.queryProof(params).then((res) => {
+        if (res.code == 200) {
+          this.tableAll = res.data
+        }
+      }).catch((error) => {
+
+      })
+    },
+    //打开上传文件弹窗
+    andClick(val) {
+      switch (val) {
+        case '1':
+        case '5':
+          this.form.reportId = this.queryParams.reportId
+          this.form.processType = val
+          this.$refs.responseDialog.open(this.form)
+          break;
+        case '2':
+          this.title = 'Excel导入'
+          this.isComponent = 'ExcelImport'
+          this.showFile = true
+          break;
+        case '3':
+          this.title = '专利号导入'
+          this.isComponent = 'PatentNoImport'
+          this.showFile = true
+          break;
+      }
+    },
+    // 上传文件弹窗关闭
+    handleFile() {
+      this.getList()
+      this.getListTable()
+      this.showFile = false
+    },
+    // 分页
+    handleCurrentChange(val) {
+      this.queryParams.current = val;
+      this.getList();
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 260 - 0
src/views/report/components/dialog/responseDialog.vue

@@ -0,0 +1,260 @@
+<template>
+  <div class="responseDialog">
+    <el-dialog  :title="form.id?'编辑' +title[form.processType]:'添加' +title[form.processType]" :visible.sync="showDialog" width="500px" :close-on-click-modal="false"  :before-close="handleClose" append-to-body>
+      <el-form  :model="form" :rules="rules" ref="reportForm" label-width="120px" label-position="left" v-loading="loading">
+        <el-form-item v-if="form.processType!=5" :label="timeType[form.processType]">
+          <el-date-picker v-model="form.occuredTime" value-format="yyyy-MM-dd" type="date"  placeholder="请选择时间" style="width: 100%;"></el-date-picker>
+        </el-form-item>
+        <el-form-item v-else label="文献名称:" prop="fileName">
+          <el-input  v-model="form.fileName" autocomplete="off" placeholder="请输入文献名称"></el-input>
+        </el-form-item>
+        <template v-if="form.processType==0">
+          <el-form-item  label="地点">
+            <el-input  v-model="form.address" autocomplete="off" placeholder="请输入地点"></el-input>
+          </el-form-item>
+          <el-form-item  label="参与人">
+            <el-input  v-model="form.participants" autocomplete="off" placeholder="请输入参与人"></el-input>
+          </el-form-item>
+        </template>
+        <el-form-item v-if="form.processType!=0" label="附件:">
+          <template>
+            <div> 
+              <p v-if="form.reportFile && form.reportFile.name">{{ form.reportFile.name }}</p>
+              <el-upload  ref="upload" class="upload-file" drag action="#" :auto-upload="false" :show-file-list="true" :on-change="onChange" :limit="1"  :on-remove="handleRemove" :on-exceed="handleExceed">
+                <i :class="!file ? 'el-icon-upload' : 'el-icon-refresh'"></i>
+                <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+                <div class="el-upload__tip" slot="tip"></div>
+              </el-upload>
+            </div>
+          </template>
+             
+        </el-form-item>
+        <el-form-item v-if="form.processType==5" label="备注内容:">
+          <el-input type='textarea' v-model="form.remark" autocomplete="off" placeholder="请输入备注"></el-input>
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">取 消</el-button>
+        <el-button type="primary" @click="finish" >确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props:['reportId'],
+  data() {
+    return {
+      showDialog: false,
+      loading: false,
+      form: {},
+      rules: {},
+      Already: [],
+      file: [],
+      isFinish: false,
+      timeType: {
+        '1': '提出无效时间',
+        '2': '陈述答复时间',
+        '0': '口审时间',
+        '3': '无效决定时间',
+        '4': '发起诉讼时间',
+      },
+      title: {
+        // type为5是非专利文献,后台未定义
+        '1': '无效请求书',
+        '2': '陈述意见书',
+        '0': '口审记录',
+        '3': '无效决定书',
+        '4': '行政诉讼书',
+        '5': '非专利文献',
+      },
+      rules: {
+        fileName:[{required : false , message:'请输入文献名称',trigger:'blur'}]
+      }
+    }
+  },
+  watch: {
+  },
+  mounted() {
+
+  },
+  methods: {
+    open(form) {
+      this.form = JSON.parse(JSON.stringify(form))
+      if (this.form.processType == 5 ) {//专利文献需要进行名称校验
+        this.rules.fileName[0].required=true
+      } else {
+        this.rules.fileName[0].required=false
+      }
+      if(this.form.processType == 0 && this.form.id){
+        this.$set(this.form,'address',this.form.oralExam.address)
+        this.$set(this.form,'participants',this.form.oralExam.participants)
+      }
+      this.showDialog=true
+    },
+    // 弹窗确定
+    finish() {
+      if (['0','5'].includes(this.form.processType)  ||(this.file && this.file.length > 0)) {
+        var formData = new FormData()
+        this.form.reportId=this.reportId
+        if (this.form.processType != 5) {
+          if (this.file && this.form.processType!=0) {
+            for (var i = 0; i < this.file.length; i++) {
+              formData.append("file", this.file[i]);
+            }
+          }
+          formData.append('invalidProcessStr', JSON.stringify(this.form))
+        } else {
+          if (!this.form.fileName) {
+            this.$refs.reportForm.validateField('fileName')
+            return false
+          }
+          if (this.file) {
+            for (var i = 0; i < this.file.length; i++) {
+              formData.append("files", this.file[i]);
+            }
+          }
+          formData.append('proofAddNewDTOStr', JSON.stringify(this.form))
+        }
+        if (this.form.processType != 5) {
+          // 上传无效请求书、口审记录等(无效流程的上传接口)
+          this.addInvalidProcess(formData)
+        } else {
+          // 上传非专利文献
+          this.ProofByFile(formData)
+        }
+      } else {
+        this.$message.error('请上传文件')
+        return false
+      }
+     
+    },
+    // 上传无效请求书
+    addInvalidProcess(formData) {
+      if (!this.form.id) {
+        this.$api.addInvalidProcess(formData).then(response => {
+          if (response.code == 200) {
+            this.isFinish = !this.isFinish
+            this.handleClose()
+            this.$emit('isFinish', this.isFinish)
+            this.$message.success('上传成功')
+          }
+        })
+      } else {
+        this.$api.updateInvalidProcess(formData).then(response => {
+          if (response.code == 200) {
+            this.isFinish = !this.isFinish
+            this.handleClose()
+            this.$emit('isFinish', this.isFinish)
+            this.$message.success('编辑成功')
+          }
+        })
+      }
+    },
+    // 上传非专利文件
+    ProofByFile(formData) {
+      if (!this.form.id) {
+        this.$api.addProofByFile(formData).then(response => {
+          if (response.code == 200) {
+            this.isFinish = !this.isFinish
+            this.handleClose()
+            this.$emit('isFinish', this.isFinish)
+            this.$message.success('上传成功')
+          }
+        }).catch(error => {
+
+        })
+      } 
+      
+    },
+    // 关闭弹窗
+    handleClose() {
+      if (this.form.processType!=0) {
+        this.$refs.upload.clearFiles()
+      }
+      if (this.form.processType == 5) {
+        this.$refs.reportForm.resetFields()
+      }
+      this.showDialog = false
+      this.file = []
+      this.form = {}
+    },
+    onChange(file, fileList) {
+      if (file && file.length>0) {
+        this.$message.error("请选择文件");
+        return false
+      }
+      if (this.form.reportFiles) {
+        var index3 = this.form.reportFiles.findIndex(item => {
+          return item.name + '.' + item.suffix == file.raw.name
+        })
+        if (index3 != -1) {
+
+          this.Already.push(this.form.reportFiles[index3].name)
+          var index2 = fileList.reverse().findIndex(item => {
+            return item.raw.name == file.raw.name
+          })
+          fileList.splice(index2, 1)
+        } else {
+          this.inFile(file, fileList)
+        }
+      } else {
+        this.inFile(file, fileList)
+      }
+      this.$nextTick(() => {
+        var b = ''
+        if (this.Already.length > 0) {
+          this.Already.forEach(item => {
+            b = b + item + ','
+          })
+          this.$alert('文件' + b + '已存在', '提示', {
+            confirmButtonText: '确定',
+            type: 'warning',
+            callback: action => {
+              this.Already = []
+            }
+          });
+
+        }
+      })
+    },
+    inFile(file, fileList) {
+      var index = this.file.findIndex(item => {
+        return item.name == file.raw.name
+      })
+      if (index != -1) {
+        this.Already.push(this.file[index].name)
+        var index2 = fileList.reverse().findIndex(item => {
+          return item.raw.name == file.raw.name
+        })
+        fileList.splice(index2, 1)
+      } else {
+        this.form.reportFile = null
+        this.file.push(file.raw)
+      }
+    },
+    handleRemove(file, fileList) {
+      var index = this.file.findIndex(item => {
+        return item.uid == file.raw.uid
+      })
+      if (index != -1) {
+        this.file.splice(index, 1)
+      }
+      // console.log(this.file, fileList);
+    },
+    handleExceed(file, fileList) {
+      this.$message.error('禁止一次上传多个文件')
+    },
+  },
+}
+</script>
+
+<style lang="scss">
+.responseDialog{
+  .el-dialog__body{
+    padding-bottom: 0px;
+  }
+}
+</style>

+ 45 - 32
src/views/report/components/index.vue

@@ -3,13 +3,14 @@
     <el-container>
       <el-header>
         <div>
-          <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption"> </mySearch>
+          <mySearch style="width:500px" :SearchFields="searchFiled" @search="search" :searchValue="searchOption">
+          </mySearch>
         </div>
         <div style="display:flex;">
           <el-button-group style="display:flex;justify-content:flex-start" v-if="[2].indexOf(isOperate) == -1">
             <el-button v-for="item in viewTypes" :key="item.component" size="small"
-              :type="viewType == item.component ? 'primary' : ''"
-              @click="onChange2(item.component)">{{ item.name }}</el-button>
+              :type="viewType == item.component ? 'primary' : ''" @click="onChange2(item.component)">{{ item.name
+              }}</el-button>
           </el-button-group>
           <el-dropdown size="small" style="margin-right:20px" v-if="$permission('/pcs/report/add')">
             <el-button type="primary" size="small">
@@ -17,7 +18,8 @@
             </el-button>
             <el-dropdown-menu slot="dropdown" style="margin-top:0px" v-if="dictMessage.REPORT_TYPE">
               <!-- 遍历按钮 -->
-              <el-dropdown-item v-for="item in dictMessage.REPORT_TYPE.filter(item => !['6'].includes(item.dictChildValue))"
+              <el-dropdown-item
+                v-for="item in dictMessage.REPORT_TYPE.filter(item => !['6'].includes(item.dictChildValue))"
                 :key="item.dictChildLabel" @click.native="handleAnalyse(item.dictChildValue)"
                 v-if="$permission('/pcs/report/add/' + item.permission)">{{ item.dictChildLabel }}</el-dropdown-item>
             </el-dropdown-menu>
@@ -131,7 +133,7 @@ export default {
       //报告数据集合
       dataList: [],
       //获取报告类型、报告状态、核心结论
-      reportSearch:{},
+      reportSearch: {},
     };
   },
   watch: {},
@@ -195,19 +197,19 @@ export default {
     getReportSearch() {
       this.$api.search(params).then(res => {
         if (res.code == 200) {
-          this.reportSearch.types=res.data.types
-          this.reportSearch.statuses=res.data.statuses
+          this.reportSearch.types = res.data.types
+          this.reportSearch.statuses = res.data.statuses
           this.reportSearch.cronIds = res.data.cronIds
           this.searchFiled.forEach(item => {
             if (item.type == 3) {
-              item.options=this.reportSearch[item.value]
+              item.options = this.reportSearch[item.value]
             }
           })
         }
       }).catch(error => {
-        this.reportSearch.type=[]
-        this.reportSearch.state=[]
-        this.reportSearch.conclusion=[]
+        this.reportSearch.type = []
+        this.reportSearch.state = []
+        this.reportSearch.conclusion = []
         this.$message.error(error.message)
       })
     },
@@ -216,15 +218,15 @@ export default {
       let params = {}
       val.forEach(item => {
         if (item.type == 3) {
-          params[item.value]=item.searchValue.map(itemValue => {
+          params[item.value] = item.searchValue.map(itemValue => {
             return itemValue.value
           })
         } else {
-          params[item.value]=item.searchValue.label
+          params[item.value] = item.searchValue.label
         }
       })
       // 返回字符串
-      this.searchOption.searchQuery=this.$commonJS.objectToString(params)
+      this.searchOption.searchQuery = this.$commonJS.objectToString(params)
       // 调用查询接口
       this.queryParams.current = 1
       this.getList()
@@ -236,28 +238,28 @@ export default {
       let params = {
         ...this.queryParams,//分页信息
         ...this.searchOption,//检索条件
-        orderDTOList:this.sort,//排序信息
+        orderDTOList: this.sort,//排序信息
       }
       this.$api.query(params).then(res => {
         if (res.code == 200) {
           this.dataList = res.data
-          this.total=res.total
+          this.total = res.total
         }
       }).catch(error => {
         this.dataList = []
-        this.total=0
+        this.total = 0
         this.$message.error(error.message)
       })
     },
     //排序
     handleSort({ column, prop, order }) {
-      this.sort=[]//如需要多个字段排序,则不需要清空
+      this.sort = []//如需要多个字段排序,则不需要清空
       if (order == 'null') {
         return;
       }
       var orderType = {
         ascending: 0,
-        descending:1
+        descending: 1
       }
       var params = this.sort.find(item => {
         return item.orderBy == prop
@@ -340,18 +342,9 @@ export default {
         case '6'://导入专利
           this.handleImportPatent(row)
           break
-        case '7':
-          this.$confirm('此操作将永久删除该报告, 是否继续?', '提示', {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning'
-          }).then(() => {
-            this.handleDelete(row)
-
-          }).catch(() => {
-            this.$message.info("已取消删除")
-          });
-          break
+        case '7'://删除
+          this.handleDelete(row)
+          break;
         case '8'://侵权分析技术特征对比
           this.$s.setSession('reportMessage1', row)
           var routerReport3 = this.$router.resolve({
@@ -388,11 +381,31 @@ export default {
           break
       }
     },
+    // 删除报告
+    handleDelete(row) {
+      this.$confirm('此操作将永久删除该报告, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$api.dele(params).then(res => {
+          if (res.code == 200) {
+            this.$message.success('删除报告成功')
+            this.getList()
+          }
+        }).catch(err => {
+          this.$message.error(err.message)
+        })
+
+      }).catch(() => {
+        this.$message.info("已取消删除")
+      });
+    },
     //编辑报告
     handleEdit(row) {
       this.$refs.ReportForm.open(row)
     },
-   
+
     //查看详情(修改)
     checkDetails(row) {
       row.dictMessage = this.dictMessage

+ 95 - 0
src/views/report/components/view/card.vue

@@ -0,0 +1,95 @@
+<template>
+  <div class="eventCard">
+    <el-row :gutter="12">
+      <el-col :span="6" v-for="(item, itemIndex) in tableData" :key="itemIndex" style="height:420px">
+        <myCard shadow="always">
+          <div slot="head">
+            <div style="font-size:18px">
+              <span>{{ item.name }}</span>
+            </div>
+            <div v-if="!projectId && !show">
+              <el-dropdown @command="handleCommand($event, item)" trigger="click">
+                <span class="el-dropdown-link">
+                  <i class="el-icon-more" style="font-size: 16px;"></i>
+                </span>
+                <el-dropdown-menu slot="dropdown" class="text-align_center">
+                  <el-dropdown-item command="0" v-if="$reportPermission(item.id,[0,1])">分享</el-dropdown-item>
+                  <el-dropdown-item command="1" v-if="[2,3].includes(item.status) && $reportPermission(item.id,[0,1])">导出报告</el-dropdown-item>
+                  <el-dropdown-item command="2" v-if="[2,3].includes(item.status) && $reportPermission(item.id,[0,1])">报告文档</el-dropdown-item>
+                  <el-dropdown-item command="3" v-if="[1,2].includes(item.status)&&[0,1,2,3].includes(item.type) && $reportPermission(item.id,[0,1])">自定义字段</el-dropdown-item>
+                  <el-dropdown-item command="4" v-if="[2].includes(item.status)&& [0,1,2,3].includes(item.type) && $reportPermission(item.id,[0,1])">任务分配</el-dropdown-item>
+                  <el-dropdown-item command="5" v-if="([1].includes(item.status) || (item.type == 4 && [1,2].includes(item.status))) && $reportPermission(item.id,[0,1])">{{!([3,4].includes(item.type))?'拆分特征':'产品信息录入'}}</el-dropdown-item>
+                  <el-dropdown-item command="8" v-if="(item.type == 4 && [1,2].includes(item.status)) && $reportPermission(item.id,[0,1])">专利与产品关联比对</el-dropdown-item>
+                  <el-dropdown-item command="9" v-if="(item.type == 5 && [1,2].includes(item.status)) && $reportPermission(item.id,[0,1])"> 规避方案填写</el-dropdown-item>
+                  <el-dropdown-item command="10" v-if="[0,1,2,3].includes(item.type)&&[2].includes(item.status) && $reportPermission(item.id,[0,1])"> 添加对比文件</el-dropdown-item>
+                  <el-dropdown-item command="11" v-if="[1,2].includes(item.status) && $reportPermission(item.id,[0,1])"> 完成报告</el-dropdown-item>
+                  <el-dropdown-item command="12" v-if="[3].includes(item.status) && $reportPermission(item.id,[0,1])">添加追踪报告</el-dropdown-item>
+                  <el-dropdown-item command="13" v-if="(item.type == 7 && [1,2,3].includes(item.status)) && $reportPermission(item.id,[0,1])">添加无效理由和证据</el-dropdown-item>
+                  <el-dropdown-item command="14" v-if="(item.type == 7 && [1,2,3].includes(item.status)) && $reportPermission(item.id,[0,1])">证据文献</el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
+            </div>
+          </div>
+          <div>
+            <el-form label-position="left" label-width="110px">
+              <el-form-item label="报告数量:"> {{ item.reportProjectNum || 0  }} </el-form-item>
+              <el-form-item label="专题库数量:">{{ item.patentProjectNum || 0 }}</el-form-item>
+              <el-form-item label="应用场景:">
+                <el-tooltip class="item" effect="light" placement="top" :content="item.scenarioName">
+                  <div>{{ item.scenarioName }}</div>
+                </el-tooltip>
+              </el-form-item>
+              <el-form-item label="时间:">{{ item.eventDate || '--' }}</el-form-item>
+              <el-form-item label="描述:">{{ item.description || '--'}}</el-form-item>
+              <el-form-item label="创建人:">{{ item.createName || '--'}}</el-form-item>
+              <el-form-item label="创建时间:">{{ item.createTime || '--'}}</el-form-item>
+            </el-form>
+          </div>
+          <div slot="foot">
+            <div class="btn">
+              <i class="el-icon-edit" @click="handleCommand('e',item)"></i>
+              <i class="el-icon-delete" @click="handleCommand('7', item)"></i>
+            </div>
+          </div>
+        </myCard>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+  
+<script>
+import mixins from '../mixins';
+export default {
+  components: {},
+  props: {},
+  mixins: [mixins],
+  data() {
+    return {
+    };
+  },
+  watch: {},
+  computed: {},
+  created() { },
+  mounted() { 
+    
+  },
+  methods: {},
+};
+</script>
+<style lang="scss">
+.eventCard{
+  
+}
+</style>
+<style lang="scss" scoped>
+  .eventCard{
+    .btn{
+      margin: 0;
+      i{
+        color: var(--color2);
+        font-size: 16px;
+        margin-right:16px
+      }
+    }
+  }
+</style>

+ 1 - 1
src/views/report/components/view/table.vue

@@ -133,7 +133,7 @@ export default {
    
   },
   methods: {
-        // 排序
+    // 排序
     sortChange({ column, prop, order }) {
       this.$emit('sort', { column, prop, order })
     },