zpj 1 سال پیش
والد
کامیت
a1fa505ec4

+ 11 - 0
src/api/contract.js

@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+
+const commonUrl = '/contract/'
+// 获取列表
+export const contractList = (data) => request(commonUrl + 'list', 'post', { ...data })
+// 新增&编辑合同
+export const contractSave = (data) => request(commonUrl + 'save', 'post', { ...data })
+// 获取详情
+export const contractInfo = (data) => request(commonUrl + 'info', 'post', { ...data })
+// 删除合同
+export const contractDel = (data) => request(commonUrl + 'del', 'post', { ...data })

+ 10 - 0
src/router/modules/template.js

@@ -19,6 +19,16 @@ const templateRouter = [
         meta: {
           title: '合同模板'
         }
+      },
+      {
+        path: 'add-edit',
+        name: 'add-edit',
+        hidden: true,
+        component: () => import('@/views/admin/template/add-edit.vue'),
+        uid: '',
+        meta: {
+          title: '新增编辑'
+        }
       }
     ]
   }

+ 27 - 22
src/views/admin/organ/add-edit.vue

@@ -14,13 +14,13 @@
       <div class="w-50">
         <div class="display-flex p-f mb-20">
           <div class="fs-16">营业执照图片:</div>
-          <img class="img-class" src="@/assets/img/user/yyzz.png" alt="" />
-          <div class="p-c">
-            <ImgUpload :hideTitle='true' :isFlex='true' v-model="fromData.license_img"></ImgUpload>
+          <img v-show="!fromData.license_img" class="img-class" src="@/assets/img/user/yyzz.png" alt="" />
+          <div class="" :class="fromData.license_img?'':'p-c'">
+            <ImgUpload :limit='1' :hideTitle='true' :isFlex='true' v-model="fromData.license_img"></ImgUpload>
           </div>
         </div>
 
-        <div v-if="islicense" class="align-items-center mb-20">
+        <div class="align-items-center mb-20">
            <div class="fs-16">机构名:</div>
            <el-input
              class="input-w-264 mr-10"
@@ -29,7 +29,7 @@
              v-model="fromData.firm_name">
            </el-input>
          </div>
-         <div v-if="islicense" class="align-items-center mb-20">
+         <div class="align-items-center mb-20">
             <div class="fs-16">统一社会信用代码:</div>
             <el-input
               class="input-w-264 mr-10"
@@ -38,7 +38,7 @@
               v-model="fromData.license_number">
             </el-input>
           </div>
-         <div v-if="islicense" class="align-items-center mb-20">
+         <div class="align-items-center mb-20">
             <div class="fs-16">电话:</div>
             <el-input
               class="input-w-200 mr-10"
@@ -47,7 +47,7 @@
               v-model="fromData.phone">
             </el-input>
           </div>
-          <div v-if="islicense" class="align-items-center mb-20">
+          <div class="align-items-center mb-20">
              <div class="fs-16">注册地址:</div>
              <el-input
                class="input-w-280 mr-10"
@@ -61,19 +61,19 @@
       <div class="w-50">
         <div class="display-flex p-f mb-20">
           <div class="fs-16">法人身份证正明:</div>
-          <img class="img-class" src="@/assets/img/user/zm.png" alt="" />
-          <div class="p-c">
-            <ImgUpload :hideTitle='true' :isFlex='true' v-model="fromData.legal_identity_one"></ImgUpload>
+          <img v-show="!fromData.legal_identity_one" class="img-class" src="@/assets/img/user/zm.png" alt="" />
+          <div class="" :class="fromData.legal_identity_one?'':'p-c'">
+            <ImgUpload :limit='1' :hideTitle='true' :isFlex='true' v-model="fromData.legal_identity_one"></ImgUpload>
           </div>
         </div>
-        <div v-if="isLegal" class="display-flex p-f mb-20">
+        <div  class="display-flex p-f mb-20">
           <div class="fs-16">法人身份证背面:</div>
-          <img class="img-class" src="@/assets/img/user/zm.png" alt="" />
-          <div class="p-c">
-            <ImgUpload :hideTitle='true' :isFlex='true' v-model="fromData.legal_identity_two"></ImgUpload>
+          <img v-show="!fromData.legal_identity_two" class="img-class" src="@/assets/img/user/zm.png" alt="" />
+          <div class="" :class="fromData.legal_identity_two?'':'p-c'">
+            <ImgUpload :limit='1' :hideTitle='true' :isFlex='true' v-model="fromData.legal_identity_two"></ImgUpload>
           </div>
         </div>
