对接订单页剩下接口

This commit is contained in:
Double-_-Z 2025-08-01 18:07:48 +08:00
parent 2768d24990
commit ca37ed420b
5 changed files with 329 additions and 55 deletions

View File

@ -32,6 +32,7 @@
boxShadow: '0rpx 0rpx 12rpx rgba(202,202,182,0.5)',
filter: 'opacity(0.96)'}"></u-back-top>
</view>
<Movable v-if="current === 0" :iconName="ordFileUrl+addIcon" />
</view>
</template>
@ -42,15 +43,19 @@ import Route from '@/aircraft/server/route/route.vue';
import My from '@/aircraft/server/my/my.vue';
import configService from '@/common/config.service.js';
import Topnav from '@/components/topnav/index.vue';
import Movable from '../order/components/movable.vue';
export default {
components: {
Order, Equipment, Route, My, Topnav
Order, Equipment, Route, My, Topnav, Movable
},
data() {
return {
current: uni.getStorageSync('current')||0,//
loading: false,
fileUrl: configService.fileUrl + 'aerocraft/navigation/',//
ordFileUrl: configService.fileUrl + 'aerocraft/order/',//
//
addIcon: 'add.png',
// a
aNavicationList:[
{

View File

@ -3,6 +3,9 @@
<Topnav :topLevel="1" :title="`${form.orderId?'编辑':'新增'}订单`" defaultBackColor="#333333"
defaultNavTextColor="#333333" showBack :fixed="false" />
<view class="order-form">
<view class="order-delete" v-if="canDelete">
<u-icon name="trash" color="#333" size="46" @click="handleDelete"/>
</view>
<view class="order-field">
<u-form ref="uForm" :model="form" label-position="top"
:label-style="{fontFamily: 'PingFang SC, PingFang SC',
@ -53,14 +56,16 @@
<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-form-item v-if="form.orderId" :label="`订单确认人${form.confirmStatus?
(form.confirmStatus===1?'(待确认)':'(已确认)'):''}`" :border-bottom="false">
<u-input disabled class="field-ninput" placeholder="订单确认人" v-model="form.customerName" />
</u-form-item>
<view class="field-btns">
<u-button type="warning" :custom-style="customStyle" style="width: 100%;"
<view class="field-btns" v-if="isPilot&&(!form.confirmStatus||form.confirmStatus===0)
&&(!form.orderId||form.orderInitiatorId==userMessage.id)">
<u-button type="warning" :custom-style="customStyle" style="width: 100%;" v-if="!isDisable"
:hair-line="false" @click="saveOrder" :loading="saveLoading">保存</u-button>
<u-button style="margin-left: 30rpx;width: 100%;" type="warning" v-if="form.orderId"
:custom-style="customStyle"
<u-button :style="{marginLeft: isDisable?'0rpx':'30rpx',width: '100%'}" type="warning"
v-if="form.orderId" :custom-style="customStyle"
:hair-line="false" @click="finishOrder">完成订单</u-button>
</view>
</u-form>
@ -186,6 +191,8 @@ export default {
showScenOrCus: false,
// /
scenOrCusType: '',
//
orderStatus: ['进行中','已完成','已取消'],
}
},
onReady() {
@ -198,6 +205,18 @@ export default {
const arr = isScen ? this.scenics : this.customers;
const index = this.form[isScen?'attractionId':'customerId'];
return index?[arr.findIndex(item=>item.id === index)]:[0];
},
//
canDelete(){
const { orderId, orderInitiatorId, confirmStatus, orderTaskDetailList } = this.form;
return orderId&&this.isPilot&&orderInitiatorId==this.userMessage.id
&&(!confirmStatus||confirmStatus===0)&&(!orderTaskDetailList||orderTaskDetailList.some(
item=>!this.orderStatus.includes(item.orderItemStatus)));
},
//
isDisable(){
const { orderTaskDetailList } = this.form;
return orderTaskDetailList&&orderTaskDetailList.length>0;
}
},
onLoad(e) {
@ -234,27 +253,65 @@ export default {
async getOrderDetail(){
let res = await this.$api.orderDetail(this.form.orderId);
if(res){
const { id, customerName, phone, scenicName, surchargeAmount, cargoWeight, orderNo, orderCreateTime, orderInitiator } = res;
const { id, customerName, phone, scenicName, surchargeAmount, cargoWeight,
orderNo, orderCreateTime, orderInitiator, confirmStatus, orderInitiatorId,
customerId, attractionId, routeIds, operatorIds, orderTaskDetailList } = res;
this.form = {
orderId: id,
orderNo: orderNo,
orderType: 1,
orderTypeName: '载物订单',
customerName: customerName,
customerId: '',//
customerId: customerId,//
phone: phone,
attractionName: scenicName,
attractionId: '',//
attractionId: attractionId,//
surchargeAmount: surchargeAmount,
cargoWeight: cargoWeight,
operatorIds: [],
routeIds: [],
orderInitiator: orderInitiator,
orderCreateTime: orderCreateTime,
confirmStatus: confirmStatus,
orderInitiatorId: orderInitiatorId,
orderTaskDetailList: orderTaskDetailList,
}
let resp = await this.$api.allRoutesByScenicId(attractionId);
if(resp){
this.routes = resp || [];
this.form.routeIds = resp.filter(item=> routeIds.includes(item.key));
this.form.operatorIds = this.operators.filter(item=> operatorIds.includes(item.id));
} else {
this.$refs.uToast.show({type: 'error',title: "景区路线获取失败!"});
}
} else
this.$refs.uToast.show({type: 'error',title: "订单详情获取失败!"});
},
//
handleDelete(){
let that = this;
uni.showModal({
title: '提示',
content: '是否确认删除该订单?',
confirmColor: '#FE020E',
success: async(res) => {
if (res.confirm) {
try {
let res = await that.$api.deleteOrder(that.form.orderId);
if(res === undefined){
that.$refs.uToast.show({type: 'error',title: "订单详删除失败!"});
return;
}
uni.navigateBack({complete() {
that.$u.toast('订单删除成功!');
}})
} catch (error) {
that.$refs.uToast.show({type: 'error',title: "订单详删除失败!"});
}
}
}
})
},
// 线
changeRoute(e){
},
@ -294,14 +351,13 @@ export default {
routeIds:that.form.routeIds.map(item=>item.key),
orderCreateTime:that.$u.timeFormat(new Date().getTime(),'yyyy-mm-dd hh:MM:ss')}
console.log('验证通过',that.form);
let res = await that.$api.addOrder(data);
let res = that.form.orderId ? await that.$api.editOrder(data) : await that.$api.addOrder(data);
that.saveLoading = false;
uni.navigateBack({complete() {
uni.showToast({
icon: 'none',
title: '订单新增成功!'
})
that.$u.toast(`订单${that.form.orderId?'编辑':'新增'}成功!`);
}})
}else{
that.saveLoading = false;
}
});
}catch(e){
@ -312,15 +368,23 @@ export default {
//
async finishOrder(){
let that = this;
if(!this.form.orderTaskDetailList || this.form.orderTaskDetailList.length === 0){
this.$refs.uToast.show({type: 'warning',title: "该订单不存在飞行任务,无法完成!"});
return;
}
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?'成功':'失败'}!`});
try {
let res = await that.$api.completeOrder(that.form.orderId);
that.$refs.uToast.show({type: 'success', title: `订单完成操作成功!`});
that.init();
} catch (error) {
that.$refs.uToast.show({type: 'error', title: `订单完成操作失败!`});
}
}
}
})
@ -334,6 +398,15 @@ export default {
display: flex;
flex-direction: column;
min-height: 100vh;
position: relative;
.order-delete{
position: absolute;
right: 50rpx;
z-index: 1;
&:active{
opacity: 0.7;
}
}
.order-form{
padding: 30rpx 32rpx 52rpx;
display: flex;

View File

@ -109,7 +109,7 @@
新增任务
</view>
</view>
<u-popup v-model="showAddAction" mode="bottom" border-radius="40">
<u-popup v-model="showAddAction" mode="bottom" border-radius="40" @close="closeAddAction">
<view class="action-popup">
<view class="action-top">
<view class="action-close" />
@ -120,14 +120,19 @@
<view class="action-lam" style="margin-top: 72rpx;">
<view class="lam-title">执行设备</view>
<u-input class="lam-input" placeholder-style="font-size:32rpx;color:#B3B3B3;"
custom-style="font-size:32rpx;"
v-model="form.equipmentName" @click="handleClickPick"
placeholder="请选择设备" type="select" :clearable="false" />
custom-style="font-size:32rpx;" placeholder="请选择设备" type="select"
v-model="form.deviceName" @click="handleClickPick('设备')" :clearable="false"/>
</view>
<view class="action-lam">
<view class="lam-title">执行路线</view>
<u-input class="lam-input" placeholder-style="font-size:32rpx;color:#B3B3B3;"
custom-style="font-size:32rpx;" v-model="form.routeName" type="select" :clearable="false"
@click="handleClickPick('路线')" placeholder="请选择路线" />
</view>
<view class="action-lam">
<view class="lam-title">载货重量</view>
<u-input class="lam-input" placeholder-style="font-size:32rpx;color:#B3B3B3;"
custom-style="font-size:32rpx;" v-model.number="form.weight"
custom-style="font-size:32rpx;" v-model.number="form.cargoWeight"
placeholder="请填写重量" type="number" :clearable="false" />
<view class="lam-input-right">KG</view>
</view>
@ -189,13 +194,22 @@
</view>
</view>
</u-popup>
<u-picker mode="selector" v-model="showEquipment" :default-selector="getDefaultSelector" :range="equipments"
range-key="name" confirm-color="#f7c04d" title="执行设备选择" @confirm="handleChangePick"></u-picker>
<u-picker mode="selector" v-model="showPick" :default-selector="getDefaultSelector" :range="pickType==='设备'?equipments:routes"
range-key="value" confirm-color="#f7c04d" :title="`执行${pickType}`" @confirm="handleChangePick"></u-picker>
<u-modal v-model="showChangeState" title="更新状态" show-cancel-button confirm-color="#f7c04d" @confirm="handleChangeState">
<view class="slot-content">
<u-input placeholder="请选择任务状态" v-model="stateForm.taskStatusName"
@click="showChangeStatePick = true" type="select"/>
<u-picker mode="selector" v-model="showChangeStatePick" :default-selector="getDefaultStateSelector" :range="stateList"
range-key="value" confirm-color="#f7c04d" title="飞行任务状态" @confirm="handleClickState"></u-picker>
</view>
</u-modal>
<u-back-top :scrollTop="scrollTop" zIndex="100" :duration="500"
:iconStyle="{ color: '#fff' }" :customStyle="{background: 'linear-gradient(180deg, #f8b500 0%, #fceabb 100%)',
boxShadow: '0rpx 0rpx 12rpx rgba(202,202,182,0.5)',
filter: 'opacity(0.96)'}"></u-back-top>
<u-toast ref="uToast"></u-toast>
<DotLoading :show="dotLoading" />
</view>
</template>
@ -212,8 +226,14 @@ export default {
computed:{
//
getDefaultSelector(){
const index = this.form.equipmentId;
return index?[this.equipments.findIndex(item=>item.id === index)]:[0];
const isDevice = this.pickType === '设备';
const index = isDevice ? this.form.deviceId : this.form.routeId;
const arr = isDevice ? this.equipments : this.routes;
return index?[arr.findIndex(item=>item.key === index)]:[0];
},
//
getDefaultStateSelector(){
return [this.stateList.findIndex(item=>item.key === this.stateForm.taskStatus)]||[0];
}
},
data(){
@ -251,6 +271,12 @@ export default {
borderRadius: '10rpx',
border: '2rpx solid #999999'
},
//
stateForm: {
orderTaskId: '',
taskStatus: 0,
taskStatusName: '未进行'
},
//
fileList: [],
//
@ -281,19 +307,38 @@ export default {
showAddAction: false,
//
equipments:[],
//
showEquipment: false,
//
showPick: false,
//
pickType: '',
//
showChangeState: false,
showChangeStatePick: false,
// form
form:{
equipmentName: '',
equipmentId: '',
weight: '',
photo: ''
orderId: '',
deviceName: '',
deviceId: '',
cargoWeight: '',
attachmentMaterialList: [],
routeId: '',
routeName: ''
},
//
dotLoading: false,
// 线
routes: [],
//
orderDetail: {},
//
current: 0,
//
stateList: [
{ key: 0, value: '未进行' },
{ key: 1, value: '进行中' },
{ key: 2, value: '已完成' },
{ key: 3, value: '已取消' },
],
}
},
onPageScroll(e) {
@ -303,6 +348,7 @@ export default {
this.scrollTop = e.scrollTop;
},
onLoad(e) {
this.form.orderId = e.id;
this.init(e.id);
},
methods:{
@ -312,40 +358,167 @@ export default {
let res = await this.$api.orderDetail(id);
if(res) this.orderDetail = res;
else this.$refs.uToast.show({type: 'error',title: "订单详情获取失败!"});
let resp = await this.$api.allRoutesByScenicId(res.attractionId);
if(resp){
this.routes = resp || [];
} else {
this.$refs.uToast.show({type: 'error',title: "景区路线获取失败!"});
}
let respx = await this.$api.obtainDeviceList({attractionId: res.attractionId});
if(respx){
this.equipments = respx || [];
} else {
this.$refs.uToast.show({type: 'error',title: "景区设备获取失败!"});
}
},
//
closeAddAction(){
this.clearForm();
this.showAddAction = false;
},
//
async getOrderDetail(id){
let res = await this.$api.orderDetail(id);
if(res) this.orderDetail = res;
else this.$refs.uToast.show({type: 'error',title: "订单详情获取失败!"});
},
//
handleClickPick(){
this.showEquipment = true;
handleClickPick(type){
this.pickType = type;
this.showPick = true;
},
//
uploadFile({fileFullPath}){
this.form.photo = fileFullPath;
uploadFile(file){
this.form.attachmentMaterialList = [file];
},
//
removeFile(index){
this.form.photo = "";
this.form.attachmentMaterialList = [];
},
//
handleChangePick(index){
const val = this.equipments[index[0]];
this.form.equipmentId = val?.id || '';
this.form.equipmentName = val?.name || '';
const valueForm = this.pickType==='设备' ?
{ list: this.equipments, id: 'deviceId', name: 'deviceName' } :
{ list: this.routes, id: 'routeId', name: 'routeName' }
const val = valueForm.list[index[0]];
this.form[valueForm.id] = val?.key || '';
this.form[valueForm.name] = val?.value || '';
},
//
handleClickState(index){
const val = this.stateList[index[0]];
this.stateForm.taskStatus = val.key;
this.stateForm.taskStatusName = val.value;
},
//
handleSave(){
if(this.current === 2){
this.showAddAction = false;
this.current = 0;
async handleSave(){
if(this.current!==0){
this.showAddAction = this.current !== 2;
this.current = (this.current+1)%3;
return;
}
this.current += 1;
const data = this.form;
console.log(data);
let warningMessage = '';
if(!data.deviceId){
warningMessage = '请选择执行设备!';
}else if(!data.routeId){
warningMessage = '请选择执行路线!';
}else if(!data.cargoWeight||!/^-?\d*\.?\d+$/.test(data.cargoWeight)){
warningMessage = '载货重量格式错误!';
}else if(data.attachmentMaterialList.length===0){
warningMessage = '请上传货物图片!';
}else{
try {
this.dotLoading = true;
let res = await this.$api.addOrderTask(data);
if(res === undefined){
this.$refs.uToast.show({type: 'error',title: '飞行任务新增失败(新增订单飞行任务: 同一个订单同一个飞行员,只能存在一个任务状态处于[未进行或进行中])'});
return;
}
await this.clearForm();
await this.getOrderDetail(this.form.orderId);
this.dotLoading = false;
this.current += 1;
this.$refs.uToast.show({type: 'success',title: `飞行任务新增成功!`});
} catch (error) {
this.dotLoading = false;
this.$refs.uToast.show({type: 'error',title: '飞行任务新增失败!'});
}
return;
}
this.$refs.uToast.show({type: 'warning',title: warningMessage});
},
//
async handleChangeState(){
try {
const { orderTaskId, taskStatus } = this.stateForm;
let res = await this.$api.editOrderStatus(orderTaskId, taskStatus);
this.showChangeState = false;
if(res === undefined){
this.$refs.uToast.show({type: 'error',title: '飞行任务状态更改失败!'});
return;
}
this.$refs.uToast.show({type: 'success',title: `飞行任务状态更改成功!`});
await this.getOrderDetail(this.form.orderId);
this.stateForm = {
orderTaskId: '',
taskStatus: 0,
taskStatusName: '未进行'
};
} catch (error) {
this.showChangeState = false;
this.$refs.uToast.show({type: 'error',title: '飞行任务状态更改失败!'});
}
},
//
clearForm(){
this.current = 0;
this.fileList = [];
this.form = {
orderId: this.form.orderId,
deviceName: '',
deviceId: '',
cargoWeight: '',
attachmentMaterialList: [],
routeId: '',
routeName: ''
};
},
//
handleDeleteAction(item){
let that = this;
uni.showModal({
title: '提示',
content: '是否确认删除该飞行任务?',
confirmColor: '#FE020E',
success: async(res) => {
if (res.confirm) {
try {
let res = await that.$api.deleteOrderTask(item.id);
console.log(res);
if(res === undefined){
that.$refs.uToast.show({type: 'error',title: "您没有权限删除此订单任务!"});
return;
}
that.getOrderDetail(this.form.orderId);
that.clearForm();
that.$refs.uToast.show({type: 'success',title: "飞行任务删除成功!"});
} catch (error) {
that.$refs.uToast.show({type: 'error',title: "飞行任务删除失败!"});
}
}
}
})
},
//
handleChangeAction(item){
handleChangeAction({id, orderItemStatus}){
this.stateForm = {
orderTaskId: id,
taskStatusName: orderItemStatus,
taskStatus: this.stateList.find(item=>item.value===orderItemStatus).key
};
this.showChangeState = true;
}
}
}
@ -638,4 +811,23 @@ export default {
}
}
}
::v-deep .u-default-hover{
border-color: #F8B500 !important;
background-color: #fdf6ec !important;
color: #f29100 !important;
&:active{
border-color: #F8B500 !important;
background-color: #fdf6ec !important;
color: #f29100 !important;
}
&:focus{
border-color: #F8B500 !important;
background-color: #fdf6ec !important;
color: #f29100 !important;
}
}
.slot-content{
padding: 10rpx 50rpx;
border-radius: 6rpx;
}
</style>

View File

@ -37,28 +37,23 @@
margin-top="250"></u-empty>
</view>
</view>
<Movable :iconName="fileUrl+addIcon" />
<u-toast ref="uToast"></u-toast>
</view>
</template>
<script>
import configService from '@/common/config.service.js';
import Movable from './components/movable.vue';
export default {
// #ifdef MP
options: {
styleIsolation: 'shared'
},
// #endif
components: { Movable },
data(){
return {
fileUrl: configService.fileUrl + 'aerocraft/order/',//
//
banner: 'banner.png',
//
addIcon: 'add.png',
//
girlIcon: 'girl.png',
//
@ -97,6 +92,7 @@ export default {
size: 10,
// loadmoreloadingnomore
isFinish: 'nomore',
mainOrderStatusList: '0,1,3',
},
//
customers: {},
@ -107,7 +103,7 @@ export default {
methods:{
//
async init(){
this.form = {size: 10,current: 1,isFinish: 'nomore'};
this.form = {size: 10,current: 1,isFinish: 'nomore',mainOrderStatusList: '0,1,3'};
//
await this.getOrderList();
//

View File

@ -20,10 +20,18 @@ const install = (Vue, vm) => {
vm.$api.singleScenic = async (id) => await vm.$u.get(`/emScenic/${id}`);// 查询单个景区
// 订单管理
vm.$api.completeOrder = async (orderId) => await vm.$u.get(`/api/order/completeOrder/${orderId}`);// 完成订单
vm.$api.completeOrder = async (orderId) => await vm.$u.put(`/api/order/completeOrder/${orderId}`);// 完成订单
vm.$api.getOrders = async (params = {}) => await vm.$u.get('/api/order/allOrder',params);// 获取订单列表
vm.$api.orderDetail = async (id) => await vm.$u.get(`/api/order/queryOrderDetail/${id}`);// 查询单个订单
vm.$api.addOrder = async (params = {}) => await vm.$u.post(`/api/order/addOrder`,params);// 新增订单
vm.$api.deleteOrder = async (orderId) => await vm.$u.delete(`/api/order/deleteOrder/${orderId}`);// 删除订单
vm.$api.editOrder = async (params = {}) => await vm.$u.put(`/api/order/editOrder`,params);// 修改订单信息
vm.$api.addOrderTask = async (params = {}) => await vm.$u.post(`/api/order/addOrderTask`,params);// 新增飞行任务
vm.$api.deleteOrderTask = async (orderTaskId) => await vm.$u.delete(`/api/order/deleteOrderTask/${orderTaskId}`);// 删除飞行任务
vm.$api.editOrderStatus = async (orderTaskId,taskStatus) => await vm.$u.put(`/api/order/editOrderStatus/${orderTaskId}/${taskStatus}`);// 编辑订单飞行任务状态
// 设备管理
vm.$api.obtainDeviceList = async (params = {}) => await vm.$u.get('/api/dataDropdown/obtainDeviceList',params);// 获取设备下拉列表
// 客户管理
vm.$api.allCustomers = async () => await vm.$u.get('/cnCustomer/all');// 获取全部客户