company/.env.development | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
company/src/api/business/contract.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
company/src/components/business/OperaContractDescWindow.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
company/src/components/business/OperaContractWindow.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
company/src/components/business/OperaSolutionsBaseWindow.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
company/src/views/business/contract.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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/' 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}`) } 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> 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> 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)) { 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>