-        <div v-if="isLegal" class="align-items-center mb-20">
+        <div  class="align-items-center mb-20">
            <div class="fs-16">身份证号:</div>
            <el-input
              class="input-w-264 mr-10"
@@ -118,11 +118,10 @@
     },
     watch:{
       'fromData.license_img':function(newV,oldV){
-        if(newV&&newV!=oldV){
-          this.islicense = false;
+        if(newV&&newV!=oldV&&!this.isInfo){
+          console.log(1);
           commonLicense({license_img:newV}).then((res)=>{
             if(res.code == 1){
-              this.islicense = true;
               this.fromData.firm_name = res.data.name;
               this.fromData.license_number = res.data.id_number;
               this.fromData.registered_address = res.data.address;
@@ -131,11 +130,10 @@
         }
       },
       'fromData.legal_identity_one':function(newV,oldV){
-        if(newV&&newV!=oldV){
-          this.isLegal = false;
+        if(newV&&newV!=oldV&&!this.isInfo){
+          console.log(2);
           commonCardFront({id_card:newV}).then((res)=>{
             if(res.code == 1){
-              this.isLegal = true;
               this.fromData.legal_id_number = res.data.id_number
             }
           })
@@ -146,6 +144,7 @@
     mounted() {
       let id = this.$route.query.id;
       if(id){
+        this.isInfo = true;
         this.fromData.id = id;
         this.getInfo();
       }
@@ -154,7 +153,8 @@
       getInfo(){
         firmInfo({id:this.fromData.id}).then((res)=>{
           if(res.code == 1){
-            this.fromData = res.data
+            this.fromData = res.data;
+            // this.isInfo = false;
           }
         })
       },
@@ -182,6 +182,11 @@
 
 <style scoped lang="scss">
   .add-edit-box{
+
+    .opacity01{
+      opacity: 0.1;
+    }
+
     .img-class{
       width: 180px;
       height: 160px;

+ 2 - 2
src/views/admin/organ/list.vue

@@ -86,11 +86,11 @@
         })
       },
       handleCurrentChange(val){
-        this.page = val;
+        this.fromData.page = val;
         this.getList();
       },
       searchFun(){
-        this.page = 1;
+        this.fromData.page = 1;
         this.getList();
       },
       add(){

+ 251 - 0
src/views/admin/template/add-edit.vue

@@ -0,0 +1,251 @@
+<template>
+  <div class="add-edit-box">
+    <div class="mb-20 baC-fff sys-radius-10 box-sizing-border pd-15-10 flex-justify-space">
+      <div class="fs-20 fw-600 p-15 ">{{fromData.id?'编辑合同模板':'新增合同模板'}}</div>
+      <div class="align-items-center">
+        <el-button type="primary" icon="el-icon-back" @click="close()">返回</el-button>
+        <el-button type="warning" icon="el-icon-close" @click="close()">取消</el-button>
+        <el-button type="success" icon="el-icon-check" @click="save()">保存</el-button>
+      </div>
+    </div>
+
+    <div class="baC-fff sys-radius-10 box-sizing-border pd-26-24">
+      <div class="align-items-center mb-20">
+        <div class="fs-16">合同名称:</div>
+        <el-input
+          class="input-w-280 mr-10"
+          placeholder="请输入合同名称"
+          prefix-icon="el-icon-edit"
+          v-model="fromData.name">
+        </el-input>
+      </div>
+
+      <div class="align-items-center mb-20">
+        <div class="fs-16">合同文件:</div>
+        <div class="up-box">
+          <el-upload
+            accept=".doc,.docx"
+            action="#"
+            :limit="2"
+            :file-list="fileList"
+            :http-request="reportFileHttpRequest"
+            :before-upload="beforeUpload"
+            :before-remove='beforeRemove'
+            >
+            <el-button type="success" icon="el-icon-folder-add">上传合同模板</el-button>
+            <div slot="tip" class="el-upload__tip">只能上传doc文件</div>
+          </el-upload>
+        </div>
+      </div>
+
+      <div class="display-flex ">
+        <div class="w-50">
+          <el-button class="mb-20" type="success" icon="el-icon-circle-plus-outline" @click="add(1)">添加签署区域关键词</el-button>
+
+          <div class="align-items-center mb-20" v-for="(item,i) in signList" :key="i">
+            <div class="fs-16">签署区域关键词:</div>
+            <el-input
+              class="input-w-264 mr-10"
+              placeholder="请输入签署区域关键词"
+              prefix-icon="el-icon-edit"
+              v-model="item.val"
+              >
+            </el-input>
+            <el-button type="danger" icon="el-icon-delete" @click="del(1,item,i)">删除</el-button>
+          </div>
+        </div>
+        <div class="w-50">
+          <el-button class="mb-20" type="success" icon="el-icon-circle-plus-outline" @click="add(2)">添加合同可替换变量词</el-button>
+
+          <div class="align-items-center mb-20" v-for="(item,i) in textList" :key="i">
+            <div class="fs-16">合同可替换变量词:</div>
+            <el-input
+              class="input-w-264 mr-10"
+              placeholder="请输入合同可替换变量词"
+              prefix-icon="el-icon-edit"
+              v-model="item.val"
+              >
+            </el-input>
+            <el-button type="danger" icon="el-icon-delete" @click="del(2,item,i)">删除</el-button>
+          </div>
+        </div>
+      </div>
+    </div>
+
+  </div>
+</template>
+
+<script>
+  import oss from 'ali-oss'
+  import {
+    GetSts
+  } from '@/api/conmmon.js'
+  import {contractInfo,contractSave} from '@/api/contract.js';
+  export default {
+    data(){
+      return{
+        fromData:{
+          id:"",
+          name:"",
+          sign_party:[],
+          texts:[],
+          file:"",
+        },
+        aliOss: "",
+        fileList:[],
+
+        signList:[],
+        textList:[],
+
+        isAJAX:false,
+      }
+    },
+    mounted() {
+      this.setNewOss();
+
+      let id = this.$route.query.id;
+      if(id){
+        this.fromData.id = id;
+        this.getInfo();
+      }
+    },
+    methods:{
+      getInfo(){
+        contractInfo({id:this.fromData.id}).then((res)=>{
+          if(res.code == 1){
+            this.fromData = res.data;
+            if(this.fromData.sign_party.length > 0){
+              this.fromData.sign_party.forEach((v)=>{
+                let obj = {val:v};
+                this.signList.push(obj)
+              })
+            }
+            if(this.fromData.texts.length > 0){
+              this.fromData.texts.forEach((v)=>{
+                let obj = {val:v};
+                this.textList.push(obj)
+              })
+            }
+          }
+        })
+      },
+      close(){
+        this.$router.go(-1)
+      },
+      save(){
+        if(this.isAJAX){
+          return
+        }
+        this.isAJAX = true;
+
+        this.fromData.sign_party = [];
+        this.fromData.texts = [];
+
+        this.signList.forEach((v)=>{
+          this.fromData.sign_party.push(v.val)
+        })
+        this.textList.forEach((v)=>{
+          this.fromData.texts.push(v.val)
+        })
+
+        contractSave(this.fromData).then((res)=>{
+          this.isAJAX = false
+          if(res.code == 1){
+            this.$message(res.msg);
+            this.$router.replace({path:'/user/list'})
+          }else{
+            this.$message.error(res.msg);
+          }
+        })
+      },
+
+      add(type){
+        if(type == 1){
+          let obj = {val:""};
+          this.signList.push(obj);
+        }else{
+          let obj = {val:""};
+          this.textList.push(obj);
+        }
+      },
+      del(type,item,i){
+        if(type == 1){
+          this.signList.splice(i, 1);
+        }else{
+          this.textList.splice(i, 1);
+        }
+      },
+
+      async setNewOss() {
+        let obj = await GetSts()
+        obj = obj.data
+        let client = new oss({
+          region: "oss-cn-chengdu",
+          accessKeyId: obj.AccessKeyId,
+          accessKeySecret: obj.AccessKeySecret,
+          stsToken: obj.SecurityToken,
+          refreshSTSToken: async () => {
+            let obj = await GetSts()
+            obj = obj.data
+            return {
+              accessKeyId: obj.accessKeyId,
+              accessKeySecret: obj.accessKeySecret,
+              stsToken: obj.stsToken,
+            }
+          },
+          refreshSTSTokenInterval: 900000,
+          bucket: "jhnewshop",
+        })
+        this.aliOss = client
+      },
+      beforeUpload(file){
+        if(this.fileList.length > 0){
+          this.fileList = [];
+          this.fromData.file = '';
+        }
+        // ||file.type === 'application/pdf'
+        let isWord = file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||file.type === 'application/msword';
+        if (!isWord) {
+          this.$message.error('只能上传.doc、.docx格式的Word文件!');
+          return false;
+        }
+        return true;
+      },
+      reportFileHttpRequest(e){
+        this.aliOss.put(e.file.name, e.file).then((res)=>{
+          if(res){
+            this.$message.success('上传成功,可保存')
+            let obj = {
+              name:res.name,
+              url:res.url,
+            };
+            this.fileList.push(obj);
+
+            if(res.url[4] == 's'){
+              this.fromData.file = res.url;
+            }else{
+              let a = res.url.substring(0, 4);
+              let b = res.url.substring(4);
+              let s = 's';
+              this.fromData.file = a+s+b;
+            }
+          }else{
+            this.$message.error('上传失败,请重新上传')
+          }
+        })
+      },
+      beforeRemove(file, fileList){
+        this.fileList = fileList;
+        this.fromData.file = '';
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .add-edit-box{
+    .up-box{
+      width: 500px;
+    }
+  }
+</style>

+ 102 - 7
src/views/admin/template/list.vue

@@ -1,25 +1,120 @@
 <template>
-  <div class="list-box">
+  <div class="user-list">
+
+      <div class="mb-20 flex-justify-space baC-fff sys-radius-10 box-sizing-border pd-15-10">
+        <div class="align-items-center">
+            <el-input
+              class="input-w-200 mr-10"
+              placeholder="请输入查询关键词"
+              prefix-icon="el-icon-search"
+              v-model="fromData.search">
+            </el-input>
+            <el-button type="primary" icon="el-icon-search" @click="searchFun()">查询</el-button>
+        </div>
+        <div class="">
+          <el-button type="success" icon="el-icon-circle-plus-outline" @click="add()">新增</el-button>
+        </div>
+      </div>
+
+      <div class="mb-30">
+        <el-table :data="list" stripe >
+            <el-table-column fixed prop="id" label="ID"></el-table-column>
+            <el-table-column fixed prop="name" label="合同名称"></el-table-column>
+
+            <el-table-column prop="created_at" label="创建时间"></el-table-column>
+            <el-table-column fixed='right' prop="" label="编辑">
+              <template slot-scope="scope">
+                <el-button type="warning" icon="el-icon-edit" @click="edit(scope.row)">编辑</el-button>
+
+                <el-popconfirm
+                  title="是否立即删除合同模板?"
+                >
+                  <el-button slot="reference" icon="el-icon-delete" type="danger" @click="del(scope.row)">删除</el-button>
+                </el-popconfirm>
+
+              </template>
+            </el-table-column>
+        </el-table>
+      </div>
+
+
+      <div class="mb-30 flex-justify-end">
+        <el-pagination
+          background
+          @current-change="handleCurrentChange"
+          :current-page.sync="fromData.page"
+          :page-size="10"
+          layout="prev, pager, next"
+          :total="total">
+        </el-pagination>
+      </div>
 
   </div>
 </template>
 
 <script>
+  import {contractList,contractDel} from '@/api/contract.js'
   export default {
-    dara(){
+    data(){
       return{
-
+        list:[],
+        fromData:{
+          page:1,
+          search:'',
+        },
+        total:0,
+        isAJAX:false,
       }
     },
-    mounted() {
-
+    mounted(){
+      this.getList();
     },
     methods:{
-
+      getList(){
+        contractList(this.fromData).then((res)=>{
+          if(res.code == 1){
+            this.list = res.data.items;
+            this.total = res.data.total
+          }
+        })
+      },
+      handleCurrentChange(val){
+        this.fromData.page = val;
+        this.getList();
+      },
+      searchFun(){
+        this.fromData.page = 1;
+        this.getList();
+      },
+      add(){
+        this.$router.push({path:'/template/add-edit'})
+      },
+      edit(item){
+        this.$router.push({path:'/template/add-edit',query:{id:item.id}})
+      },
+      del(item){
+        if(this.isAJAX){
+          return
+        }
+        this.isAJAX = true;
+        contractDel({id:item.id}).then((res)=>{
+          this.isAJAX = false;
+          if(res.code == 1){
+            this.$message(res.msg);
+            this.fromData.page = 1;
+            this.fromData.search = '';
+            this.getList();
+          }else{
+            this.$message.error(res.msg);
+          }
+        })
+      }
     },
   }
 </script>
 
-<style scoped lang="list-box">
+<style scoped lang="scss">
+  .user-list{
 
+  }
 </style>

+ 2 - 2
src/views/admin/user/list.vue

@@ -86,11 +86,11 @@
         })
       },
       handleCurrentChange(val){
-        this.page = val;
+        this.fromData.page = val;
         this.getList();
       },
       searchFun(){
-        this.page = 1;
+        this.fromData.page = 1;
         this.getList();
       },
       add(){