<style> .priceUpdate .resource-content { min-width: 1200px; margin-top: 30px; font-size: 12px; } .priceUpdate .resource-content>div { display: inline-block; } .priceUpdate .resource-baseinfo { float: left; height: auto; width: 550px; margin-left: 30px; } .priceUpdate .resource-imginfo { float: left; width: 550px; margin-top: 60px; } .priceUpdate .resource-imginfo>div { margin-bottom: 20px; } .priceUpdate .resource-lititle { display: block; border-left: 4px solid #e95252; padding-left: 10px; } .priceUpdate .resource-baseinfo span { display: inline-block; } .priceUpdate .resource-baseinfo>div { margin-bottom: 20px; } .clearfix:after { content: "\0020"; display: block; height: 0; clear: both; } .priceUpdate .priceDate { width: 500px; background-color: #fff; border: 1px solid #d1d1d1; } .priceUpdate .noticeInfo div { margin-bottom: 10px; margin: 0 120px 10px 80px; } .priceUpdate .subPrice { margin: 0 20px 0 70px; } .priceUpdate .inventory-div>div { float: left; margin: 10px 30px 30px 0; } .priceUpdate .inventoryCommon { display: inline-block; width: 10px; height: 10px; border-radius: 50%; } .priceUpdate .inOne { background-color: #e95252; } .priceUpdate .inTwo { background-color: #f58f0c; } .priceUpdate .inThree { background-color: #1bc594; } .priceUpdate .inFour { background-color: #1b63c5; } .priceUpdate .price-manage { margin: 20px 0 25px 0; } .priceUpdate .day { width: 1000px; margin: 0 auto; position: relative; overflow: hidden; } .priceUpdate .yearSelect, .monthSelect { float: left; width: 168px; height: 30px; } .priceUpdate .priceDate td.checked>label { border-color: red; line-height: 28px; box-sizing: border-box; border-radius: 15px; } .priceUpdate .triangle_border_up { width: 0; height: 0; border-width: 0 123px 30px; border-style: solid; opacity: 0.75; border-color: transparent transparent rgba(233, 82, 82, 1); /*透明 透明 灰*/ } .priceUpdate #calendar { width: 500px; height: 400px; margin: 0 auto; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } .priceUpdate .month ul { margin: 0; padding: 0; display: flex; justify-content: space-between; } .priceUpdate .year-month { flex-direction: column; align-items: center; justify-content: space-around; } .priceUpdate .year-month>input { width: 100px; float: left; } .priceUpdate .arrow { padding: 10px; font-style: normal; cursor: pointer; } .priceUpdate .monthminus { position: absolute; left: 15px; top: 15px; } .priceUpdate .monthadd { position: absolute; right: 21px; top: 16px; } .priceUpdate .month ul li { font-size: 12px; position: relative; text-transform: uppercase; float: left; letter-spacing: 3px; } .priceUpdate .month ul li>input { padding-left: 10px; text-align: center; margin: 20px 10px 20px; } .priceUpdate .weekdays { margin: 0; padding: 10px 0; background-color: #f9f9f9; display: flex; flex-wrap: wrap; color: #999999; justify-content: space-around; } .priceUpdate .weekdays li { display: inline-block; width: 13.6%; text-align: center; } .priceUpdate .days { width: 500px; padding: 0; margin: 0; display: flex; flex-wrap: wrap; justify-content: space-around; } .priceUpdate .days li { list-style-type: none; display: inline-block; width: 14.2%; text-align: center; position: relative; padding-bottom: 15px; padding-top: 10px; font-size: 1rem; color: #000; } .priceUpdate .spanCheck { cursor: pointer; } .priceUpdate .days li .active { padding: 6px 10px; border-radius: 50%; background: #00b8ec; color: #fff; } .priceUpdate .days li span { display: inline-block; width: 30px; height: 30px; border: 1px solid #fff; border-radius: 17px; line-height: 30px; } .priceUpdate .days li .other-month { display: inline-block; width: 30px; height: 30px; line-height: 30px; color: gainsboro; } .priceUpdate .checked span { border-color: green !important; } .priceUpdate .currentInput { width: 120px; height: 30px; border-radius: 17px; outline: none; border: none; margin-top: 20px; border: 1px solid #dcdfe6; } .priceUpdate .detailInfo { display: none; position: absolute; left: -85px; top: 50px; z-index: 999; } .priceUpdate .priceUpdate { min-width: 1200px; } .priceUpdate .popContent { width: 245px; height: 145px; background-color: #e95252; text-align: left; color: #fff; font-size: 12px; } .priceUpdate .popContent div { width: 100%; } .priceUpdate .popList label:first-child { display: inline-block; width: 40%; margin: 10px 0 0 10px; text-align: left; } .priceUpdate .popList label:last-child { display: inline-block; width: 40%; margin: 10px 10px 0 0; text-align: right; } .priceUpdate .class-a { background-color: #e95252; color: #fff; } .priceUpdate .class-b { background-color: #f58f0c; color: #fff; } .priceUpdate .class-c { background-color: #1bc594; color: #fff; } .priceUpdate .class-d { background-color: #1b63c5; color: #fff; } .packagePrice .class-e { background-color: #e95252; color: #fff; } .priceUpdate .delButton { position: relative; top: -50px; background-color: #1bc594; color: #fff; } .priceUpdate .el-form-item { display: inline-block; } .priceUpdate .el-form-item__label { width: 80px; } .priceUpdate .resDiv { width: 700px; } .priceUpdate .el-textarea__inner { resize: none; font-family: "微软雅黑"; } .priceUpdate input::-webkit-outer-spin-button, .priceUpdate input::-webkit-inner-spin-button { -webkit-appearance: none !important; margin: 0; } .priceUpdate .el-form-item__error { left: 80px; } .priceUpdate .s { display: block !important; } .priceUpdate .el-form-item__content { width: 315px; } .priceUpdate .RemarkDiv .el-form-item__content { width: 400px; } .priceUpdate .ckAll { margin: 25px 20px 0 0; } .priceUpdate .ckStyle { cursor: pointer; } .HS_supplier { margin: 10px 0 10px 10px; } </style> <template> <div class="flexOne priceUpdate"> <div class="resource-content clearfix"> <div class="resource-baseinfo"> <span class="resource-lititle price-manage">{{$t('hotel.hotel_productManage')}}</span> <div> <div class="priceDate" id="DayAll"> <div class="month"> <ul> <li> <i class="arrow monthminus" @click="currentYear-=1,getDateString(),initCalendar(dateString)">❮</i> <input type="text" v-model="currentYear" class="currentInput" @input="getDateString(),initCalendar(dateString)" />{{$t('pub.year')}} <i class="arrow monthadd" @click="currentYear+=1,getDateString(),initCalendar(dateString)">❯</i> </li> <li> <i class="arrow monthminus" @click="pickPre(currentYear,currentMonth)">❮</i> <input type="text" v-model="currentMonth" class="currentInput" @input="getDateString(),initCalendar(dateString)" />{{$t('pub.month')}} <i class="arrow monthadd" @click="pickNext(currentYear,currentMonth)">❯</i> </li> <li> <div class="ckAll"> <el-checkbox class="checkBox" v-model='isCheckAll' @change="checkAll">{{$t('system.table_chekAll')}} </el-checkbox> </div> </li> </ul> </div> <!-- 星期 --> <ul class="weekdays"> <li>{{$t('hotel.hotel_Monday')}}</li> <li>{{$t('hotel.hotel_Tuesday')}}</li> <li>{{$t('hotel.hotel_Wednesday')}}</li> <li>{{$t('hotel.hotel_Thursday')}}</li> <li>{{$t('hotel.hotel_Friday')}}</li> <li>{{$t('hotel.hotel_Saturday')}}</li> <li>{{$t('hotel.hotel_Sunday')}}</li> </ul> <!-- 日期 --> <ul class="days"> <li class="liList" :class="{'checked':dayobject.checkState==$calendarUtils.checkState.checked}" v-for="(dayobject,index) in days" :key="dayobject.subCode" @mouseover="disBoard(dayobject,index)" @mouseout="disNoneBoard()"> <span v-if="dayobject.day.getMonth()+1 != currentMonth" class="other-month">{{ dayobject.day.getDate()}}</span> <span class="ckStyle" @click="clickedDay(dayobject)" v-else-if="updateDay==-1 || dayobject.day.getDate()==updateDay" :class="dayobject.class"> {{dayobject.day.getDate()}} </span> <span class="other-month" v-else :class="{'class-a': dayobject.checkState==$calendarUtils.checkState.hasValue}"> {{dayobject.day.getDate()}} </span> <div class="detailInfo" :class="{s:index==num}"> <div class="triangle_border_up"></div> <div class="popContent"> <div class="popList"> <label>{{$t('hotel.hotel_cost')}}:{{dayobject.CostPrice}}</label> <label>{{$t('hotel.hotel_B2BPrice')}}:{{dayobject.B2BPrice}}</label> </div> <div class="popList"> <label>{{$t('hotel.hotel_Inventory')}}:{{dayobject.kucun}}</label> <label>{{$t('hotel.hotel_B2CPrice')}}:{{dayobject.B2CPrice}}</label> </div> <!-- <div class="HS_supplier"> <label>{{$t('hotel.hotel_Supplier')}}:{{dayobject.SupplierName}}</label> </div> --> </div> <input type="button" class="hollowFixedBtn delButton" @click="isdelete(dayobject.ID)" :value="$t('system.table_delete')" /> <button class="hollowFixedBtn delButton" @click="updateInfo(dayobject.ID,dayobject.date,index)">{{$t('system.table_edit')}}</button> </div> </li> </ul> </div> </div> <div class="inventory-div clearfix"> <div> <span class="inventoryCommon inOne"></span> <span>{{$t('hotel.hotel_Inventory')}}<10</span> </div> <div> <span class="inventoryCommon inTwo"></span> <span>10-100</span> </div> <div> <span class="inventoryCommon inThree"></span> <span>100-500</span> </div> <div> <span class="inventoryCommon inFour"></span> <span>500-1000</span> </div> </div> </div> <div class="resource-imginfo"> <el-form :model="addMsg" :rules="rules" ref="addMsg"> <div class="resDiv" style="margin:0 0 20px 42px"> <span> <em style="margin-right:10px;">{{$t('pub.date')}}</em> <el-date-picker class="w150" v-model='addMsg.StartDate' type="date" :picker-options="pickerBeginDateBefore" value-format="yyyy-MM-dd" placeholder=""> </el-date-picker> <el-date-picker class="w150" v-model='addMsg.EndDate' type="date" value-format="yyyy-MM-dd" :picker-options="pickerBeginDateAfter" placeholder=""> </el-date-picker> </span> </div> <div class="resDiv"> <el-form-item :label="$t('hotel.hotel_CostPrice')" prop="CostPrice"> <el-input type="text" class="w210" v-model="addMsg.CostPrice" @keyup.native="checkPrice(addMsg,'CostPrice')"></el-input> </el-form-item> <el-form-item :label="$t('objFill.soujia')" prop="SalesPrice"> <el-input type="text" class="w210" v-model="addMsg.SalesPrice" @keyup.native="checkPrice(addMsg,'SalesPrice')"></el-input> </el-form-item> </div> <div class="resDiv"> <el-form-item :label="$t('hotel.hotel_B2BPrice')" prop="B2BPrice"> <el-input type="text" class="w210" v-model="addMsg.B2BPrice" @keyup.native="checkPrice(addMsg,'B2BPrice')"></el-input> </el-form-item> <el-form-item :label="$t('hotel.hotel_Inventory')" prop="Inventory"> <el-input type="text" class="w210" v-model="addMsg.Inventory" @keyup.native="checkPrice(addMsg,'Inventory')"></el-input> </el-form-item> <!-- <el-form-item :label="$t('hotel.hotel_B2CPrice')"> <el-input type="text" class="w210" v-model="addMsg.B2CPrice" @keyup.native="checkPrice(addMsg,'B2CPrice')"></el-input> </el-form-item> --> </div> <div class="resDiv"> <!-- <el-form-item :label="$t('hotel.hotel_Inventory')" prop="Inventory"> <el-input type="text" class="w210" v-model="addMsg.Inventory" @keyup.native="checkPrice(addMsg,'Inventory')"></el-input> </el-form-item> --> <el-form-item :label="$t('hotel.hotel_Supplier')" v-if="IsSelfBook==1" prop="Supplier"> <el-select v-model="addMsg.Supplier" class="w210" filterable clearable :placeholder="$t('hotel.hotel_inputholder')"> <el-option :label='$t("pub.ph_buxian")' value=''></el-option> <el-option v-for="item in SupplierList" :key="item.ID" :label="item.Name" :value="item.ID"></el-option> </el-select> </el-form-item> </div> <div class="resDiv" style="display:none;"> <el-form-item :label="$t('hotel.hotel_Currency')"> <el-select :placeholder="$t('ground.qingxuanbizhong')" filterable class='multiple_input w210' @change="getCurrentRate(addMsg.CurrencyId)" v-model="addMsg.CurrencyId"> <el-option :label="$t('pub.unlimitedSel')" :value='SelectDefaultValue'></el-option> <el-option v-for="item in allCurrencyList" :key="item.ID" :label="item.Name" :value="item.ID"> </el-option> </el-select> </el-form-item> <el-form-item :label="$t('hotel.hotel_CurrentRate')" prop="Fax"> <el-input class="w210" v-model='addMsg.CurrentRate' @keyup.native="checkRate(addMsg,'CurrentRate')"> </el-input> </el-form-item> </div> <!-- <div class="resDiv RemarkDiv"> <el-form-item :label="$t('hotel.hotel_remark')" prop="Remark"> <el-input type="textarea" class="w300" v-model="addMsg.Remark"></el-input> </el-form-item> </div> --> </el-form> <div class="noticeInfo"> <div>{{$t('hotel.hotel_attention')}}:</div> <div>1.{{$t('hotel.hotel_attentionOne')}}</div> <div>2.{{$t('hotel.hotel_attentionTwo')}}</div> </div> <button type="success" class="subPrice" :class="{'comDisableBtn':isDisable==true,'normalBtn':isDisable==false}" :disabled='isDisable' @click="isDeleteNote=true,submitForm('addMsg')">{{comBtnText}}</button> <button type="success" class="hollowFixedBtn" @click="goBack" v-if="updateDay=='-1'">{{$t('pub.returnBack')}}</button> <button type="success" class="hollowFixedBtn" @click="resetForm('addMsg')" v-else>{{$t('pub.cancelBtn')}}</button> </div> </div> </div> </template> <script> export default { data() { return { //供应商 SupplierList: [], productname: "", serviceNum: "", yearInput: "", //输入框年 monthInput: "", //输入框月 ID: "", HotelID: "", DateList: [], DateArr: [], currentDay: 1, currentMonth: 1, currentYear: 1970, currentWeek: 1, days: [], nowDate: "", dateString: "2016-01-02", num: -1, updateDay: -1, IsSelfBook: 0, Country: 0, //提交报价中 comBtnText: this.$t('ground.tijiaobaojia'), isDisable: false, //选中状态 isCheckAll: false, //选择的币种 SelectDefaultValue: 0, //所有币种 allCurrencyList: [], addMsg: { Hotel: "", Product: "", Supplier: "", Inventory: "", B2BPrice: "", B2CPrice: 0, SalesPrice: "", DMCPrice: 0, DateList: "", Remark: "", CostPrice: "", CurrencyId: 1, CurrentRate: 1, StartDate: "", EndDate: "" }, rules: { //表单必填验证 CostPrice: [{ required: true, message: this.$t('ground.qingshurcbj'), trigger: "change" }, { pattern: this.$commonUtils.Regex.el_Isdecimal, message: this.$t('ground.qingshurlwxs') } ], Inventory: [{ required: true, message: this.$t('ground.qingshurukc'), trigger: "change" }, { pattern: this.$commonUtils.Regex.el_Isdecimal, message: this.$t('ground.qingshuruzqdsz') } ], B2BPrice: [{ required: true, message: this.$t('ground.qingshuruB2Bjg'), trigger: "change" }, { pattern: this.$commonUtils.Regex.el_Isdecimal, message: this.$t('ground.qingshurlwxs') } ], // B2CPrice: [{ // required: true, // message: this.$t('ground.qingshuruB2Cjg'), // trigger: "change" // }, // { // pattern: this.$commonUtils.Regex.el_Isdecimal, // message: this.$t('ground.qingshurlwxs') // } // ], SalesPrice: [{ required: true, message: this.$t('ground.qingshurnbjg'), trigger: "change" }, { pattern: this.$commonUtils.Regex.el_Isdecimal, message: this.$t('ground.qingshurlwxs') } ], Supplier: [{ required: true, message: this.$t('ground.qingxuanzgys') }] }, pickerBeginDateBefore: { disabledDate: time => { let endTime = new Date(this.addMsg.EndDate); return endTime.getTime() < time.getTime(); } }, pickerBeginDateAfter: { disabledDate: time => { let startTime = new Date(this.addMsg.StartDate); return startTime.getTime() >= time.getTime(); } } }; }, methods: { //初始化列表数据 initDataTable() { let msg = { Product: this.ID, Date: this.nowDate }; this.apipost( "dict_post_HotelOffer_GetList", msg, res => { if (res.data.resultCode == 1) { var tableinfo = res.data.data; this.days.forEach(dayItem => { var d = dayItem.day; var myDate = this.$calendarUtils.formatDate( d.getFullYear(), d.getMonth() + 1, d.getDate() ); for (var j = 0; j < tableinfo.length; j++) { if (tableinfo[j].DateStr == myDate) { dayItem.CostPrice = tableinfo[j].CostPrice; dayItem.B2BPrice = tableinfo[j].B2BPrice; dayItem.B2CPrice = tableinfo[j].B2CPrice; dayItem.kucun = tableinfo[j].Inventory; dayItem.SupplierName = tableinfo[j].SupplierName; dayItem.ID = tableinfo[j].ID; dayItem.date = tableinfo[j].Date; dayItem.checkState = this.$calendarUtils.checkState.hasValue; if (dayItem.kucun >= 0 && dayItem.kucun < 10) { dayItem.class = "class-a"; } else if (dayItem.kucun >= 10 && dayItem.kucun < 100) { dayItem.class = "class-b"; } else if (dayItem.kucun >= 100 && dayItem.kucun < 500) { dayItem.class = "class-c"; } else if (dayItem.kucun >= 500) { dayItem.class = "class-d"; } } } }); } }, null ); }, initSupplier() { let msg = { Type: 1 }; //HK新增查询条件 this.apipost( "supplier_post_GetAllList", msg, response => { if (response.data.resultCode == 1) { this.SupplierList = response.data.data; } }, null ); }, //提交酒店报价 hotelOfferSet() { this.addMsg.Hotel = this.HotelID; this.addMsg.Product = this.ID; this.addMsg.DateList = this.DateArr; if ( this.addMsg.DateList == "" && (this.addMsg.StartDate == "" || this.addMsg.EndDate == "") ) { this.Error(this.$t('ground.qingxuanzeriq')); return; } this.isDisable = true; this.comBtnText = this.$t('ground.zhengzaitijiao'); this.apipost( "dict_post_HotelOffer_Set", this.addMsg, res => { this.isDisable = false; this.comBtnText = this.$t('ground.tijiaobaojia'); if (res.data.resultCode == 1) { this.initDataTable(); this.addMsg = {}; this.Success(this.$t('tips.saveYes')); this.DateArr = []; this.resetForm("addMsg"); } else { this.Error(res.data.message); } }, null ); }, isdelete(ID) { var that = this; that.Confirm(that.$t('tips.shifoushanchu'), function () { that.apipost( "dict_post_HotelOffer_Remove", { Id: ID }, res => { if (res.data.resultCode == 1) { that.initDataTable(); that.initCalendar(); that.Success(that.$t('tips.shanchuchenggong')); } } ); }); }, updateInfo(ID, date, index) { let msg = { Id: ID }; this.addMsg.ID = ID; let parameterDate = date.split("-"); this.setCheck(index); this.updateDay = parameterDate[parameterDate.length - 1]; this.apipost("dict_post_HotelOffer_Get", msg, res => { if (res.data.resultCode == 1) { this.addMsg = res.data.data; this.DateArr = [date]; } }); }, getDateString: function () { this.dateString = this.$calendarUtils.formatDate( this.currentYear, this.currentMonth, 1 ); }, initCalendar: function (cur) { var newDays = this.$calendarUtils.createCalendar(cur); this.currentDay = newDays.CurrentDay; this.currentYear = newDays.CurrentYear; this.currentMonth = newDays.CurrentMonth; this.currentWeek = newDays.CurrentWeek; this.days.length = 0; var dateArray = newDays.DayArray; for (var i = 0; i < dateArray.length; i++) { var d = dateArray[i].day; var dayobject = {}; dayobject.day = d; if (d.getMonth() + 1 == this.currentMonth) { dayobject.checkState = this.$calendarUtils.checkState.noChecked; } this.days.push(dayobject); } }, //点击左箭头切换年月 pickPre: function (year, month) { var d = new Date(this.$calendarUtils.formatDate(year, month, 1)); d.setDate(0); this.nowDate = d.getFullYear() + "-" + (d.getMonth() + 1) + "-1"; this.initCalendar( this.$calendarUtils.formatDate(d.getFullYear(), d.getMonth() + 1, 1) ); this.initDataTable(); }, //点击右箭头切换年月 pickNext: function (year, month) { var d = new Date(this.$calendarUtils.formatDate(year, month, 1)); d.setDate(35); this.nowDate = d.getFullYear() + "-" + (d.getMonth() + 1) + "-1"; this.initCalendar( this.$calendarUtils.formatDate(d.getFullYear(), d.getMonth() + 1, 1) ); this.initDataTable(); }, //鼠标移入显示详情看板 disBoard(item, index) { if (item.checkState == this.$calendarUtils.checkState.hasValue) { this.num = index; } }, //鼠标移出隐藏详情看板 disNoneBoard() { this.num = -1; }, //日历修改设置 setCheck(index) { this.$calendarUtils.daySetCheck(this.days, index); }, //点击选取日历日期 clickedDay(item) { this.$calendarUtils.dayClick(item, this.DateArr); }, //日历全选 checkAll() { this.DateArr = this.$calendarUtils.checkAll(this.days, this.isCheckAll); }, //提交创建、修改表单 submitForm(addMsg) { let that = this; that.$refs[addMsg].validate(valid => { if (valid) { that.hotelOfferSet(); } else { return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); this.updateDay = -1; this.$calendarUtils.resetChekState(this.days); }, goBack() { this.$router.push({ path: 'HotelProductManage', query: { id: this.HotelID, tab: '房型列表' } }); }, //获取所有币种 getAllCurrency() { this.apipost( "financeinfo_post_GetList", {}, res => { if (res.data.resultCode == 1) { this.allCurrencyList = res.data.data; } }, err => {} ); }, //获取当前下拉选中币种汇率 getCurrentRate(currencyId) { this.allCurrencyList.forEach(x => { if (x.ID == currencyId) { this.addMsg.CurrentRate = x.Rate; } }); } }, mounted() { this.getAllCurrency(); var d = new Date(); var vYear = d.getFullYear(); var vMonth = d.getMonth() + 1; var vDate = d.getDate(); this.nowDate = vYear + "-" + vMonth + "-" + vDate; this.yearInput = vYear; this.monthInput = vMonth; this.ID = this.$route.query.id; this.HotelID = this.$route.query.HotelID; this.IsSelfBook = this.$route.query.IsSelfBook; this.Country = this.$route.query.Country; this.initSupplier(); this.initCalendar(); this.initDataTable(); } }; </script>