From 08aec42c4da1cecf123edfb250d3181fb5e659cc Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 06 十一月 2024 09:47:53 +0800
Subject: [PATCH] 优化

---
 company/src/views/business/contract.vue                      |  151 +++++++++++++++
 company/src/api/business/contract.js                         |   38 +++
 company/src/components/business/OperaSolutionsBaseWindow.vue |   17 +
 company/src/components/business/OperaContractDescWindow.vue  |  167 ++++++++++++++++
 company/.env.development                                     |    2 
 company/src/components/business/OperaContractWindow.vue      |  185 ++++++++++++++++++
 6 files changed, 556 insertions(+), 4 deletions(-)

diff --git a/company/.env.development b/company/.env.development
index d6927af..43c2afe 100644
--- a/company/.env.development
+++ b/company/.env.development
@@ -11,4 +11,4 @@
 # VUE_APP_API = 'https://dmtest.ahapp.net/yyb_admin_api/'
 
 # 浠诲悍
-VUE_APP_API = 'http://192.168.0.138:10030/'
+VUE_APP_API = 'http://192.168.0.134:10030/'
diff --git a/company/src/api/business/contract.js b/company/src/api/business/contract.js
new file mode 100644
index 0000000..99222df
--- /dev/null
+++ b/company/src/api/business/contract.js
@@ -0,0 +1,38 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/contract/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/contract/create', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/contract/delete/${id}`)
+}
+
+// 鏍规嵁id鏌ヨ
+export function contractId (id) {
+  return request.get(`/business/contract/${id}`)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/contract/updateById', data)
+}
+
+// 鍚堝悓鍙栨秷
+export function cancel (data) {
+  return request.post('/business/contract/cancel', data)
+}
+
+// 鍙戣捣绛剧讲
+export function getSignLink (id) {
+  return request.get(`/business/contract/getSignLink?id=${id}`)
+}
diff --git a/company/src/components/business/OperaContractDescWindow.vue b/company/src/components/business/OperaContractDescWindow.vue
new file mode 100644
index 0000000..4f4a10f
--- /dev/null
+++ b/company/src/components/business/OperaContractDescWindow.vue
@@ -0,0 +1,167 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        width="100%"
+        :withFooter="false"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <div class="info" v-if="info">
+            <div class="info_label">
+                <span>鍚堝悓璇︽儏</span>
+            </div>
+            <div class="info_list">
+                <div class="info_list_item">
+                    <div class="info_list_item_label">鍚堝悓鍚嶇О锛�</div>
+                    <div class="info_list_item_val">{{info.name}}</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">鍚堝悓鏃堕棿锛�</div>
+                    <div class="info_list_item_val">{{info.startTime}} - {{info.endTime}}</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">鍚堝悓绫诲瀷锛�</div>
+                    <div class="info_list_item_val">
+                        <template v-if="info.signType === 0">骞冲彴-鍟嗘埛</template>
+                        <template v-if="info.signType === 1">骞冲彴-浼佷笟</template>
+                        <template v-if="info.signType === 2">鍟嗘埛-浼佷笟</template>
+                    </div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">浼佷笟鍚嶇О锛�</div>
+                    <div class="info_list_item_val">{{info.companyName}}</div>
+                </div>
+                <div class="info_list_item" style="width: 100%;">
+                    <div class="info_list_item_label">绛剧讲鏂瑰紡锛�</div>
+                    <div class="info_list_item_val">
+                        <template v-if="info.type === 0">鍙屾柟绛剧珷</template>
+                        <template v-if="info.type === 1">浠呮垜鏂圭绔�</template>
+                    </div>
+                </div>
+                <div class="info_list_item" style="width: 100%;">
+                    <div class="info_list_item_label">鍘熷闄勪欢锛�</div>
+                    <div class="info_list_item_val">
+                        <u @click="openPDF(info.multifile.fileurlFull)">{{info.multifile.name}}</u>
+                    </div>
+                </div>
+                <div class="info_list_item" style="width: 100%;">
+                    <div class="info_list_item_label">澶囨敞锛�</div>
+                    <div class="info_list_item_val">{{info.remark}}</div>
+                </div>
+            </div>
+        </div>
+        <div class="info" v-if="info && info.status !== 0">
+            <div class="info_label">
+                <span>鍚堝悓绛剧讲鎯呭喌</span>
+            </div>
+            <div class="info_list">
+                <div class="info_list_item">
+                    <div class="info_list_item_label">骞冲彴绛剧讲浜猴細</div>
+                    <div class="info_list_item_val">寮犱笁</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">骞冲彴绛剧讲鏃堕棿锛�</div>
+                    <div class="info_list_item_val">2024-08-28 08:53:52</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">鍚堝悓绫诲瀷锛�</div>
+                    <div class="info_list_item_val">鍟嗘埛-浼佷笟</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">浼佷笟鍚嶇О锛�</div>
+                    <div class="info_list_item_val">XXX鏈夐檺鍏徃</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">浼佷笟绛剧讲浜猴細</div>
+                    <div class="info_list_item_val">閲屾柉</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">浼佷笟绛剧讲鏃堕棿锛�</div>
+                    <div class="info_list_item_val">2024-08-30 08:53:52</div>
+                </div>
+                <div class="info_list_item">
+                    <div class="info_list_item_label">绛剧讲浠讹細</div>
+                    <div class="info_list_item_val">
+                        <u>XXX鍚堝悓绛剧讲浠�.pdf</u>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </GlobalWindow>
+</template>
+
+<script>
+  import BaseOpera from '@/components/base/BaseOpera'
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import { contractId } from '@/api/business/contract'
+  export default {
+    name: 'OperaContractDescWindow',
+    extends: BaseOpera,
+    components: { GlobalWindow },
+    data () {
+      return {
+        info: null
+      }
+    },
+    methods: {
+      open (title, id) {
+        this.title = title
+        this.visible = true
+        contractId(id)
+          .then(res => {
+            console.log(res)
+            this.info = res
+          })
+      },
+      openPDF(url) {
+        window.open(url)
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+    .info {
+        width: 100%;
+        .info_label {
+            width: 100%;
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            margin-bottom: 20px;
+            span {
+                font-size: 18px;
+                font-weight: 600;
+                color: #000000;
+            }
+        }
+        .info_list {
+            width: 100%;
+            display: flex;
+            align-items: start;
+            flex-wrap: wrap;
+            .info_list_item {
+                width: 50%;
+                display: flex;
+                align-items: start;
+                margin-bottom: 20px;
+                .info_list_item_label {
+                    flex-shrink: 0;
+                    font-size: 16px;
+                }
+                .info_list_item_val {
+                    flex: 1;
+                    display: flex;
+                    align-items: center;
+                    font-size: 16px;
+                    u {
+                        font-size: 16px;
+                        color: #2E68EC;
+                        cursor: pointer;
+                    }
+                }
+            }
+        }
+    }
+</style>
diff --git a/company/src/components/business/OperaContractWindow.vue b/company/src/components/business/OperaContractWindow.vue
new file mode 100644
index 0000000..2f7b1ce
--- /dev/null
+++ b/company/src/components/business/OperaContractWindow.vue
@@ -0,0 +1,185 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+        <el-form :model="form" ref="form" :rules="rules">
+            <el-form-item label="鍚堝悓鍚嶇О" prop="name">
+                <el-input v-model="form.name" maxlength="50" show-word-limit placeholder="璇疯緭鍏ュ悎鍚屽悕绉�" v-trim/>
+            </el-form-item>
+            <el-form-item label="鍚堝悓瀵硅薄" prop="companyType">
+                <el-radio-group v-model="form.companyType" @change="getList">
+                    <el-radio :label="0">浼佷笟</el-radio>
+                    <el-radio :label="1">鍟嗘埛</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="浼佷笟/鍟嗘埛鍚嶇О" prop="companyId">
+                <el-select v-model="form.companyId" filterable placeholder="璇烽�夋嫨锛屾敮鎸佹悳绱�">
+                    <el-option
+                        v-for="item in nameList"
+                        :key="item.id"
+                        :label="item.name"
+                        :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鍚堝悓鏃堕棿" prop="date">
+                <el-date-picker
+                    v-model="form.date"
+                    type="daterange"
+                    @change="changeDate"
+                    value-format="yyyy-MM-dd"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫棩鏈�"
+                    end-placeholder="缁撴潫鏃ユ湡">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="绛剧珷鏂瑰紡" prop="type">
+                <el-radio-group v-model="form.type">
+                    <el-radio :label="0">鍙屾柟绛剧珷</el-radio>
+                    <el-radio :label="1">浠呮垜鏂圭绔�</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="鍚堝悓闄勪欢" prop="multifile" :rules="[{required:true,message:'璇蜂笂浼犳柟妗堢‘璁や功'}]">
+                <div>
+                    <UploadFile @remove="deleFile" :uploadData="{ folder: 'contract', fileType:'.pdf' }" :fileList="fileList" @uploadSuccess="editFanganFile" />
+                </div>
+            </el-form-item>
+            <el-form-item label="澶囨敞" prop="remark">
+                <el-input
+                    type="textarea"
+                    placeholder="璇疯緭鍏ュ娉�"
+                    v-model="form.remark"
+                    maxlength="300"
+                    show-word-limit
+                    v-trim
+                />
+            </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+  import BaseOpera from '@/components/base/BaseOpera'
+  import GlobalWindow from '@/components/common/GlobalWindow'
+  import UploadFile from '@/components/common/UploadFile'
+  import { pageAll } from '@/api/business/company'
+  import { mapState } from 'vuex'
+  export default {
+    name: 'OperaContractWindow',
+    extends: BaseOpera,
+    computed: {
+      ...mapState(['userInfo'])
+    },
+    components: { GlobalWindow, UploadFile },
+    data () {
+      const validatorTime = (rule, value, callback) => {
+        if (!this.form.startTime || !this.form.endTime) {
+          return callback(new Error('璇烽�夋嫨鍚堝悓鏃堕棿'))
+        }
+        callback()
+      }
+      const validatorMultifile = (rule, value, callback) => {
+        if (!this.form.multifile) {
+          return callback(new Error('璇蜂笂浼犲悎鍚岄檮浠�'))
+        }
+        callback()
+      }
+      return {
+        // 琛ㄥ崟鏁版嵁
+        form: {
+          id: null,
+          remark: '',
+          name: '',
+          companyType: 0,
+          type: 0,
+          startTime: '',
+          endTime: '',
+          date: [],
+          multifile: null,
+          companyId: ''
+        },
+        fileList: [],
+        // 楠岃瘉瑙勫垯
+        rules: {
+          name: [
+            { required: true, message: '璇疯緭鍏ュ悎鍚屽悕绉�' }
+          ],
+          companyType: [
+            { required: true, message: '璇烽�夋嫨鍚堝悓瀵硅薄' }
+          ],
+          companyId: [
+            { required: true, message: '璇烽�夋嫨浼佷笟/鍟嗘埛鍚嶇О' }
+          ],
+          date: [
+            { required: true, validator: validatorTime }
+          ],
+          multifile: [
+            { required: true, validator: validatorMultifile }
+          ],
+        },
+        nameList: [],
+        list: []
+      }
+    },
+    created () {
+      this.config({
+        api: '/business/contract',
+        'field.id': 'id'
+      })
+    },
+    methods: {
+      open (title, target) {
+        this.title = title
+        this.visible = true
+        if (this.userInfo.type === 0) {
+          this.list = [{ label: '浼佷笟', id: 0 },{ label: '鍟嗘埛', id: 1 }]
+        } else if (this.userInfo.type === 2) {
+          this.list = [{ label: '浼佷笟', id: 0 }]
+        }
+        // 鏂板缓
+        if (target == null) {
+          this.$nextTick(() => {
+            this.$refs.form.resetFields()
+            this.form[this.configData['field.id']] = null
+          })
+          this.getList()
+          return
+        }
+        // 缂栬緫
+        this.$nextTick(() => {
+          for (const key in this.form) {
+            this.form[key] = target[key]
+          }
+        })
+        this.getList()
+      },
+      getList() {
+        this.form.companyId = ''
+        pageAll({ type: this.form.companyType })
+            .then(res => {
+              console.log(res)
+              this.nameList = res
+            })
+      },
+      deleFile () {
+        this.form.multifile = null
+      },
+      editFanganFile (data) {
+        console.log(data)
+        this.form.multifile = data
+      },
+      changeDate(e) {
+        if (e) {
+          this.form.startTime = e[0]
+          this.form.endTime = e[1]
+        } else {
+          this.form.startTime = ''
+          this.form.endTime = ''
+        }
+      }
+    }
+  }
+</script>
diff --git a/company/src/components/business/OperaSolutionsBaseWindow.vue b/company/src/components/business/OperaSolutionsBaseWindow.vue
index e7f597e..6772793 100644
--- a/company/src/components/business/OperaSolutionsBaseWindow.vue
+++ b/company/src/components/business/OperaSolutionsBaseWindow.vue
@@ -25,7 +25,7 @@
             </el-form-item>
             <el-form-item label="鎶曚繚骞撮緞" prop="minAge">
                 <div style="display: flex; align-items: center;">
-                    <el-select v-model="form.minAge" style="flex: 1;" placeholder="璇烽�夋嫨">
+                    <el-select v-model="form.minAge" @change="changeMinAge" style="flex: 1;" placeholder="璇烽�夋嫨">
                         <el-option
                             v-for="item in 80"
                             :key="item"
@@ -34,7 +34,7 @@
                         </el-option>
                     </el-select>
                     <span style="margin: 0 30px;">鑷�</span>
-                    <el-select v-model="form.maxAge" style="flex: 1;" placeholder="璇烽�夋嫨">
+                    <el-select v-model="form.maxAge" @change="changeMaxAge" style="flex: 1;" placeholder="璇烽�夋嫨">
                         <el-option
                             v-for="item in 80"
                             :key="item"
@@ -242,7 +242,18 @@
       getWangedditor2(val){
         this.form.ortherInfo = val;
       },
-
+      changeMinAge(e) {
+        if (this.form.maxAge && this.form.maxAge >= 0 && e > this.form.maxAge) {
+          this.form.minAge = ''
+          this.$message.warning('璧峰骞撮緞涓嶈兘澶т簬鎴骞撮緞锛�')
+        }
+      },
+      changeMaxAge(e) {
+        if (this.form.minAge && this.form.minAge >= 0 && e < this.form.minAge) {
+          this.form.maxAge = ''
+          this.$message.warning('鎴骞撮緞涓嶈兘澶т簬璧峰骞撮緞锛�')
+        }
+      },
       handNumberInput (value) {
         const regex = /^[-+]?\d*$/
         if (!regex.test(value)) {
diff --git a/company/src/views/business/contract.vue b/company/src/views/business/contract.vue
new file mode 100644
index 0000000..9cd8362
--- /dev/null
+++ b/company/src/views/business/contract.vue
@@ -0,0 +1,151 @@
+<template>
+    <TableLayout :permissions="['business:contract:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item label="鍚堝悓鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悎鍚屽悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item label="鍚堝悓绫诲瀷" prop="signType">
+                <el-select v-model="searchForm.signType" placeholder="璇烽�夋嫨" @change="search">
+                    <el-option label="骞冲彴-鍟嗘埛" :value="0"></el-option>
+                    <el-option label="骞冲彴-浼佷笟" :value="1"></el-option>
+                    <el-option label="鍟嗘埛-浼佷笟" :value="2"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鐘舵��" prop="status">
+                <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨" @change="search">
+                    <el-option label="寰呯绔�" :value="0"></el-option>
+                    <el-option label="鎴戞柟宸茬绔�" :value="1"></el-option>
+                    <el-option label="浼佷笟鍟嗘埛宸茬绔�" :value="2"></el-option>
+                    <el-option label="瀹屾垚" :value="3"></el-option>
+                    <el-option label="宸插彇娑�" :value="4"></el-option>
+                    <el-option label="宸插叧闂�" :value="5"></el-option>
+                </el-select>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+            <ul class="toolbar" v-permissions="['business:contract:create']">
+                <li><el-button type="primary" @click="$refs.operaContractWindow.open('鏂板缓鍚堝悓淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:contract:create']">鏂板缓</el-button></li>
+            </ul>
+            <el-table
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe
+            >
+                <el-table-column label="搴忓彿" width="80px">
+                    <template slot-scope="scope">
+                        <span>{{scope.$index + 1}}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="name" label="鍚堝悓鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column label="鍚堝悓绫诲瀷" min-width="100px">
+                    <template slot-scope="{row}">
+                        <template v-if="row.signType === 0">骞冲彴-鍟嗘埛</template>
+                        <template v-else-if="row.signType === 1">骞冲彴-浼佷笟</template>
+                        <template v-else-if="row.signType === 2">鍟嗘埛-浼佷笟</template>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="companyName" label="瀵规柟鍚嶇О" min-width="100px"></el-table-column>
+                <el-table-column label="鍚堝悓寮�濮嬫椂闂�" min-width="100px">
+                    <template slot-scope="{row}">
+                        {{ row.startTime }} - {{ row.endTime }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="鐘舵��" min-width="100px">
+                    <template slot-scope="{row}">
+                        <template v-if="row.status === 0">寰呯绔�</template>
+                        <template v-else-if="row.status === 1">鎴戞柟宸茬绔�</template>
+                        <template v-else-if="row.status === 2">浼佷笟鍟嗘埛宸茬绔�</template>
+                        <template v-else-if="row.status === 3">瀹屾垚</template>
+                        <template v-else-if="row.status === 4">宸插彇娑�</template>
+                        <template v-else-if="row.status === 5">宸插叧闂�</template>
+                    </template>
+                </el-table-column>
+                <el-table-column
+                    v-if="containPermissions(['business:contract:update', 'business:contract:delete'])"
+                    label="鎿嶄綔"
+                    min-width="220"
+                    fixed="right"
+                >
+                    <template slot-scope="{row}">
+                        <el-button type="text" @click="$refs.operaContractDescWindow.open('鍚堝悓璇︽儏', row.id)" icon="el-icon-view">鏌ョ湅璇︽儏</el-button>
+                        <el-button type="text" @click="sign(row)" icon="el-icon-document-checked" v-if="row.status !== 1 && row.status !== 4 && row.status !== 3">绛剧讲</el-button>
+                        <el-button type="text" icon="el-icon-document-remove" v-if="row.status === 0" @click="cancelHT(row.id)">鍙栨秷</el-button>
+                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:contract:delete']" v-if="row.status === 4">鍒犻櫎</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"
+            >
+            </pagination>
+        </template>
+        <!-- 鏂板缓/淇敼 -->
+        <OperaContractWindow ref="operaContractWindow" @success="handlePageChange"/>
+        <!--    璇︽儏    -->
+        <OperaContractDescWindow ref="operaContractDescWindow" />
+    </TableLayout>
+</template>
+
+<script>
+  import BaseTable from '@/components/base/BaseTable'
+  import TableLayout from '@/layouts/TableLayout'
+  import Pagination from '@/components/common/Pagination'
+  import OperaContractWindow from '@/components/business/OperaContractWindow'
+  import OperaContractDescWindow from '@/components/business/OperaContractDescWindow'
+  import { cancel, getSignLink } from '@/api/business/contract'
+  export default {
+    name: 'Contract',
+    extends: BaseTable,
+    components: { TableLayout, Pagination, OperaContractWindow, OperaContractDescWindow },
+    data () {
+      return {
+        // 鎼滅储
+        searchForm: {
+          name: '',
+          signType: '',
+          status: ''
+        }
+      }
+    },
+    created () {
+      this.config({
+        module: '鍚堝悓淇℃伅琛�',
+        api: '/business/contract',
+        'field.id': 'id',
+        'field.main': 'id'
+      })
+      this.search()
+    },
+    methods: {
+      // 绛剧讲
+      sign(row) {
+        getSignLink(row.id)
+          .then(res => {
+            window.open(res)
+          })
+      },
+      // 鍙栨秷鍚堝悓
+      cancelHT(id) {
+        this.$confirm('纭鍙栨秷褰撳墠鍚堝悓鍚�?', '鎻愮ず', {
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }).then(() => {
+          cancel({ id }).then(res => {
+            this.search()
+          })
+        }).catch(() => {
+
+        });
+      }
+    }
+  }
+</script>

--
Gitblit v1.9.3