guhongwei há 4 anos atrás
pai
commit
03ed68dd65

+ 32 - 1
src/layout/common/top.vue

@@ -18,6 +18,15 @@
             <van-search v-model="searchName" placeholder="请输入赠与人名称" @search="search" />
           </el-col>
         </el-col>
+        <el-col :span="24" class="four" v-else-if="topType == '4'">
+          <el-col :span="4" class="back" @click.native="upBack"> <van-icon name="arrow-left" />返回 </el-col>
+          <el-col :span="16" class="title">
+            {{ $route.meta.title }}
+          </el-col>
+          <el-col :span="4" class="add">
+            <van-button icon="plus" size="small" type="info" round @click="add" />
+          </el-col>
+        </el-col>
       </el-col>
     </el-row>
   </div>
@@ -46,7 +55,11 @@ export default {
     },
     // 返回
     upBack() {
-      this.$emit('upBack');
+      this.$emit('back');
+    },
+    // 添加
+    add() {
+      this.$emit('add');
     },
   },
   computed: {
@@ -95,5 +108,23 @@ export default {
       }
     }
   }
+  .four {
+    .back {
+      color: #409eff;
+      padding: 8px 0;
+      text-align: center;
+      .van-icon {
+        top: 3px;
+      }
+    }
+    .title {
+      text-align: center;
+      padding: 9px 0;
+    }
+    .add {
+      text-align: center;
+      padding: 4px 0;
+    }
+  }
 }
 </style>

+ 47 - 1
src/router/index.js

@@ -7,6 +7,50 @@ VueRouter.prototype.push = function push(location) {
   return originalPush.call(this, location).catch((err) => err);
 };
 Vue.use(VueRouter);
