Commit 71ca7eef authored by 吴春's avatar 吴春

1

parent 1fea9227
...@@ -390,6 +390,7 @@ ...@@ -390,6 +390,7 @@
</span> </span>
</li> </li>
<li> <li>
<input v-if="userInfo.SimpleEasy==1" type="button" class="hollowFixedBtn" :value="$t('pub.addBtn')" @click="addOrders"/>
<button class="hollowFixedBtn" @click="getList()">{{$t('pub.searchBtn')}}</button> <button class="hollowFixedBtn" @click="getList()">{{$t('pub.searchBtn')}}</button>
</li> </li>
</ul> </ul>
...@@ -519,19 +520,33 @@ ...@@ -519,19 +520,33 @@
</el-row> </el-row>
</el-form> </el-form>
</div> </div>
<pinkDrawer ref="addOrders"
:drawer-config="drawerConfig">
<template slot="drawer" slot-scope="{ visible, close }">
<cruiseShipInfo v-if="visible" :isDrawerMode="true"
:details="selectedSpotData"
@close="close" @save-success="handleSaveSuccess"></cruiseShipInfo>
</template>
</pinkDrawer>
</div> </div>
</template> </template>
<script> <script>
import visaOrderList from './visaOrderList.vue'; import visaOrderList from './visaOrderList.vue';
import pinkDrawer from '../../common/pinkDrawer.vue';
import DateLimit from '../../public/DateLimit.vue'; import DateLimit from '../../public/DateLimit.vue';
import cruiseShipInfo from './cruiseShipInfo.vue';
import addConfig from "./addConfig.js";
export default { export default {
props: ['pagesTitle'], props: ['pagesTitle'],
components: { components: {
visaOrderList, visaOrderList,
DateLimit DateLimit,
pinkDrawer,
cruiseShipInfo,
}, },
data() { data() {
return { return {
selectedSpotData: null,
pickerStartDate: { pickerStartDate: {
disabledDate: time => { disabledDate: time => {
let startTime = new Date(this.msg.StartDate); let startTime = new Date(this.msg.StartDate);
...@@ -633,7 +648,21 @@ ...@@ -633,7 +648,21 @@
layerCompanyList: [] layerCompanyList: []
} }
}, },
computed: {
// 抽屉配置
drawerConfig() {
return addConfig.drawerConfig;
},
},
methods: { methods: {
addOrders() {
this.$refs.addOrders.openDrawer();
},
handleSaveSuccess() {
this.$refs.addOrders.handleDrawerClose();
this.getList();
this.$message.success('保存成功');
},
pickerEnd(){ pickerEnd(){
if (this.msg.FinishSDate > this.msg.FinishEDate && this.msg.FinishEDate !== "") { if (this.msg.FinishSDate > this.msg.FinishEDate && this.msg.FinishEDate !== "") {
this.$message.error(this.$t('tips.jsrqbndyksriqi')); this.$message.error(this.$t('tips.jsrqbndyksriqi'));
......
// 邮轮列表配置
export const addConfig = {
// 抽屉配置
drawerConfig: {
title: '签证信息',
size: '90%',
direction: 'rtl'
},
}
// 导出默认配置
export default addConfig
<style>
@import "../../../assets/css/DMC.css";
.drawer-mode {
display: flex;
height: 100%;
flex-direction: column;
}
/* 抽屉模式下的样式优化 */
.drawer-mode .changInfo {
padding: 0;
margin: 0;
height: 100%;
display: flex;
flex-direction: column;
}
.drawer-mode .resource-content {
padding: 0;
flex: 1;
overflow: hidden;
margin: 0 !important;
}
.drawer-mode .hotel-form-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
/* Tabs 样式优化 */
.drawer-mode .hotel-tabs {
flex: 1;
display: flex;
flex-direction: column;
border: none;
box-shadow: none;
}
.drawer-mode .hotel-tabs .el-tabs__header {
margin: 0;
background: #f8f9fa;
border-bottom: 1px solid #e8e8e8;
}
.drawer-mode .hotel-tabs .el-tabs__nav-wrap {
padding: 0 20px;
}
.drawer-mode .hotel-tabs .el-tabs__item {
height: 40px;
line-height: 40px;
font-size: 13px;
font-weight: 500;
color: #595959;
border: none;
padding: 0 20px;
}
.drawer-mode .hotel-tabs .el-tabs__item.is-active {
color: #1890ff;
background: #fff;
border-bottom: 2px solid #1890ff;
}
.drawer-mode .hotel-tabs .el-tabs__content {
flex: 1;
overflow-y: auto;
padding: 0;
}
.drawer-mode .hotel-tabs .el-tab-pane {
height: 100%;
}
/* Tab 内容区域 */
.drawer-mode .tab-content {
padding: 20px;
height: 100%;
overflow-y: auto;
}
.drawer-mode .tab-content.hidden {
height: calc(100vh - 160px);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* 表单样式优化 */
.drawer-mode .el-form {
padding: 0;
}
.drawer-mode .el-form-item {
margin-bottom: 16px;
}
.drawer-mode .el-form-item__label {
font-size: 13px;
font-weight: 500;
line-height: 32px;
color: #262626;
/* width: 120px !important; */
}
/* 输入框和下拉框优化 */
.drawer-mode .el-input,
.drawer-mode .el-select {
width: 100%;
}
.drawer-mode .el-input__inner,
.drawer-mode .el-select .el-input__inner {
height: 32px;
line-height: 32px;
font-size: 13px;
border: 1px solid #d9d9d9;
border-radius: 4px;
transition: all 0.2s ease;
}
.drawer-mode .el-input__inner:focus,
.drawer-mode .el-select .el-input__inner:focus {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
.drawer-mode .el-textarea__inner {
font-size: 13px;
border: 1px solid #d9d9d9;
border-radius: 4px;
min-height: 60px;
}
.drawer-mode .el-textarea__inner:focus {
border-color: #1890ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
/* 日期选择器优化 */
.drawer-mode .el-date-editor {
width: 100%;
}
.drawer-mode .el-date-editor .el-input__inner {
height: 32px;
line-height: 32px;
}
/* 联系人区域样式 */
.drawer-mode .contact-header {
margin-bottom: 20px;
padding-bottom: 10px;
border-bottom: 1px solid #e8e8e8;
text-align: right;
}
.drawer-mode .contact-list {
flex: 1;
overflow-y: auto;
}
.drawer-mode .contact-item {
margin-bottom: 12px;
padding: 12px;
background: #fafbfc;
border: 1px solid #e8e8e8;
border-radius: 6px;
position: relative;
display: flex;
align-items: start;
padding-bottom: 0;
}
.drawer-mode .contact-item .el-form-item__content {
margin-left: 0px !important;
}
/* 上传区域样式 */
.drawer-mode .upload-section {
display: flex;
flex-direction: column;
gap: 8px;
}
.drawer-mode .upload-section a {
color: #1890ff;
text-decoration: none;
font-size: 13px;
margin-right: 8px;
display: inline-block;
margin-bottom: 4px;
}
.drawer-mode .upload-section a:hover {
color: #40a9ff;
text-decoration: underline;
}
/* 按钮区域优化 */
.drawer-mode .btn-list {
position: sticky;
bottom: 0;
background: #fff;
padding: 16px 20px;
border-top: 1px solid #e8e8e8;
margin: 0;
z-index: 100;
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
}
.drawer-mode .btn-actions {
display: flex;
justify-content: flex-end;
gap: 12px;
}
.drawer-mode .save-Btn,
.drawer-mode .cancel-Btn {
height: 36px;
padding: 0 20px;
font-size: 14px;
border-radius: 4px;
cursor: pointer;
border: 1px solid;
transition: all 0.2s ease;
}
.drawer-mode .save-Btn {
background: #1890ff;
border-color: #1890ff;
color: #fff;
}
.drawer-mode .save-Btn:hover {
background: #40a9ff;
border-color: #40a9ff;
}
.drawer-mode .save-Btn:disabled {
background: #d9d9d9;
border-color: #d9d9d9;
color: #bfbfbf;
cursor: not-allowed;
}
.drawer-mode .save-Btn:disabled:hover {
background: #d9d9d9;
border-color: #d9d9d9;
}
.drawer-mode .cancel-Btn {
background: #fff;
border-color: #d9d9d9;
color: #595959;
}
.drawer-mode .cancel-Btn:hover {
background: #f5f5f5;
border-color: #40a9ff;
color: #40a9ff;
}
/* 上传按钮优化 */
.drawer-mode .el-button--small {
height: 28px;
padding: 0 12px;
font-size: 12px;
border-radius: 4px;
}
.drawer-mode .el-button--primary.el-button--small {
background: #1890ff;
border-color: #1890ff;
}
.drawer-mode .el-button--primary.el-button--small:hover {
background: #40a9ff;
border-color: #40a9ff;
}
/* 滚动条样式 */
.drawer-mode .tab-content::-webkit-scrollbar {
width: 6px;
}
.drawer-mode .tab-content::-webkit-scrollbar-track {
background-color: #f6f8fa;
border-radius: 3px;
}
.drawer-mode .tab-content::-webkit-scrollbar-thumb {
background-color: #d0d7de;
border-radius: 3px;
}
.drawer-mode .tab-content::-webkit-scrollbar-thumb:hover {
background-color: #8c959f;
}
/* 加载状态样式 */
.loading-container {
display: flex;
align-items: center;
justify-content: center;
min-height: 300px;
padding: 40px;
}
.loading-content {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.loading-content .el-loading-spinner {
margin-bottom: 16px;
}
.loading-content .el-loading-spinner .circular {
width: 32px;
height: 32px;
color: #1890ff;
}
.loading-content p {
color: #666;
font-size: 14px;
margin: 0;
}
/* 错误状态样式 */
.error-container {
display: flex;
align-items: center;
justify-content: center;
min-height: 300px;
padding: 40px;
}
.error-content {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
max-width: 400px;
}
.error-content .el-icon-warning {
font-size: 48px;
color: #f56c6c;
margin-bottom: 16px;
}
.error-content .error-title {
color: #f56c6c;
font-size: 16px;
font-weight: 500;
margin: 0 0 8px 0;
}
.error-content .error-message {
color: #666;
font-size: 14px;
margin: 0 0 20px 0;
line-height: 1.5;
}
.error-actions {
display: flex;
gap: 12px;
}
.error-actions .el-button {
min-width: 80px;
}
/* 响应式优化 */
@media (max-width: 1200px) {
.drawer-mode .el-col[class*="span-6"] {
width: 50% !important;
}
.drawer-mode .el-col[class*="span-4"] {
width: 33.333% !important;
}
}
@media (max-width: 768px) {
.drawer-mode .el-col[class*="span-"] {
width: 100% !important;
}
.drawer-mode .tab-content {
padding: 16px;
}
.drawer-mode .el-form-item__label {
width: 100px !important;
}
.loading-container,
.error-container {
min-height: 200px;
padding: 20px;
}
.error-actions {
flex-direction: column;
width: 100%;
}
.error-actions .el-button {
width: 100%;
}
}
.cruiseShipInfo{
display: flex;
flex-direction: row;
}
</style>
<template>
<div class="flexOne changInfo" :class="{ 'drawer-mode': isDrawerMode }">
<!-- 正常内容 -->
<div class="resource-content clearfix">
<!-- :disabled="addMsg.OrderId>0&&(activeTab=='basic'||activeTab=='contact')" -->
<el-form :model="addMsg" :rules="rules" class="h-full" ref="addMsg" label-width="120px"
>
<div class="hotel-form-container h-full">
<el-tabs v-model="activeTab" type="border-card" class="hotel-tabs">
<el-tab-pane label="基础资料" name="basic">
<div class="tab-content">
<el-row :gutter="16">
<el-col :span="6">
<el-form-item label="签证名称" prop="DisplayCouponsId">
<el-select
v-model="addMsg.VisaId"
placeholder="请选择"
filterable allow-create
default-first-option clearable
remote
reserve-keyword
:remote-method="getCruiseShip"
:loading="CSloading"
@change="(val)=>{handleChange(val,1)}">
<el-option v-for="item in CruiseShipList" :key="item.Id" :label="item.Name" :value="item.Id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="人数" prop="PeopleNum">
<el-input type="number" v-model="addMsg.PeopleNum"></el-input>
</el-form-item>
</el-col>
<!-- <el-col :span="6">
<el-form-item label="房型名称" prop="DisplayTicketId">
<el-select
v-model="addMsg.DisplayTicketId"
placeholder="请选择"
filterable allow-create
default-first-option clearable
remote
reserve-keyword
:remote-method="getRoomType"
:loading="RTloading"
@change="(val)=>{handleChange(val,2)}">
<el-option v-for="item in RoomTypeList" :key="item.Id" :label="item.TicketName" :value="item.Id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="出游时间" prop="UseDate">
<el-date-picker v-model="addMsg.UseDate" type="date" placeholder="出游时间">
</el-date-picker>
</el-form-item>
</el-col>-->
<el-col :span="6">
<el-form-item label="OP">
<el-select v-model="addMsg.AppointOPList"
multiple filterable collapse-tags placeholder="请选择OP">
<el-option v-for='item in EmployeeList' :label='item.EmName'
:value='item.EmployeeId' :key='item.EmployeeId'></el-option>
</el-select>
</el-form-item>
</el-col>
<!-- <el-col :span="6">
<el-form-item label="预订人" prop="Name">
<el-input type="text" v-model="addMsg.Name" maxlength="100"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预订人(英文名)">
<el-input type="text" v-model="addMsg.EName" maxlength="100"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预订人手机号">
<el-input type="text" v-model="addMsg.Mobile" maxlength="100"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预订人性别">
<el-select v-model="addMsg.Sex" placeholder="请选择">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
</el-col> -->
<el-col :span="6">
<el-form-item label="供应商" prop="DisplaySupplierId">
<el-select
v-model="addMsg.DisplaySupplierId"
placeholder="请输入关键字查询"
filterable allow-create
default-first-option clearable
remote
reserve-keyword
:remote-method="getSupplier"
:loading="SPloading"
@change="(val)=>{handleChange(val,3)}">
<el-option v-for="item in SupplierList" :key="item.ID" :label="item.Name" :value="item.ID">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="供应商联系人" prop="Contact">
<el-input type="text" v-model="addMsg.Contact"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="供应商联系电话" prop="Tel">
<el-input type="tel" v-model="addMsg.Tel"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="供应商(公司名称)">
<el-input type="text" v-model="addMsg.CompanyName"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="供应商(公司电话)">
<el-input type="tel" v-model="addMsg.CompanyPhone"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="营业执照号">
<el-input type="text" v-model="addMsg.DutyParagraph"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="开户行">
<el-input type="text" v-model="addMsg.OpeningBank"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="开户账号">
<el-input type="text" v-model="addMsg.BankNo"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="成本" prop="Meet">
<el-input type="number" v-model="addMsg.Meet"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="应收总金额" prop="TotalPrice">
<el-input type="number" v-model="addMsg.TotalPrice"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="订单备注">
<el-input type="textarea" v-model="addMsg.Remark" placeholder="订单备注"></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-tab-pane>
<el-tab-pane label="旅客信息" name="contact">
<div class="tab-content hidden">
<div class="contact-header">
<el-button type="primary" size="small" @click="AddContract()">添加旅客</el-button>
</div>
<div class="contact-list" v-if="addMsg.GuestList&&addMsg.GuestList.length>0">
<el-form-item v-for="(item,index) in addMsg.GuestList" :key="index" label-width="0px">
<div class="contact-item" :key="`contact-${index}`">
<el-row :gutter="16" style="flex: 1;">
<el-col :span="4" prop="Money">
<el-form-item
:label="addMsg.GuestList.length>0?`${$t('admin.mane')} ${index+1} `:` ` "
:prop="`GuestList.${index}.Name`"
:rules="rules.Name2"
class="cruiseShipInfo"
label-width="70px">
<el-input placeholder="请输入旅客名称" v-model="item.Name" clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item>
<el-input placeholder="请输入身份证号" v-model="item.IdCard" clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item>
<el-input placeholder="请输入护照号" v-model="item.PassportNo" clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item>
<el-date-picker
v-model="item.PassportIssued"
type="date"
placeholder="护照签发日期" clearable>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item>
<el-date-picker
v-model="item.PassportExpiry"
type="date"
placeholder="护照有效期" clearable>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item
:label="addMsg.GuestList.length>0?`${$t('admin.admin_Birthday')} ${index+1} `:` ` "
:prop="`GuestList.${index}.Birthday`"
:rules="rules.Birthday"
class="cruiseShipInfo"
label-width="70px">
<el-date-picker
v-model="item.Birthday"
type="date"
placeholder="请选择生日" clearable>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item
:label="addMsg.GuestList.length>0?`${$t('hotel.table_tel')} ${index+1} `:` ` "
:prop="`GuestList.${index}.Tel`"
:rules="rules.Tel2"
class="cruiseShipInfo"
label-width="70px">
<el-input :placeholder="$t('visaT.qsrphone')" v-model="item.Tel" clearable>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-button style="margin-top: 8px; margin-left: 10px;" type="danger" size="mini"
@click="deleteContract(index)">删除</el-button>
</div>
</el-form-item>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="设置" name="internal">
<div class="tab-content">
<el-row :gutter="16">
<el-col :span="4">
<el-form-item label="尾款提醒" label-width="70px">
<el-input type="number" v-model="addMsg.FinalPriceTips" placeholder="天数"></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-tab-pane>
</el-tabs>
</div>
</el-form>
</div>
<el-dialog custom-class="resourceImgAdd" :title="$t('ground.xuanzetupian')" center :visible.sync="addimg">
<DMCchooseImg @closeImg="closeDMCchooseImg" ref="DMCchooseImg1" @headCallBack="getDMCimg" v-bind:imgType="1">
</DMCchooseImg>
</el-dialog>
<div class="btn-list">
<div class="btn-actions">
<button class="save-Btn" @click="submitForm('addMsg')" :disabled="isSaving">
<i v-if="isSaving" class="el-icon-loading" style="margin-right: 4px;"></i>
{{ isSaving ? '' : $t('pub.saveBtn') }}
</button>
<button class="cancel-Btn" @click="goUrl('HotelManagement')">
{{ isDrawerMode ? '关闭' : $t('pub.cancelBtn') }}
</button>
</div>
</div>
<viewer :images="images" :options='imageOptions' @inited="inited" class="viewer" ref="viewer">
<img v-for="src in images" :src="src" :key="src">
</viewer>
</div>
</template>
<script>
import DMCchooseImg from "../../commonPage/DMCchooseImg.vue";
import { listManagerMixin } from "../../common/mixins/listManagerMixin.js";
export default {
mixins: [listManagerMixin],
props: {
itemId: {
type: [String, Number],
default: 0
},
details: {
type: Object,
default: () => {}
},
isDrawerMode: {
type: Boolean,
default: false
}
},
data() {
return {
activeTab: 'basic', // 默认激活基础资料标签页
isLoading: false, // 加载状态
loadError: null, // 加载错误信息
isSaving: false, // 保存状态
isRetrying: false, // 重试状态
imageOptions: {
navbar: false,
title: false
},
images: [],
//是否显示添加图片
addimg: false,
//上传的文件数组
HotelImageArray: [],
//删除的图片文件数组
DeleteImageArray: [],
//地接资源图片
imglistArry: [],
//地接图片搜索关键字
imgKeyword: "",
starslevel: "", //获取酒店星级
totalimg: "",
selecnum: 0,
imgBeforeFile: this.domainManager().ViittoFileUrl,
//下拉框默认值
SelectDefaultValue: 0,
//国家列表
CountryList: [],
//省份列表
ProvinceList: [],
//城市列表
CityList: [],
addMsg: {
OrderId: 0,// 订单号
TotalPrice: null,// 应收总金额
Meet: null,// 成本
Remark: '',// 订单备注
DisplayCouponsId: null,// 签证id
VisaId: null,// 签证id
Name: '',// 签证名称
PeopleNum:"",//签证人数
// DisplayTicketId: null,
//UseDate: '',// 出游时间
// Name: '',// 预订人
// EName: '',// 预订人(英文名)
// Sex: null,// 性别,1-男2女
// Mobile: '',// 联系手机号
DisplaySupplierId: null,
SupplierId: null,// 供应商id
SupplierName: '',// 供应商
Tel: '',// 供应商联系电话
Contact: '',// 供应商联系人
CompanyName: '',// 供应商(公司名称)
DutyParagraph: '',// 营业执照号
CompanyPhone: '',// 电话
OpeningBank: '',// 开户行
BankNo: '',// 开户账号
AppointOPList: [],// op 格式:([1,2,3])
GuestList: [],// 旅客名单
FinalPriceTips: '',// 尾款提醒设置
},
GuestObj: {
Birthday: '',// 生日
Name: '',// 名称
IdCard: '',// 身份证号
PassportNo: '',// 护照号
PassportIssued: '',// 护照签发日期
PassportExpiry: '',// 护照有效期
Tel: '',// 联系电话
},
uploadType: "", //上传文件类型
baseList: [], //澡盆,婴儿床,连通房
vatList: [], //VAT配置
starList: [], //星级
bjfsList: [], //报价方式
configDetailsList: [], //酒店
rules: {
VisaId: [{
required: true,
message: '请选择或输入签证名称',
trigger: "change"
}],
DisplaySupplierId: [{
required: true,
message: '请选择或输入供应商',
trigger: "change"
}],
Contact: [{
required: true,
message: '请输入供应商联系人',
trigger: "blur"
}],
Tel: [{
required: true,
message: '请输入供应商联系电话',
trigger: "blur"
}],
Meet: [{
required: true,
message: '请输入成本',
trigger: "blur"
}],
TotalPrice: [{
required: true,
message: '请输入应收总金额',
trigger: "blur"
}],
PeopleNum: [{
required: true,
message: '请输入人数',
trigger: "blur"
}],
// Name: [{
// required: true,
// message: '请输入预订人名称',
// trigger: "blur"
// }],
// EName: [{
// required: true,
// message: '请输入预订人名称(英文名)',
// trigger: "blur"
// }],
Name2: [{
required: true,
message: '请输入旅客名称',
trigger: "blur"
}],
Birthday: [{
required: true,
message: '请选择生日',
trigger: "change"
}],
Tel2: [{
required: true,
message: '请输入旅客名称',
trigger: "blur"
}],
},
CruiseShipList: [],//邮轮
CSloading: false,
RoomTypeList: [],//房型
RTloading: false,
SupplierList: [],//供应商
SPloading: false,
employeeMsg: { // 员工
GroupId: '',
BranchId: -1,
DepartmentId: 0,
PostId: 0,
IsLeave: 0,
},
};
},
components: {
DMCchooseImg: DMCchooseImg
},
methods: {
async getCruiseShip(query){
if (query !== '') {
this.CSloading = true
await this.apipost(
"dmc_get_visa_GetVisaProductDropDownList",
{
Name: query,
},
response => {
this.CSloading = false
if (response.data.resultCode == 1) {
this.CruiseShipList = response.data.data
} else {
this.Error(response.data.message)
}
},
error => {
this.CSloading = false
}
)
}else{
this.CruiseShipList = []
}
},
async getRoomType(query){
if (query !== '') {
this.RTloading = true
await this.apipost(
"ticketcouponsticket_get_GetList",
{
TicketName: query,
CouponsId: this.addMsg.CouponsId,
},
response => {
this.RTloading = false
if (response.data.resultCode == 1) {
this.RoomTypeList = response.data.data
} else {
this.Error(response.data.message)
}
},
error => {
this.RTloading = false
}
)
}else{
this.RoomTypeList = []
}
},
async getSupplier(query){
if (query !== '') {
this.SPloading = true
await this.apipost(
"supplier_post_GetAllList",
{
Type: 3,
Name: query,
},
response => {
this.SPloading = false
if (response.data.resultCode == 1) {
this.SupplierList = response.data.data
} else {
this.Error(response.data.message)
}
},
error => {
this.SPloading = false
}
)
}else{
this.RoomTypeList = []
this.addMsg.SupplierName = query
}
},
handleChange(val,type) {
let findIndex = -1
if(type==1){
findIndex = this.CruiseShipList.findIndex(item => item.Id === val)
console.log("findIndex",findIndex);
if(findIndex != -1) {
this.addMsg.Name = this.CruiseShipList[findIndex].Name;
this.addMsg.VisaId = val
}else{
this.addMsg.Name = val
this.addMsg.VisaId = 0
}
console.log(this.addMsg.VisaId,"this.addMsg.Name",this.addMsg.Name);
}else if(type==2){
findIndex = this.RoomTypeList.findIndex(item => item.Id === val)
if(findIndex != -1) {
this.addMsg.TicketName = this.RoomTypeList[findIndex].TicketName;
this.addMsg.TicketId = val
}else{
this.addMsg.TicketName = val
this.addMsg.TicketId = 0
}
}else if(type==3){
findIndex = this.SupplierList.findIndex(item => item.ID === val)
if(findIndex != -1) {
this.addMsg.SupplierName = this.SupplierList[findIndex].Name;
this.addMsg.SupplierId = val;
this.addMsg.CompanyName = this.SupplierList[findIndex].CompanyName;
this.addMsg.Contact = this.SupplierList[findIndex].Contact;
this.addMsg.Tel = this.SupplierList[findIndex].Tel;
this.addMsg.DutyParagraph = this.SupplierList[findIndex].DutyParagraph;
this.addMsg.CompanyPhone = this.SupplierList[findIndex].CompanyPhone;
this.addMsg.OpeningBank = this.SupplierList[findIndex].OpeningBank;
this.addMsg.BankNo = this.SupplierList[findIndex].BankNo;
}else{
this.addMsg.SupplierName = val
this.addMsg.SupplierId = 0
this.addMsg.CompanyName = null
this.addMsg.Contact = null
this.addMsg.Tel = null
this.addMsg.DutyParagraph = null
this.addMsg.CompanyPhone = null
this.addMsg.OpeningBank = null
this.addMsg.BankNo = null
}
}
// console.log(val);
},
//上传酒店图片
UploadImage(file) {
let newArr = [];
newArr.push(file.file);
let fileName = file.file.name;
var path = "/Upload/DMC/";
var that = this;
this.UploadSelfFileT(path, newArr, x => {
var sourceFileName = x.data.SourceFileName;
var imgUrl = that.domainManager().ViittoFileUrl + x.data.FilePath;
that.addMsg.HotelDetailsList.forEach(item => {
//行程或注意事项
if (that.uploadType == "TripNotice" && item.HSType == 1) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//星等证明
else if (that.uploadType == 'XDZM' && item.HSType == 3) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//加床照片
else if (that.uploadType == 'JCZP' && item.HSType == 6) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//房價图片
else if (that.uploadType == 'PriceUrl' && item.HSType == 11) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//FOC規定
else if (that.uploadType == 'FOCDesc' && item.HSType == 12) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//附加費
else if (that.uploadType == 'FuJiaDesc' && item.HSType == 13) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//取消規定
else if (that.uploadType == 'CancelDesc' && item.HSType == 14) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//小童備註
else if (that.uploadType == 'ChildDesc' && item.HSType == 15) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
//合約資訊
else if (that.uploadType == 'ContractDesc' && item.HSType == 17) {
item.ContentList[0].Name = sourceFileName;
item.ContentList[0].Url = imgUrl;
}
})
});
},
//添加Drive
AddDrive() {
if (this.addMsg.HotelDetailsList && this.addMsg.HotelDetailsList.length > 0) {
var tempObj = this.addMsg.HotelDetailsList.find(qitem => qitem.HSType == 4);
if (!tempObj) {
var contractObj = {
HSType: 4,
TextType: 2,
ContentList: [],
}
this.addMsg.HotelDetailsList.push(contractObj)
}
this.addMsg.HotelDetailsList.forEach(item => {
if (item.HSType == 4) {
if (!item.ContentList) {
item.ContentList = [];
}
var cObj = {
Name: "", //名称
Url: "", //地址
};
item.ContentList.push(cObj);
}
})
}
},
//删除Drive
DeleteDrive(index) {
if (this.addMsg.HotelDetailsList && this.addMsg.HotelDetailsList.length > 0) {
this.addMsg.HotelDetailsList.forEach(item => {
if (item.HSType == 4) {
item.ContentList.splice(index, 1);
}
})
}
},
//添加联系人
AddContract() {
this.addMsg.GuestList.push(JSON.parse(JSON.stringify(this.GuestObj)));
},
//删除联系人
deleteContract(index) {
this.addMsg.GuestList.splice(index, 1);
},
//删除图片
delImg(index) {
var item = this.HotelImageArray[index];
this.DeleteImageArray.push(item);
this.HotelImageArray.splice(index, 1);
},
inited(viewer) {
this.$viewer = viewer
},
showImg: function (src) {
let srcArr = src.split('?')
src = srcArr[0]
let isExsit = false
this.images.forEach(x => {
if (x === src)
isExsit = true
})
if (!isExsit) {
this.images.push(src)
} else {
this.$viewer.view(this.images.indexOf(src))
}
this.$viewer.show()
},
addImgOpen() {
this.addimg = true;
this.initimgList();
},
saveResource() {
// 防重复提交
if (this.isSaving) {
return;
}
this.isSaving = true;
this.apipost(
"dmc_get_visa_SetVisaOrder",
this.addMsg,
response => {
this.isSaving = false;
//修改添加接口
if (response.data.resultCode == 1) {
this.Success(this.$t('tips.saveYes'))
if (this.isDrawerMode) {
this.$emit('save-success')
} else {
this.goUrl("HotelManagement")
}
} else {
this.Error(response.data.message)
}
},
error => {
this.isSaving = false;
this.Error('保存失败,请检查网络连接');
}
)
},
selectImg(index) {
//选取弹窗图片
this.imglistArry[index].isShow = !this.imglistArry[index].isShow;
let num = 0;
if (this.imglistArry != null) {
this.imglistArry.forEach(x => {
if (x.isShow == true) {
num++;
}
this.selecnum = num;
});
}
},
initDataDetails() {
// 验证酒店ID
if (!this.addMsg.OrderId || this.addMsg.OrderId <= 0) {
this.loadError = '无效的邮轮ID';
return;
}
// 设置加载状态
this.isLoading = true;
this.loadError = null;
var msg = {
hotelID: this.addMsg.OrderId
};
var _self = this;
this.apipost(
"hotel_post_GetAll",
msg,
res => {
_self.isLoading = false;
_self.isRetrying = false;
if (res.data.resultCode == 1) {
_self.addMsg = res.data.data;
if (_self.addMsg.Province > 0) {
this.GetSubAreaList(_self.addMsg.Province, 'city');
}
} else {
_self.loadError = res.data.message || '加载酒店信息失败';
_self.Error(res.data.message);
}
},
error => {
_self.isLoading = false;
_self.isRetrying = false;
_self.loadError = '网络请求失败,请检查网络连接';
_self.Error('网络请求失败,请检查网络连接');
}
);
},
// 重试加载方法
retryLoad() {
this.isRetrying = true;
this.initDataDetails();
},
goUrl(path) {
if (this.isDrawerMode) {
this.$emit('close')
} else {
this.$router.push({
path: path,
query: {
cache: true
}
})
}
},
validate(){
let msg = ''
if(msg==''&&(!this.addMsg.VisaId||this.addMsg.VisaId==''
||!this.addMsg.Meet||this.addMsg.Meet==''
||!this.addMsg.TotalPrice||this.addMsg.TotalPrice=='')){
msg = '基础资料请填入必填项'
this.activeTab = 'basic'
}else if(this.addMsg.GuestList.length>0){
for(let i=0;i<this.addMsg.GuestList.length;i++){
let item = this.addMsg.GuestList[i]
if(msg==''&&(!item.Name||item.Name==''
||!item.Birthday||item.Birthday==''
||!item.Tel||item.Tel=='')){
msg = '旅客信息请填入必填项'
this.activeTab = 'contact'
}
}
}
return msg
},
submitForm(addMsg) {
//提交创建、修改表单
let msg = this.validate()
if(msg!='') return this.Error(msg)
let that = this;
that.$refs[addMsg].validate(valid => {
if (valid) {
that.saveResource();
} else {
return false;
}
});
},
//选中的数组
checkImgList() {
if (this.imglistArry != null) {
this.imglistArry.forEach(x => {
if (x.isShow == true) {
var obj = this.$DMCUtils.DMCImageObj();
obj.Path = "/U" + this.$commonUtils.getCaption(x.Path, "Upload");
obj.ShowPath = x.Path;
obj.PicID = x.ID;
this.HotelImageArray.push(obj);
}
x.isShow = false;
this.selecnum = 0;
});
}
this.addimg = false;
},
closeDMCchooseImg() {
this.addimg = false;
},
getDMCimg(imgArr) {
imgArr.forEach(imgItem => {
var obj = this.$DMCUtils.DMCImageObj();
obj.ID = 0;
obj.Path = this.$commonUtils.removeDomain(imgItem.Path);
obj.PicID = imgItem.ID;
obj.ShowPath = imgItem.Path + "?x-oss-process=image/resize,l_140";
this.HotelImageArray.push(obj);
});
},
//获取国家
GetCounrty() {
var that = this;
this.apipost(
"dict_post_Destination_GetCountry", {},
res => {
var tempCountryArray = res.data.data;
if (tempCountryArray && tempCountryArray.length > 0) {
that.GetSubAreaList(tempCountryArray[0].ID, 'province')
}
}
);
},
//获取省份和城市
GetSubAreaList(ID, typeStr) {
let msg = {
Id: ID
};
this.apipost(
"dict_post_Destination_GetChildList",
msg,
res => {
if (typeStr == 'province') {
this.ProvinceList = res.data.data;
} else if (typeStr == 'city') {
this.CityList = res.data.data;
}
},
err => {}
);
},
//获取酒店配置
getHotelConfig() {
this.apipost(
"hotel_post_GetNewHotelConfig", {},
res => {
if (res.data.resultCode == 1) {
var tempData = res.data.data;
if (tempData && tempData.length > 0) {
tempData.forEach(item => {
if (item.DicKey == 'Hotel_ZLY') {
this.baseList = item.SubList
} else if (item.DicKey == "Hotel_VAT") {
this.vatList = item.SubList;
} else if (item.DicKey == "Hotel_Star") {
this.starList = item.SubList;
} else if (item.DicKey == "Hotel_BJFS") {
this.bjfsList = item.SubList;
} else if (item.DicKey == "Hotel_Info") {
this.configDetailsList = item.SubList;
if (this.addMsg.OrderId == 0) {
this.addMsg.HotelDetailsList = item.SubList;
}
}
})
}
}
});
}
},
created() {
// this.GetCounrty();
// this.getHotelConfig();
},
mounted() {
// 从 props 或 route 获取 ID
if (this.details) {
this.addMsg.OrderId = this.details.OrderId
}
},
watch: {
details: {
deep: true,
immediate: true,
handler(newVal) {
if (newVal && newVal.id >0) {
let s = newVal.supplierModel
this.CruiseShipList.push({
Id: newVal.visaId,
Name: newVal.name,
})
this.SupplierList.push({
ID: s.supplierId,
Name: s.supplierName,
})
setTimeout(() => {
var guestList=[];
if(newVal.guestList!=null&&newVal.guestList.length>0){
newVal.guestList.forEach(item => {
guestList.push({
Birthday: item.birthday,// 生日
Name: item.userName,// 名称
IdCard: item.idCard,// 身份证号
PassportNo: item.passportNo,// 护照号
PassportIssued: item.passportIssued,// 护照签发日期
PassportExpiry: item.passportExpiry,// 护照有效期
Tel: item.tel,// 联系电话
});
});
}
var appointOPList=[];
if(newVal.appointOPList!=null&&newVal.appointOPList.length>0){
newVal.appointOPList.forEach(item => {
appointOPList.push(item.opId);
});
}
this.addMsg = {
OrderId: newVal.id,// 订单号
TotalPrice: newVal.totalPrice,// 应收总金额
Meet: newVal.meet,// 成本
Remark: newVal.remark,// 订单备注
VisaId: newVal.visaId,// 邮轮id
Name: newVal.name,// 邮轮名称
PeopleNum:newVal.peopleNum,
DisplaySupplierId: s.supplierId,
SupplierId: s.supplierId,// 供应商id
SupplierName: s.supplierName,// 供应商
Tel: s.tel,// 供应商联系电话
Contact: s.contact,// 供应商联系人
CompanyName: s.companyName,// 供应商(公司名称)
DutyParagraph: s.dutyParagraph,// 营业执照号
CompanyPhone: s.companyPhone,// 电话
OpeningBank: s.openingBank,// 开户行
BankNo: s.bankNo,// 开户账号
AppointOPList: appointOPList,// op 格式:([1,2,3])
GuestList:guestList,// newVal.guestList,// 旅客名单
FinalPriceTips: newVal.finalPriceTips,// 尾款提醒设置
};
console.log(this.addMsg,"newVal.guestList",newVal.guestList);
},1000)
}
}
}
}
};
</script>
...@@ -586,7 +586,25 @@ ...@@ -586,7 +586,25 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="OP" prop="opEmName" min-width="100" style="background:#EAEAEA"></el-table-column> <template v-if="userInfo.SimpleEasy===1">
<el-table-column label="OP" min-width="100" style="background:#EAEAEA">
<template slot-scope="scope" >
<template>
<div class="row flex-wrap mb" v-if="scope.row.appointOPList&&scope.row.appointOPList.length>0">
<div class="row wrap orderNo fz12 ml">
<span class="cursor-pointer radius5 mr px5 bgf5 c3FC4FF" style="margin: 3px;"
v-for="(x, i) in scope.row.appointOPList" :key="i+10000">{{ x.opName }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
</template>
<template v-else>
<el-table-column label="OP" prop="opEmName" min-width="100" style="background:#EAEAEA"></el-table-column>
</template>
<el-table-column :label="$t('hotel.hotel_StarDate')" min-width="100" style="background:#EAEAEA"> <el-table-column :label="$t('hotel.hotel_StarDate')" min-width="100" style="background:#EAEAEA">
<template slot-scope="scope"> <template slot-scope="scope">
<template> <template>
...@@ -1037,17 +1055,31 @@ ...@@ -1037,17 +1055,31 @@
<offset :isShow="cdState" :obj="queryObj" @close="cdState=false"></offset> <offset :isShow="cdState" :obj="queryObj" @close="cdState=false"></offset>
<TransferOrder v-if="showTransferOrder" :isShow="showTransferOrder" :obj="queryObj" <TransferOrder v-if="showTransferOrder" :isShow="showTransferOrder" :obj="queryObj"
@success="showTransferOrder=false,$emit('success')" @close="showTransferOrder=false"></TransferOrder> @success="showTransferOrder=false,$emit('success')" @close="showTransferOrder=false"></TransferOrder>
<pinkDrawer ref="addOrders"
:drawer-config="drawerConfig">
<template slot="drawer" slot-scope="{ visible, close }">
<cruiseShipInfo v-if="visible" :isDrawerMode="true"
:details="selectedSpotData"
@close="close" @save-success="handleSaveSuccess"></cruiseShipInfo>
</template>
</pinkDrawer>
</div> </div>
</template> </template>
<script> <script>
import offset from '../../public/offset.vue'; import offset from '../../public/offset.vue';
import TransferOrder from './TransferOrder.vue'; import TransferOrder from './TransferOrder.vue';
import commissionDialog from "../../FinancialModule/TradeCommission/commissionDialog" import commissionDialog from "../../FinancialModule/TradeCommission/commissionDialog"
export default { import pinkDrawer from '../../common/pinkDrawer.vue';
import cruiseShipInfo from './cruiseShipInfo.vue';
import addConfig from "./addConfig.js";
export default {
components: { components: {
offset, offset,
TransferOrder, TransferOrder,
commissionDialog commissionDialog,
pinkDrawer,
cruiseShipInfo,
}, },
props: ["OrderList", "pagesTitle"], props: ["OrderList", "pagesTitle"],
data() { data() {
...@@ -1159,7 +1191,8 @@ ...@@ -1159,7 +1191,8 @@
EditOPVisible: false, EditOPVisible: false,
OPEmpId: 0, OPEmpId: 0,
OPOrderId: 0, OPOrderId: 0,
OPEmpList: [] OPEmpList: [],
selectedSpotData: null,
}; };
}, },
watch: { watch: {
...@@ -1172,7 +1205,17 @@ ...@@ -1172,7 +1205,17 @@
} }
} }
}, },
computed: {
// 抽屉配置
drawerConfig() {
return addConfig.drawerConfig;
},
},
methods: { methods: {
handleSaveSuccess(){
this.$refs.addOrders.handleDrawerClose();
this.$emit('success')
},
//提交 //提交
submitForm(msg) { submitForm(msg) {
//提交创建、修改表单 //提交创建、修改表单
...@@ -1525,6 +1568,12 @@ ...@@ -1525,6 +1568,12 @@
}); });
}, },
getDetail(obj, updateRStatus) { getDetail(obj, updateRStatus) {
console.log('-----')
if(this.userInfo.SimpleEasy==1){
this.selectedSpotData = obj;
this.$refs.addOrders.openDrawer(obj);
return;
}
this.SendStartDate = obj.sendStartDate this.SendStartDate = obj.sendStartDate
this.updateRemarksStatus = updateRStatus; this.updateRemarksStatus = updateRStatus;
this.visaManagementId = obj.visaManagementId this.visaManagementId = obj.visaManagementId
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment