浏览代码

项目申报

liuxiangqi 1 年之前
父节点
当前提交
e7ba130d06

二进制
public/temp/研究成果报告模板.xls


二进制
public/temp/项目立项书模板.doc


二进制
public/temp/项目负责人及研发人员模板.xls


+ 3 - 4
src/api/enterprise/declare/declare.js

@@ -15,11 +15,10 @@ export function listDeclareApi(query) {
 //   })
 // }
 //提交申报
-export function submitDeclareApi(id, data) {
+export function submitDeclareApi(id, reportState) {
   return request({
-    url: `/ent/project/apply/${id}`,
-    method: 'put',
-    data: data
+    url: `/ent/data/auth/${id}/${reportState}`,
+    method: 'put'
   })
 }
 

+ 76 - 2
src/api/enterprise/project/project.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询项目列表
 export function listProjectApi(query) {
   return request({
-    url: '/ent/project/manageList',
+    url: '/ent/data/list',
     method: 'get',
     params: query
   })
@@ -67,7 +67,7 @@ export function synFinApi(id, data) {
 //删除项目
 export function deleteProjectApi(ids) {
   return request({
-    url: `/ent/project/${ids}`,
+    url: `/ent/data/${ids}`,
     method: 'delete'
   })
 }
@@ -110,3 +110,77 @@ export function draftApi(data) {
     data: data
   })
 }
+
+//保存年度信息
+export function yearApi(data) {
+  return request({
+    url: `/ent/data/year-project`,
+    method: 'post',
+    data: data
+  })
+}
+//修改年度信息
+export function yearUpdateApi(data) {
+  return request({
+    url: `/ent/data/year-project`,
+    method: 'put',
+    data: data
+  })
+}
+//项目申报
+export function declareApi(data) {
+  return request({
+    url: `/ent/data/project`,
+    method: 'post',
+    data: data
+  })
+}
+
+//获取企业研发项目
+export function devProjectApi(projectId, query) {
+  return request({
+    url: `/ent/data/project/${projectId}`,
+    method: 'get',
+    params: query
+  })
+}
+
+export function declareUpdateApi(data) {
+  return request({
+    url: `/ent/data/project`,
+    method: 'put',
+    data: data
+  })
+}
+//获取企业年度信息
+export function getYearDataApi(projectYear, query) {
+  return request({
+    url: `/ent/data/year-project/${projectYear}`,
+    method: 'get',
+    params: query
+  })
+}
+//获取附件列表
+// export function getEnclosureApi(attachType, dataId) {
+//   return request({
+//     url: `/common/attach/attach/${attachType}/${dataId}`,
+//     method: 'get',
+//     params: query
+//   })
+// }
+
+//下载
+export function downloadApi(id) {
+  return request({
+    url: `/common/attach/${id}`,
+    method: 'get',
+    responseType: 'blob'
+  })
+}
+//年度列表
+export function yearListApi() {
+  return request({
+    url: `/ent/data/year-list`,
+    method: 'get'
+  })
+}

+ 34 - 2
src/assets/styles/index.scss

@@ -25,7 +25,11 @@ html {
 #app {
   height: 100%;
 }
-
+ul,li {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
 *,
 *:before,
 *:after {
@@ -195,7 +199,7 @@ $--color-primary: $menuActiveText;
 $border: #ddd;
 /* 工具栏 */
 .toolbar {
-  margin: 0 0 15px;
+  margin: 0 0 10px;
   &>.title {
     position: relative;
     padding-left: 15px;
@@ -750,6 +754,29 @@ $border: #ddd;
     text-align: right;
     background: #fff;
   }
+  .th_title {
+    text-align: left;
+    color: #5282b6;
+    font-size: 18px;
+    font-weight: 700;
+    line-height: 19px;
+    // padding: 15px 20px;
+  }
+}
+.table_edit {
+  border-collapse: collapse;
+  table-layout: fixed;
+  border: 1px solid #eee;
+  font-size: 15px;
+  margin: 0 auto;
+  .th_title {
+    text-align: left;
+    color: #5282b6;
+    font-size: 18px;
+    font-weight: 700;
+    line-height: 19px;
+    // padding: 15px 20px;
+  }
 }
 .table_register {
   .el-input--medium .el-input__inner {
@@ -773,3 +800,8 @@ $border: #ddd;
     padding: 0;
   }
 }
+.table_edit {
+  .el-table .el-form-item {
+    margin: 5px 0;
+  }
+}

+ 0 - 6
src/router/index.js

@@ -129,12 +129,6 @@ export const constantRoutes = [
         component: (resolve) => require(['@/views/enterprise/project/edit'], resolve),
         name: 'editProject',
         meta: { title: '修改项目信息'}
-      },
-      {
-        path: 'info/:id',
-        component: (resolve) => require(['@/views/enterprise/project/info'], resolve),
-        name: 'projectInfo',
-        meta: {title: '项目详情'}
       }
     ]
   }, {

+ 36 - 3
src/utils/dataFormat.js

@@ -1,3 +1,4 @@
+
 export const regTypeOptions = [
   { dictLabel: '有限责任公司', dictValue: '1'},
   { dictLabel: '股份有限公司', dictValue: '2'},
@@ -65,6 +66,16 @@ export const yesOrNoOptions = [
   { dictLabel: '是', dictValue: 1},
   { dictLabel: '否', dictValue: 0}
 ]
+
+export const successOptions = [
+  { dictLabel: '成功', dictValue: true},
+  { dictLabel: '失败', dictValue: false}
+]
+
+export const booleanOptions = [
+  { dictLabel: '是', dictValue: true},
+  { dictLabel: '否', dictValue: false}
+]
 /**
  *
  * 审核状态 1:待审核 2:通过 3:驳回
@@ -311,9 +322,31 @@ export const businessIndustryOptions = [
  * 申报状态
  */
 export const reportStateOptions = [
-  { dictLabel: '未申报', dictValue: 1},
-  { dictLabel: '已申报', dictValue: 2},
-  { dictLabel: '撤回', dictValue: 3}
+  { dictLabel: '待补充', dictValue: 1},
+  { dictLabel: '待申报', dictValue: 2},
+  { dictLabel: '待审核', dictValue: 3},
+  { dictLabel: '已申报', dictValue: 4}
+]
+
+export const techSourceOptions = [
+  { dictLabel: '自有技术', dictValue: '1' },
+  { dictLabel: '引进技术后消化再创新', dictValue: '2'},
+  { dictLabel: '高校、院所产学研合作项目', dictValue: '3'},
+  { dictLabel: '其他企业技术', dictValue: '4'},
+]
+
+export const devOptions = [
+  { dictLabel: '新产品', dictValue: '1'},
+  { dictLabel: '新技术', dictValue: '2'},
+  { dictLabel: '新工艺', dictValue: '3'},
+  { dictLabel: '引进技术的消化、吸收和创新', dictValue: '4'},
+]
+
+export const projectTypeOptions = [
+  { dictLabel: '自主研发', dictValue: '1'},
+  { dictLabel: '委托研发', dictValue: '2'},
+  { dictLabel: '合作研发', dictValue: '3'},
+  { dictLabel: '自主研发(含委托研发)', dictValue: '4'},
 ]
 export function getLabel(list, val) {
   for (let i = 0; i < list.length; i++) {

+ 291 - 0
src/views/admin/project/index.vue

@@ -0,0 +1,291 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" size="small">
+      <template v-if="!checkRole(['entAdmin','entUser'])">
+        <el-form-item label="省" prop="provinceId">
+          <el-select v-model="queryParams.provinceId" placeholder="请选择省" @change="getCityData" filterable style="width: 200px;" clearable>
+            <el-option v-for="(item,index) in provinceDataList" :key="index" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="市" prop="cityId">
+          <el-select v-model="queryParams.cityId" placeholder="请选择市" @change="getDistrictData" filterable style="width: 200px;" clearable>
+            <el-option v-for="(item, index) in cityDataList" :key="index" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="区" prop="districtId">
+          <el-select v-model="queryParams.districtId" placeholder="请选择区" filterable style="width: 200px;" clearable>
+            <el-option v-for="(item, index) in districtDataList" :key="index" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="年份" prop="year">
+          <el-date-picker
+                type="years"
+                v-model="years"
+                placeholder="选择一个或多个年份" value-format="yyyy">
+              </el-date-picker>
+        </el-form-item>
+        <el-form-item label="企业名称" prop="entName">
+          <el-input v-model="queryParams.entName" clearable style="width: 200px;" placeholder="请填入企业名称"></el-input>
+        </el-form-item>
+        <el-form-item label="社会信用代码" prop="license">
+          <el-input v-model="queryParams.license" style="width: 200px;" placeholder="请输入社会信用代码" clearable></el-input>
+        </el-form-item>
+      </template>
+      <el-form-item label="项目编号" prop="projectNo">
+        <el-input v-model="queryParams.projectNo" style="width: 200px;" placeholder="请输入项目编号" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="项目名称" prop="projectName">
+        <el-input v-model="queryParams.projectName" style="width: 200px;" placeholder="请输入项目名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="handleQuery">搜索</el-button>
+        <el-button @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <h3 class="toolbar">
+      <span class="title">列表</span>
+      <div class="tool">
+        <el-button type="primary" plain icon="el-icon-download" size="mini" @click="handleDownloadBatch">下载</el-button>
+        <el-button type="primary" plain icon="el-icon-delete" size="mini" @click="handleBatchDel">批量删除</el-button>
+      </div>
+    </h3>
+    <el-table v-loading="loading" :data="list" border @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column type="index" width="50" label="序号"></el-table-column>
+      <el-table-column label="加计扣除年度" prop="projectYear"></el-table-column>
+      <el-table-column label="项目名称" prop="projectName" align="center" width="180"></el-table-column>
+      <el-table-column label="企业名称" prop="entName" align="center" width="180"/>
+      <el-table-column label="统一社会信用代码" prop="license" align="center" width="180" />
+      <el-table-column label="是否跨年项目" prop="overYearFlag" :formatter="overYearFormat"></el-table-column>
+      <!-- <el-table-column label="跨年申报"></el-table-column> -->
+      <el-table-column label="是否追溯项目" prop="backFlag" :formatter="flagFormat"></el-table-column>
+      <el-table-column label="项目起止时间" align="center" width="200">
+        <template slot-scope="scope">
+          <span>{{scope.row.projectStartDate}} - {{scope.row.projectEndDate}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="资料完善度" prop="linkEmail" align="center" width="340">
+        <template slot-scope="scope">
+          <span>企业 {{scope.row.entCompRate}} 技术 {{scope.row.techCompRate}} 财务 {{scope.row.finCompRate}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="申报状态" prop="reportState" align="center" width="80" :formatter="reportStateFormat"></el-table-column>
+      <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width" fixed="right">
+        <template slot-scope="scope">
+          <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+          <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
+          <el-button type="text" @click="handleAuditAdmin(scope.row)" v-if="scope.row.reportState == 3">审核</el-button>
+          <template v-if="scope.row.attachCnt != 0">
+            <el-button type="text" @click="handleDownload(scope.row)">下载</el-button>
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"/>
+      <audit-project v-if="auditVisible" ref="auditProject" @refreshData="getList()"></audit-project>
+  </div>
+</template>
+
+<script>
+  import {getProvinceDataApi,getRegionChildrenApi,downloadProjectByIDApi} from "@/api/common/common"
+  import {deleteProjectApi,listProjectApi} from '@/api/enterprise/project/project'
+  import {projectAuditApi} from '@/api/admin/project/project'
+  import {listProjectAdminApi} from '@/api/admin/project/project'
+  import {entStateOptions, getLabel, authStateOptions, reportStateOptions,booleanOptions} from '@/utils/dataFormat'
+  import AuditProject from '../../enterprise/project/components/audit.vue'
+  import { downLoadZip } from "@/utils/zipdownload";
+  import { checkRole } from "@/utils/permission"; // 权限判断函数
+  export default {
+    components: {
+      AuditProject
+    },
+    data () {
+      return {
+        years: [],
+        loading: false,
+        auditVisible: false,
+        ids: [],
+        selectCount: '',
+        provinceDataList: [],
+        cityDataList: [],
+        districtDataList: [],
+        entStateOptions: entStateOptions,
+        authStateOptions: authStateOptions,
+
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          provinceId: undefined,
+          cityId: undefined,
+          districtId: undefined,
+          entName: '',
+          year: '',
+          license: '',
+          projectNo: '',
+          projectName: ''
+        },
+        list: [],
+        total: 0,
+        open: false,
+        openInfo: false,
+      }
+    },
+    created() {
+      this.getList()
+      this.getProvinceData()
+    },
+    methods: {
+      checkRole,
+      getList() {
+        this.loading = true;
+        this.queryParams.year = this.years.join(',')
+        listProjectApi(this.queryParams).then(response => {
+          this.list = response.data.records;
+          this.total = response.data.total;
+          this.loading = false;
+        });
+      },
+      // 多选框选中数据
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.selectCount = selection.length;
+      },
+      handleBatchDel() {
+        if(this.selectCount <= 0) {
+          this.$message.error('请选择要删除的数据');
+          return
+        }
+        const delIds = this.ids.join(',')
+        this.$confirm('是否确认删除该数据?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            return deleteProjectApi(delIds);
+          }).then(() => {
+            this.queryParams.pageNum = 1;
+            this.getList();
+            this.$message({
+              message: '删除成功',
+              type: 'success'
+            });
+          })
+      },
+      //选择省份
+      getCityData() {
+        this.queryParams.cityId = ''
+        this.queryParams.districtId = ''
+        getRegionChildrenApi(this.queryParams.provinceId).then(res => {
+          if(res.code == 200) {
+            this.cityDataList = res.data
+          }
+        })
+      },
+      //选择市
+      getDistrictData() {
+        this.queryParams.districtId = ''
+        getRegionChildrenApi(this.queryParams.cityId).then(res => {
+          if(res.code == 200) {
+            this.districtDataList = res.data
+          }
+        })
+      },
+      getProvinceData() {
+        getProvinceDataApi().then(res => {
+          if(res.code == 200) {
+            this.provinceDataList = res.data
+          }
+        })
+      },
+      handleDownload(row) {
+        downLoadZip('/project/download/' +row.id, "项目附件")
+      },
+      handleDownloadBatch() {
+        if(this.selectCount <= 0) {
+          this.$message.error('请选择要下载的项目');
+          return
+        }
+        const delIds = this.ids.join(',')
+        downLoadZip('/project/download/' +delIds, "项目附件")
+      },
+      //编辑
+      handleEdit(row) {
+        this.$router.push({name: 'editProject', query: {id: row.id, entId: row.entId, type: 'update', activeName: '2'}})
+      },
+      // 审核
+      handleAudit(row) {
+        const projectId = row.id;
+        const authState = '2'
+        this.$confirm('是否确认提交审核该数据?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            return projectAuditApi(projectId,authState);
+          }).then(() => {
+            this.queryParams.pageNum = 1;
+            this.getList();
+            this.$message({
+              message: '提交成功',
+              type: 'success'
+            });
+          })
+      },
+      handleAuditAdmin(row) {
+        this.auditVisible = true
+        this.$nextTick(() => {
+          this.$refs.auditProject.init(row.id)
+        })
+      },
+      // 查看
+      handleView(row) {
+        this.$router.push("/project/info/"+row.id)
+      },
+      handleDelete(row) {
+        const id = row.id;
+        this.$confirm('是否确认删除该数据?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            return deleteProjectApi(id);
+          }).then(() => {
+            this.queryParams.pageNum = 1;
+            this.getList();
+            this.$message({
+              message: '删除成功',
+              type: 'success'
+            });
+          })
+      },
+      // 重置
+      resetQuery() {
+        this.years = [];
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 搜索
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      reportStateFormat(row, col, val, index) {
+        return getLabel(reportStateOptions, val)
+      },
+      flagFormat(row, col, val, index) {
+        return getLabel(booleanOptions, val)
+      },
+      overYearFormat(row, col, val, index) {
+        return getLabel(booleanOptions, val)
+      }
+    }
+  }
+</script>
+
+<style>
+</style>

+ 0 - 28
src/views/components/region/region.vue

@@ -1,28 +0,0 @@
-<template>
-  <div>
-    <el-cascader placeholder="请选择省份" :options="options" filterable></el-cascader>
-  </div>
-</template>
-
-<script>
-  import {getProvinceDataApi} from "@/api/common/common"
-
-  export default {
-    name: 'Region',
-    data () {
-      return {
-        options: []
-      }
-    },
-    methods: {
-      getProvinceData() {
-        getProvinceDataApi().then(res => {
-          console.log(res)
-        })
-      }
-    }
-  }
-</script>
-
-<style>
-</style>

+ 1 - 1
src/views/enterprise/ent/index.vue

@@ -71,7 +71,7 @@
           <span>{{scope.row.provinceName}}{{scope.row.cityName}}{{scope.row.districtName}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="社会信用代码" prop="license" align="center" width="240"></el-table-column>
+      <!-- <el-table-column label="社会信用代码" prop="license" align="center" width="240"></el-table-column> -->
       <el-table-column label="联系人" align="center" prop="nickName" width="240"></el-table-column>
       <el-table-column label="联系人手机号" prop="phonenumber" align="center" width="240"></el-table-column>
       <el-table-column label="联系人邮箱" prop="email" align="center" width="240"></el-table-column>

+ 8 - 8
src/views/enterprise/ent/info.vue

@@ -38,7 +38,7 @@
         <td>{{info.taxOffice}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">法人信息</span>
     </h3>
     <table class="table_view">
@@ -61,7 +61,7 @@
         <td>{{info.legalEmail}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">联系人信息</span>
     </h3>
     <table class="table_view">
@@ -84,7 +84,7 @@
         <td>{{info.linkEmail}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">企业上市信息</span>
     </h3>
     <table class="table_view">
@@ -95,7 +95,7 @@
         <td>{{info.listingCode}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">风险投资信息</span>
     </h3>
     <table class="table_view">
@@ -106,7 +106,7 @@
         <td>{{info.investCapital}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">高新企业</span>
     </h3>
     <table class="table_view">
@@ -117,7 +117,7 @@
         <td>{{info.techCode}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">上年度是否做加计扣除</span>
     </h3>
     <table class="table_view">
@@ -126,7 +126,7 @@
         <td>{{deductionFlag}}</td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">附件</span>
     </h3>
     <table class="table_view">
@@ -143,7 +143,7 @@
         </td>
       </tr>
     </table>
-    <h3 class="toolbar mt20">
+    <h3 class="toolbar">
       <span class="title">文件水印</span>
     </h3>
     <table class="table_view">

+ 3 - 4
src/views/enterprise/project/components/UploadEnclosure.vue

@@ -56,7 +56,7 @@
           // 设置上传的请求头部
           headers: { Authorization: "Bearer " + getToken() },
           // 上传的地址
-          url: process.env.VUE_APP_BASE_API + "/common/attach/upload"
+          url: process.env.VUE_APP_BASE_API + "/common/attach/uploads"
         },
         open: false,
         disabled: false,
@@ -66,13 +66,12 @@
         rules: {
         },
         params: {
-          attachType: this.attachType,
-          dataId: this.dataId
         }
       }
     },
     methods: {
-      init() {
+      init(params) {
+        this.params = params
         this.open = true;
         this.form.fileList = '';
         this.resetForm("form");

+ 20 - 15
src/views/enterprise/project/components/addProject.vue

@@ -8,7 +8,10 @@
         <el-input v-model="form.projectName"></el-input>
       </el-form-item>
       <el-form-item label="项目年份" prop="projectYear">
-        <el-date-picker v-model="form.projectYear" placeholder="选择项目年份" type="year" value-format="yyyy"></el-date-picker>
+        <!-- <el-date-picker v-model="form.projectYear" placeholder="选择项目年份" type="year" value-format="yyyy"></el-date-picker> -->
+        <el-select v-model="form.projectYear" filterable>
+          <el-option v-for="(item, index) in yearsOptions" :key="index" :value="item.dictValue" :label="item.dictLabel"></el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="技术员分配" prop="techUserId">
         <el-select v-model="form.techUserId" filterable>
@@ -51,7 +54,7 @@
 </template>
 
 <script>
-  import {addProjectApi, listUserListApi} from "@/api/enterprise/project/project"
+  import {declareApi, listUserListApi} from "@/api/enterprise/project/project"
   import { listUserApi } from "@/api/enterprise/employee/employee"
   import { yesOrNoOptions } from "@/utils/dataFormat"
   export default {
@@ -117,6 +120,7 @@
             return time.getTime() < new Date(this.form.projectStartDate).getTime()
           }
         },
+        yearsOptions: []
       }
     },
     computed: {
@@ -129,6 +133,7 @@
         this.open = true;
         this.getFinUserData()
         this.getTechUserData()
+        this.getYears()
         this.resetForm("form");
       },
       getFinUserData() {
@@ -154,7 +159,7 @@
         this.$refs.form.validate(valid => {
           if (valid) {
             this.disabled = true
-            addProjectApi(this.form).then(res => {
+            declareApi(this.form).then(res => {
               this.disabled = false;
               if(res.code == 200) {
                 this.$message({
@@ -171,18 +176,18 @@
       cancel() {
         this.open = false
       },
-    },
-    // watch: {
-    //   "form.projectTime"(val) {
-    //     if(this.form.projectTime) {
-    //       this.form.projectStartDate = this.form.projectTime[0]
-    //       this.form.projectEndDate = this.form.projectTime[1]
-    //     }else {
-    //       this.form.projectStartDate = ''
-    //       this.form.projectEndDate = ''
-    //     }
-    //   }
-    // }
+      getYears(){
+        let optionsArray = new Array();
+        let years= new Date().getFullYear();
+        for(var i=years-3;i<=years;i++){
+          let anOption = {};
+          anOption.dictValue=i;
+          anOption.dictLabel=i;
+          optionsArray.push(anOption);
+        }
+        this.yearsOptions = optionsArray;
+      }
+    }
   }
 </script>
 

+ 4 - 5
src/views/enterprise/project/components/audit.vue

@@ -3,8 +3,8 @@
     <el-form ref="form" :model="form" :rules="rules" label-width="140px">
         <el-form-item label="审核结果" prop="checkStatus">
           <el-radio-group v-model="form.checkStatus">
-            <el-radio label="3">审核通过</el-radio>
-            <el-radio label="4">审核拒绝</el-radio>
+            <el-radio label="4">审核通过</el-radio>
+            <el-radio label="1">审核拒绝</el-radio>
           </el-radio-group>
         </el-form-item>
     </el-form>
@@ -16,8 +16,7 @@
 </template>
 
 <script>
-  import {auditEntApi} from "@/api/admin/ent/ent"
-  import {projectAuditApi} from "@/api/admin/project/project"
+  import {submitDeclareApi} from "@/api/enterprise/declare/declare"
   export default {
     data () {
       return {
@@ -42,7 +41,7 @@
         this.$refs.form.validate(valid => {
           if (valid) {
             this.disabled = true
-            projectAuditApi(this.form.id, this.form.checkStatus).then(res => {
+            submitDeclareApi(this.form.id, this.form.checkStatus).then(res => {
               this.disabled = false;
               if(res.code == 200) {
                 this.$message({

+ 550 - 0
src/views/enterprise/project/components/enclosure-edit.vue

@@ -0,0 +1,550 @@
+<template>
+  <div class="app-container">
+    <h3 class="toolbar">
+      <span class="title">加计扣除备查资料清单(<b style="color: red;font-size: 15px;">根据您填报的项目信息,系统自动将需要上传的文件列出,每种类型文件只能上传单个文件(大小限制4M),如有多个请打包上传!</b>)</span>
+      <!-- <div class="tool">
+        <el-button type="primary" plain icon="el-icon-download" size="mini" @click="handleDownloadBatch">批量下载</el-button>
+      </div> -->
+    </h3>
+    <!-- 技术 -->
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">项目计划书
+        </th>
+      </tr>
+      <tr>
+        <th>项目计划书导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('9')" v-if="techFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list9" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDownload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">研究成果报告
+        </th>
+      </tr>
+      <tr>
+        <th>研究成果导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('10')" v-if="techFlag">上传</el-button>
+          <el-button type="primary" size="mini">
+            <a href="/temp/研究成果报告模板.xls">模板下载</a>
+          </el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list10" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">自主、委托、合作研究开发项目计划书和企业有权部门关于自主、委托、合作研究开发项目立项的决议文件
+        </th>
+      </tr>
+      <tr>
+        <th>决议文件导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('1')" v-if="techFlag">上传</el-button>
+          <el-button type="primary" size="mini">
+            <a href="/temp/项目立项书模板.doc">模板下载</a>
+          </el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list1" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">自主、委托、合作研究开发专门机构或项目组的编制情况和研发人员名单
+        </th>
+      </tr>
+      <tr>
+        <th>研发人员名单导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('2')" v-if="techFlag">上传</el-button>
+          <el-button type="primary" size="mini">
+            <a href="/temp/项目负责人及研发人员模板.xls">模板下载</a>
+          </el-button>
+
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list2" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">经科技行政主管部门登记的委托、合作研究开发项目的合同
+        </th>
+      </tr>
+      <tr>
+        <th>研究开发合同导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('3')" v-if="techFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list3" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+
+
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">“研发支出”辅助账及汇总表
+        </th>
+      </tr>
+      <tr>
+        <th>“研发支出”辅助账及汇总表导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('6')" v-if="techFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list6" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">企业如果已取得地市级(含)以上科技行政主管部门出具的鉴定意见,应作为资料留存备查
+        </th>
+      </tr>
+      <tr>
+        <th>科技主管部门鉴定意见导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('7')" v-if="techFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list7" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="techFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+
+    <!-- 财务 -->
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">从事研发活动的人员(包括外聘人员)和用于研发活动的仪器、设备、无形资产的费用分配说明(包括工作使用情况记录及费用分配计算证据材料)
+        </th>
+      </tr>
+      <tr>
+        <th>费用分配说明导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('4')" v-if="finFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list4" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="finFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">集中研发项目研发费决算表、集中研发项目费用分摊明细情况表和实际分享收益比例等资料
+        </th>
+      </tr>
+      <tr>
+        <th>资料导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('5')"v-if="finFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list5" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="finFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <table class="table_register mt20" style="width: 100%;">
+      <tr>
+        <th colspan="4" class="th_title">《研发费用加计扣除优惠明细表》(a107012,选择预缴享受的企业留存备查)
+        </th>
+      </tr>
+      <tr>
+        <th>优惠明细表导入</th>
+        <td colspan="3">
+          <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload('8')" v-if="finFlag">上传</el-button>
+        </td>
+      </tr>
+      <tr>
+        <th>下载</th>
+        <td colspan="3">
+          <ul>
+            <li v-for="(item, index) in list8" :key="index" style="margin: 2px;">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <a :href="item.url">{{item.fileName}}</a>
+                </el-col>
+                <el-col :span="12">
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleUpload(item.id)">下载</el-button>
+                  <el-button type="primary"  icon="el-icon-upload2" size="mini" @click="handleDelete(item.id)" v-if="finFlag">删除</el-button>
+                </el-col>
+              </el-row>
+            </li>
+          </ul>
+        </td>
+      </tr>
+    </table>
+    <upload-enclosure ref="uploadEnclosure" v-if="enclosureVisible" @refreshData="getList()" :dataId="dataId" :attachType="'PROJECT'"></upload-enclosure>
+  </div>
+</template>
+
+<script>
+  import {getEnclosureApi,deleteEnclosureApi,getProjectInfoApi,downloadApi} from '@/api/enterprise/project/project'
+  import UploadEnclosure from './UploadEnclosure'
+  import { getExtend, readBuffer, render } from '@/utils/util';
+  import { parse } from 'qs';
+  import axios from 'axios'
+  import FileUpload from '@/components/FileUpload'
+  export default {
+    components: {
+      UploadEnclosure,
+      FileUpload
+    },
+    props: {
+      type: {
+        type: String
+      }
+    },
+    data() {
+      return {
+        total: 0,
+        enclosureVisible: false,
+        list: [],
+        id: this.$route.query.id,
+        dataId: undefined,
+        attachType: 'FINACIAL',
+        loading: false,
+        selectionList: [],
+        ids: '',
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10
+        },
+        list1: [],
+        list2: [],
+        list3: [],
+        list4: [],
+        list5: [],
+        list6: [],
+        list7: [],
+        list8: [],
+        list9: [],
+        list10: []
+      };
+    },
+    computed: {
+      userType() {
+        return this.$store.state.user.userType
+      },
+      techFlag() {
+        let roleType = this.$store.state.user.userType
+        return this.type != 'view' ? ['ENT_TECH', 'ADMIN', 'ENT_ADMIN'].includes(roleType) : false //判断是否为技术
+      },
+      finFlag() {
+        let roleType = this.$store.state.user.userType
+        return this.type != 'view' ? ['ENT_FIN', 'ADMIN', 'ENT_ADMIN'].includes(roleType) : false //判断是否为财务
+      }
+    },
+    created() {
+      this.id = this.$route.query.id || undefined;
+      if(this.id) {
+        this.getList()
+      }
+    },
+    methods: {
+      getList() {
+        getEnclosureApi(this.attachType,this.id).then(res => {
+          if(res.code == 200) {
+            this.list = res.data.records
+            this.list1 = []
+            this.list2 = []
+            this.list3 = []
+            this.list4 = []
+            this.list5 = []
+            this.list6 = []
+            this.list7 = []
+            this.list8 = []
+            this.list9 = []
+            this.list10 = []
+            this.list.map(item => {
+              if(item.fileType == 'file1') {
+                this.list1.push(item)
+              }
+              if(item.fileType == 'file2') {
+                this.list2.push(item)
+              }
+              if(item.fileType == 'file3') {
+                this.list3.push(item)
+              }
+              if(item.fileType == 'file4') {
+                this.list4.push(item)
+              }
+              if(item.fileType == 'file5') {
+                this.list5.push(item)
+              }
+              if(item.fileType == 'file6') {
+                this.list6.push(item)
+              }
+              if(item.fileType == 'file7') {
+                this.list7.push(item)
+              }
+              if(item.fileType == 'file8') {
+                this.list8.push(item)
+              }
+              if(item.fileType == null) {
+                this.list9.push(item)
+              }
+              if(item.fileType == 'file10') {
+                this.list10.push(item)
+              }
+
+            })
+            this.total = res.data.total
+          }
+        })
+      },
+      handleUpload(type) {
+        let params = {
+          attachType: 'FINACIAL',
+          fileType: 'file'+type,
+          dataId: this.id
+        }
+        this.enclosureVisible = true
+        this.$nextTick(() => {
+          this.$refs.uploadEnclosure.init(params)
+        })
+      },
+      handleDownload(id) {
+        // window.open("http://124.232.146.72:7015/api/common/attach/"+row.id)
+        downloadApi(id).then(res => {
+        	if (res) {
+        		let fileName = "账单";
+        		const content = res.data
+        		let fileTypeEx = '';
+        		if(fileExtension == 'zip') {
+        			fileTypeEx = 'application/zip'
+        		} else if(fileExtension == 'csv') {
+        			fileTypeEx = 'text/csv'
+        		}
+        		const blob = new Blob([content], { type: fileTypeEx })
+        		const elink = document.createElement('a')
+        		elink.download = fileName
+        		elink.style.display = 'none'
+        		elink.href = URL.createObjectURL(blob)
+        		document.body.appendChild(elink)
+        		elink.click()
+        		URL.revokeObjectURL(elink.href)
+        		document.body.removeChild(elink)
+        	}
+        })
+      },
+      handleDownloadBatch() {
+        if(this.selectionList.length <=0) {
+          this.$message.error('请选择要下载的数据');
+          return
+        }
+        window.open("http://124.232.146.72:7015/api/common/attach/"+this.ids)
+        this.getList();
+      },
+      handleBatchDelte() {
+        if(this.selectionList.length <=0) {
+          this.$message.error('请选择要删除的数据');
+          return
+        }
+        this.$confirm('请确认是否删除所选择的数据!', '提示').then(() => {
+        	deleteEnclosureApi(this.ids).then(res => {
+            if(res.code == 200) {
+              this.queryParams.pageNum = 1;
+              this.getList();
+              this.$modal.msgSuccess("删除成功");
+            }
+        	})
+        })
+      },
+      // 从url加载
+      handleView(row) {
+        let routeUrl = this.$router.resolve({
+          path: '/enclosurePreview',
+          query: {url: row.url,fileName: row.fileName,id: row.id}
+        });
+        window.open(routeUrl.href, "_blank");
+      },
+      handleDelete(id) {
+        // const id = row.id;
+        this.$confirm('是否确认删除该数据?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            return deleteEnclosureApi(id);
+          }).then(() => {
+            this.queryParams.pageNum = 1;
+            this.getList();
+            this.$modal.msgSuccess("删除成功");
+          })
+      },
+      // 取消全选
+      selectAll(selection) {
+        if (selection.length == 0) {
+          let list = this.selectedList.filter(item => !this.list.some(ele => ele.id === item.id));
+          this.selectionList = list;
+        }
+      },
+      handleSelectionChange(val) {
+        this.selectionList = val;
+        if(this.selectionList.length > 0) {
+          let selectionIds = []
+          for (let i = 0, len = this.selectionList.length; i < len; i++) {
+          	selectionIds.push(this.selectionList[i].id)
+          }
+          this.ids = selectionIds.join(',')
+        }else {
+          this.ids = ''
+        }
+      }
+    }
+  };
+  </script>
+
+</script>
+
+<style>
+</style>

+ 581 - 0
src/views/enterprise/project/components/ent-edit.vue

@@ -0,0 +1,581 @@
+<template>
+  <div class="app-container" v-loading="loading">
+    <el-form ref="form" :model="form" :rules="rules" label-width="180px">
+      <table class="table_register" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">项目基本信息</th>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>加计扣除年度</th>
+          <td>
+            <el-form-item prop="projectYear" label-width="0">
+              <el-select v-model="form.projectYear" filterable :disabled="disabledVisible">
+                <el-option v-for="(item, index) in yearsOptions" :key="index" :value="item.dictValue" :label="item.dictLabel"></el-option>
+              </el-select>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>研发成果</th>
+          <td>
+            <el-form-item prop="developFlag" label-width="0">
+              <el-select v-model="form.developFlag" filterable :disabled="disabledVisible">
+                <el-option v-for="(item, index) in successOptions" :key="index" :value="item.dictValue" :label="item.dictLabel"></el-option>
+              </el-select>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>项目名称</th>
+          <td>
+            <el-form-item prop="projectName" label-width="0">
+              <el-input v-model="form.projectName" placeholder="请输入项目名称" :disabled="disabledVisible"></el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>立项时间</th>
+          <td>
+            <el-form-item prop="projectDate" label-width="0">
+              <el-date-picker :disabled="disabledVisible"
+                v-model="form.projectDate"
+                type="date"
+                value-format="yyyy-MM-dd"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>起止时间</th>
+          <td>
+            <el-form-item prop="projectTime" label-width="0">
+              <!-- <el-input id="inputUI" v-model="form.projectTime" style="width: 220px"></el-input> -->
+              <el-input  @focus="getLayDate" id="projectTime" v-model="form.projectTime" clearable :disabled="disabledVisible"></el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>项目类型</th>
+          <td>
+            <el-form-item prop="projectType" label-width="0">
+              <el-select v-model="form.projectType" filterable :disabled="disabledVisible">
+                <el-option v-for="(item, index) in projectTypeOptions" :key="index" :value="item.dictValue" :label="item.dictLabel"></el-option>
+              </el-select>
+            </el-form-item>
+          </td>
+        </tr>
+      </table>
+      <table class="table_edit mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">项目负责人及研发人员
+            <!-- <div class="tool"> -->
+              <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="addFunc" style="margin-left: 10px" v-if="!disabledVisible">新增</el-button>
+            <!-- </div> -->
+          </th>
+        </tr>
+        <tr v-if="!disabledVisible">
+          <td colspan="4">
+            <el-table :data="form.headAddVOList" border>
+              <el-table-column label="姓名" prop="name" align="center" width="120">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.name'">
+                    <el-input v-model="scope.row.name"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="性别" prop="sex" align="center" width="80">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.sex'">
+                    <el-input v-model="scope.row.sex"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="身份证号" prop="idNumber" align="center" width="180">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.idNumber'">
+                    <el-input v-model="scope.row.idNumber"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="年龄" prop="age" align="center" width="80">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.age'">
+                    <el-input v-model="scope.row.age"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="学历" prop="education" align="center" width="80">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.education'">
+                    <el-input v-model="scope.row.education"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="所学专业" prop="major" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.major'">
+                    <el-input v-model="scope.row.major"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="现从事专业" prop="currentMajor" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.currentMajor'">
+                    <el-input v-model="scope.row.currentMajor"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="职称" prop="jobTitle" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.jobTitle'">
+                    <el-input v-model="scope.row.jobTitle"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="部门" prop="dept" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.dept'">
+                    <el-input v-model="scope.row.dept"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="在本项目中承担工作" prop="responsibilities" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.responsibilities'">
+                    <el-input v-model="scope.row.responsibilities"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="联系电话" prop="contactNumber" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-form-item label-width="0" :prop="'headAddVOList.'+scope.$index+'.contactNumber'">
+                    <el-input v-model="scope.row.contactNumber"></el-input>
+                  </el-form-item>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" align="center" width="150">
+                <template slot-scope="scope">
+                  <el-button v-if="!scope.row.disabled" type="text" class="danger" @click="delProcess(scope.$index)">移除
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </td>
+        </tr>
+        <tr v-if="disabledVisible">
+          <td colspan="4">
+            <el-table :data="form.headAddVOList" border>
+              <el-table-column label="姓名" prop="name" align="center" width="120">
+              </el-table-column>
+              <el-table-column label="性别" prop="sex" align="center" width="80">
+              </el-table-column>
+              <el-table-column label="身份证号" prop="idNumber" align="center" width="180">
+              </el-table-column>
+              <el-table-column label="年龄" prop="age" align="center" width="80">
+              </el-table-column>
+              <el-table-column label="学历" prop="education" align="center" width="80">
+              </el-table-column>
+              <el-table-column label="所学专业" prop="major" align="center" width="150">
+              </el-table-column>
+              <el-table-column label="现从事专业" prop="currentMajor" align="center" width="150">
+              </el-table-column>
+              <el-table-column label="职称" prop="jobTitle" align="center" width="150">
+              </el-table-column>
+              <el-table-column label="部门" prop="dept" align="center" width="150">
+              </el-table-column>
+              <el-table-column label="在本项目中承担工作" prop="responsibilities" align="center" width="150">
+              </el-table-column>
+              <el-table-column label="联系电话" prop="contactNumber" align="center" width="150">
+              </el-table-column>
+            </el-table>
+          </td>
+        </tr>
+      </table>
+      <table class="table_register mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">项目所属技术领域</th>
+        </tr>
+        <tr>
+           <td colspan="4">
+             <el-form-item prop="technicalFieldArray" label-width="0">
+               <el-checkbox-group v-model="form.technicalFieldArray" :disabled="disabledVisible">
+                 <el-checkbox v-for="(item, index) in techScopeOptions" :label="item.dictLabel" :key="item.dictValue" :name="item.dictLabel">{{item.dictLabel}}</el-checkbox>
+               </el-checkbox-group>
+             </el-form-item>
+           </td>
+        </tr>
+      </table>
+      <table class="table_register mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">技术来源</th>
+        </tr>
+        <tr>
+           <td colspan="4">
+             <el-form-item prop="technicalSourceArray" label-width="0">
+               <el-checkbox-group v-model="form.technicalSourceArray" :disabled="disabledVisible">
+                 <el-checkbox v-for="(item, index) in techSourceOptions" :label="item.dictLabel" :key="item.dictValue" :name="item.dictLabel">{{item.dictLabel}}</el-checkbox>
+               </el-checkbox-group>
+             </el-form-item>
+           </td>
+        </tr>
+      </table>
+      <table class="table_register mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">项目开发形式</th>
+        </tr>
+        <tr>
+          <td colspan="4">
+            <el-form-item prop="technicalFormArray" label-width="0">
+              <el-checkbox-group v-model="form.technicalFormArray" :disabled="disabledVisible">
+                <el-checkbox v-for="(item, index) in devOptions" :label="item.dictLabel" :key="item.dictValue" :name="item.dictLabel">{{item.dictLabel}}</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </td>
+        </tr>
+      </table>
+      <table class="table_register mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">新兴产业信息</th>
+        </tr>
+        <tr>
+           <th><span style="color: red;">*</span>战略新兴产业</th>
+           <td>
+             <el-form-item prop="industry" label-width="0">
+               <el-radio-group v-model="form.industry" :disabled="disabledVisible">
+                 <el-radio v-for="(item, index) in booleanOptions" :key="index" :label="item.dictValue">{{item.dictLabel}}</el-radio>
+               </el-radio-group>
+             </el-form-item>
+           </td>
+        </tr>
+      </table>
+      <template v-if="type == 'update'">
+        <el-row :gutter="40" v-if="!disabledVisible">
+          <el-col :span="24">
+            <el-form-item style="width:100%;text-align: center;" label-width="0px" class="mt20">
+              <el-button :loading="loading" size="medium" type="primary" @click.native.prevent="submitForm" style="width: 100px;">保存</el-button>
+              <el-button size="medium" type="primary" style="width: 100px;" @click="cancel">取消</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </template>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { editProjectApi,getProjectInfoApi,synTechApi,draftApi,yearApi,declareUpdateApi,devProjectApi } from "@/api/enterprise/project/project"
+import { techScopeOptions,yesOrNoOptions,businessIndustryOptions,techSourceOptions,devOptions,successOptions,projectTypeOptions,booleanOptions } from "@/utils/dataFormat"
+import FileUpload from '@/components/FileUpload'
+import { listEntUserApi } from "@/api/ent/ent"
+import { validAmount,validNumber,validPercentage} from '@/utils/validate'
+
+export default {
+  name: "First",
+  components: {
+    FileUpload
+  },
+  props: {
+    type: {
+      type: String
+    },
+    info: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+  },
+  computed: {
+    userType() {
+      return this.$store.state.user.userType
+    },
+    tempVariable() {
+      let invest = this.form.techInvest
+      let sales = this.form.sales
+      return {invest, sales}
+    },
+    roleTypeFlag() {
+      let roleType = this.$store.state.user.userType
+      return ['ENT_ADMIN_TECH', 'ENT_ADMIN_FIN', 'ENT_TECH', 'ENT_FIN'].includes(roleType) //判断是否为技术负责人,财务负责人
+    }
+  },
+  mounted() {
+    let laydate = window.laydate;
+    laydate.render({
+      elem: '#inputUI', // 输入框的id属性,用来绑定到dom
+      type: 'date',
+      range: true,
+      done: (value) => {
+        this.form.projectTime = value; // 将选中的值赋给组件中的变量
+      }
+    });
+  },
+  data() {
+    return {
+      options: businessIndustryOptions,
+      disabledVisible: false,
+      adminId: undefined,
+      techId: undefined,
+      finId: undefined,
+      serviceDate: [],
+      provinceName: '',
+      cityName: '',
+      districtName: '',
+      codeUrl: "",
+      techScopeOptions: techScopeOptions,
+      techSourceOptions: techSourceOptions,
+      devOptions: devOptions,
+      yesOrNoOptions: yesOrNoOptions,
+      successOptions: successOptions,
+      projectTypeOptions: projectTypeOptions,
+      booleanOptions: booleanOptions,
+      yearsOptions: [],
+      provinceDataList: [],
+      cityDataList: [],
+      districtDataList: [],
+      form: {
+        technicalFieldArray: [],
+        technicalSourceArray: [],
+        technicalFormArray: [],
+        projectTime: "",
+        id: undefined,
+        entId: undefined,
+        projectOwner: 2,
+        projectStartDate: '',
+        projectEndDate: '',
+        industryArray: [],
+        industry: '',
+        headAddVOList: []
+      },
+      rules: {
+        userName: [
+          { required: true, trigger: "blur", message: "请输入您的账号" },
+          { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
+        ],
+        password: [
+          { required: true, trigger: "blur", message: "请输入您的密码" },
+          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
+        ],
+        address: [
+          { required: true, trigger: "blur", message: "请输入通讯地址" },
+          { max: 100, message: '不超过100字符', trigger: 'blur' }
+        ],
+        linkName: [
+          { required: true, trigger: "blur", message: "请输入企业联系人" },
+          { max: 100, message: '不超过100字符', trigger: 'blur' }
+        ],
+        linkPhone: [
+          { required: true, trigger: "blur", message: "请输入联系电话(座机)" },
+          // { max: 11, message: '请输入正确的电话格式', trigger: 'blur' }
+        ],
+        linkMobile: [
+          { required: true, trigger: "blur", message: "请输入手机号" },
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ],
+        totoalPersons: [
+          { required: true, trigger: "blur", message: "请输入职工总人数" },
+          { validator: validNumber, trigger: 'blur'}
+        ],
+        sales: [
+          { required: true, trigger: "blur", message: "请输入年度企业销售收入(万元)" },
+          { validator: validAmount, trigger: 'blur'}
+        ],
+        techPersons: [
+          { required: true, trigger: "blur", message: "请输入研发人数" },
+          { validator: validNumber, trigger: 'blur'}
+        ],
+        techInvest: [
+          { required: true, trigger: "blur", message: "请输入年度研发投入(万元)" },
+          { validator: validAmount, trigger: 'blur'}
+        ],
+        techRate: [
+          { required: true, trigger: "blur", message: "请输入占销售收入比例(%)" },
+          { validator: validPercentage, trigger: 'blur'}
+        ],
+        industry: [
+          { required: true, trigger: "blur", message: "请选择企业所属行业" }
+        ],
+        innovateFlag: [
+          { required: true, trigger: "[blur,change]", message: "请选择国家自主创新示范区企业" }
+        ],
+        overYearFlag: [
+          { required: true, trigger: "change", message: "请选择是否跨年" }
+        ],
+        smallFlag: [
+          { required: true, trigger: "[blur,change]", message: "请选择是否科技型中小企业" }
+        ],
+        techFlag: [
+          { required: true, trigger: "[blur,change]", message: "请选择是否高新技术企业" }
+        ],
+        techLicense: [
+          { required: true, trigger: "change", message: "请上传高新企业证书" }
+        ],
+      },
+      loading: false,
+      captchaOnOff: true
+    };
+  },
+  mounted() {
+    let laydate = window.laydate;
+    laydate.render({
+      elem: '#inputUI', // 输入框的id属性,用来绑定到dom
+      type: 'date',
+      range: true,
+      done: (value) => {
+        this.form.projectTime = value; // 将选中的值赋给组件中的变量
+      }
+    });
+  },
+  created() {
+    this.$nextTick(() => {
+    	this.$refs.form.clearValidate()
+    })
+    this.form.id = this.$route.query.id || undefined;
+    this.form.entId = this.$route.query.entId || undefined;
+    this.getYears()
+    //如果是财务、科技
+    if(this.roleTypeFlag) {
+      this.disabledVisible = true
+    }else {
+      this.disabledVisible = false
+    }
+    if(this.type == 'view') {
+      this.disabledVisible = true
+    }
+  },
+  methods: {
+    getYears(){
+      let optionsArray = new Array();
+      let years= new Date().getFullYear();
+      for(var i=years-3;i<=years;i++){
+        let anOption = {};
+        anOption.dictValue=i;
+        anOption.dictLabel=i;
+        optionsArray.push(anOption);
+      }
+      this.yearsOptions = optionsArray;
+    },
+    addFunc() {
+      this.form.headAddVOList.push({
+        name: "",
+        sex: "",
+        idNumber: "",
+        age: "",
+        education: "",
+        major: "",
+        currentMajor: "",
+        jobTitle: "",
+        dept: "",
+        responsibilities: "",
+        contactNumber: ""
+      })
+    },
+    getLayDate(){
+      let _self = this
+      laydate.render({
+        elem: '#projectTime', // 输入框的id属性,用来绑定到dom
+        type: 'date',
+        range: true,
+        done: (value) => {
+          _self.form.projectTime = value; // 将选中的值赋给组件中的变量
+        }
+      })
+    },
+    synSubmit() {
+      this.loading = true
+      synTechApi(this.adminId).then(res => {
+        this.loading = false
+        if(res.code == 200) {
+          this.$message.success('已同步完成');
+          // this.getData()
+        }
+      })
+    },
+    async getEntData() {
+      listEntUserApi().then(res => {
+        if(!this.form.entName) {
+          this.form.entName = res.data.entName
+        }
+        if(!this.form.linkName) {
+          this.form.linkName = res.data.linkName
+        }
+        if(!this.form.linkPhone) {
+          this.form.linkPhone = res.data.linkPhone
+        }
+        if(!this.form.linkMobile) {
+          this.form.linkMobile = res.data.linkMobile
+        }
+        if(!this.form.techFlag) {
+          this.form.techFlag = res.data.techFlag
+        }
+      })
+    },
+    handleSuccess(file) {
+      this.$refs.techLicenseUpload.clearValidate()
+      this.form.techLicense = file.url;
+      this.form.fileName = file.name;
+    },
+    cancel() {
+      this.$store.dispatch("tagsView/delView", this.$route); // 关闭当前tab
+      this.$router.go(-1);
+    },
+    //保存年度信息
+    submitForm() {
+      this.$refs.form.validate(valid => {
+        if(valid) {
+          this.loading = true
+          this.form.technicalField = this.form.technicalFieldArray.join(',')
+          this.form.technicalSource = this.form.technicalSourceArray.join(',')
+          this.form.technicalForm = this.form.technicalFormArray.join(',')
+          if(this.form.projectTime) {
+            this.form.projectStartDate = this.form.projectTime.split('至')[0].trim()
+            this.form.projectEndDate = this.form.projectTime.split('至')[1].trim()
+          }else {
+            this.form.projectStartDate = ''
+            this.form.projectEndDate = ''
+          }
+          declareUpdateApi(this.form).then(res => {
+            this.loading = false
+            this.$store.dispatch("tagsView/delView", this.$route);
+            this.$router.go(-1);
+          })
+        }
+      })
+    }
+  },
+  watch: {
+    'tempVariable'(val) {
+      if(val.invest && val.sales) {
+        this.form.techRate = ((val.invest / val.sales)*100).toFixed(2)
+      }
+    },
+    info: {
+      immediate: true,
+      handler (obj) {
+            this.form.projectDate = obj.projectDate
+            this.form.projectType = obj.projectType + ''
+            this.form.projectYear = obj.projectYear
+            this.form.projectName = obj.projectName
+            this.form.developFlag = obj.developFlag
+            this.form.headAddVOList = obj.headAddVOList || []
+            this.form.industry = obj.industry
+            this.form.fileName = '高新证书'
+            let arr = ['电子信息']
+            this.$set(this.form, 'techScopeArray', arr)
+
+            if(obj.technicalField) {
+              this.form.technicalFieldArray = obj.technicalField.split(',') || []
+            }
+            if(obj.technicalSource) {
+              this.form.technicalSourceArray = obj.technicalSource.split(',') || []
+            }
+            if(obj.technicalForm) {
+              this.form.technicalFormArray = obj.technicalForm.split(',') || []
+            }
+            if(obj.projectStartDate && obj.projectEndDate) {
+              this.form.projectTime = obj.projectStartDate + ' 至 ' + obj.projectEndDate
+            }
+      }
+    },
+  }
+};
+</script>

+ 489 - 0
src/views/enterprise/project/components/year-edit.vue

@@ -0,0 +1,489 @@
+<template>
+  <div class="app-container" v-loading="loading">
+    <el-form ref="form" :model="form" :rules="rules" label-width="180px">
+      <table class="table_register" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">年度基本信息(<b style="color: red;">年度销售收入、研发投入、职工总人数、研发人员请填写正整数,占销售收入比例为系统自动算出</b>)</th>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>企业名称</th>
+          <td>
+            <el-form-item prop="entName" label-width="0">
+              <el-input v-model="form.entName" type="text" placeholder="请输入企业名称" disabled></el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>申办加计年度</th>
+          <td>
+            <el-form-item prop="projectYear" label-width="0">
+              <!-- <el-input v-model="form.projectName" type="text" placeholder="请输入项目名称" :disabled="disabledVisible"></el-input> -->
+              <el-select v-model="form.projectYear" filterable :disabled="disabledVisible">
+                <el-option v-for="(item, index) in yearsOptions" :key="index" :value="item.dictValue" :label="item.dictLabel"></el-option>
+              </el-select>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>通信地址</th>
+          <td colspan="3">
+            <el-form-item prop="address" label-width="0">
+              <el-input v-model="form.address" placeholder="请输入通讯地址" disabled></el-input>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>企业联系人</th>
+          <td>
+            <el-form-item prop="linkName" label-width="0">
+              <el-input v-model="form.linkName" placeholder="请输入企业联系人" disabled></el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>联系电话(座机)</th>
+          <td>
+            <el-form-item prop="linkPhone" label-width="0">
+              <el-input v-model="form.linkPhone" type="text" auto-complete="off" placeholder="请输入联系电话(座机)" disabled>
+              </el-input>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>联系电话(手机)</th>
+          <td>
+            <el-form-item prop="linkMobile" label-width="0">
+              <el-input v-model="form.linkMobile" type="text" auto-complete="off" placeholder="请输入联系电话(手机)" disabled>
+              </el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>职工总人数(人)</th>
+          <td>
+            <el-form-item prop="totoalPersons" label-width="0">
+              <el-input v-model="form.totoalPersons" type="text" auto-complete="off" placeholder="请输入职工总人数" :disabled="disabledVisible">
+              </el-input>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>年度企业销售收入(万元)</th>
+          <td>
+            <el-form-item prop="sales" label-width="0">
+              <el-input v-model="form.sales" type="text" auto-complete="off" placeholder="请输入年度企业销售收入(万元)" :disabled="disabledVisible">
+              </el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>研发人数(人)</th>
+          <td>
+            <el-form-item prop="techPersons" label-width="0">
+              <el-input v-model="form.techPersons" type="text" auto-complete="off" placeholder="请输入研发人数" :disabled="disabledVisible">
+              </el-input>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>年度研发投入(万元)</th>
+          <td>
+            <el-form-item prop="techInvest" label-width="0">
+              <el-input v-model="form.techInvest" type="text" auto-complete="off" placeholder="请输入年度研发投入(万元)" :disabled="disabledVisible">
+              </el-input>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>占销售收入比例(%)</th>
+          <td>
+            <el-form-item prop="techRate" label-width="0">
+              <el-input v-model="form.techRate" type="text" auto-complete="off" placeholder="请输入占销售收入比例(%)" disabled>
+              </el-input>
+            </el-form-item>
+          </td>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>企业所属行业</th>
+          <td>
+            <el-form-item prop="industryArray" label-width="0">
+              <el-cascader
+                  v-model="form.industryArray"
+                  :options="options"
+                  :disabled="disabledVisible"></el-cascader>
+            </el-form-item>
+          </td>
+          <th><span style="color: red;">*</span>国家自主创新示范区企业</th>
+          <td>
+            <el-form-item prop="innovateFlag" label-width="0">
+              <el-radio-group v-model="form.innovateFlag" :disabled="disabledVisible">
+                <el-radio v-for="(item, index) in booleanOptions" :key="index" :label="item.dictValue">{{item.dictLabel}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </td>
+        </tr>
+      </table>
+      <table class="table_register mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">科技型中小企业信息</th>
+        </tr>
+        <tr>
+          <th><span style="color: red;">*</span>是否科技型中小企业</th>
+          <td>
+            <el-form-item prop="smallFlag" label-width="0">
+              <el-radio-group v-model="form.smallFlag" :disabled="disabledVisible">
+                <el-radio v-for="(item, index) in booleanOptions" :key="index" :label="item.dictValue">{{item.dictLabel}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </td>
+        </tr>
+      </table>
+      <table class="table_register mt20" style="width: 100%;">
+        <tr>
+          <th colspan="4" class="th_title">高新技术企业信息</th>
+        </tr>
+        <tr>
+           <th><span style="color: red;">*</span>是否高新技术企业</th>
+           <td>
+             <el-form-item prop="techFlag" label-width="0">
+               <el-radio-group v-model="form.techFlag" :disabled="disabledVisible">
+                 <el-radio v-for="(item, index) in booleanOptions" :key="index" :label="item.dictValue">{{item.dictLabel}}</el-radio>
+               </el-radio-group>
+             </el-form-item>
+           </td>
+        </tr>
+        <template v-if="form.techFlag == 1">
+          <tr>
+            <th><span style="color: red;">*</span>高新技术企业所属技术领域</th>
+            <td colspan="3">
+              <el-form-item prop="techScopeArray" label-width="0">
+                <el-checkbox-group v-model="form.techScopeArray" :disabled="disabledVisible">
+                  <el-checkbox v-for="(item, index) in techScopeOptions" :label="item.dictLabel" :key="index">{{item.dictLabel}}</el-checkbox>
+                </el-checkbox-group>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <th><span style="color: red;">*</span>证书有效期限</th>
+            <td>
+              <el-form-item prop="licenseTime" label-width="0">
+                <el-input  @focus="getLayDate" id="licenseTime" v-model="form.licenseTime" clearable></el-input>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <th><span style="color: red;">*</span>高新证书</th>
+            <td colspan="3">
+              <el-form-item prop="techLicense" ref="techLicenseUpload" label-width="0">
+                <FileUpload :file="{url: form.techLicense, name: form.fileName}" @input="handleSuccess" :disabledVisible="disabledVisible">上传证书</FileUpload>
+              </el-form-item>
+            </td>
+          </tr>
+        </template>
+      </table>
+      <template v-if="type == 'year' || type == 'update'">
+        <el-row :gutter="40" v-if="!disabledVisible">
+          <el-col :span="24">
+            <el-form-item style="width:100%;text-align: center;" label-width="0px" class="mt20">
+              <el-button :loading="loading" size="medium" type="primary" @click.native.prevent="submitForm" style="width: 100px;">保存</el-button>
+              <el-button size="medium" type="primary" style="width: 100px;" @click="cancel">取消</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </template>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { editProjectApi,getProjectInfoApi,synTechApi,draftApi,yearApi,devProjectApi,getYearDataApi,yearUpdateApi } from "@/api/enterprise/project/project"
+import { techScopeOptions,yesOrNoOptions,businessIndustryOptions,booleanOptions } from "@/utils/dataFormat"
+import FileUpload from '@/components/FileUpload'
+import { listEntUserApi } from "@/api/ent/ent"
+import { validAmount,validNumber,validPercentage} from '@/utils/validate'
+
+export default {
+  name: "First",
+  components: {
+    FileUpload
+  },
+  props: {
+    type: {
+      type: String
+    },
+    info: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+  },
+  computed: {
+    userType() {
+      return this.$store.state.user.userType
+    },
+    tempVariable() {
+      if(this.form.techInvest && this.form.sales) {
+        let invest = this.form.techInvest
+        let sales = this.form.sales
+        return {invest, sales}
+      }
+    },
+    roleTypeFlag() {
+      let roleType = this.$store.state.user.userType
+      return ['ENT_ADMIN_TECH', 'ENT_ADMIN_FIN', 'ENT_TECH', 'ENT_FIN'].includes(roleType) //判断是否为技术负责人,财务负责人
+    }
+  },
+  data() {
+    return {
+      options: businessIndustryOptions,
+      disabledVisible: false,
+      adminId: undefined,
+      techId: undefined,
+      finId: undefined,
+      serviceDate: [],
+      provinceName: "",
+      cityName: "",
+      districtName: "",
+      codeUrl: "",
+      techScopeOptions: techScopeOptions,
+      yesOrNoOptions: yesOrNoOptions,
+      booleanOptions: booleanOptions,
+      provinceDataList: [],
+      cityDataList: [],
+      districtDataList: [],
+      yearsOptions: [],
+      form: {
+        techScopeArray: [],
+        licenseTime: "",
+        projectTime: "",
+        id: undefined,
+        entId: undefined,
+        projectOwner: 2,
+        techStartDate: "",
+        techEndDate: "",
+        projectStartDate: "",
+        projectEndDate: "",
+        industryArray: [],
+        industry: "",
+        entName: "",
+        address: ""
+      },
+      rules: {
+        userName: [
+          { required: true, trigger: "blur", message: "请输入您的账号" },
+          { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
+        ],
+        password: [
+          { required: true, trigger: "blur", message: "请输入您的密码" },
+          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
+        ],
+        address: [
+          { required: true, trigger: "blur", message: "请输入通讯地址" },
+          { max: 100, message: '不超过100字符', trigger: 'blur' }
+        ],
+        linkName: [
+          { required: true, trigger: "blur", message: "请输入企业联系人" },
+          { max: 100, message: '不超过100字符', trigger: 'blur' }
+        ],
+        // linkPhone: [
+        //   { required: true, trigger: "blur", message: "请输入联系电话(座机)" },
+        //   // { max: 11, message: '请输入正确的电话格式', trigger: 'blur' }
+        // ],
+        linkMobile: [
+          { required: true, trigger: "blur", message: "请输入手机号" },
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
+        ],
+        totoalPersons: [
+          { required: true, trigger: "blur", message: "请输入职工总人数" },
+          { validator: validNumber, trigger: 'blur'}
+        ],
+        sales: [
+          { required: true, trigger: "blur", message: "请输入年度企业销售收入(万元)" },
+          { validator: validAmount, trigger: 'blur'}
+        ],
+        techPersons: [
+          { required: true, trigger: "blur", message: "请输入研发人数" },
+          { validator: validNumber, trigger: 'blur'}
+        ],
+        techInvest: [
+          { required: true, trigger: "blur", message: "请输入年度研发投入(万元)" },
+          { validator: validAmount, trigger: 'blur'}
+        ],
+        techRate: [
+          { required: true, trigger: "blur", message: "请输入占销售收入比例(%)" },
+          { validator: validPercentage, trigger: 'blur'}
+        ],
+        industry: [
+          { required: true, trigger: "blur", message: "请选择企业所属行业" }
+        ],
+        innovateFlag: [
+          { required: true, trigger: "[blur,change]", message: "请选择国家自主创新示范区企业" }
+        ],
+        overYearFlag: [
+          { required: true, trigger: "change", message: "请选择是否跨年" }
+        ],
+        smallFlag: [
+          { required: true, trigger: "[blur,change]", message: "请选择是否科技型中小企业" }
+        ],
+        techFlag: [
+          { required: true, trigger: "[blur,change]", message: "请选择是否高新技术企业" }
+        ],
+        techLicense: [
+          { required: true, trigger: "change", message: "请上传高新企业证书" }
+        ],
+        licenseTime: [
+          { required: true, trigger: "change", message: "请选择证书有效期限" }
+        ]
+      },
+      loading: false,
+      captchaOnOff: true
+    };
+  },
+  mounted() {
+    let laydate = window.laydate;
+    laydate.render({
+      elem: '#inputUI', // 输入框的id属性,用来绑定到dom
+      type: 'date',
+      range: true,
+      done: (value) => {
+        this.form.projectTime = value; // 将选中的值赋给组件中的变量
+      }
+    });
+  },
+  created() {
+    this.$nextTick(() => {
+    	this.$refs.form.clearValidate()
+    })
+    this.form.id = this.$route.query.id || undefined;
+    this.form.entId = this.$route.query.entId || undefined;
+    this.getYears()
+    //添加年度信息 获取企业信息
+    if(this.type == 'year') {
+      this.getEntData()
+    }
+    //如果是财务、科技
+    if(this.roleTypeFlag) {
+      this.disabledVisible = true
+    }else {
+      this.disabledVisible = false
+    }
+    if(this.type == 'view') {
+      this.disabledVisible = true
+    }
+  },
+  methods: {
+    getYears(){
+      let optionsArray = new Array();
+      let years= new Date().getFullYear();
+      for(var i=years-3;i<=years;i++){
+        let anOption = {};
+        anOption.dictValue=i;
+        anOption.dictLabel=i;
+        optionsArray.push(anOption);
+      }
+      this.yearsOptions = optionsArray;
+    },
+    getLayDate(){
+      let _self = this
+      laydate.render({
+        elem: '#licenseTime', // 输入框的id属性,用来绑定到dom
+        type: 'date',
+        range: true,
+        done: (value) => {
+          _self.form.licenseTime = value; // 将选中的值赋给组件中的变量
+        }
+      })
+    },
+    synSubmit() {
+      this.loading = true
+      synTechApi(this.adminId).then(res => {
+        this.loading = false
+        if(res.code == 200) {
+          this.$message.success('已同步完成');
+          this.getData()
+        }
+      })
+    },
+    getEntData() {
+      listEntUserApi().then(res => {
+        if(res.code == 200) {
+          this.form.entName = res.data.entName
+          this.form.linkName = res.data.linkName
+          this.form.linkPhone = res.data.linkPhone
+          this.form.linkMobile = res.data.linkMobile
+          this.form.techFlag = res.data.techFlag
+          this.form.address = res.data.address
+        }
+      })
+    },
+    getYearData(projectYear) {
+      getYearDataApi(projectYear).then(res => {
+        this.form = res.data
+        if(this.form.industry) {
+          let industryArray = this.form.industry.split(',') || [];
+          this.$set(this.form, 'industryArray', industryArray);
+        }
+      })
+    },
+    handleSuccess(file) {
+      this.$refs.techLicenseUpload.clearValidate()
+      this.form.techLicense = file.url;
+      this.form.fileName = file.name;
+    },
+    cancel() {
+      this.$store.dispatch("tagsView/delView", this.$route); // 关闭当前tab
+      this.$router.go(-1);
+    },
+    submitForm() {
+      this.$refs.form.validate(valid => {
+        if(valid) {
+          this.loading = true
+          if(this.form.techScopeArray && this.form.techScopeArray.length > 0) {
+            this.form.techScope = this.form.techScopeArray.join(',')
+          }
+          this.form.industry = this.form.industryArray.join(',')
+          if(this.form.projectTime) {
+            this.form.projectStartDate = this.form.projectTime.split('至')[0].trim()
+            this.form.projectEndDate = this.form.projectTime.split('至')[1].trim()
+          }else {
+            this.form.projectStartDate = ""
+            this.form.projectEndDate = ""
+          }
+          if(this.form.licenseTime) {
+            this.form.techStartDate = this.form.licenseTime.split('至')[0].trim()
+            this.form.techEndDate = this.form.licenseTime.split('至').trim()
+          }else{
+            this.form.techStartDate = ""
+            this.form.techEndDate = ""
+          }
+          if(this.type == 'year') {
+            yearApi(this.form).then(res => {
+              this.loading = false
+              this.$store.dispatch("tagsView/delView", this.$route);
+              this.$router.go(-1);
+            })
+          } else {
+            yearUpdateApi(this.form).then(res => {
+              this.loading = false
+              this.$store.dispatch("tagsView/delView", this.$route);
+              this.$router.go(-1);
+            })
+          }
+        }
+      })
+    }
+  },
+  watch: {
+    'tempVariable'(val) {
+      if(val.invest && val.sales) {
+        this.form.techRate = ((val.invest / val.sales)*100).toFixed(2)
+      }
+    },
+    info: {
+      immediate: true,
+      handler (obj) {
+        this.form.projectYear = obj.projectYear
+        if(this.form.projectYear) {
+          this.getYearData(this.form.projectYear)
+        }
+      }
+    },
+
+  }
+};
+</script>

+ 44 - 84
src/views/enterprise/project/edit.vue

@@ -1,117 +1,77 @@
 <template>
   <div class="app-container" v-loading="loading">
-    <el-tabs :tab-position="tabPosition" stretch v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="企业自填" name="1">
-        <el-tabs type="border-card" v-if="entVisible">
-          <el-tab-pane label="项目基本信息">
-            <ent-basic></ent-basic>
-          </el-tab-pane>
-          <el-tab-pane label="资料附件">
-            <ent-enclosure></ent-enclosure>
-          </el-tab-pane>
-        </el-tabs>
+    <el-tabs stretch v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="加计年度企业基本信息" name="1">
+        <year-edit :type="type" :info.sync="form"></year-edit>
       </el-tab-pane>
-      <el-tab-pane label="企业技术" name="2">
-        <el-tabs type="border-card" v-if="techVisible">
-          <el-tab-pane label="项目基本信息">
-            <tech-basic></tech-basic>
-          </el-tab-pane>
-          <el-tab-pane label="资料附件">
-            <tech-enclosure></tech-enclosure>
-          </el-tab-pane>
-        </el-tabs>
+      <el-tab-pane label="企业研发项目情况表" name="2" :disabled="entDisabled">
+        <ent-edit :type="type" :info.sync="form"></ent-edit>
       </el-tab-pane>
-      <el-tab-pane label="企业财务" name="3">
-        <el-tabs type="border-card" v-if="finVisible">
-          <el-tab-pane label="项目基本信息">
-            <fin-basic></fin-basic>
-          </el-tab-pane>
-          <el-tab-pane label="资料附件">
-            <fin-enclosure></fin-enclosure>
-          </el-tab-pane>
-          <el-tab-pane label="财务资料附件">
-            <fin-data-enclosure></fin-data-enclosure>
-          </el-tab-pane>
-        </el-tabs>
+      <el-tab-pane label="上传文件" name="3" :disabled="encDisabled">
+        <enclosure-edit :type="type"></enclosure-edit>
       </el-tab-pane>
     </el-tabs>
   </div>
 </template>
 
 <script>
-
-import EntBasic from './components/EntBasic'
-import TechBasic from './components/TechBasic'
-import FinBasic from './components/FinBasic'
-import {getProjectInfoApi} from '@/api/enterprise/project/project'
-import EntEnclosure from './components/EntEnclosure'
-import FinEnclosure from './components/FinEnclosure'
-import TechEnclosure from './components/TechEnclosure'
-import FinDataEnclosure from './components/FinDataEnclosure'
-
-import first from './edit/first'
-import second from './edit/second'
-import third from './edit/third'
+import YearEdit from "./components/year-edit.vue"
+import EntEdit from "./components/ent-edit.vue"
+import EnclosureEdit from "./components/enclosure-edit.vue"
+import { devProjectApi } from "@/api/enterprise/project/project"
+
 export default {
-  name: "First",
+  name: "projectEdit",
   computed: {
     userType() {
       return this.$store.state.user.userType
     },
   },
   components: {
-    EntBasic,
-    TechBasic,
-    FinBasic,
-    EntEnclosure,
-    FinEnclosure,
-    TechEnclosure,
-    FinDataEnclosure,
-    first,
-    second,
-    third
+    YearEdit,
+    EntEdit,
+    EnclosureEdit
   },
   data() {
     return {
-      tabPosition: 'left',
-      activeName: '1',
+      activeName: "1",
       loading: false,
       id: undefined,
-      entVisible: true,
-      finVisible: false,
-      techVisible: false
+      entDisabled: false,
+      encDisabled: false,
+      type: "",
+      form: {},
+      source: ""
     };
   },
   created() {
-    this.id = this.$route.query.id || undefined;
+    this.id = this.$route.query.id || undefined;
+    this.type = this.$route.query.type || ""
+    this.source = this.$route.query.source || ""
+    this.activeName = this.$route.query.activeName || "1"
+    if(this.id) {
+      this.getData()
+    }
+    if(this.type == 'year' || this.source == 'add') {
+      this.entDisabled = true
+      this.encDisabled = true
+    }else {
+      this.entDisabled = false
+      this.encDisabled = false
+    }
   },
   methods: {
     getEntData() {
-      listEntUserApi().then(res => {
-        this.form.entName = res.data.entName
-      })
+
     },
     handleClick(tab,event) {
-      if(tab.name == '1') {
-        this.entVisible = true
-        this.techVisible = false
-        this.finVisible = false
-      }else if(tab.name == '2') {
-        this.techVisible = true
-        this.entVisible = false
-        this.finVisible = false
-      }else if(tab.name == '3') {
-        this.finVisible = true
-        this.entVisible = false
-        this.techVisible = false
-      }
-    }
+
+    },
+    async getData() {
+      devProjectApi(this.id).then(res => {
+        this.form = res.data || {}
+      })
+    },
   }
 };
 </script>
-
-<style rel="stylesheet/scss" lang="scss">
-  .el-tabs__nav {
-    width: 96px
-  }
-</style>

+ 45 - 121
src/views/enterprise/project/index.vue

@@ -1,36 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" size="small">
-      <template v-if="!checkRole(['entAdmin','entUser'])">
-        <el-form-item label="省" prop="provinceId">
-          <el-select v-model="queryParams.provinceId" placeholder="请选择省" @change="getCityData" filterable style="width: 200px;" clearable>
-            <el-option v-for="(item,index) in provinceDataList" :key="index" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="市" prop="cityId">
-          <el-select v-model="queryParams.cityId" placeholder="请选择市" @change="getDistrictData" filterable style="width: 200px;" clearable>
-            <el-option v-for="(item, index) in cityDataList" :key="index" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="区" prop="districtId">
-          <el-select v-model="queryParams.districtId" placeholder="请选择区" filterable style="width: 200px;" clearable>
-            <el-option v-for="(item, index) in districtDataList" :key="index" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="年份" prop="year">
-          <el-date-picker
-                type="years"
-                v-model="years"
-                placeholder="选择一个或多个年份" value-format="yyyy">
-              </el-date-picker>
-        </el-form-item>
-        <el-form-item label="企业名称" prop="entName">
-          <el-input v-model="queryParams.entName" clearable style="width: 200px;" placeholder="请填入企业名称"></el-input>
-        </el-form-item>
-        <el-form-item label="社会信用代码" prop="license">
-          <el-input v-model="queryParams.license" style="width: 200px;" placeholder="请输入社会信用代码" clearable></el-input>
-        </el-form-item>
-      </template>
       <el-form-item label="项目编号" prop="projectNo">
         <el-input v-model="queryParams.projectNo" style="width: 200px;" placeholder="请输入项目编号" clearable></el-input>
       </el-form-item>
@@ -46,78 +16,42 @@
       <span class="title">列表</span>
       <div class="tool">
         <el-button type="text" style="color: red">当技术、财务资料达到 100%时,可提交项目申报</el-button>
-        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-if="roleType == 'entAdmin' || roleType == 'entUser'">新增</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleYear" v-if="checkRole(['entAdmin'])">添加加计年度基本信息</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-if="checkRole(['entAdmin'])">项目申报</el-button>
         <el-button type="primary" plain icon="el-icon-download" size="mini" @click="handleDownloadBatch">下载</el-button>
-        <el-button type="primary" plain icon="el-icon-delete" size="mini" @click="handleBatchDel" v-if="roleType == 'entAdmin' || roleType == 'entUser' || roleType == 'manager'">批量删除</el-button>
+        <el-button type="primary" plain icon="el-icon-delete" size="mini" @click="handleBatchDel">批量删除</el-button>
       </div>
     </h3>
     <el-table v-loading="loading" :data="list" border @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="项目编号" prop="projectNo" width="150" align="center" />
+      <el-table-column type="index" width="50" label="序号"></el-table-column>
+      <el-table-column label="加计扣除年度" prop="projectYear" align="center"></el-table-column>
       <el-table-column label="项目名称" prop="projectName" align="center" width="180"></el-table-column>
-      <!-- <el-table-column label="企业名称" prop="entName" align="center" width="180"/> -->
-      <!-- <el-table-column label="社会信用代码" prop="license" align="center" width="180" /> -->
-      <el-table-column label="项目年份" prop="projectYear" align="center" width="120" />
+      <el-table-column label="是否跨年项目" prop="overYearFlag" :formatter="overYearFormat"></el-table-column>
+      <!-- <el-table-column label="跨年申报" prop="backFlag"></el-table-column> -->
+      <el-table-column label="是否追溯项目" prop="backFlag" :formatter="flagFormat"></el-table-column>
       <el-table-column label="项目起止时间" align="center" width="200">
         <template slot-scope="scope">
           <span>{{scope.row.projectStartDate}} - {{scope.row.projectEndDate}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="160"></el-table-column>
       <el-table-column label="资料完善度" prop="linkEmail" align="center" width="340">
         <template slot-scope="scope">
           <span>企业 {{scope.row.entCompRate}} 技术 {{scope.row.techCompRate}} 财务 {{scope.row.finCompRate}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="负责状态" align="center" width="160">
-        <template slot-scope="scope">
-          <template v-if="scope.row.compRate !='100.0%'">
-            <span>待完善</span>
-          </template>
-          <template v-if="scope.row.compRate =='100.0%' && scope.row.authState == '1'">
-            <span>已完善</span>
-          </template>
-          <template v-if="scope.row.authState == '2'">
-            <span>待审核</span>
-          </template>
-          <template v-if="scope.row.authState == '3'">
-            <span>审核通过</span>
-          </template>
-          <template v-if="scope.row.authState == '4'">
-            <span>审核拒绝</span>
-          </template>
-        </template>
-      </el-table-column>
-      </el-table-column>
-      <el-table-column label="项目状态" prop="reportState" align="center" width="160" :formatter="reportStateFormat"></el-table-column>
+      <el-table-column label="申报状态" prop="reportState" align="center" width="160" :formatter="reportStateFormat"></el-table-column>
       </el-table-column>
-      <el-table-column label="操作" align="center" width="180" class-name="small-padding fixed-width" fixed="right">
+      <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width" fixed="right">
         <template slot-scope="scope">
-          <el-button type="text" @click="handleView(scope.row)">查看</el-button>
+          <el-button type="text" @click="handleView(scope.row)" v-if="(!roleTypeFlag &&(scope.row.reportState == 3 || scope.row.reportState == 4)) || roleTypeFlag">查看</el-button>
           <template v-if="scope.row.attachCnt != 0">
             <el-button type="text" @click="handleDownload(scope.row)">下载</el-button>
           </template>
-          
-          <!-- <template v-if="roleType == 'entAdmin' || roleType == 'entUser' || roleType == 'manager'">
+          <template v-if="!roleTypeFlag && (scope.row.reportState == 1 || scope.row.reportState == 2)">
             <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
-          </template> -->
-          <template v-if="roleType == 'entAdmin' || roleType == 'entUser'">
-            <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
-            <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
-            <template v-if="scope.row.finCompRate == '100.0%' && scope.row.reportState == '1'">
-              <el-button type="text" @click="handleDeclare(scope.row)">提交申报</el-button>
-            </template>
-            <template v-if="scope.row.finCompRate == '100.0%' && (scope.row.reportState == '2' || scope.row.reportState == '3') ">
-              <el-button type="text" @click="handleDeclare(scope.row)">重新申报</el-button>
-            </template>
-            <template v-if="scope.row.compRate == '100.0%' && (userType == 'ENT_TECH' || userType == 'ENT_FIN')">
-              <!-- && (scope.row.authState == '1' || scope.row.authState == '4') -->
-              <el-button type="text" @click="handleAudit(scope.row)" v-if="scope.row.authState == '1'">提交审核</el-button>
-              <el-button type="text" @click="handleAudit(scope.row)" v-else-if="scope.row.authState == '4'">重新提交审核</el-button>
-            </template>
-            <template v-if="scope.row.authState == '2' && (userType == 'ENT_ADMIN_TECH' || userType == 'ENT_ADMIN_FIN')">
-              <el-button type="text" @click="handleAuditAdmin(scope.row)">审核</el-button>
-            </template>
+            <el-button type="text" @click="handleDeclare(scope.row)">提交申报</el-button>
+            <el-button type="text" @click="handleDelete(scope.row)" v-if="userType == 'ENT_ADMIN'">删除</el-button>
           </template>
         </template>
       </el-table-column>
@@ -138,7 +72,7 @@
   import {getProvinceDataApi,getRegionChildrenApi} from "@/api/common/common"
   import {listProjectApi, deleteEntApi, deleteProjectApi} from '@/api/enterprise/project/project'
   import {listProjectAdminApi} from '@/api/admin/project/project'
-  import {entStateOptions, getLabel, authStateOptions, reportStateOptions} from '@/utils/dataFormat'
+  import {entStateOptions, getLabel, authStateOptions, reportStateOptions,booleanOptions} from '@/utils/dataFormat'
   import AddProject from './components/addProject'
   import declare from './components/declare'
   import {projectAuditApi} from '@/api/admin/project/project'
@@ -146,6 +80,7 @@
   import {downloadProjectByIDApi} from '@/api/common/common'
   import { downLoadZip } from "@/utils/zipdownload";
   import { checkRole } from "@/utils/permission"; // 权限判断函数
+  import {submitDeclareApi} from "@/api/enterprise/declare/declare"
   export default {
     components: {
       AddProject,
@@ -185,22 +120,21 @@
         list: [],
         total: 0,
         open: false,
-        openInfo: false,
-        roleType: '',
+        openInfo: false
       }
     },
     computed: {
       userType() {
         return this.$store.state.user.userType
       },
-      roles() {
-        return this.$store.state.user.roles
+      roleTypeFlag() {
+        let roleType = this.$store.state.user.userType
+        return ['ENT_ADMIN_TECH', 'ENT_ADMIN_FIN'].includes(roleType) //判断是否为技术负责人,财务负责人
       }
     },
     created() {
       this.getList()
       this.getProvinceData()
-      this.roleType = this.roles.join(',')
     },
     methods: {
       checkRole,
@@ -259,20 +193,11 @@
       getList() {
         this.loading = true;
         this.queryParams.year = this.years.join(',')
-        if(this.userType == 'ENT_ADMIN' || this.userType == 'ENT_TECH' || this.userType == 'ENT_ADMIN_TECH' || this.userType == 'ENT_FIN' || this.userType == 'ENT_ADMIN_FIN') {
-          listProjectApi(this.queryParams).then(response => {
-            this.list = response.data.records;
-            this.total = response.data.total;
-            this.loading = false;
-          });
-        }else if(this.userType == 'ADMIN') {
-          listProjectAdminApi(this.queryParams).then(response => {
-            this.list = response.data.records;
-            this.total = response.data.total;
-            this.loading = false;
-          });
-        }
-
+        listProjectApi(this.queryParams).then(response => {
+          this.list = response.data.records;
+          this.total = response.data.total;
+          this.loading = false;
+        });
       },
       handleAdd() {
         this.addProjectVisible = true
@@ -291,43 +216,36 @@
         const delIds = this.ids.join(',')
         downLoadZip('/project/download/' +delIds, "项目附件")
       },
+      //提交申报
       handleDeclare(row) {
-        this.declareVisible = true
-        this.$nextTick(() => {
-          this.$refs.declare.init(row.id)
-        })
-      },
-      handleEdit(row) {
-        this.$router.push({name: 'editProject', query: {id: row.id, entId: row.entId}})
-      },
-      // 审核
-      handleAudit(row) {
-        const projectId = row.id;
-        const authState = '2'
-        this.$confirm('是否确认提交审核该数据?', "警告", {
+        const id = row.id;
+        const reportState = '3'
+        this.$confirm('是否确认申报该数据?', "警告", {
             confirmButtonText: "确定",
             cancelButtonText: "取消",
             type: "warning"
           }).then(function() {
-            return projectAuditApi(projectId,authState);
+            return submitDeclareApi(id, reportState);
           }).then(() => {
             this.queryParams.pageNum = 1;
             this.getList();
             this.$message({
-              message: '提交成功',
+              message: '申报成功',
               type: 'success'
             });
           })
       },
-      handleAuditAdmin(row) {
-        this.auditVisible = true
-        this.$nextTick(() => {
-          this.$refs.auditProject.init(row.id)
-        })
+      //编辑
+      handleEdit(row) {
+        this.$router.push({name: 'editProject', query: {id: row.id, entId: row.entId, type: 'update', activeName: '2'}})
+      },
+      //添加年度信息 type用来区分tab页是否可以切换
+      handleYear() {
+        this.$router.push({name: 'editProject', query: {type: 'year'}})
       },
       // 查看
       handleView(row) {
-        this.$router.push("/project/info/"+row.id)
+        this.$router.push({name: 'editProject', query: {id: row.id, entId: row.entId, type: 'view'}})
       },
       handleDelete(row) {
         const id = row.id;
@@ -359,6 +277,12 @@
       },
       reportStateFormat(row, col, val, index) {
         return getLabel(reportStateOptions, val)
+      },
+      flagFormat(row, col, val, index) {
+        return getLabel(booleanOptions, val)
+      },
+      overYearFormat(row, col, val, index) {
+        return getLabel(booleanOptions, val)
       }
     }
   }

+ 0 - 93
src/views/enterprise/project/info.vue

@@ -1,93 +0,0 @@
-<template>
-  <div class="app-container" v-loading="loading">
-    <el-tabs :tab-position="tabPosition" stretch ref="tabsFirst" v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="企业自填" name="1">
-        <el-tabs type="border-card" v-if="entVisible">
-          <el-tab-pane label="项目基本信息">
-            <basic-info :projectOwner="'1'"></basic-info>
-          </el-tab-pane>
-          <el-tab-pane label="资料附件">
-            <enclosure-info :projectOwner="'1'"></enclosure-info>
-          </el-tab-pane>
-        </el-tabs>
-      </el-tab-pane>
-        <el-tab-pane label="企业技术" name="2">
-          <el-tabs type="border-card" v-if="techVisible">
-            <el-tab-pane label="项目基本信息">
-              <basic-info :projectOwner="'2'"></basic-info>
-            </el-tab-pane>
-            <el-tab-pane label="资料附件">
-              <enclosure-info :projectOwner="'2'"></enclosure-info>
-            </el-tab-pane>
-          </el-tabs>
-        </el-tab-pane>
-        <el-tab-pane label="企业财务" name="3">
-          <el-tabs type="border-card" v-if="finVisible">
-            <el-tab-pane label="项目基本信息">
-              <basic-info :projectOwner="'3'"></basic-info>
-            </el-tab-pane>
-            <el-tab-pane label="资料附件">
-              <enclosure-info :projectOwner="'3'"></enclosure-info>
-            </el-tab-pane>
-            <el-tab-pane label="财务资料附件">
-              <enclosure-info :projectOwner="'3'" :finOwner="'fin'"></enclosure-info>
-            </el-tab-pane>
-          </el-tabs>
-        </el-tab-pane>
-
-    </el-tabs>
-  </div>
-</template>
-
-<script>
-
-import BasicInfo from './components/BasicInfo'
-import EnclosureInfo from './components/EnclosureInfo'
-export default {
-  name: "First",
-  computed: {
-    userType() {
-      return this.$store.state.user.userType
-    },
-  },
-  components: {
-    BasicInfo,
-    EnclosureInfo
-  },
-  data() {
-    return {
-      activeName: '1',
-      tabPosition: 'left',
-      loading: false,
-      entVisible: true,
-      finVisible: false,
-      techVisible: false
-    };
-  },
-  created() {
-  },
-  methods: {
-    handleClick(tab,event) {
-      if(tab.name == '1') {
-        this.entVisible = true
-        this.techVisible = false
-        this.finVisible = false
-      }else if(tab.name == '2') {
-        this.techVisible = true
-        this.entVisible = false
-        this.finVisible = false
-      }else if(tab.name == '3') {
-        this.finVisible = true
-        this.entVisible = false
-        this.techVisible = false
-      }
-    }
-  }
-};
-</script>
-
-<style rel="stylesheet/scss" lang="scss">
-  .el-tabs__nav {
-    width: 96px
-  }
-</style>

+ 57 - 5
src/views/index.vue

@@ -96,28 +96,64 @@
           </div>
         </el-col>
       </el-row>
-    </template>
+    </template>
+    <template v-if="roleTypeFlag">
+      <h3 class="toolbar">
+        <span class="title">年度信息管理</span>
+        <div class="tool">
+          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleYear">添加加计年度基本信息</el-button>
+        </div>
+      </h3>
+      <el-table v-loading="loading" :data="list" border>
+        <el-table-column label="申报年度" prop="projectYear"></el-table-column>
+        <el-table-column label="企业名称" prop="entName" align="center" width="180"/>
+        <el-table-column label="职工数" prop="totoalPersons" align="center" width="180" />
+        <el-table-column label="销售收入" prop="sales"></el-table-column>
+        <el-table-column label="研发收入" prop="techInvest"></el-table-column>
+        <el-table-column label="占销售收入比例" prop="techRate"></el-table-column>
+        <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width" fixed="right">
+          <template slot-scope="scope">
+            <!-- <template v-if="!roleTypeFlag && (scope.row.reportState == 1 || scope.row.reportState == 2)"> -->
+              <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+            <!-- </template> -->
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+    
   </div>
 </template>
 
 <script>
-  import {getIndexDataApi} from "@/api/common/common.js"
+  import {getIndexDataApi} from "@/api/common/common.js"
+  import {yearListApi} from "@/api/enterprise/project/project"
 export default {
   name: "Index",
   computed: {
     userType() {
       return this.$store.state.user.userType
     },
+    roleTypeFlag() {
+      let roleType = this.$store.state.user.roles.join(',')
+      return ['entAdmin'].includes(roleType) //判断是否为技术负责人,财务负责人
+    }
   },
   data() {
     return {
       // 版本号
       version: "1.0.0",
-      info: {}
+      info: {},
+      list: [],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
     };
   },
   created() {
     this.getData()
+    this.getList()
   },
   methods: {
     goTarget(href) {
@@ -127,8 +163,24 @@ export default {
       getIndexDataApi().then(res => {
         this.info = res.data || {}
       })
-    }
-  },
+    },
+    getList() {
+      this.loading = true;
+      yearListApi(this.queryParams).then(response => {
+        this.list = response.data.records;
+        // this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    //添加年度信息 type用来区分tab页是否可以切换
+    handleYear() {
+      this.$router.push({name: 'editProject', query: {type: 'year'}})
+    },
+    //编辑
+    handleEdit(row) {
+      this.$router.push({name: 'editProject', query: {id: row.id, entId: row.entId, type: 'update', activeName: '1', source: 'add'}})
+    },
+  }
 };
 </script>
 

+ 2 - 1
vue.config.js

@@ -35,7 +35,8 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://124.232.146.72:7015/api`,
+        target: `http://124.232.146.72:7015/api`,
+        // target: 'http://192.168.0.174:8080/api',
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''