+const company = [
+  {
+    path: '/companyCenter/basic',
+    name: 'companyCenter_basic',
+    meta: { title: '基本信息' },
+    component: () => import('../views/companyCenter/basic/index.vue'),
+  },
+  {
+    path: '/companyCenter/subsidy',
+    name: 'companyCenter_subsidy',
+    meta: { title: '研发补贴' },
+    component: () => import('../views/companyCenter/subsidy/index.vue'),
+  },
+  {
+    path: '/companyCenter/subsidy/detail',
+    name: 'companyCenter_subsidy_detail',
+    meta: { title: '研发补贴-信息管理' },
+    component: () => import('../views/companyCenter/subsidy/detail.vue'),
+  },
+  {
+    path: '/companyCenter/reward',
+    name: 'companyCenter_reward',
+    meta: { title: '奖励兑现' },
+    component: () => import('../views/companyCenter/reward/index.vue'),
+  },
+  {
+    path: '/companyCenter/reward/detail',
+    name: 'companyCenter_reward_detail',
+    meta: { title: '奖励兑现-信息管理' },
+    component: () => import('../views/companyCenter/reward/detail.vue'),
+  },
+  {
+    path: '/companyCenter/coupons',
+    name: 'companyCenter_coupons',
+    meta: { title: '创新券申领' },
+    component: () => import('../views/companyCenter/coupons/index.vue'),
+  },
+  {
+    path: '/companyCenter/coupons/detail',
+    name: 'companyCenter_coupons_detail',
+    meta: { title: '创新券-信息管理' },
+    component: () => import('../views/companyCenter/coupons/detail.vue'),
+  },
+];
 const web = [
   {
     path: '/',
@@ -38,6 +82,8 @@ const web = [
     meta: { title: '登录页面' },
     component: () => import('../views/login.vue'),
   },
+  // 企业菜单
+  ...company,
 ];
 const routes = [...web];
 const router = new VueRouter({
@@ -48,7 +94,7 @@ const router = new VueRouter({
 router.beforeEach((to, from, next) => {
   document.title = `${to.meta.title} `;
   const token = localStorage.getItem('token');
-  if (to.path == '/policy' || to.path == '/ticket') {
+  if (to.path == '/policy' || to.path == '/ticket' || to.path == '/userCenter') {
     if (!token) {
       next(`/login?path=${to.path}`);
     } else {

+ 158 - 0
src/views/companyCenter/basic/index.vue

@@ -0,0 +1,158 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="2" @back="back"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-form>
+            <van-col span="24" class="info_1">
+              <van-col span="24" class="info_1text"> 基本信息 </van-col>
+              <van-col span="24" class="info_1field">
+                <van-field v-model="form.name" label="企业名称" placeholder="企业名称" />
+                <van-field v-model="form.institution_code" label="机构代码" placeholder="机构代码" disabled />
+                <van-field v-model="form.phone" label="手机号" placeholder="手机号" />
+                <van-field v-model="form.email" label="电子邮箱" placeholder="电子邮箱" />
+                <van-field v-model="form.addr" label="联系地址" placeholder="联系地址" />
+                <van-field v-model="form.office_phone" label="办公电话" placeholder="办公电话" />
+                <van-field v-model="form.profession" label="所属行业" placeholder="所属行业" />
+              </van-col>
+            </van-col>
+            <van-col span="24" class="info_1">
+              <van-col span="24" class="info_1text"> 详细信息 </van-col>
+              <van-col span="24" class="info_1field">
+                <van-field v-model="form.companytype" label="注册类型" placeholder="注册类型" />
+                <van-field
+                  readonly
+                  clickable
+                  name="calendar"
+                  :value="form.companydate"
+                  label="注册时间"
+                  placeholder="点击选择日期"
+                  @click="showCalendar = true"
+                />
+                <van-calendar v-model="showCalendar" @confirm="onConfirm" />
+                <van-field v-model="form.companycapital" label="注册资金" placeholder="注册资金" />
+                <van-field v-model="form.companyperson" label="企业法人" placeholder="企业法人" />
+                <van-field v-model="form.sndqyzsr" label="企业总收入" placeholder="企业总收入" />
+                <van-field v-model="form.sndyffy" label="研发费用" placeholder="研发费用" />
+                <van-field v-model="form.companytotal" label="研发人数" placeholder="研发人数" />
+                <van-field v-model="form.companybrief" label="企业简介" placeholder="企业简介" type="textarea" maxlength="300" show-word-limit />
+                <van-field v-model="form.mainproduct" label="主要产品" placeholder="主要产品" type="textarea" maxlength="300" show-word-limit />
+                <van-field v-model="form.qualifications" label="资质&荣誉" placeholder="资质&荣誉" type="textarea" maxlength="300" show-word-limit />
+              </van-col>
+            </van-col>
+            <van-col span="24" class="btn">
+              <van-button type="danger" round @click="back">取消保存</van-button>
+              <van-button type="info" round @click="oneSubmit">提交保存</van-button>
+            </van-col>
+          </van-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+var moment = require('moment');
+import top from '@/layout/common/top.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: organization } = createNamespacedHelpers('organization');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      form: {},
+      // 时间
+      showCalendar: false,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 40;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...organization(['fetch', 'update']),
+    async search() {
+      if (this.user.id) {
+        let res = await this.fetch(this.user.id);
+        if (this.$checkRes(res)) this.$set(this, `form`, res.data);
+      }
+    },
+    // 提交
+    async oneSubmit() {
+      let data = _.get(this, 'form');
+      let res = await this.update(data);
+      if (this.$checkRes(res)) {
+        this.$toast({ type: 'success', message: '保存成功' });
+        this.back();
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push('/userCenter');
+    },
+    // 时间选择
+    onConfirm(date) {
+      let newsDate = moment(date).format('YYYY-MM-DD');
+      if (newsDate) this.$set(this.form, `companydate`, newsDate);
+      this.showCalendar = false;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    .btn {
+      text-align: center;
+      padding: 15px 0;
+      .van-button {
+        margin: 0 10px;
+      }
+    }
+    .info_1 {
+      .info_1text {
+        font-size: 16px;
+        font-weight: bold;
+        padding: 10px 15px;
+        border-bottom: 1px dashed #409eff;
+        text-align: center;
+      }
+      .info_1field {
+        border-bottom: 1px dashed #409eff;
+      }
+    }
+  }
+}
+</style>

+ 181 - 0
src/views/companyCenter/coupons/detail.vue

@@ -0,0 +1,181 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="2" @back="back"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-form>
+            <van-field v-model="form.company" label="申请单位" placeholder="申请单位" :rules="[{ required: true, message: '请填写申请单位' }]" />
+            <van-field v-model="form.apply_personal" label="申请人" placeholder="申请人" :rules="[{ required: true, message: '请填写申请人' }]" />
+            <van-field v-model="form.phone" label="联系电话" placeholder="联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" />
+            <van-field name="uploader" label="法人复印件" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.qyfr"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'qyfr')"
+                  @delete="(file) => toDelete(file, 'qyfr')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="营业执照" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.yyzz"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'yyzz')"
+                  @delete="(file) => toDelete(file, 'yyzz')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="企业利润表" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.qylr"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'qylr')"
+                  @delete="(file) => toDelete(file, 'qylr')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="radio" label="审核状态" label-width="60">
+              <template #input>
+                <van-radio-group v-model="form.status" direction="horizontal">
+                  <van-radio :name="item.value" v-for="(item, index) in statusList" :key="index" disabled>{{ item.label }}</van-radio>
+                </van-radio-group>
+              </template>
+            </van-field>
+            <van-field v-model="form.desc" label="审核意见" placeholder="审核意见" type="textarea" maxlength="300" show-word-limit readonly />
+            <van-col span="24" class="btn" v-if="form.status == '0'">
+              <van-button type="danger" round>取消申报</van-button>
+              <van-button type="info" round @click="oneSubmit">提交申报</van-button>
+            </van-col>
+          </van-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import top from '@/layout/common/top.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { policyStatus } = require('@common/dict/index');
+const { mapActions: upload } = createNamespacedHelpers('upload');
+const { mapActions: mapPolicy } = createNamespacedHelpers('policy');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      form: {
+        qyfr: [],
+        yyzz: [],
+        qylr: [],
+        status: '0',
+      },
+      statusList: policyStatus,
+    };
+  },
+  async created() {
+    if (this.id) this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 40;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...upload(['upload']),
+    ...mapPolicy(['fetch', 'create']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `form`, res.data);
+      }
+    },
+    async oneSubmit() {
+      let data = _.get(this, 'form');
+      data.user_id = this.user.id;
+      data.type = this.type;
+      let res = await this.create(data);
+      if (this.$checkRes(res)) {
+        this.$toast({ type: 'success', message: '政策服务申报成功,请耐心等待结果' });
+        this.back();
+      }
+    },
+    async toUpload({ file }, model) {
+      // 上传,赋值
+      const res = await this.upload({ file, dir: 'serve' });
+      if (this.$checkRes(res)) {
+        this.form[model].push({ url: res.uri, name: res.name });
+      }
+    },
+    toDelete(file, model) {
+      const index = this.form[model].findIndex((f) => _.isEqual(f, file));
+      this.form[model].splice(index, 1);
+    },
+    onOversize() {
+      Toast('文件大小不能超过 10MB');
+    },
+    // 返回
+    back() {
+      this.$router.push('/companyCenter/coupons');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    type() {
+      return this.$route.query.type;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    /deep/.van-radio__label {
+      margin-left: 7px;
+    }
+    .btn {
+      text-align: center;
+      padding: 15px 0;
+      .van-button {
+        margin: 0 10px;
+      }
+    }
+  }
+}
+</style>

+ 150 - 0
src/views/companyCenter/coupons/index.vue

@@ -0,0 +1,150 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="4" @back="back" @add="add"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-col span="24" class="list" v-for="(item, index) in list" :key="index">
+            <van-col span="24" class="company">
+              {{ item.company }}
+            </van-col>
+            <van-col span="24" class="other">
+              <p>
+                申请人:<span>{{ item.contacts || '暂无' }}</span>
+              </p>
+              <p>
+                联系电话:<span>{{ item.phone || '暂无' }}</span>
+              </p>
+              <p>
+                审核状态:<span>{{ getStatus(item.status) || '暂无' }}</span>
+              </p>
+            </van-col>
+            <van-col span="24" class="btn">
+              <van-button type="info" size="small" round @click="toView(item)">查看结果</van-button>
+            </van-col>
+          </van-col>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <page limit="4" :total="total" @search="search"></page>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const { policyStatus } = require('@common/dict/index');
+import top from '@/layout/common/top.vue';
+import page from '@/layout/common/page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: policy } = createNamespacedHelpers('policy');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+    page,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      list: [],
+      total: 0,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 80;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...policy(['query']),
+    async search({ skip = 0, limit = 4, ...info } = {}) {
+      info.type = '创新券';
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: '/companyCenter/coupons/detail', query: { type: '创新券' } });
+    },
+    // 查看
+    toView(data) {
+      this.$router.push({ path: '/companyCenter/coupons/detail', query: { id: data.id, type: data.type } });
+    },
+    // 返回
+    back() {
+      this.$router.push('/userCenter');
+    },
+    // 处理状态
+    getStatus(data) {
+      const r = policyStatus.find((f) => f.value === data);
+      if (r) return r.label;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    padding: 10px;
+    .list {
+      border: 1px solid #ccc;
+      border-radius: 10px;
+      margin: 0 0 10px 0;
+      padding: 8px;
+      .company {
+        font-size: 16px;
+        font-weight: bold;
+        margin: 0 0 5px 0;
+      }
+      .other {
+        p {
+          font-size: 14px;
+          color: #666;
+          margin: 0 0 5px 0;
+          span {
+            color: #000;
+          }
+        }
+      }
+      .btn {
+        text-align: center;
+      }
+    }
+  }
+  .foot {
+    height: 40px;
+    overflow: hidden;
+    border-top: 1px solid #f1f1f1;
+  }
+}
+</style>

+ 181 - 0
src/views/companyCenter/reward/detail.vue

@@ -0,0 +1,181 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="2" @back="back"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-form>
+            <van-field v-model="form.company" label="申请单位" placeholder="申请单位" :rules="[{ required: true, message: '请填写申请单位' }]" />
+            <van-field v-model="form.apply_personal" label="申请人" placeholder="申请人" :rules="[{ required: true, message: '请填写申请人' }]" />
+            <van-field v-model="form.phone" label="联系电话" placeholder="联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" />
+            <van-field name="uploader" label="法人复印件" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.qyfr"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'qyfr')"
+                  @delete="(file) => toDelete(file, 'qyfr')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="营业执照" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.yyzz"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'yyzz')"
+                  @delete="(file) => toDelete(file, 'yyzz')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="企业利润表" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.qylr"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'qylr')"
+                  @delete="(file) => toDelete(file, 'qylr')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="radio" label="审核状态" label-width="60">
+              <template #input>
+                <van-radio-group v-model="form.status" direction="horizontal">
+                  <van-radio :name="item.value" v-for="(item, index) in statusList" :key="index" disabled>{{ item.label }}</van-radio>
+                </van-radio-group>
+              </template>
+            </van-field>
+            <van-field v-model="form.desc" label="审核意见" placeholder="审核意见" type="textarea" maxlength="300" show-word-limit readonly />
+            <van-col span="24" class="btn" v-if="form.status == '0'">
+              <van-button type="danger" round>取消申报</van-button>
+              <van-button type="info" round @click="oneSubmit">提交申报</van-button>
+            </van-col>
+          </van-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import top from '@/layout/common/top.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { policyStatus } = require('@common/dict/index');
+const { mapActions: upload } = createNamespacedHelpers('upload');
+const { mapActions: mapPolicy } = createNamespacedHelpers('policy');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      form: {
+        qyfr: [],
+        yyzz: [],
+        qylr: [],
+        status: '0',
+      },
+      statusList: policyStatus,
+    };
+  },
+  async created() {
+    if (this.id) this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 40;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...upload(['upload']),
+    ...mapPolicy(['fetch', 'create']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `form`, res.data);
+      }
+    },
+    async oneSubmit() {
+      let data = _.get(this, 'form');
+      data.user_id = this.user.id;
+      data.type = this.type;
+      let res = await this.create(data);
+      if (this.$checkRes(res)) {
+        this.$toast({ type: 'success', message: '政策服务申报成功,请耐心等待结果' });
+        this.back();
+      }
+    },
+    async toUpload({ file }, model) {
+      // 上传,赋值
+      const res = await this.upload({ file, dir: 'serve' });
+      if (this.$checkRes(res)) {
+        this.form[model].push({ url: res.uri, name: res.name });
+      }
+    },
+    toDelete(file, model) {
+      const index = this.form[model].findIndex((f) => _.isEqual(f, file));
+      this.form[model].splice(index, 1);
+    },
+    onOversize() {
+      Toast('文件大小不能超过 10MB');
+    },
+    // 返回
+    back() {
+      this.$router.push('/companyCenter/reward');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    type() {
+      return this.$route.query.type;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    /deep/.van-radio__label {
+      margin-left: 7px;
+    }
+    .btn {
+      text-align: center;
+      padding: 15px 0;
+      .van-button {
+        margin: 0 10px;
+      }
+    }
+  }
+}
+</style>

+ 150 - 0
src/views/companyCenter/reward/index.vue

@@ -0,0 +1,150 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="4" @back="back" @add="add"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-col span="24" class="list" v-for="(item, index) in list" :key="index">
+            <van-col span="24" class="company">
+              {{ item.company }}
+            </van-col>
+            <van-col span="24" class="other">
+              <p>
+                申请人:<span>{{ item.contacts || '暂无' }}</span>
+              </p>
+              <p>
+                联系电话:<span>{{ item.phone || '暂无' }}</span>
+              </p>
+              <p>
+                审核状态:<span>{{ getStatus(item.status) || '暂无' }}</span>
+              </p>
+            </van-col>
+            <van-col span="24" class="btn">
+              <van-button type="info" size="small" round @click="toView(item)">查看结果</van-button>
+            </van-col>
+          </van-col>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <page limit="4" :total="total" @search="search"></page>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const { policyStatus } = require('@common/dict/index');
+import top from '@/layout/common/top.vue';
+import page from '@/layout/common/page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: policy } = createNamespacedHelpers('policy');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+    page,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      list: [],
+      total: 0,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 80;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...policy(['query']),
+    async search({ skip = 0, limit = 4, ...info } = {}) {
+      info.type = '奖励兑现';
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: '/companyCenter/reward/detail', query: { type: '奖励兑现' } });
+    },
+    // 查看
+    toView(data) {
+      this.$router.push({ path: '/companyCenter/reward/detail', query: { id: data.id, type: data.type } });
+    },
+    // 返回
+    back() {
+      this.$router.push('/userCenter');
+    },
+    // 处理状态
+    getStatus(data) {
+      const r = policyStatus.find((f) => f.value === data);
+      if (r) return r.label;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    padding: 10px;
+    .list {
+      border: 1px solid #ccc;
+      border-radius: 10px;
+      margin: 0 0 10px 0;
+      padding: 8px;
+      .company {
+        font-size: 16px;
+        font-weight: bold;
+        margin: 0 0 5px 0;
+      }
+      .other {
+        p {
+          font-size: 14px;
+          color: #666;
+          margin: 0 0 5px 0;
+          span {
+            color: #000;
+          }
+        }
+      }
+      .btn {
+        text-align: center;
+      }
+    }
+  }
+  .foot {
+    height: 40px;
+    overflow: hidden;
+    border-top: 1px solid #f1f1f1;
+  }
+}
+</style>

