Commit da5fefc8 by pangchong

feat: 机械延误

parent d8047a86
import { http } from 'mocp/utils/http'
export const getAdverseEventsListApi = (data, config) => {
return http({
method: 'POST',
url: '/technical-support/getAdverseEventsList',
data,
config
})
}
......@@ -72,3 +72,12 @@ export const getEngineListApi = (data, config) => {
config
})
}
//获取责任单位列表
export const getRepairUnitApi = (data, config) => {
return http({
method: 'POST',
url: '/terminal/getRepairUnit',
data,
config
})
}
//primary
@mixin global-button-primary-border {
color: $mocp-primary-6;
border: 0.5rpx solid $mocp-primary-6;
}
@mixin global-button-primary-border-active {
color: darken($mocp-primary-6, 10%);
background-color: darken($mocp-primary-1, 5%);
}
@mixin global-button-primary-plain {
color: $mocp-primary-6;
background-color: $mocp-primary-1;
......@@ -18,6 +26,14 @@
border-color: darken($mocp-primary-7, 5%);
}
//success
@mixin global-button-success-border {
color: $mocp-success-6;
border: 0.5rpx solid $mocp-success-6;
}
@mixin global-button-success-border-active {
color: darken($mocp-success-6, 10%);
background-color: darken($mocp-success-1, 5%);
}
@mixin global-button-success-plain {
color: $mocp-success-6;
background-color: $mocp-success-1;
......@@ -37,6 +53,14 @@
border-color: darken($mocp-success-7, 5%);
}
//warning
@mixin global-button-warning-border {
color: $mocp-warning-6;
border: 0.5rpx solid $mocp-warning-6;
}
@mixin global-button-warning-border-active {
color: darken($mocp-warning-6, 10%);
background-color: darken($mocp-warning-1, 5%);
}
@mixin global-button-warning-plain {
color: $mocp-warning-6;
background-color: $mocp-warning-1;
......@@ -56,6 +80,14 @@
border-color: darken($mocp-warning-7, 5%);
}
//danger
@mixin global-button-danger-border {
color: $mocp-danger-6;
border: 0.5rpx solid $mocp-danger-6;
}
@mixin global-button-danger-border-active {
color: darken($mocp-danger-6, 10%);
background-color: darken($mocp-danger-1, 5%);
}
@mixin global-button-danger-plain {
color: $mocp-danger-6;
background-color: $mocp-danger-1;
......@@ -78,6 +110,15 @@
padding: 0 20rpx;
margin: 0;
font-size: 28rpx;
&.primary-border {
@include global-button-primary-border;
&:active {
@include global-button-primary-border-active;
}
&::after {
border: none;
}
}
&.primary-plain {
@include global-button-primary-plain;
&:active {
......@@ -93,6 +134,15 @@
@include global-button-primary-active;
}
}
&.success-border {
@include global-button-success-border;
&:active {
@include global-button-success-border-active;
}
&::after {
border: none;
}
}
&.success-plain {
@include global-button-success-plain;
&:active {
......@@ -108,6 +158,15 @@
@include global-button-success-active;
}
}
&.warning-border {
@include global-button-warning-border;
&:active {
@include global-button-warning-border-active;
}
&::after {
border: none;
}
}
&.warning-plain {
@include global-button-warning-plain;
&:active {
......@@ -123,6 +182,15 @@
@include global-button-warning-active;
}
}
&.danger-border {
@include global-button-danger-border;
&:active {
@include global-button-danger-border-active;
}
&::after {
border: none;
}
}
&.danger-plain {
@include global-button-danger-plain;
&:active {
......
......@@ -50,6 +50,11 @@ const ps = defineProps({
disabled: {
type: Boolean,
default: false
},
//是否有边框
border: {
type: Boolean,
default: false
}
})
const getClass = computed(() => {
......@@ -59,10 +64,11 @@ const getClass = computed(() => {
}
if (ps.plain) {
_class.push(ps.type + '-plain')
} else if (ps.border) {
_class.push(ps.type + '-border')
} else {
_class.push(ps.type)
}
return _class
})
const getSize = computed(() => {
......
......@@ -27,7 +27,7 @@
</template>
<script setup>
import { computed, ref, watch } from 'vue'
import { computed, onMounted, ref, watch } from 'vue'
import Day from 'mocp/utils/dayjs'
const es = defineEmits(['update:modelValue', 'change'])
......@@ -135,6 +135,13 @@ const getPickerClass = computed(() => {
const show = ref(false)
//设置初始值
const defaultValue = ref()
onMounted(() => {
//默认今天
if (ps.defaultToday) {
es('update:modelValue', defaultValue.value)
es('change', defaultValue.value)
}
})
watch(
() => ps.modelValue,
() => {
......@@ -152,11 +159,6 @@ watch(
} else {
defaultValue.value = Day().format(ps.valueFormat)
}
//默认今天
if (ps.defaultToday) {
es('update:modelValue', defaultValue.value)
es('change', defaultValue.value)
}
}
},
{ immediate: true }
......
......@@ -144,7 +144,7 @@ const ps = defineProps({
})
//获取下拉框样式
const getContentStyle = computed(() => {
let pickAlign = 'flex-start'
let pickAlign = 'space-between'
if (ps.pickAlign == 'center') {
pickAlign = 'center'
} else if (ps.pickAlign == 'right') {
......
......@@ -107,10 +107,14 @@ const getCustomStyle = computed(() => {
}
return _style
})
//获取下拉框的内容Columns
//获取单选框的内容Columns
const getColumns = computed(() => {
if (ps.dictkey) {
return cloneDeep(dictData[ps.dictkey])
if (dictData[ps.dictkey]) {
return cloneDeep(dictData[ps.dictkey])
} else {
throw new Error('请输入存在的dictkey值')
}
} else {
if (ps.options && Object.prototype.toString.call(ps.options[0]) == '[object Object]') {
return ps.options
......
......@@ -48,3 +48,9 @@ export const mco_feedBack = [
{ text: '已完成', class: 'mocp-color-success-6', value: 2 },
{ text: '-', class: 'mocp-color-text-4', value: '' }
]
export const aem_auditListSelect = [
{ text: '未提交审核', class: 'mocp-color-text-3', value: '1' },
{ text: '已提交审核', class: 'mocp-color-warning-6', value: '2' },
{ text: '审核通过', class: 'mocp-color-success-6', value: '3' },
{ text: '审核不通过', class: 'mocp-color-danger-6', value: '4' }
]
......@@ -43,7 +43,7 @@ const ps = defineProps({
},
uploadIcon: {
type: String,
default: 'plus'
default: 'camera-fill'
},
mapFieldName: {
type: String,
......
// 建议以文件名首字母作为前缀aem_
export const aem_state = [
{ label: 'OPEN', value: 0 },
{ label: 'CLOSE', value: 2 }
]
export const aem_auditListSelect = [
{ label: '未提交审核', value: '1' },
{ label: '已提交审核', value: '2' },
{ label: '审核通过', value: '3' },
{ label: '审核不通过', value: '4' }
]
export const aem_surveyListSelect = [
{ label: '未反馈', value: 0 },
{ label: '已反馈', value: 1 },
{ label: '不涉及', value: 2 }
]
export const aem_completeListSelect = [
{ label: '未完成', value: 0 },
{ label: '已完成', value: 1 },
{ label: '不涉及', value: 2 }
]
......@@ -8,3 +8,4 @@ export * from './support-application'
export * from './mco'
export * from './fleet'
export * from './electronicBill'
export * from './abnormalEventManage'
import { getRqmDetailsApi } from 'mocp/api/appraisal-record'
import { defineStore } from 'pinia'
const useAbnormalEventManageStore = defineStore('abnormalEventManage', {
state: () => {
return {
searchData: {
state: 0,
terminalCode: '',
repairUnit: '',
aviation: '',
occurrenceTimeStart: null,
occurrenceTimeEnd: null,
delay: undefined,
category: '',
pointsDeductionL: undefined,
pointsDeductionH: undefined,
eventProperty: '',
handledBy: '',
reviewedState: ''
},
details: undefined
}
},
getters: {},
actions: {
async getRqmDetails() {
const res = await getRqmDetailsApi({ id: this.id }, { loading: true })
if (res.code == 200) {
this.details = res.data
} else {
uni.$mocpMessage.error(res.message)
}
},
resetForm() {
this.searchData = {
state: 0,
terminalCode: '',
repairUnit: '',
aviation: '',
occurrenceTimeStart: null,
occurrenceTimeEnd: null,
delay: undefined,
category: '',
pointsDeductionL: undefined,
pointsDeductionH: undefined,
eventProperty: '',
handledBy: '',
reviewedState: ''
}
},
setState(...args) {
this.$patch({ [args[0]]: args[1] })
}
},
// 配置持久化
persist: {
// 调整为兼容多端的API
storage: {
setItem(key, value) {
uni.setStorageSync(key, value)
},
getItem(key) {
return uni.getStorageSync(key)
}
}
}
})
export default useAbnormalEventManageStore
......@@ -6,7 +6,8 @@ import {
getBasicParamsListApi,
getEngineListApi,
getFlightNumApi,
getPlaneModelsRepairApi
getPlaneModelsRepairApi,
getRepairUnitApi
} from 'mocp/api/base'
import { uniqueArray } from 'mocp/utils/tool'
import { defineStore } from 'pinia'
......@@ -21,7 +22,8 @@ const useBaseStore = defineStore('base', {
flightNumList: [], //航班号下拉数据
typeList: [], //机型下拉数据
ATAList: [], //章节下拉数据
engineList: [] //发动机型号列表
engineList: [], //发动机型号列表
repairUnitList: [] //责任单位列表
},
allBasicParams: {} //系统基础参数
}
......@@ -76,7 +78,7 @@ const useBaseStore = defineStore('base', {
},
getATAChecked: (state) => {
return (model) => {
const selectATAList = state.selectList.ATAList.filter(item => item.zstortGc == model)
const selectATAList = state.selectList.ATAList.filter((item) => item.zstortGc == model)
return selectATAList.map((q) => ({
label: q.label,
value: q.label
......@@ -108,7 +110,8 @@ const useBaseStore = defineStore('base', {
this.getFlightNum(),
this.getPlaneModelsRepair(),
this.getATA(),
this.getEngineList()
this.getEngineList(),
this.getRepairUnit()
])
} finally {
uni.hideLoading()
......@@ -177,6 +180,12 @@ const useBaseStore = defineStore('base', {
if (res.code == 200) {
this.selectList.engineList = res.data
}
},
async getRepairUnit() {
const res = await getRepairUnitApi({})
if (res.code == 200) {
this.selectList.repairUnitList = res.data
}
}
},
// 配置持久化
......
......@@ -3,25 +3,32 @@ import { ref } from 'vue'
//默认default最多显示15个,id唯一标识
const menuList = ref([
// 生产保障
{ id: 'xxtb', name: '信息通报', icon: 'xxtb', group: '生产保障', default: true, count: 0, url: '/panel/inforDisclosure/search' },
{ id: 'hbbz', name: '航班保障', icon: 'hbbz', group: '生产保障', default: true, count: 0, url: '/panel/flight-support/list' },
{ id: 'AOG', name: 'AOG任务', icon: 'AOG', group: '生产保障', default: true, count: 0, url: '/panel/aog/search' },
{ id: 'wdgj', name: '我的跟机', icon: 'wdgj', group: '生产保障', default: true, count: 0, url: '/panel/supported-task/list' },
{ id: 'sfd', name: '收费单', icon: 'sfd', group: '生产保障', default: true, count: 0, url: '/panel/electronicBill/list' },
// 维修控制
{ id: 'bzcsj', name: '不正常事件', icon: 'bzcsj', group: '维修控制', default: false, count: 0 },
{ id: 'yxdc', name: '运行调查', icon: 'yxdc', group: '维修控制', default: false, count: 0 },
{ id: 'yxjc', name: '运行决策', icon: 'yxjc', group: '维修控制', default: false, count: 0, url: '/panel/move-decision/list' },
{ id: 'bzgz', name: '布置工作', icon: 'bzgz', group: '维修控制', default: false, count: 0, url: '/panel/assign-work/search' },
{ id: 'jxyw', name: '机械延误', icon: 'jxyw', group: '维修控制', default: false, count: 0, url: '/panel/abnormalEventManage/list' },
{ id: 'ffh', name: '防风害', icon: 'ffh', group: '维修控制', default: false, count: 0 },
// 技术支援
{ id: 'jdzt', name: '机队状态', icon: 'jdzt', group: '技术支援', default: true, count: 0, url: '/panel/fleet/search' },
{ id: 'zysq', name: '支援申请', icon: 'zysq', group: '技术支援', default: false, count: 0, url: '/panel/support-application/search' },
{ id: 'gzzl', name: '工作指令', icon: 'gzzl', group: '技术支援', default: false, count: 0, url: '/panel/work-assignment/search' },
{ id: 'jspg', name: '技术评估', icon: 'jspg', group: '技术支援', default: false, count: 0, url: '/panel/technology-evaluation/list' },
{ id: 'wjll', name: '文件浏览', icon: 'wjll', group: '技术支援', default: false, count: 0, url: '/panel/fileList/index' },
// { id: 'jsfx', name: '技术分析', icon: 'jsfx', group: '技术支援', default: false, count: 0 },
{ id: 'jsfx', name: '技术分析', icon: 'jsfx', group: '技术支援', default: false, count: 0 },
{ id: 'MCO', name: 'MCO', icon: 'MCO', group: '技术支援', default: true, count: 0, url: '/panel/mco/search' },
// { id: 'pzfx', name: '品质分析', icon: 'pzfx', group: '运行品质', default: false, count: 0 },
{ id: 'wjll', name: '文件浏览', icon: 'wjll', group: '技术支援', default: false, count: 0, url: '/panel/fileList/index' },
// 运行品质
{ id: 'pzfx', name: '品质分析', icon: 'pzfx', group: '运行品质', default: false, count: 0 },
{ id: 'khjl', name: '考核记录', icon: 'khjl', group: '运行品质', default: false, count: 0, url: '/panel/appraisal-record/list' },
// { id: 'gcfx', name: '工程分析', icon: 'gcfx', group: '运行品质', default: false, count: 0 },
{ id: 'gcfx', name: '工程分析', icon: 'gcfx', group: '运行品质', default: false, count: 0 },
// 航站管理
{ id: 'hzgl', name: '航站管理', icon: 'hzgl', group: '航站管理', default: false, count: 0 },
{ id: 'xydw', name: '协议单位', icon: 'xydw', group: '航站管理', default: false, count: 0 }
])
......
......@@ -84,14 +84,12 @@ export const previewFile = (fileUrl) => {
export const validateParameters = (...params) => {
// 检查参数数组中是否至少有一个非空(非undefined、非null、非空字符串)的值
const anyFilled = params.some((param) => param !== undefined && param !== null && param !== '')
// 如果至少有一个参数被填写,那么检查是否所有的参数都被填写
if (anyFilled) {
// 使用every方法检查所有参数是否都被填写
const allFilled = params.every((param) => param !== undefined && param !== null && param !== '')
return allFilled
}
// 如果没有任何参数被填写,那么也是有效的
return true
}
......@@ -518,6 +518,18 @@
"style": {
"navigationBarTitleText": "文件浏览"
}
},
{
"path": "pages/modules/mocp/panel/abnormalEventManage/list",
"style": {
"navigationBarTitleText": "机械延误"
}
},
{
"path": "pages/modules/mocp/panel/abnormalEventManage/search",
"style": {
"navigationBarTitleText": "筛选"
}
}
],
"globalStyle": {
......
.details {
background: #fff;
padding: 24rpx;
&-header {
&-left {
display: flex;
align-items: center;
.txt {
margin-left: 16rpx;
}
}
&-right {
margin-top: 16rpx;
}
}
&-body {
&-box {
padding-bottom: 16rpx;
border-bottom: 2rpx solid #f4f4f4;
}
&-field {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
align-items: center;
margin-top: 16rpx;
}
&-item {
margin-top: 16rpx;
.title {
font-size: 34rpx;
color: $mocp-text-5;
margin-bottom: 16rpx;
}
.content {
color: $mocp-text-4;
line-height: 42rpx;
font-size: 30rpx;
}
}
}
}
.time-list {
background: #fff;
margin-top: 16rpx;
padding: 16rpx 24rpx 0 24rpx;
overflow: hidden;
.time-item {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
margin-bottom: 16rpx;
}
}
import {
aem_surveyListSelect as surveyListSelect,
aem_completeListSelect as completeListSelect,
aem_auditListSelect as auditListSelect
} from 'mocp/hooks/use-dict/dict-data'
export const rowClassName = (rowData) => {
let color = ''
if (
rowData.survey !== '' &&
getValueBySelect(surveyListSelect, rowData.survey) !== '已反馈' &&
getValueBySelect(surveyListSelect, rowData.survey) !== '不涉及' &&
rowData.surveyTimeLimit !== null &&
rowData.surveyTimeLimit !== 0
) {
color = getRecordData(rowData.surveyTimeLimit, 1)
}
if (
rowData.correctiveComplete !== '' &&
getValueBySelect(completeListSelect, rowData.correctiveComplete) !== '已完成' &&
getValueBySelect(completeListSelect, rowData.correctiveComplete) !== '不涉及' &&
rowData.correctiveTimeLimit !== null &&
rowData.correctiveTimeLimit !== 0
) {
if (color == '') {
color = getRecordData(rowData.correctiveTimeLimit, 3)
} else if (color == 'warning-class') {
color = getRecordData(rowData.correctiveTimeLimit, 3) == 'wrong-class' ? getRecordData(rowData.correctiveTimeLimit, 3) : color
}
}
if (getValueBySelect(auditListSelect, rowData.reviewedState) == '审核通过') {
color = 'cancel-class'
}
return color
}
export const getValueBySelect = (selectList, val) => {
if (val == '' || val == undefined) {
return
} else {
const findSelectObj = selectList.find((item) => item.value == val)
return findSelectObj?.label
}
}
export const getRecordData = (data, index) => {
let colorValue = ''
if (data == null) {
colorValue = ''
} else if (data < new Date().getTime()) {
colorValue = 'wrong-class'
} else if (new Date().getTime() >= workDayAhead(data, index)) {
colorValue = 'warning-class'
}
return colorValue
}
export function workDayAhead(tarTime, dayDiffer) {
let tsNow = new Date(tarTime)
tsNow.setHours(0, 0, 0, 0)
tsNow = tsNow.getTime()
while (dayDiffer > 0) {
tsNow -= dayTS
const weekDay = new Date(tsNow).getDay()
if (!holidaySet.includes(tsNow) && !weekHoliday.includes(weekDay)) {
dayDiffer--
}
}
return tsNow
}
<template>
<global-page
title="机械延误"
isDataList
refresherEnabled
loadingMoreEnabled
auto
ref="paging"
:params="searchData"
showNavRight
navRightType="icon"
navRightIcon="saixuan-01"
@handleRightClick="handleRightClick"
:api="getAdverseEventsListApi"
:padding="24"
>
<template #default="{ item }">
<view class="item" :class="rowClassName(item)" @tap="goDetails(item)">
<view class="item-title">
<view class="left">
<custom-state :value="useGetDictByValue('aem_state', item.state)"></custom-state>
</view>
<view class="right">
<text class="txt u-line-1" v-if="item.terminal">{{ item.terminal }}</text>
<text class="txt u-line-1" v-if="item.aviation">
{{ useGetDictByValue('', item.aviation, { data: baseStore.getAirlineSelect }) }}
</text>
</view>
</view>
<view class="item-content u-line-3">
{{ item.eventDescription || '无' }}
</view>
<view class="item-footer">
<view class="label">
<global-icon icon="calendar"></global-icon>
<text class="txt">
{{ timeStampFormat(item.occurrenceTime, { format: 'YYYY/MM/DD' }) }}
</text>
</view>
<view class="label">
审核状态:
<global-text-status :value="item.reviewedState" dictkey="aem_auditListSelect"></global-text-status>
</view>
</view>
</view>
</template>
</global-page>
</template>
<script setup>
import { ref } from 'vue'
import { timeStampFormat } from 'mocp/utils/tool'
import { useGetDictByValue } from 'mocp/hooks/use-dict/useDict'
import { storeToRefs } from 'pinia'
import { onUnload } from '@dcloudio/uni-app'
import useAbnormalEventManageStore from 'mocp/store/abnormalEventManage'
import { getAdverseEventsListApi } from 'mocp/api/abnormalEventManage'
import useBaseStore from 'mocp/store/base'
import { rowClassName } from './constants/list.functionals'
const baseStore = useBaseStore()
//跳转
const abnormalEventManageStore = useAbnormalEventManageStore()
const { searchData } = storeToRefs(abnormalEventManageStore)
const goDetails = (data) => {
uni.$mocpJump.navigateTo('/panel/abnormalEventManage/details', { id: data.id })
}
//筛选
const handleRightClick = () => {
uni.$mocpJump.navigateTo('/panel/abnormalEventManage/search')
}
//刷新
const paging = ref()
uni.$on('abnormalEventManageReload', () => {
paging.value?.reload()
})
onUnload(() => {
uni.$off('abnormalEventManageReload')
})
</script>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
.warning-class {
background: linear-gradient(138.51deg, #ffede3 6.14%, #ffffff 125.66%);
}
.wrong-class {
background: linear-gradient(138.51deg, #ffe1e1 6.14%, #ffffff 125.66%);
}
.cancel-class {
background: #fff;
opacity: 0.5;
}
</style>
<template>
<global-page title="筛选">
<view class="search-form">
<up-form labelPosition="left" labelWidth="auto">
<up-form-item label="状态" prop="state" :borderBottom="true">
<global-picker v-model="formData.state" pickAlign="right" clearable dictkey="aem_state"></global-picker>
</up-form-item>
<up-form-item label="航站" prop="terminalCode" :borderBottom="true">
<global-picker
pickAlign="right"
v-model="formData.terminalCode"
clearable
:options="baseStore.getTerminalSelect"
filter
></global-picker>
</up-form-item>
<up-form-item label="责任单位" prop="repairUnit" :borderBottom="true">
<global-picker v-model="formData.repairUnit" pickAlign="right" :options="repairUnitList" clearable filter></global-picker>
</up-form-item>
<up-form-item label="航司" prop="aviation" :borderBottom="true">
<global-picker
v-model="formData.aviation"
pickAlign="right"
:options="baseStore.getAirlineSelect"
clearable
filter
></global-picker>
</up-form-item>
<up-form-item label="接报日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.occurrenceTimeStart"
v-model:endTime="formData.occurrenceTimeEnd"
clearable
></global-calendar>
</up-form-item>
<up-form-item label="是否延误" prop="delay" :borderBottom="true">
<global-picker
v-model="formData.delay"
pickAlign="right"
:options="[
{ label: '是', value: '1' },
{ label: '否', value: '0' }
]"
clearable
></global-picker>
</up-form-item>
<up-form-item label="类别" prop="category" :borderBottom="true">
<global-picker
v-model="formData.category"
pickAlign="right"
:options="getParamsByType('EventCategory')"
clearable
></global-picker>
</up-form-item>
<up-form-item label="扣分范围" :borderBottom="true">
<view style="display: flex; align-items: center">
<up-input type="number" v-model="formData.pointsDeductionL" placeholder="请输入" clearable></up-input>
<text style="margin: 0 20rpx">-</text>
<up-input type="number" v-model="formData.pointsDeductionH" placeholder="请输入" clearable></up-input>
</view>
</up-form-item>
<up-form-item label="事件性质" prop="eventProperty" :borderBottom="true">
<global-picker
v-model="formData.eventProperty"
pickAlign="right"
:options="getParamsByType('EventProperty')"
clearable
></global-picker>
</up-form-item>
<up-form-item label="处理人" prop="handledBy" :borderBottom="true">
<up-input v-model="formData.handledBy" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="审核状态" prop="reviewedState" :borderBottom="true">
<global-picker v-model="formData.reviewedState" pickAlign="right" clearable dictkey="aem_auditListSelect"></global-picker>
</up-form-item>
</up-form>
</view>
<template #bottom>
<view class="footer-btn">
<up-row gutter="10">
<up-col span="6">
<global-button type="primary" plain size="large" :radius="5" @tap="handleReset">重置</global-button>
</up-col>
<up-col span="6"><global-button type="primary" size="large" :radius="5" @tap="handleConfirm">确定</global-button></up-col>
</up-row>
</view>
</template>
</global-page>
</template>
<script setup>
import useBaseStore from 'mocp/store/base'
import { storeToRefs } from 'pinia'
import { cloneDeep } from 'lodash'
import { ref } from 'vue'
import useAbnormalEventManageStore from 'mocp/store/abnormalEventManage'
import { getParamsByType } from 'mocp/hooks/use-params/useParams'
//获取下拉框选项
const baseStore = useBaseStore()
const {
selectList: { repairUnitList }
} = useBaseStore()
const abnormalEventManageStore = useAbnormalEventManageStore()
//获取查询表单数据
const { searchData } = storeToRefs(abnormalEventManageStore)
const formData = ref(cloneDeep(searchData.value))
const handleReset = () => {
abnormalEventManageStore.resetForm()
uni.$mocpJump.navigateBack()
uni.$emit('abnormalEventManageReload')
}
const handleConfirm = () => {
abnormalEventManageStore.setState('searchData', formData.value)
uni.$mocpJump.navigateBack()
uni.$emit('abnormalEventManageReload')
}
</script>
<style lang="scss" scoped>
.search-form {
padding: 24rpx 24rpx 0 24rpx;
background: #fff;
}
.footer-btn {
padding: 24rpx 32rpx;
background-color: #fff;
}
</style>
......@@ -50,15 +50,20 @@
</view>
<view class="mocp-title">除冰、防冰记录</view>
<view class="mocp-form">
<up-form-item label="定点除冰" prop="fixedPointDeicing" :borderBottom="true">
<global-switch v-model="formData.fixedPointDeicing" switchAlign="right"></global-switch>
</up-form-item>
<up-form-item label="原机位除冰" prop="originalAircraftPositionDeicing" :borderBottom="true">
<global-switch v-model="formData.originalAircraftPositionDeicing" switchAlign="right"></global-switch>
</up-form-item>
<up-form-item label="是否包含预除冰" prop="expectDeicing" :borderBottom="true">
<global-switch v-model="formData.expectDeicing" switchAlign="right"></global-switch>
</up-form-item>
<view class="mocp-switchs">
<view class="mocp-switch">
<view class="mocp-switch-label">定点除冰</view>
<global-switch v-model="formData.fixedPointDeicing"></global-switch>
</view>
<view class="mocp-switch">
<view class="mocp-switch-label">原机位除冰</view>
<global-switch v-model="formData.originalAircraftPositionDeicing"></global-switch>
</view>
<view class="mocp-switch">
<view class="mocp-switch-label">是否包含预除冰</view>
<global-switch v-model="formData.expectDeicing"></global-switch>
</view>
</view>
</view>
<!-- 除冰记录 -->
<view class="mocp-title">除冰记录</view>
......@@ -156,6 +161,9 @@
</view>
</view>
</view>
<view class="mocp-button">
<global-button type="primary" :radius="0" border @tap="submitDeicing">提交</global-button>
</view>
<up-form-item label="用量合计" prop="deicingQuantityTotal" :borderBottom="true">
<up-input
type="number"
......@@ -300,6 +308,9 @@
</view>
</view>
</view>
<view class="mocp-button">
<global-button type="primary" :radius="0" border @tap="submitAntiicing">提交</global-button>
</view>
<up-form-item label="用量合计" prop="antiicingQuantityTotal" :borderBottom="true">
<up-input
type="number"
......@@ -344,10 +355,24 @@
</view>
</up-form>
</global-page>
<up-modal :show="show" title="警告" @confirm="confirmRemark">
<!-- 除冰超量警告 -->
<up-modal :show="showDeicing" title="超量使用" @confirm="confirmDeicing" closeOnClickOverlay @close="showDeicing = false">
<view class="warn-modal">
<view class="warn-title">请填写超量使用原因</view>
<up-input v-model="formData.deicingRemark" border="bottom" placeholder="请输入" clearable></up-input>
<view class="warn-upload">
<global-upload-image v-model="formData.deicingFile" map-field-name="id" :width="165" :height="165"></global-upload-image>
</view>
</view>
</up-modal>
<!-- 防冰超量警告 -->
<up-modal :show="showAntiicing" title="超量使用" @confirm="confirmAntiicing" closeOnClickOverlay @close="showAntiicing = false">
<view class="warn-modal">
<view class="warn-title">请填写超量使用原因</view>
<up-input v-model="formData.remark" border="bottom" placeholder="请输入" clearable></up-input>
<up-input v-model="formData.antiicingRemark" border="bottom" placeholder="请输入" clearable></up-input>
<view class="warn-upload">
<global-upload-image v-model="formData.antiicingFile" map-field-name="id" :width="165" :height="165"></global-upload-image>
</view>
</view>
</up-modal>
</template>
......@@ -355,10 +380,18 @@
<script setup>
import useBaseStore from 'mocp/store/base'
import useElectronicBillStore from 'mocp/store/electronicBill'
import { formData, rules, formRef, show } from './constants/add.compositions'
import { formData, rules, formRef, showDeicing, showAntiicing, deicingFlag, antiicingFlag } from './constants/add.compositions'
import { navigateTo } from 'mocp/utils/jump'
import { changeAcreg, getOneTotal, handleFooterClick, confirmRemark } from './constants/add.functionals'
import { watchEffect } from 'vue'
import {
changeAcreg,
getOneTotal,
handleFooterClick,
confirmDeicing,
confirmAntiicing,
submitDeicing,
submitAntiicing
} from './constants/add.functionals'
import { watch, watchEffect } from 'vue'
const baseStore = useBaseStore()
const electronicBillStore = useElectronicBillStore()
......@@ -377,12 +410,12 @@ watchEffect(() => {
if (formData.deicingMix == 'Other') {
if (formData.deicingMix1 && formData.deicingMix2) {
const percent = parseFloat(formData.deicingMix1) / (parseFloat(formData.deicingMix1) + parseFloat(formData.deicingMix2))
formData.deicingQuantityTotal = parseFloat(deicingQuantityTotal * percent.toFixed(4)) || undefined
formData.deicingQuantityTotal = parseFloat((deicingQuantityTotal * percent).toFixed(4)) || undefined
}
} else {
const percentArr = formData.deicingMix.split(':')
const percent = parseFloat(percentArr[0]) / (parseFloat(percentArr[0]) + parseFloat(percentArr[1]))
formData.deicingQuantityTotal = parseFloat(deicingQuantityTotal * percent.toFixed(4)) || undefined
formData.deicingQuantityTotal = parseFloat((deicingQuantityTotal * percent).toFixed(4)) || undefined
}
} else {
formData.deicingQuantityTotal = undefined
......@@ -397,17 +430,23 @@ watchEffect(() => {
if (formData.antiicingMix == 'Other') {
if (formData.antiicingMix1 && formData.antiicingMix2) {
const percent = parseFloat(formData.antiicingMix1) / (parseFloat(formData.antiicingMix1) + parseFloat(formData.antiicingMix2))
formData.antiicingQuantityTotal = parseFloat(antiicingQuantityTotal * percent.toFixed(4)) || undefined
formData.antiicingQuantityTotal = parseFloat((antiicingQuantityTotal * percent).toFixed(4)) || undefined
}
} else {
const percentArr = formData.antiicingMix.split(':')
const percent = parseFloat(percentArr[0]) / (parseFloat(percentArr[0]) + parseFloat(percentArr[1]))
formData.antiicingQuantityTotal = parseFloat(antiicingQuantityTotal * percent.toFixed(4)) || undefined
formData.antiicingQuantityTotal = parseFloat((antiicingQuantityTotal * percent).toFixed(4)) || undefined
}
} else {
formData.antiicingQuantityTotal = undefined
}
})
watch([() => formData.deicingQuantityTotal, () => formData.weatherToday, () => formData.modelType], () => {
deicingFlag.value = false
})
watch([() => formData.antiicingQuantityTotal, () => formData.weatherToday, () => formData.modelType], () => {
antiicingFlag.value = false
})
</script>
<style lang="scss" scoped>
@import 'mocpStatic/css/table.scss';
......@@ -434,5 +473,25 @@ watchEffect(() => {
color: #969799;
font-size: 28rpx;
}
.warn-upload {
margin-top: 24rpx;
}
}
.mocp-switchs {
display: flex;
.mocp-switch {
padding: 24rpx 0;
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
&-label {
margin-bottom: 24rpx;
color: $mocp-text-5;
}
}
}
.mocp-button {
padding-top: 24rpx;
}
</style>
......@@ -66,7 +66,11 @@ export const formData = reactive({
guaranteeUnit: '',
weatherToday: '',
modelType: '',
remark: ''
remark: '',
deicingFile: '',
deicingRemark: '',
antiicingFile: '',
antiicingRemark: ''
})
export const rules = reactive({
......@@ -136,4 +140,9 @@ export const rules = reactive({
]
})
export const formRef = ref()
export const show = ref(false)
//除冰弹框
export const deicingFlag = ref(false)
export const showDeicing = ref(false)
//防冰弹框
export const antiicingFlag = ref(false)
export const showAntiicing = ref(false)
import { getAirlineAcregApi } from 'mocp/api/electronicBill'
import { formData, formRef, show } from './add.compositions'
import { antiicingFlag, deicingFlag, formData, formRef, showAntiicing, showDeicing } from './add.compositions'
import { validateParameters } from 'mocp/utils/tool'
import { showToast } from 'mocp/utils/message'
......@@ -21,9 +21,13 @@ export const changeAcreg = async (acreg) => {
uni.$mocpMessage.error(res.message)
}
}
export const handleFooterClick = async () => {
await formRef.value?.validate()
export const deicingValidate = () => {
if (!formData.modelType) {
return uni.$mocpMessage.warning('请选择机型类别')
}
if (!formData.weatherToday) {
return uni.$mocpMessage.warning('请选择当日天气')
}
//验证除冰混合比(Other)
if (formData.deicingMix == 'Other' && (!formData.deicingMix1 || !formData.deicingMix2)) {
return uni.$mocpMessage.warning('请填写除冰自定义混合比')
......@@ -41,6 +45,14 @@ export const handleFooterClick = async () => {
if (!validateParameters(formData.deicingCartNo4, formData.deicingPersion4, formData.deicingQuantity4, formData.deicingUnit4)) {
return uni.$mocpMessage.warning('请完整填写第4条除冰记录')
}
}
export const antiicingValidate = () => {
if (!formData.modelType) {
return uni.$mocpMessage.warning('请选择机型类别')
}
if (!formData.weatherToday) {
return uni.$mocpMessage.warning('请选择当日天气')
}
//验证防冰混合比(Other)
if (formData.antiicingMix == 'Other' && (!formData.antiicingMix1 || !formData.antiicingMix2)) {
return uni.$mocpMessage.warning('请填写防冰自定义混合比')
......@@ -58,24 +70,19 @@ export const handleFooterClick = async () => {
if (!validateParameters(formData.antiicingCartNo4, formData.antiicingPersion4, formData.antiicingQuantity4, formData.antiicingUnit4)) {
return uni.$mocpMessage.warning('请完整填写第4条防冰记录')
}
//验证总用量
const limit = getLimit()
let flag = false
if (formData.deicingQuantityTotal && formData.deicingQuantityTotal > 0) {
if (formData.deicingQuantityTotal < limit[0] || formData.deicingQuantityTotal > limit[1]) {
flag = true
}
}
if (formData.antiicingQuantityTotal && formData.antiicingQuantityTotal > 0) {
if (formData.antiicingQuantityTotal < limit[0] || formData.antiicingQuantityTotal > limit[1]) {
flag = true
}
}
export const handleFooterClick = async () => {
await formRef.value?.validate()
deicingValidate()
antiicingValidate()
//是否点击提交验证除冰/防冰用量
if (!deicingFlag.value && formData.deicingMix) {
return uni.$mocpMessage.warning('请提交除冰记录')
}
if (flag) {
show.value = true
} else {
uni.$mocpJump.navigateTo('/panel/electronicBill/deicing/sign')
if (!antiicingFlag.value && formData.antiicingMix) {
return uni.$mocpMessage.warning('请提交防冰记录')
}
uni.$mocpJump.navigateTo('/panel/electronicBill/deicing/sign')
}
/**
* 对应天气类别 霜/雾 小雪 中雪/冻雾 大雪/结冰
......@@ -121,12 +128,43 @@ export const getOneTotal = (a, b) => {
}
return (a || 0) * unit
}
export const confirmRemark = () => {
if (!formData.remark) {
showToast('请填写超量使用原因')
} else {
show.value = false
uni.$mocpJump.navigateTo('/panel/electronicBill/deicing/sign')
export const submitDeicing = () => {
deicingValidate()
const limit = getLimit()
if (formData.deicingQuantityTotal && formData.deicingQuantityTotal > 0) {
if (formData.deicingQuantityTotal > limit[1]) {
showDeicing.value = true
}
}
}
export const confirmDeicing = () => {
if (!formData.deicingRemark) {
return showToast('请填写超量使用原因')
}
if (!formData.deicingFile) {
return showToast('至少上传一张图片')
}
showToast('提交成功')
deicingFlag.value = true
showDeicing.value = false
}
export const submitAntiicing = () => {
antiicingValidate()
const limit = getLimit()
if (formData.antiicingQuantityTotal && formData.antiicingQuantityTotal > 0) {
if (formData.antiicingQuantityTotal > limit[1]) {
showAntiicing.value = true
}
}
}
export const confirmAntiicing = () => {
if (!formData.antiicingRemark) {
return showToast('请填写超量使用原因')
}
if (!formData.antiicingFile) {
return showToast('至少上传一张图片')
}
showToast('提交成功')
antiicingFlag.value = true
showAntiicing.value = false
}
import { upload } from 'mocp/utils/http'
import { canvasImage } from './sign.compositions'
import { formData } from './add.compositions'
import { antiicingFlag, deicingFlag, formData, showAntiicing, showDeicing } from './add.compositions'
import { addDeicingApi } from 'mocp/api/electronicBill'
export const handleSubmit = async () => {
......@@ -104,8 +104,16 @@ export const addDeicing = async () => {
guaranteeUnit: '',
weatherToday: '',
modelType: '',
remark: ''
remark: '',
deicingFile: '',
deicingRemark: '',
antiicingFile: '',
antiicingRemark: ''
})
showDeicing.value = false
showAntiicing.value = false
deicingFlag.value = false
antiicingFlag.value = false
uni.$mocpMessage.success(res.message)
} else {
uni.$mocpMessage.error(res.message)
......
......@@ -76,4 +76,6 @@ const handleQuery = ({ res }) => {
myToDoStore.setState('appraisalRecordNum', parseInt(res.total) || 0)
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
</style>
......@@ -88,4 +88,6 @@ const handleQuery = ({ res }) => {
myToDoStore.setState('assignWorkNum', parseInt(res.data.total) || 0)
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
</style>
......@@ -85,4 +85,6 @@ const handleQuery = ({ res }) => {
myToDoStore.setState('moveDecisionNum', parseInt(res.data.total) || 0)
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
</style>
......@@ -90,4 +90,6 @@ const handleQuery = ({ res }) => {
myToDoStore.setState('technologyEvaluationNum', parseInt(res.data.total) || 0)
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
</style>
......@@ -47,7 +47,6 @@ const confirm = () => {
}
</script>
<style lang="scss">
@import 'mocpStatic/css/list.scss';
.item {
margin-bottom: 0;
}
......
......@@ -71,13 +71,6 @@
align-items: center;
justify-content: space-between;
margin-top: 16rpx;
.label {
display: flex;
align-items: center;
.txt {
margin-left: 16rpx;
}
}
.left {
color: $mocp-primary-6;
display: flex;
......@@ -92,5 +85,13 @@
}
}
}
.label {
display: flex;
align-items: center;
color: $mocp-text-4;
.txt {
margin-left: 16rpx;
}
}
}
}
src/static/mocp/image/panel/ffh.png

8.74 KB | W: | H:

src/static/mocp/image/panel/ffh.png

8.74 KB | W: | H:

src/static/mocp/image/panel/ffh.png
src/static/mocp/image/panel/ffh.png
src/static/mocp/image/panel/ffh.png
src/static/mocp/image/panel/ffh.png
  • 2-up
  • Swipe
  • Onion skin
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