From a2299a6d4a6f99e9c11132138f5d3e9ec68f03ea Mon Sep 17 00:00:00 2001 From: jiangping <jp@doumee.com> Date: 星期五, 06 六月 2025 19:19:34 +0800 Subject: [PATCH] 开发更新 --- admin/src/views/finance/components/bullEdit.vue | 441 +++++++++++++++++++++++++++++------------------------- 1 files changed, 236 insertions(+), 205 deletions(-) diff --git a/admin/src/views/finance/components/bullEdit.vue b/admin/src/views/finance/components/bullEdit.vue index 80a4067..ac594b9 100644 --- a/admin/src/views/finance/components/bullEdit.vue +++ b/admin/src/views/finance/components/bullEdit.vue @@ -1,217 +1,255 @@ <template> - <GlobalWindow width="1100px" :title="title" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close" + <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close" @confirm="confirm"> - <template v-if="activeTabs == 0"> - <div class="main"> - <div class="main_content"> - <el-form :model="param" label-position="top" ref="paramRef" :rules="rules"> - <div class="head"> - <div class="m_title">鍩虹淇℃伅</div> - <div class="tabs"> - <div class="tab" :class="{ active: timeTab == 0 }" @click="timeTabClick('0')">鍛ㄦ湡璐圭敤</div> - <div class="tab" :class="{ active: timeTab == 1 }" @click="timeTabClick('1')">涓�娆℃�ц垂鐢�</div> - </div> + <div class="main"> + <div class="main_content"> + <el-form :model="form" label-position="top" ref="form" :rules="rules"> + <div class="head"> + <div class="m_title">鍩虹淇℃伅</div> + <div class="tabs"> + <div class="tab" :class="{ active: form.feeType === 0 }" @click="timeTabClick(0)">鍛ㄦ湡璐圭敤</div> + <div class="tab" :class="{ active: form.feeType === 1 }" @click="timeTabClick(1)">涓�娆℃�ц垂鐢�</div> </div> - <div class="list"> - <el-form-item label="鍏宠仈鍚堝悓" prop="type"> - <el-select v-model="param.type" placeholder="璇烽�夋嫨" clearable> - <el-option v-for="item in types" :value="item.value" :label="item.name"></el-option> - </el-select> - </el-form-item> - <el-form-item label="浠樻鏂�" prop="code"> - <el-input v-model="param.code" placeholder="璇疯緭鍏ュ悎鍚岀紪鍙�" v-trim /> - </el-form-item> - <el-form-item label="璐圭敤绫诲瀷" prop="aaa"> - <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable> - <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option> - </el-select> - </el-form-item> - <el-form-item label="璁¤垂鍛ㄦ湡" prop=""> - <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" /> - </el-form-item> - <el-form-item label="搴旀敹閲戦" prop=""> - <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" /> - </el-form-item> - <el-form-item label="搴旀敹鏃ユ湡" prop=""> - <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" /> - </el-form-item> - <el-form-item label="鎵�灞炲叕鍙�" prop=""> - <el-select v-model="param.aaa" placeholder="璇烽�夋嫨" clearable> - <el-option v-for="item in comparyList" :value="item.id" :label="item.name"></el-option> - </el-select> - </el-form-item> - <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop=""> - <el-input type="textarea" :rows="4" v-model="param.content" placeholder="璇疯緭鍏�" /> - </el-form-item> - </div> - </el-form> - </div> - <div class="main_house"> - <div class="title">璇烽�夋嫨鎴挎簮</div> - <el-cascader style="width: 300px" v-model="value" @change="houseChange" :options="options" - :props="{ multiple: true }" collapse-tags clearable /> - </div> + </div> + <div class="list"> + <el-form-item label="鍏宠仈鍚堝悓" prop="contractId"> + <el-select v-model="form.contractId" @change="changeContract" placeholder="璇烽�夋嫨"> + <el-option v-for="(item, index) in contract" :key="index" :value="item.id" :label="item.code"></el-option> + </el-select> + </el-form-item> + <el-form-item label="浠樻鏂�" prop="renterName"> + <el-input v-model="form.renterName" disabled placeholder="浠樻鏂�" v-trim /> + </el-form-item> + <el-form-item label="鎴挎簮" prop="ywContractRoomList"> + <el-select v-model="form.ywContractRoomList" @click="clickHouse" multiple placeholder="璇烽�夋嫨"> + <el-option + v-for="(item, index) in houseList" + :key="index" + :value="item.roomId" + :label="item.projectName + item.buildingName + item.floorName + item.roomName" /> + </el-select> + </el-form-item> + <el-form-item label="璐圭敤绫诲瀷" prop="costType"> + <el-select v-model="form.costType" placeholder="璇烽�夋嫨"> + <el-option :value="0" label="绉熻祦璐�"></el-option> + <el-option :value="1" label="鐗╀笟璐�"></el-option> + <el-option :value="2" label="绉熻祦鎶奸噾"></el-option> + <el-option :value="3" label="鐗╀笟鎶奸噾"></el-option> + <el-option :value="4" label="姘寸數璐�"></el-option> + <el-option :value="5" label="鏉傞」璐�"></el-option> + <el-option :value="6" label="鍏朵粬"></el-option> + </el-select> + </el-form-item> + <el-form-item label="璁¤垂鍛ㄦ湡" prop="date" v-if="form.feeType !== 1"> + <el-date-picker + type="daterange" + range-separator="鑷�" + v-model="form.date" + @change="changeDate" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + value-format="yyyy-MM-dd" + placeholder="璇烽�夋嫨" /> + </el-form-item> + <el-form-item label="搴旀敹閲戦" prop="totleFee"> + <el-input v-model="form.totleFee" placeholder="璇疯緭鍏ュ簲鏀堕噾棰�" v-trim /> + </el-form-item> + <el-form-item label="搴旀敹鏃ユ湡" prop="planPayDate"> + <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨" /> + </el-form-item> + <el-form-item label="鎵�灞炲叕鍙�" prop="companyId"> + <el-select v-model="form.companyId" placeholder="璇烽�夋嫨"> + <el-option + v-for="(item, index) in comparyList" + :key="index" + :value="item.id" + :label="item.name" /> + </el-select> + </el-form-item> + <el-form-item style="width: 100%;" label="璐﹀崟澶囨敞" prop="remark"> + <el-input type="textarea" :rows="5" v-model="form.remark" placeholder="璇疯緭鍏�" /> + </el-form-item> + </div> + </el-form> </div> - <div class="file_wrap"> - <div class="head"> - <div>璐﹀崟闄勪欢</div> - <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl" - :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError"> - <el-button icon="el-icon-plus" plain>娣诲姞闄勪欢</el-button> - </el-upload> - </div> - <el-table :data="param.list" stripe> - <el-table-column prop="" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="鎿嶄綔" align="center" min-width="100"> - <template v-slot="scope"> - <span class="cu red">鍒犻櫎</span> - </template> - </el-table-column> - </el-table> + </div> + <div class="file_wrap"> + <div class="head"> + <div>璐﹀崟闄勪欢</div> + <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl" + :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError"> + <el-button icon="el-icon-plus" plain>娣诲姞闄勪欢</el-button> + </el-upload> </div> - </template> - <!-- --> - <MemberSearch ref="MemberSearchRef" /> + <el-table :data="form.multifileList" stripe> + <el-table-column prop="originname" label="闄勪欢鍚嶇О" align="center" min-width="100" show-overflow-tooltip /> + <el-table-column prop="userName" label="鎿嶄綔浜�" align="center" min-width="100" show-overflow-tooltip /> + <el-table-column prop="createTime" label="鎿嶄綔鏃堕棿" align="center" min-width="100" show-overflow-tooltip /> + <el-table-column label="鎿嶄綔" align="center" min-width="100"> + <template slot-scope="{row}"> + <span class="cu red" @click="dele(row.imgaddr)">鍒犻櫎</span> + </template> + </el-table-column> + </el-table> + </div> </GlobalWindow> </template> <script> import GlobalWindow from '@/components/common/GlobalWindow' import BaseOpera from '@/components/base/BaseOpera' -import MemberSearch from '@/components/common/MemberSearch' import { rules } from './config' +import { create } from '@/api/bill' +import { list as listAll } from '@/api/contract' +import { companyList } from '@/api/company' import { Message, Loading } from 'element-ui' +import { getContractRoom } from '@/api/house' +import { mapState } from 'vuex' export default { components: { - GlobalWindow, - MemberSearch + GlobalWindow + }, + computed: { + ...mapState(['userInfo']) }, extends: BaseOpera, - data() { + data () { return { - isShowModal: false, - title: '', - activeTabs: '0', - param: {}, + form: { + contractId: '', + renterName: '', + renterId: '', + costType: '', + type: '', + companyId: '', + remark: '', + startDate: '', + endDate: '', + totleFee: '', + feeType: 0, + planPayDate: '', + multifileList: [], + ywContractRoomList: [], + date: [], + RoomName: '' + }, rules, - timeTab: '0', - loadingInstance: null, uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch', fileList: [], uploadData: { - folder: 'HIDDEN_DANGER_FILE' + folder: 'YW_CONTRACT_BILL' }, - - types: [ - { name: '鐗╀笟+绉熻祦鍚堝悓', value: 0 }, - { name: '绉熻祦鍚堝悓', value: 1 }, - { name: '鐗╀笟鍚堝悓', value: 2 }, - ], - agentList: [], //缁忓姙浜� - projectList: [], - comparyList: [], // 鍏徃 - renterList: [], // 绉熷 - contacts: [], // 鑱旂郴浜� - value: [], - options: [ - { - value: 1, - label: '涓滃崡', - children: [{ - value: 2, - label: '涓婃捣', - children: [ - { value: 3, label: '鏅檧' }, - { value: 4, label: '榛勫煍' }, - { value: 5, label: '寰愭眹' } - ] - }, { - value: 7, - label: '姹熻嫃', - children: [ - { value: 8, label: '鍗椾含' }, - { value: 9, label: '鑻忓窞' }, - { value: 10, label: '鏃犻敗' } - ] - }, { - value: 12, - label: '娴欐睙', - children: [ - { value: 13, label: '鏉窞' }, - { value: 14, label: '瀹佹尝' }, - { value: 15, label: '鍢夊叴' } - ] - }] - }, - { - value: 17, - label: '瑗垮寳', - children: [{ - value: 18, - label: '闄曡タ', - children: [ - { value: 19, label: '瑗垮畨' }, - { value: 20, label: '寤跺畨' } - ] - }, { - value: 21, - label: '鏂扮枂缁村惥灏旀棌鑷不鍖�', - children: [ - { value: 22, label: '涔岄瞾鏈ㄩ綈' }, - { value: 23, label: '鍏嬫媺鐜涗緷' } - ] - }] - } - ], - cactiveTabs: 0, - paramCost: {}, - payMethods: [ - { name: '涓�娆℃�т粯娆�', value: 0 }, - { name: '3涓湀涓�浠�', value: 1 }, - { name: '6涓湀涓�浠�', value: 2 }, - { name: '1骞翠竴浠�', value: 2 }, - ], - unitOps: [ - { name: '鍏�/m虏路澶�', value: 0 }, - { name: '鍏�/m虏路鏈�', value: 1 }, - { name: '鍏�/澶�', value: 2 }, - { name: '鍏�/鏈�', value: 3 }, - { name: '鍏�/骞�', value: 4 }, - { name: '鍏�/m虏路骞�', value: 5 }, - { name: '鍏�/鍦�', value: 6 }, - ], + contract: [], + payerList: [], + comparyList: [], + houseList: [] } }, - created() { - const { param } = this - this.title = param.id ? '缂栬緫鏀舵璐﹀崟' : '鍒涘缓鏀舵璐﹀崟' - }, methods: { - tabsClick(val) { - this.activeTabs = val + open (title, target) { + this.title = title + this.form.feeType = 0 + this.form.multifileList = [] + this.getListAll() + this.getCompanyList() + this.visible = true + // 鏂板缓 + if (target == null) { + this.$nextTick(() => { + this.$refs.form.resetFields() + this.form[this.configData['field.id']] = null + }) + return + } + // 缂栬緫 + this.$nextTick(() => { + for (const key in this.form) { + this.form[key] = target[key] + } + }) }, - timeTabClick(val) { - this.timeTab = val + clickHouse () { + if (!this.form.contractId) { + return this.$message.warning('璇峰厛閫夋嫨鍚堝悓') + } }, - getDetail() { - + changeContract (e) { + this.form.renterName = this.contract.filter(item => { + if (item.id === e) { + this.form.companyId = item.companyId + return item + } + })[0].renterName + this.getHouseDate() }, - handleRent() { - this.$refs.MemberSearchRef.openModal() + getHouseDate () { + getContractRoom({ contractId: this.form.contractId, type: 0 }) + .then(res => { + this.houseList = res + }) }, - houseChange(e) { - console.log(e) - console.log(this.value) - + confirm () { + this.$refs.form.validate((valid) => { + if (!valid) return + this.isWorking = true + let obj = JSON.parse(JSON.stringify(this.form)) + obj.ywContractRoomList = obj.ywContractRoomList.map(id => { + return { roomId: id } + }) + obj.billType = 0 + create(obj) + .then(() => { + this.visible = false + this.$tip.apiSuccess('鏂板缓鎴愬姛') + this.$emit('success') + }) + .finally(() => { + this.isWorking = false + }) + }) }, - beforeUpload(file) { - // if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) { - // this.$message.error('璇蜂笂浼犳纭殑瑙嗛/鍥剧墖鏍煎紡') - // return false - // } + dele (imgaddr) { + this.form.multifileList.forEach((item, index) => { + if (imgaddr === item.imgaddr) { + this.form.multifileList.splice(index, 1) + } + }) + }, + openHouse () { + this.$refs.selectHouse.open('閫夋嫨鎴挎簮', { contractId: this.form.contractId, type: 0 }) + }, + getCompanyList () { + companyList({ type: 2, status: 0 }) + .then(res => { + this.comparyList = res + }) + }, + getListAll () { + listAll({}) + .then(res => { + console.log(res) + this.contract = res + }) + }, + timeTabClick (val) { + this.form.feeType = val + if (val === 1) { + this.form.startDate = '' + this.form.endDate = '' + this.form.date = [] + } + }, + changeDate (e) { + if (!e || e.length === 0) { + this.form.startDate = '' + this.form.endDate = '' + } else { + this.form.startDate = e[0] + this.form.endDate = e[1] + } + }, + beforeUpload (file) { this.loadingInstance = Loading.service({ lock: true, text: 'Loading', @@ -219,40 +257,33 @@ background: 'rgba(0, 0, 0, 0.7)' }) }, - uploadError() { + uploadError () { this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂� if (this.loadingInstance) { this.loadingInstance.close() } }) }, - uploadAvatarSuccess(file) { - this.$nextTick(() => { // 浠ユ湇鍔$殑鏂瑰紡璋冪敤鐨� Loading 闇�瑕佸紓姝ュ叧闂� + getDay () { + const now = new Date(); + const year = now.getFullYear(); + const month = now.getMonth() + 1; // 鍔�1浣垮叾浠�1寮�濮� + const day = now.getDate(); + const hours = now.getHours(); + const minutes = now.getMinutes(); + const seconds = now.getSeconds(); + return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; + }, + uploadAvatarSuccess (file) { + this.$nextTick(() => { if (this.loadingInstance) { this.loadingInstance.close() } }) - console.log('file', file) const item = file.data[0] - if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) { - this.fileList.push({ - type: 1, - fileurl: item.imgaddr, - fileurlFull: item.url - }) - } else { - this.fileList.push({ - type: 0, - fileurl: item.imgaddr, - fileurlFull: item.url - }) - } - console.log('file', this.fileList) - // this.$set(this.param, 'faceImg', file.imgurl) - // this.$set(this.param, 'faceImgUrl', file.imgurlfull) + this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() }) }, - close() { - this.isShowModal = false + close () { this.$emit('close') } } @@ -290,7 +321,7 @@ .tabs { display: flex; margin-bottom: 20px; - display: flex; + align-items: center; justify-content: center; .tab { -- Gitblit v1.9.3