+ 181 - 0
src/views/companyCenter/subsidy/detail.vue

@@ -0,0 +1,181 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="2" @back="back"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-form>
+            <van-field v-model="form.company" label="申请单位" placeholder="申请单位" :rules="[{ required: true, message: '请填写申请单位' }]" />
+            <van-field v-model="form.apply_personal" label="申请人" placeholder="申请人" :rules="[{ required: true, message: '请填写申请人' }]" />
+            <van-field v-model="form.phone" label="联系电话" placeholder="联系电话" :rules="[{ required: true, message: '请填写联系电话' }]" />
+            <van-field name="uploader" label="法人复印件" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.qyfr"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'qyfr')"
+                  @delete="(file) => toDelete(file, 'qyfr')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="营业执照" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.yyzz"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'yyzz')"
+                  @delete="(file) => toDelete(file, 'yyzz')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="企业利润表" label-width="70">
+              <template #input>
+                <van-uploader
+                  :fileList="form.qylr"
+                  :max-count="1"
+                  :after-read="(file) => toUpload(file, 'qylr')"
+                  @delete="(file) => toDelete(file, 'qylr')"
+                  max-size="11534336"
+                  @oversize="onOversize"
+                />
+              </template>
+            </van-field>
+            <van-field name="radio" label="审核状态" label-width="60">
+              <template #input>
+                <van-radio-group v-model="form.status" direction="horizontal">
+                  <van-radio :name="item.value" v-for="(item, index) in statusList" :key="index" disabled>{{ item.label }}</van-radio>
+                </van-radio-group>
+              </template>
+            </van-field>
+            <van-field v-model="form.desc" label="审核意见" placeholder="审核意见" type="textarea" maxlength="300" show-word-limit readonly />
+            <van-col span="24" class="btn" v-if="form.status == '0'">
+              <van-button type="danger" round>取消申报</van-button>
+              <van-button type="info" round @click="oneSubmit">提交申报</van-button>
+            </van-col>
+          </van-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import top from '@/layout/common/top.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { policyStatus } = require('@common/dict/index');
+const { mapActions: upload } = createNamespacedHelpers('upload');
+const { mapActions: mapPolicy } = createNamespacedHelpers('policy');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      form: {
+        qyfr: [],
+        yyzz: [],
+        qylr: [],
+        status: '0',
+      },
+      statusList: policyStatus,
+    };
+  },
+  async created() {
+    if (this.id) this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 40;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...upload(['upload']),
+    ...mapPolicy(['fetch', 'create']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `form`, res.data);
+      }
+    },
+    async oneSubmit() {
+      let data = _.get(this, 'form');
+      data.user_id = this.user.id;
+      data.type = this.type;
+      let res = await this.create(data);
+      if (this.$checkRes(res)) {
+        this.$toast({ type: 'success', message: '政策服务申报成功,请耐心等待结果' });
+        this.back();
+      }
+    },
+    async toUpload({ file }, model) {
+      // 上传,赋值
+      const res = await this.upload({ file, dir: 'serve' });
+      if (this.$checkRes(res)) {
+        this.form[model].push({ url: res.uri, name: res.name });
+      }
+    },
+    toDelete(file, model) {
+      const index = this.form[model].findIndex((f) => _.isEqual(f, file));
+      this.form[model].splice(index, 1);
+    },
+    onOversize() {
+      Toast('文件大小不能超过 10MB');
+    },
+    // 返回
+    back() {
+      this.$router.push('/companyCenter/subsidy');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    type() {
+      return this.$route.query.type;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    /deep/.van-radio__label {
+      margin-left: 7px;
+    }
+    .btn {
+      text-align: center;
+      padding: 15px 0;
+      .van-button {
+        margin: 0 10px;
+      }
+    }
+  }
+}
+</style>

