aircraft-pilot/aircraft/server/order/add.vue

383 lines
12 KiB
Vue

<template>
<view class="order-add">
<Topnav :topLevel="1" :title="`${form.orderId?'编辑':'新增'}订单`" defaultBackColor="#333333"
defaultNavTextColor="#333333" showBack :fixed="false" />
<view class="order-form">
<view class="order-field">
<u-form ref="uForm" :model="form" label-position="top"
:label-style="{fontFamily: 'PingFang SC, PingFang SC',
fontWeight: 'bold',fontSize: '32rpx',color: '#000000'}">
<u-form-item v-if="form.orderId" label="订单号:" :border-bottom="false">
<u-input disabled class="field-ninput" placeholder="订单号" v-model="form.orderNo" />
</u-form-item>
<u-form-item label="订单类型:" :border-bottom="false">
<u-input style="opacity: 0.8;" class="field-input" placeholder="请选择订单类型" v-model="form.orderTypeName" type="select" disabled/>
</u-form-item>
<u-form-item v-if="form.orderId" label="订单发起人:" :border-bottom="false">
<u-input disabled class="field-ninput" placeholder="订单发起人" v-model="form.orderInitiator" />
</u-form-item>
<u-form-item prop="customerName" required label="客户名称:" :border-bottom="false">
<u-input class="field-input" placeholder="请选择客户" v-model="form.customerName"
type="select" @click="handleSelectScenOrCus('客户')"/>
</u-form-item>
<u-form-item prop="phone" required label="手机号码:" :border-bottom="false">
<u-input class="field-input" placeholder="请选择客户" v-model.number="form.phone"
type="select" @click="handleSelectScenOrCus('客户')" />
</u-form-item>
<u-form-item prop="attractionName" label="景区:" required :border-bottom="false">
<u-input class="field-input" placeholder="请选择景区" v-model="form.attractionName"
@click="handleSelectScenOrCus('景区')" type="select"/>
</u-form-item>
<u-form-item prop="routeIds" label="路线:" required :border-bottom="false">
<!-- <u-input class="field-input" placeholder="请选择路线" v-model="form.routeIds"
type="select"/> -->
<w-select class="field-w-select" v-model="form.routeIds" multiple
:list="routes" valueName="value" keyName="key" @change="changeRoute"
placeholder="请选择路线" width="100%" bgColor="#f8f9fb">
</w-select>
</u-form-item>
<u-form-item prop="cargoWeight" required label="货物重量:" :border-bottom="false">
<u-input class="field-ninput" type="number" placeholder="请输入货物重量(最多保留两位小数)" v-model.number="form.cargoWeight" />
<view slot="right" class="field-input-right">KG</view>
</u-form-item>
<u-form-item prop="surchargeAmount" required label="附加费:" :border-bottom="false">
<u-input type="number" class="field-ninput" placeholder="请输入附加费(最多保留两位小数)" v-model.number="form.surchargeAmount" />
<view slot="right" class="field-input-right">元</view>
</u-form-item>
<u-form-item prop="operatorIds" label="操作员:" required :border-bottom="false">
<w-select class="field-w-select" v-model="form.operatorIds" multiple
:list="operators" valueName="content" keyName="id"
placeholder="请选择操作员" width="100%" bgColor="#f8f9fb">
</w-select>
</u-form-item>
<u-form-item v-if="form.orderId" label="下单时间:" :border-bottom="false">
<u-input disabled class="field-ninput" placeholder="下单时间" v-model="form.orderCreateTime" />
</u-form-item>
<u-form-item v-if="form.orderId" label="订单确认人:" :border-bottom="false">
<u-input disabled class="field-ninput" placeholder="订单确认人" v-model="form.orderCreateTime" />
</u-form-item>
<view class="field-btns">
<u-button type="warning" :custom-style="customStyle" style="width: 100%;"
:hair-line="false" @click="saveOrder">保存</u-button>
<u-button style="margin-left: 30rpx;width: 100%;" type="warning" v-if="form.orderId"
:custom-style="customStyle"
:hair-line="false" @click="finishOrder">完成订单</u-button>
</view>
</u-form>
</view>
</view>
<u-picker mode="selector" v-model="showScenOrCus" :range="scenOrCusType==='景区'?scenics:customers"
:default-selector="getDefaultSelector" range-key="name" confirm-color="#f7c04d"
:title="scenOrCusType+'选择'" @confirm="handleConfirmScenOrCus"/>
<u-toast ref="uToast"></u-toast>
</view>
</template>
<script>
import Topnav from '@/components/topnav/index.vue';
import configService from '@/common/config.service.js';
import WSelect from '@/components/w-select/w-select.vue'
export default {
// #ifdef MP
options: {
styleIsolation: 'shared'
},
// #endif
components: { Topnav, WSelect },
data(){
return{
// #ifdef MP
// 微信小程序自定义导航栏参数
CustomBar: this.CustomBar || 0,
// #endif
// 订单类型
form:{
orderId: '',
orderType: 1,
orderTypeName: '载物订单',
customerName: '',
customerId: '',
phone: '',
attractionName: '',
attractionId: '',
surchargeAmount:'',
cargoWeight: '',
operatorIds: [],
routeIds: []
},
// 订单类型
orderTypes:[],
// 校验规则
rules:{
customerName: [{
required: true,
message: '请选择客户',
trigger: ['change','blur']
}],
phone: [{
required: true,
message: '请选择客户',
trigger: ['change','blur']
}],
attractionName: [{
required: true,
message: '请选择景区',
trigger: ['change','blur']
}],
cargoWeight: [{
required: true,
message: '请输入货物重量',
trigger: ['change','blur']
},
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
return this.$u.test.amount(value);
},
message: '货物重量格式不正确',
// 触发器可以同时用blur和change
trigger: ['change','blur'],
}],
surchargeAmount: [{
required: true,
message: '请输入附加费',
trigger: ['change','blur']
},
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
return this.$u.test.amount(value);
},
message: '附加费格式不正确',
// 触发器可以同时用blur和change
trigger: ['change','blur'],
}],
routeIds: [{
require: true,
message: '请至少选择一条路线',
trigger: ['change','blur']
},
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
return value&&value.length>0;
},
message: '请至少选择一条路线',
// 触发器可以同时用blur和change
trigger: ['change','blur'],
}],
operatorIds: [{
require: true,
message: '请至少选择一位操作员',
trigger: ['change','blur']
},
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
return value&&value.length>0;
},
message: '请至少选择一位操作员',
// 触发器可以同时用blur和change
trigger: ['change','blur'],
}],
},
// 执行任务按钮样式
customStyle: {
backgroundColor: '#FEE547',
color: '#333333',
fontSize: '30rpx',
fontWeight: 'bold',
fontFamily: 'Source Han Sans SC',
padding: '20rpx 0',
borderRadius: '12rpx',
border: 'none'
},
// 景区列表
scenics: [],
// 客户列表
customers: [],
// 操作员列表
operators: [],
// 路线列表
routes: [],
// 用户信息
userMessage: this.$store.state.vuex_token === ''?{}:JSON.parse(this.$store.state.user_message),
isPilot: this.$store.state.user_type == 1,
// 景区/客户选择弹窗
showScenOrCus: false,
// 当前景区/客户选择类型
scenOrCusType: '',
}
},
onReady() {
this.$refs.uForm.setRules(this.rules);
},
computed:{
// 获取选择器默认值
getDefaultSelector(){
const isScen = this.scenOrCusType === '景区';
const arr = isScen ? this.scenics : this.customers;
const index = this.form[isScen?'attractionId':'customerId'];
return index?[arr.findIndex(item=>item.id === index)]:[0];
}
},
onLoad(e) {
this.form.orderId = e.id || '';
},
created() {
this.$nextTick(()=>{
this.init();
});
},
methods: {
// 初始化
async init(){
let cusRes = await this.$api.allCustomers();
// let opeRes = await this.$api.all
let selfRes = await this.$api.aSelfDetail(this.userMessage.id);
if(!cusRes){
this.$refs.uToast.show({type: 'error',title: "客户获取失败!"});
}else{
this.customers = cusRes || [];
}
if(!selfRes){
this.$refs.uToast.show({type: 'error',title: "个人信息获取失败!"});
}else{
if(selfRes.areaId){
let scenRes = await this.$api.allScenicsByAreaId({areaId: selfRes.areaId});
this.scenics = scenRes || [];
}
}
},
// 选择路线
changeRoute(e){
},
// 点击打开景区/客户选择弹窗
handleSelectScenOrCus(type){
this.scenOrCusType = type;
this.showScenOrCus = true;
},
// 选择景区
async handleConfirmScenOrCus(index){
if(this.scenOrCusType === '景区'){
const val = this.scenics[index[0]];
this.form.attractionName = val.name;
this.form.attractionId = val.id;
this.form.routeIds = [];
let res = await this.$api.allRoutesByScenicId(val.id);
if(res){
this.routes = res || [];
}else{
this.$refs.uToast.show({type: 'error',title: "景区路线获取失败!"});
}
}else{
const val = this.customers[index[0]];
this.form.customerId = val.id;
this.form.customerName = val.name;
this.form.phone = val.phone;
}
},
// 订单保存
saveOrder(){
this.$refs.uForm.validate(valid => {
if (valid) {
console.log('验证通过');
}
});
},
// 完成订单
async finishOrder(){
let that = this;
uni.showModal({
title: '订单完成',
content: '是否确认完成该订单?',
confirmColor: '#f7c04d',
success: async(res) => {
if (res.confirm) {
let res = await that.$api.completeOrder(that.form.orderId);
that.$refs.uToast.show({type: res?'success':'error',
title: `订单完成操作${res?'成功':'失败'}!`});
}
}
})
},
}
}
</script>
<style scoped lang="scss">
.order-add{
display: flex;
flex-direction: column;
min-height: 100vh;
.order-form{
padding: 30rpx 32rpx 52rpx;
display: flex;
flex-direction: column;
.order-field{
&::v-deep .u-form-item--left__content--required{
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 32rpx;
color: #FE020E;
margin-right: 8rpx !important;
}
&::v-deep .u-input{
padding: 12rpx 32rpx !important;
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 32rpx;
line-height: 40rpx;
background: #F8F9FB;
border-radius: 4rpx;
}
.field-ninput{
&::v-deep .u-input{
padding: 12rpx 80rpx 12rpx 32rpx !important;
}
}
.field-w-select{
&::v-deep .w-select{
.select-wrap{
border: none !important;
min-height: var(--select-wrap-height);
height: inherit;
}
padding: 12rpx 32rpx !important;
background: #F8F9FB;
border-radius: 4rpx;
}
&::v-deep .select-options{
.item-active{
color: #f7c04d !important;
background-color: #f5f5f5 !important;
}
}
&::v-deep .select-content-item-default{
margin-left: 0 !important;
margin-right: 0 !important;
font-size: 28rpx;
line-height: 40rpx;
color: #c0c4cc;
}
}
.field-input-right{
font-family: Source Han Sans SC;
font-weight: bold;
font-size: 32rpx;
color: #333333;
margin-left: -80rpx;
z-index: 1;
}
.field-btns{
width: 100%;
margin-top: auto;
margin-bottom: 30rpx;
padding-top: 30rpx;
display: flex;
align-items: center;
}
}
}
}
</style>