+ 150 - 0
src/views/companyCenter/subsidy/index.vue

@@ -0,0 +1,150 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="4" @back="back" @add="add"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <van-col span="24" class="list" v-for="(item, index) in list" :key="index">
+            <van-col span="24" class="company">
+              {{ item.company }}
+            </van-col>
+            <van-col span="24" class="other">
+              <p>
+                申请人:<span>{{ item.contacts || '暂无' }}</span>
+              </p>
+              <p>
+                联系电话:<span>{{ item.phone || '暂无' }}</span>
+              </p>
+              <p>
+                审核状态:<span>{{ getStatus(item.status) || '暂无' }}</span>
+              </p>
+            </van-col>
+            <van-col span="24" class="btn">
+              <van-button type="info" size="small" round @click="toView(item)">查看结果</van-button>
+            </van-col>
+          </van-col>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <page limit="4" :total="total" @search="search"></page>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const { policyStatus } = require('@common/dict/index');
+import top from '@/layout/common/top.vue';
+import page from '@/layout/common/page.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: policy } = createNamespacedHelpers('policy');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+    page,
+  },
+  data: function () {
+    return {
+      clientHeight: '',
+      list: [],
+      total: 0,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 80;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...policy(['query']),
+    async search({ skip = 0, limit = 4, ...info } = {}) {
+      info.type = '研发补贴';
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: '/companyCenter/subsidy/detail', query: { type: '研发补贴' } });
+    },
+    // 查看
+    toView(data) {
+      this.$router.push({ path: '/companyCenter/subsidy/detail', query: { id: data.id, type: data.type } });
+    },
+    // 返回
+    back() {
+      this.$router.push('/userCenter');
+    },
+    // 处理状态
+    getStatus(data) {
+      const r = policyStatus.find((f) => f.value === data);
+      if (r) return r.label;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+    padding: 10px;
+    .list {
+      border: 1px solid #ccc;
+      border-radius: 10px;
+      margin: 0 0 10px 0;
+      padding: 8px;
+      .company {
+        font-size: 16px;
+        font-weight: bold;
+        margin: 0 0 5px 0;
+      }
+      .other {
+        p {
+          font-size: 14px;
+          color: #666;
+          margin: 0 0 5px 0;
+          span {
+            color: #000;
+          }
+        }
+      }
+      .btn {
+        text-align: center;
+      }
+    }
+  }
+  .foot {
+    height: 40px;
+    overflow: hidden;
+    border-top: 1px solid #f1f1f1;
+  }
+}
+</style>

+ 1 - 0
src/views/index.vue

@@ -8,6 +8,7 @@
         <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
           <van-button @click="$router.push('policy')">高企政策服务</van-button>
           <van-button @click="$router.push('ticket')">高企申报服务</van-button>
+          <van-button @click="$router.push('userCenter')">个人中心</van-button>
         </el-col>
         <el-col :span="24" class="foot"> 底部 </el-col>
       </el-col>

+ 43 - 6
src/views/userCenter/index.vue

@@ -1,22 +1,47 @@
 <template>
   <div id="index">
     <el-row>
-      <el-col :span="24" class="main"> test </el-col>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <top topType="2" :leftArrow="false"></top>
+        </el-col>
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <user1 v-if="type == 'FWJG'"></user1>
+          <user2 v-else-if="type == 'QY'"></user2>
+          <user3 v-else-if="type == 'ZJJG'"></user3>
+          <user4 v-else-if="type == 'ZJ'"></user4>
+        </el-col>
+      </el-col>
     </el-row>
   </div>
 </template>
 
 <script>
+import user1 from './parts/user_1.vue';
+import user2 from './parts/user_2.vue';
+import user3 from './parts/user_3.vue';
+import user4 from './parts/user_4.vue';
+import top from '@/layout/common/top.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   name: 'index',
   props: {},
-  components: {},
+  components: {
+    top,
+    user1,
+    user2,
+    user3,
+    user4,
+  },
   data: function () {
-    return {};
+    return {
+      clientHeight: '',
+    };
   },
-  created() {
-    console.log(this.type);
+  async created() {},
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 40;
+    this.$set(this, `clientHeight`, clientHeight);
   },
   methods: {},
   computed: {
@@ -38,4 +63,16 @@ export default {
 };
 </script>
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 51 - 0
src/views/userCenter/parts/user_1.vue

@@ -0,0 +1,51 @@
+<template>
+  <div id="user_1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }"> 服务机构 </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'user_1',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      clientHeight: '',
+    };
+  },
+  async created() {},
+  mounted() {
+    let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 77 - 0
src/views/userCenter/parts/user_2.vue

@@ -0,0 +1,77 @@
+<template>
+  <div id="user_2">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
+          <el-col :span="24" class="one">
+            <van-contact-card type="edit" :name="info.name" :tel="info.phone" :editable="false" />
+          </el-col>
+          <el-col :span="24" class="two">
+            <van-cell title="基本信息" @click="btn('basic')" is-link />
+            <!-- <van-cell title="高企申报" @click="btn('')" is-link /> -->
+            <van-cell title="研发补贴" @click="btn('subsidy')" is-link />
+            <van-cell title="奖励兑现" @click="btn('reward')" is-link />
+            <van-cell title="创新券申领" @click="btn('coupons')" is-link />
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: organization } = createNamespacedHelpers('organization');
+export default {
+  name: 'user_2',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      clientHeight: '',
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  mounted() {
+    let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 40;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {
+    ...organization(['fetch']),
+    async search() {
+      if (this.user.id) {
+        let res = await this.fetch(this.user.id);
+        if (this.$checkRes(res)) this.$set(this, `info`, res.data);
+      }
+    },
+    btn(type) {
+      this.$router.push({ path: `/companyCenter/${type}` });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 51 - 0
src/views/userCenter/parts/user_3.vue

@@ -0,0 +1,51 @@
+<template>
+  <div id="user_3">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }"> 中介机构 </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'user_3',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      clientHeight: '',
+    };
+  },
+  async created() {},
+  mounted() {
+    let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 51 - 0
src/views/userCenter/parts/user_4.vue

@@ -0,0 +1,51 @@
+<template>
+  <div id="user_4">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }"> 专家 </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'user_4',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      clientHeight: '',
+    };
+  },
+  async created() {},
+  mounted() {
+    let clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
+    this.$set(this, `clientHeight`, clientHeight);
+  },
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+}
+</style>