Commit 9e518af4 by pangchong

feat: 三方收费单修改

parent 7a5a5d30
......@@ -45,6 +45,24 @@ export const addRoutineWorkApi = (data, config) => {
config
})
}
//编辑例行维护工作单
export const updateRoutineWorkApi = (data, config) => {
return post({
method: 'POST',
url: '/workbench/electronicBill/updateRoutineWork',
data,
config
})
}
//校验:日期、机号相同,且有【过夜维护 AF+PF】数据;返回值大于0表示存在相同的
export const routineWorkCheckRepeatApi = (data, config) => {
return http({
method: 'POST',
url: '/workbench/electronicBill/routineWorkCheckRepeat',
data,
config
})
}
//例行维护工作单列表
export const routineWorkListApi = (data, config) => {
return http({
......@@ -63,6 +81,15 @@ export const addNonRoutineWorkApi = (data, config) => {
config
})
}
//修改非例行维护工作单
export const updateNonRoutineWorkApi = (data, config) => {
return post({
method: 'POST',
url: '/workbench/electronicBill/updateNonRoutineWork',
data,
config
})
}
//非例行维护工作单列表
export const noRoutineWorkListApi = (data, config) => {
return http({
......@@ -81,6 +108,15 @@ export const addDeicingApi = (data, config) => {
config
})
}
//修改除防冰工作单
export const updateDeicingApi = (data, config) => {
return post({
method: 'POST',
url: '/workbench/electronicBill/updateDeicing',
data,
config
})
}
//除防冰工作单列表
export const deicingListApi = (data, config) => {
return http({
......
......@@ -16,6 +16,12 @@
background-color: darken($mocp-primary-1, 5%);
border-color: darken($mocp-primary-1, 5%);
}
@mixin global-button-primary-text {
color: $mocp-primary-6;
}
@mixin global-button-primary-text-active {
color: darken($mocp-primary-6, 10%);
}
@mixin global-button-primary {
color: #fff;
background-color: $mocp-primary-6;
......@@ -43,6 +49,12 @@
background-color: darken($mocp-success-1, 5%);
border-color: darken($mocp-success-1, 5%);
}
@mixin global-button-success-text {
color: $mocp-success-6;
}
@mixin global-button-success-text-active {
color: darken($mocp-success-6, 10%);
}
@mixin global-button-success {
color: #fff;
background-color: $mocp-success-6;
......@@ -70,6 +82,12 @@
background-color: darken($mocp-warning-1, 5%);
border-color: darken($mocp-warning-1, 5%);
}
@mixin global-button-warning-text {
color: $mocp-warning-6;
}
@mixin global-button-warning-text-active {
color: darken($mocp-warning-6, 10%);
}
@mixin global-button-warning {
color: #fff;
background-color: $mocp-warning-6;
......@@ -97,6 +115,12 @@
background-color: darken($mocp-danger-1, 5%);
border-color: darken($mocp-danger-1, 5%);
}
@mixin global-button-danger-text {
color: $mocp-danger-6;
}
@mixin global-button-danger-text-active {
color: darken($mocp-danger-6, 10%);
}
@mixin global-button-danger {
color: #fff;
background-color: $mocp-danger-6;
......@@ -128,6 +152,15 @@
border: none;
}
}
&.primary-text {
@include global-button-primary-text;
&:active {
@include global-button-primary-text-active;
}
&::after {
border: none;
}
}
&.primary {
@include global-button-primary;
&:active {
......@@ -152,6 +185,15 @@
border: none;
}
}
&.success-text {
@include global-button-success-text;
&:active {
@include global-button-success-text-active;
}
&::after {
border: none;
}
}
&.success {
@include global-button-success;
&:active {
......@@ -176,6 +218,15 @@
border: none;
}
}
&.warning-text {
@include global-button-warning-text;
&:active {
@include global-button-warning-text-active;
}
&::after {
border: none;
}
}
&.warning {
@include global-button-warning;
&:active {
......@@ -200,6 +251,15 @@
border: none;
}
}
&.danger-text {
@include global-button-danger-text;
&:active {
@include global-button-danger-text-active;
}
&::after {
border: none;
}
}
&.danger {
@include global-button-danger;
&:active {
......
......@@ -38,6 +38,11 @@ const ps = defineProps({
type: String,
default: 'default'
},
//文字
text: {
type: Boolean,
default: false
},
//是否镂空
plain: {
type: Boolean,
......@@ -66,6 +71,8 @@ const getClass = computed(() => {
_class.push(ps.type + '-plain')
} else if (ps.border) {
_class.push(ps.type + '-border')
} else if (ps.text) {
_class.push(ps.type + '-text')
} else {
_class.push(ps.type)
}
......
......@@ -23,10 +23,14 @@
<view style="width: 100%; height: 100%" v-else>
<global-empty></global-empty>
</view>
<template #bottom v-if="multiple">
<view style="margin-top: 20rpx">
<template #bottom>
<view style="margin-top: 20rpx" v-if="multiple">
<global-button type="primary" :radius="5" @tap="confirmMultiple">确定</global-button>
</view>
<view class="customize" style="margin-top: 20rpx" v-if="customize && !getFilterColumns.length">
<text>没有找到筛选内容</text>
<global-button type="text" :radius="5" @tap="confirmCustomize">添加已输入内容</global-button>
</view>
</template>
</global-popup>
<up-picker
......@@ -79,6 +83,11 @@ const ps = defineProps({
type: Boolean,
default: false
},
//是否筛选不到的时候可以自定义内容(只对filter有效)
customize: {
type: Boolean,
default: false
},
style: {
type: Object,
default: () => {
......@@ -291,6 +300,12 @@ const confirmMultiple = () => {
es('update:modelValue', multipleValue.value.join(ps.valueSplit))
es('change', multipleValue.value.join(ps.valueSplit))
}
//确定自定义内容
const confirmCustomize = () => {
show.value = false
es('update:modelValue', searchKey.value)
es('change', searchKey.value)
}
//点击清空按钮
const clear = () => {
labelValue.value = ''
......@@ -376,5 +391,12 @@ watch(
}
}
}
.customize {
display: flex;
justify-content: space-between;
align-items: center;
background: $mocp-fill-1;
padding: 10rpx 20rpx;
}
}
</style>
......@@ -46,3 +46,7 @@ export const eb_modelType = [
{ label: '宽体机', value: '1' },
{ label: '窄体机', value: '2' }
]
export const eb_zk = [
{ label: '窄体', value: '0' },
{ label: '宽体', value: '1' }
]
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { onLoad, onReady } from '@dcloudio/uni-app'
export const useDrawSignature = (canvasId) => {
export const useDrawSignature = (canvasId, config = {}) => {
let ctx = null
let isButtonDown = false
let points = []
......@@ -15,6 +15,37 @@ export const useDrawSignature = (canvasId) => {
ctx.lineJoin = 'round'
})
onReady(() => {
if (config.path) {
const query = uni.createSelectorQuery()
query
.select('#' + canvasId)
.fields({ size: true }, (data) => {
if (data) {
uni.getImageInfo({
src: config.path,
success: (res) => {
const { width, height } = res
// 计算缩放比例
const scale = Math.min(data.width / width, data.height / height)
// 计算绘制的宽高
const drawWidth = width * scale
const drawHeight = height * scale
// 绘制图片
ctx.drawImage(res.path, 0, 0, drawWidth, drawHeight)
ctx.draw(true)
isSigned.value = true
},
fail: (err) => {
console.log(err)
}
})
}
})
.exec()
}
})
// 触摸开始,获取到起点
const touchStart = (e) => {
let startPoint = { X: e.changedTouches[0].x, Y: e.changedTouches[0].y }
......@@ -79,7 +110,6 @@ export const useDrawSignature = (canvasId) => {
})
})
}
return {
isSigned,
touchStart,
......
import useUserStore from 'mocp/store/user'
// const baseURL = 'https://hna-platform.anyremote.cn' //测试
const baseURL = 'https://hna-platform.anyremote.cn' //测试
// const baseURL = 'https://moc.hnatechnic.com/api' //生产
// const baseURL = 'http://10.123.48.67/api' //Amms内网
const baseURL = 'https://hnaelbtest.hnatechnic.com/mocptest/api' //内网
// const baseURL = 'https://hnaelbtest.hnatechnic.com/mocptest/api' //内网
class ServiceLoading {
open(loading) {
......
......@@ -135,3 +135,26 @@ export const validateParameters = (...params) => {
// 如果没有任何参数被填写,那么也是有效的
return true
}
/**
* 判断是否是base64图片
* @param {*} url
*/
export const isBase64Image = (url) => {
// 正则表达式匹配 Base64 图片的格式
const base64ImageRegex =
/^data:image\/(png|jpg|jpeg|gif|bmp|webp|svg+xml|tiff);base64,([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$/
// 检查是否符合 Base64 图片的格式
if (!base64ImageRegex.test(url)) {
return false
}
// 提取 Base64 部分并尝试解码验证
const base64Data = url.split(',')[1]
try {
atob(base64Data) // 尝试解码
return true
} catch (e) {
return false
}
}
......@@ -2,8 +2,8 @@ import { ref, reactive } from 'vue'
export const loginFormRef = ref()
//表单数据
export const loginForm = reactive({
username: '', //devzj3
password: '', //Ifar_9527008 / Ifar2016_0525
username: 'devzj3', //devzj3
password: 'Ifar2016_0525', //Ifar_9527008 / Ifar2016_0525
verifyCode: ''
})
export const showLoad = ref(false)
......
......@@ -76,13 +76,13 @@ const handleLogin = async () => {
loading.value = true
await login()
if (userStore.token) {
//加入席位权限
await getUserSeatList()
if (userStore.seatId) {
await Promise.all([getSeatPermission(), getConfigData()])
} else {
userStore.setState('seatPermission', [])
}
// //加入席位权限
// await getUserSeatList()
// if (userStore.seatId) {
// await Promise.all([getSeatPermission(), getConfigData()])
// } else {
// userStore.setState('seatPermission', [])
// }
//跳转工作台
uni.$mocpJump.redirectTo('/tab/index')
}
......
......@@ -35,8 +35,8 @@
showCancelButton
closeOnClickOverlay
@confirm="updateAogConstruction"
@cancel="show = false"
@close="show = false"
@cancel="showConfirm = false"
@close="showConfirm = false"
></up-modal>
</global-page>
</template>
......
<template>
<global-page
title="新建除防冰收费单"
:showNavRight="true"
:title="formData.id > 0 ? '编辑除防冰收费单' : '新建除防冰收费单'"
:showNavRight="formData.id > 0 ? false : true"
navRightText="今天签单"
@handleRightClick="navigateTo('/panel/electronicBill/deicing/list')"
showFooterBtn
......@@ -18,10 +18,25 @@
<global-date pickAlign="right" clearable v-model="formData.date" defaultToday></global-date>
</up-form-item>
<up-form-item label="机号" prop="acreg" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.acreg" :options="allAc" clearable filter @change="changeAcreg"></global-picker>
<global-picker
pickAlign="right"
v-model="formData.acreg"
:options="allAc"
clearable
filter
customize
@change="changeAcreg"
></global-picker>
</up-form-item>
<up-form-item label="飞机所属单位" prop="aircaraftoperator" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.aircaraftoperator" :options="allAirline" clearable filter></global-picker>
<global-picker
pickAlign="right"
v-model="formData.aircaraftoperator"
:options="allAirline"
clearable
filter
customize
></global-picker>
</up-form-item>
<up-form-item label="保障单位" prop="guaranteeUnit" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.guaranteeUnit" dictkey="eb_guaranteeUnit" clearable></global-picker>
......@@ -30,7 +45,7 @@
<global-picker pickAlign="right" v-model="formData.weatherToday" dictkey="eb_weatherToday" clearable></global-picker>
</up-form-item>
<up-form-item label="机型" prop="model" :borderBottom="true" required>
<global-picker v-model="formData.model" pickAlign="right" :options="allAcType" clearable filter></global-picker>
<global-picker v-model="formData.model" pickAlign="right" :options="allAcType" clearable filter customize></global-picker>
</up-form-item>
<up-form-item label="机型类别" prop="modelType" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.modelType" dictkey="eb_modelType" clearable></global-picker>
......@@ -470,8 +485,9 @@ import {
getDeicingFile,
getAntiicingFile
} from './constants/add.functionals'
import { watch, watchEffect } from 'vue'
import { onUnmounted, watch, watchEffect } from 'vue'
import { getTerminalSelect } from 'mocp/utils/permission'
import { resetData } from './constants/sign.functionals'
const electronicBillStore = useElectronicBillStore()
const {
......@@ -541,6 +557,9 @@ watchEffect(() => {
}
}
})
onUnmounted(() => {
resetData()
})
</script>
<style lang="scss" scoped>
:deep(.u-fade-zoom-enter-active) {
......
......@@ -52,15 +52,15 @@ export const formData = reactive({
deicingUnit2: '',
deicingUnit3: '',
deicingUnit4: '',
expectDeicing: 0,
fixedPointDeicing: 0,
expectDeicing: '0',
fixedPointDeicing: '0',
flightNoIn: '',
flightNoOut: '',
id: undefined,
legs: '',
model: '',
nickname: '',
originalAircraftPositionDeicing: 0,
originalAircraftPositionDeicing: '0',
station: '',
username: '',
guaranteeUnit: '',
......
import { upload } from 'mocp/utils/http'
import { canvasImage } from './sign.compositions'
import { antiicingFile, antiicingFlag, deicingFile, deicingFlag, formData, showAntiicing, showDeicing } from './add.compositions'
import { addDeicingApi } from 'mocp/api/electronicBill'
import { addDeicingApi, updateDeicingApi } from 'mocp/api/electronicBill'
import Day from 'mocp/utils/dayjs'
import { isBase64Image } from 'mocp/utils/tool'
export const handleSubmit = async () => {
uni.showLoading({
......@@ -9,8 +11,14 @@ export const handleSubmit = async () => {
mask: true
})
try {
await uploadFile()
await addDeicing()
if (isBase64Image(canvasImage.value)) {
await uploadFile()
}
if (formData.id > 0) {
await updateDeicing()
} else {
await addDeicing()
}
} catch (error) {
console.error(error)
} finally {
......@@ -37,7 +45,28 @@ export const addDeicing = async () => {
}
const res = await addDeicingApi(formData, { loading: true })
if (res.code == 200) {
uni.$mocpJump.navigateBack()
uni.$emit('deicingReload')
uni.$mocpJump.navigateBack(2)
resetData()
uni.$mocpMessage.success(res.message)
} else {
uni.$mocpMessage.error(res.message)
}
}
export const updateDeicing = async () => {
const params = {
...formData
}
if (formData.deicingMix == 'Other') {
params.deicingMix = formData.deicingMix1 + ':' + formData.deicingMix2
}
if (formData.antiicingMix == 'Other') {
params.antiicingMix = formData.antiicingMix1 + ':' + formData.antiicingMix2
}
const res = await updateDeicingApi(formData, { loading: true })
if (res.code == 200) {
uni.$emit('deicingReload')
uni.$mocpJump.navigateBack(2)
resetData()
uni.$mocpMessage.success(res.message)
} else {
......@@ -73,7 +102,7 @@ export const resetData = () => {
antiicingUnit3: '',
antiicingUnit4: '',
customerSignImg: '',
date: '',
date: Day().valueOf(),
deicingCartNo1: '',
deicingCartNo2: '',
deicingCartNo3: '',
......@@ -97,15 +126,15 @@ export const resetData = () => {
deicingUnit2: '',
deicingUnit3: '',
deicingUnit4: '',
expectDeicing: 0,
fixedPointDeicing: 0,
expectDeicing: '0',
fixedPointDeicing: '0',
flightNoIn: '',
flightNoOut: '',
id: undefined,
legs: '',
model: '',
nickname: '',
originalAircraftPositionDeicing: 0,
originalAircraftPositionDeicing: '0',
station: '',
username: '',
guaranteeUnit: '',
......
......@@ -14,7 +14,7 @@
}"
>
<template #default="{ item }">
<view class="item">
<view class="item" @tap="goDetails(item)">
<view class="item-title">
<view class="left">
<text class="txt">{{ item.acreg }}</text>
......@@ -45,9 +45,24 @@ import { deicingListApi } from 'mocp/api/electronicBill'
import { timeStampFormat } from 'mocp/utils/tool'
import useBaseStore from 'mocp/store/base'
import useUserStore from 'mocp/store/user'
import { ref } from 'vue'
import { onUnload } from '@dcloudio/uni-app'
import { formData } from './constants/add.compositions'
const baseStore = useBaseStore()
const userStore = useUserStore()
const goDetails = (data) => {
Object.assign(formData, data)
uni.$mocpJump.navigateTo('/panel/electronicBill/deicing/add')
}
//刷新
const paging = ref()
uni.$on('deicingReload', () => {
paging.value?.reload()
})
onUnload(() => {
uni.$off('deicingReload')
})
</script>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
......
......@@ -9,6 +9,7 @@
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
id="canvas"
/>
</view>
<view class="footer-btns">
......@@ -34,8 +35,14 @@ import { canvasImage } from './constants/sign.compositions'
import { handleSubmit } from './constants/sign.functionals'
import { formData } from './constants/add.compositions'
import { onBeforeUnmount } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const { isSigned, touchStart, touchMove, touchEnd, clear, getPath } = useDrawSignature('canvas')
const { isSigned, touchStart, touchMove, touchEnd, clear, getPath } = useDrawSignature('canvas', {
path: formData.customerSignImg
})
onLoad(() => {
canvasImage.value = formData.customerSignImg
})
//保存签名
const handleSave = () => {
if (isSigned.value) {
......@@ -67,6 +74,10 @@ onBeforeUnmount(() => {
.mocp-preview {
width: 100%;
height: 300rpx;
uni-image {
width: 100%;
height: 100%;
}
}
.mocp-title {
padding: 24rpx 0;
......
<template>
<global-page
title="新建非例行维护工作单"
:showNavRight="true"
:title="formData.id > 0 ? '编辑非例行维护工作单' : '新建非例行维护工作单'"
:showNavRight="formData.id > 0 ? false : true"
navRightText="今天签单"
@handleRightClick="navigateTo('/panel/electronicBill/nonRoutineWork/list')"
showFooterBtn
......@@ -18,13 +18,28 @@
<global-date pickAlign="right" clearable v-model="formData.date" defaultToday></global-date>
</up-form-item>
<up-form-item label="机号" prop="acreg" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.acreg" :options="allAc" clearable filter @change="changeAcreg"></global-picker>
<global-picker
pickAlign="right"
v-model="formData.acreg"
:options="allAc"
clearable
filter
customize
@change="changeAcreg"
></global-picker>
</up-form-item>
<up-form-item label="飞机所属单位" prop="aircaraftoperator" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.aircaraftoperator" :options="allAirline" clearable filter></global-picker>
<global-picker
pickAlign="right"
v-model="formData.aircaraftoperator"
:options="allAirline"
clearable
filter
customize
></global-picker>
</up-form-item>
<up-form-item label="机型" prop="model" :borderBottom="true" required>
<global-picker v-model="formData.model" pickAlign="right" :options="allAcType" clearable filter></global-picker>
<global-picker v-model="formData.model" pickAlign="right" :options="allAcType" clearable filter customize></global-picker>
</up-form-item>
<up-form-item label="航班号" prop="flightNo" :borderBottom="true" required>
<up-input v-model="formData.flightNo" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
......@@ -134,52 +149,152 @@
</view>
<view class="mocp-title">特种车辆、设备、工具租用记录</view>
<view class="mocp-form">
<up-form-item label="牵引车(单位/次)" prop="tractor" :borderBottom="true">
<global-number-input v-model="formData.tractor"></global-number-input>
<up-form-item label="金工人员工时" prop="jgrygs" :borderBottom="true">
<global-number-input v-model="formData.jgrygs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<up-form-item label="气源车(单位/次)" prop="asu" :borderBottom="true">
<global-number-input v-model="formData.asu"></global-number-input>
<up-form-item label="普通工作梯(2米以下)" prop="ptgzt" :borderBottom="true">
<global-number-input v-model="formData.ptgzt" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="电源车(单位/小时)" prop="gpu" :borderBottom="true">
<global-number-input v-model="formData.gpu" :precision="2"></global-number-input>
<up-form-item label="高空工作梯(2米以上)" prop="gkgzt" :borderBottom="true">
<global-number-input v-model="formData.lkgzt" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="空调车(单位/小时)" prop="acu" :borderBottom="true">
<global-number-input v-model="formData.acu" :precision="2"></global-number-input>
<up-form-item label="机身千斤顶" prop="jsqjd" :borderBottom="true">
<global-number-input v-model="formData.jsqjd" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="充氧车(单位/次)" prop="oxygenCharging" :borderBottom="true">
<global-number-input v-model="formData.oxygenCharging"></global-number-input>
<up-form-item label="轮轴千斤顶" prop="lzqjd" :borderBottom="true">
<global-number-input v-model="formData.lzqjd" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="高空作业车(单位/小时)" prop="cherryPicker" :borderBottom="true">
<global-number-input v-model="formData.cherryPicker" :precision="2"></global-number-input>
<up-form-item label="换轮工具" prop="hlgj" :borderBottom="true">
<global-number-input v-model="formData.hlgj" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="轮胎充气(单位/次)" prop="tireCharging" :borderBottom="true">
<global-number-input v-model="formData.tireCharging"></global-number-input>
<up-form-item label="工具车辆" prop="gjcl" :borderBottom="true">
<global-number-input v-model="formData.gjcl" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="减震支柱充气(单位/次)" prop="shockStrutCharging" :borderBottom="true">
<global-number-input v-model="formData.shockStrutCharging"></global-number-input>
<up-form-item label="充氧" prop="cy" :borderBottom="true">
<global-number-input v-model="formData.cl" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="工作梯(单位/小时)" prop="ladder" :borderBottom="true">
<global-number-input v-model="formData.ladder" :precision="2"></global-number-input>
<up-form-item label="充高压氮气" prop="cgydq" :borderBottom="true">
<global-number-input v-model="formData.cgydq" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="千斤顶(单位/小时)" prop="jackscrew" :borderBottom="true">
<global-number-input v-model="formData.jackscrew" :precision="2"></global-number-input>
<up-form-item label="充低压氮气" prop="cdydq" :borderBottom="true">
<global-number-input v-model="formData.cdydq" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="动力设备工具(单位/次)" prop="powerTool" :borderBottom="true">
<global-number-input v-model="formData.powerTool"></global-number-input>
<up-form-item label="推/拖飞机" prop="ttfj" :borderBottom="true">
<global-number-input v-model="formData.ttfj" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="非动力设备工具(单位/次)" prop="tools" :borderBottom="true">
<global-number-input v-model="formData.tools"></global-number-input>
<up-form-item label="滑油" prop="hy" :borderBottom="true">
<global-number-input v-model="formData.hy" placeholder="请输入(单位/罐)"></global-number-input>
</up-form-item>
<up-form-item label="充电瓶(单位/次)" prop="charger" :borderBottom="true">
<global-number-input v-model="formData.charger"></global-number-input>
<up-form-item label="液压油" prop="yyy" :borderBottom="true">
<global-number-input v-model="formData.yyy" placeholder="请输入(单位/罐)"></global-number-input>
</up-form-item>
<up-form-item label="尾撑(单位/小时)" prop="tails" :borderBottom="true">
<global-number-input v-model="formData.tails" :precision="2"></global-number-input>
<up-form-item label="金属胶带" prop="jsjd" :borderBottom="true">
<global-number-input v-model="formData.jsjd" placeholder="请输入(单位/米)" :precision="2"></global-number-input>
</up-form-item>
<up-form-item label="机库(单位/小时)" prop="hanger" :borderBottom="true">
<global-number-input v-model="formData.hanger" :precision="2"></global-number-input>
<up-form-item label="其它消耗品" prop="qtxhp" :borderBottom="true">
<global-number-input v-model="formData.qtxhp" placeholder="请输入(单位/罐)"></global-number-input>
</up-form-item>
<!-- 常用非动力工具 -->
<up-form-item label="常用非动力工具" :borderBottom="true"></up-form-item>
<up-form-item label="件号" prop="cyfdlgjjh" :borderBottom="true">
<up-input v-model="formData.cyfdlgjjh" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="次数" prop="cyfdlgjcs" :borderBottom="true">
<global-number-input v-model="formData.cyfdlgjcs" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<!-- 常用动力工具 -->
<up-form-item label="常用动力工具" :borderBottom="true"></up-form-item>
<up-form-item label="件号" prop="cydlgjjh" :borderBottom="true">
<up-input v-model="formData.cydlgjjh" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="次数" prop="cydlgjcs" :borderBottom="true">
<global-number-input v-model="formData.cydlgjcs" placeholder="请输入(单位/次)"></global-number-input>
</up-form-item>
<up-form-item label="NDT人员工时" prop="ndtrygs" :borderBottom="true">
<global-number-input v-model="formData.ndtrygs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- NDT/孔探设备 -->
<up-form-item label="NDT/孔探设备" :borderBottom="true"></up-form-item>
<up-form-item label="件号" prop="ndtktsbjh" :borderBottom="true">
<up-input v-model="formData.ndtktsbjh" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="天数" prop="ndtktsbts" :borderBottom="true">
<global-number-input v-model="formData.ndtktsbts" placeholder="请输入(单位/天)"></global-number-input>
</up-form-item>
<!-- 升降车平台车 -->
<up-form-item label="升降车平台车" :borderBottom="true"></up-form-item>
<up-form-item label="人" prop="sjcptcr" :borderBottom="true">
<global-number-input v-model="formData.sjcptcr" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<up-form-item label="车" prop="sjcptcc" :borderBottom="true">
<global-number-input v-model="formData.sjcptcc" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- 悬臂高空车 -->
<up-form-item label="悬臂高空车" :borderBottom="true"></up-form-item>
<up-form-item label="人" prop="xbgkcr" :borderBottom="true">
<global-number-input v-model="formData.xbgkcr" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<up-form-item label="车" prop="xbgkcc" :borderBottom="true">
<global-number-input v-model="formData.xbgkcc" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- 停机坪 -->
<up-form-item label="停机坪" prop="tjpzk" :borderBottom="true">
<global-radio v-model="formData.tjpzk" dictkey="eb_zk" radioAlign="right" clearable></global-radio>
</up-form-item>
<up-form-item prop="tjpxs" :borderBottom="true">
<global-number-input v-model="formData.tjpxs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- 北京(机库租用) -->
<up-form-item label="北京(机库租用)" prop="bjjkzyzk" :borderBottom="true">
<global-radio v-model="formData.bjjkzyzk" dictkey="eb_zk" radioAlign="right" clearable></global-radio>
</up-form-item>
<up-form-item prop="bjjkzyxs" :borderBottom="true">
<global-number-input v-model="formData.bjjkzyxs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- 北京(试车坪) -->
<up-form-item label="北京(试车坪)" prop="bjscpzk" :borderBottom="true">
<global-radio v-model="formData.bjscpzk" dictkey="eb_zk" radioAlign="right" clearable></global-radio>
</up-form-item>
<up-form-item prop="bjscpxs" :borderBottom="true">
<global-number-input v-model="formData.bjscpxs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- 非北京地区(机库租用) -->
<up-form-item label="非北京地区(机库租用)" prop="fbjjkzyzk" :borderBottom="true">
<global-radio v-model="formData.fbjjkzyzk" dictkey="eb_zk" radioAlign="right" clearable></global-radio>
</up-form-item>
<up-form-item prop="fbjjkzyxs" :borderBottom="true">
<global-number-input v-model="formData.fbjjkzyxs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
<!-- 非北京地区(试车坪) -->
<up-form-item label="非北京地区(试车坪)" prop="fbjscpzk" :borderBottom="true">
<global-radio v-model="formData.fbjscpzk" dictkey="eb_zk" radioAlign="right" clearable></global-radio>
</up-form-item>
<up-form-item prop="fbjscpxs" :borderBottom="true">
<global-number-input v-model="formData.fbjscpxs" placeholder="请输入(单位/小时)" :precision="2"></global-number-input>
</up-form-item>
</view>
<!-- 其它工具 -->
<view class="mocp-form">
<up-form-item label="其它工具" :borderBottom="true">
<view style="width: 100%; display: flex; justify-content: flex-end">
<global-button type="text" @tap="addQtgj">添加</global-button>
</view>
</up-form-item>
</view>
<template v-for="(item, index) in formData.qtgj" :key="index">
<view class="mocp-title">
工具{{ index + 1 }}
<global-button text type="danger" @tap="delQtgj(index)">删除</global-button>
</view>
<view class="mocp-form">
<up-form-item label="件号" :borderBottom="true">
<up-input v-model="item.jh" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="天数" :borderBottom="true">
<global-number-input v-model="item.ts" placeholder="请输入(单位/天)"></global-number-input>
</up-form-item>
</view>
</template>
</up-form>
</global-page>
</template>
......@@ -188,10 +303,11 @@
import useElectronicBillStore from 'mocp/store/electronicBill'
import { formData, rules } from './constants/add.compositions'
import { navigateTo } from 'mocp/utils/jump'
import { ref } from 'vue'
import { changeAcreg } from './constants/add.functionals'
import { onUnmounted, ref } from 'vue'
import { addQtgj, delQtgj, changeAcreg } from './constants/add.functionals'
import { validateParameters } from 'mocp/utils/tool'
import { getTerminalSelect } from 'mocp/utils/permission'
import { resetData } from './constants/sign.functionals'
const electronicBillStore = useElectronicBillStore()
const {
......@@ -212,6 +328,9 @@ const handleFooterClick = async () => {
}
navigateTo('/panel/electronicBill/nonRoutineWork/sign')
}
onUnmounted(() => {
resetData()
})
</script>
<style lang="scss" scoped>
@import 'mocpStatic/css/table.scss';
......@@ -223,6 +342,8 @@ const handleFooterClick = async () => {
.mocp-title {
padding: 0 32rpx 24rpx 32rpx;
background-color: $mocp-fill-1;
display: flex;
justify-content: space-between;
}
.mocp-subtitle {
padding-top: 12rpx;
......
import { reactive, ref } from 'vue'
import { reactive } from 'vue'
export const formData = reactive({
acreg: '',
acu: undefined,
aircaraftoperator: '',
asu: undefined,
bjjkzyxs: undefined,
bjjkzyzk: undefined,
bjscpxs: undefined,
bjscpzk: undefined,
cdydq: undefined,
cgydq: undefined,
charger: undefined,
cherryPicker: undefined,
cy: undefined,
createTime: '',
createUser: undefined,
customerSignImg: '',
customerSignTime: '',
cyfdlgjcs: '',
cyfdlgjjh: '',
cydlgjcs: '',
cydlgjjh: '',
date: '',
fbjjkzyxs: undefined,
fbjjkzyzk: undefined,
fbjscpxs: undefined,
fbjscpzk: undefined,
flightNo: '',
flightNoIn: '',
flightNoOut: '',
gjcl: undefined,
gpu: undefined,
hanger: undefined,
hlgj: undefined,
hy: undefined,
id: 0,
isDel: '',
jackscrew: undefined,
jgrygs: undefined,
jsjd: undefined,
jsqjd: undefined,
ladder: undefined,
legs: '',
gkgzt: undefined,
lzqjd: undefined,
material1: '',
material2: '',
material3: '',
model: '',
ndtktsbjh: '',
ndtktsbts: undefined,
ndtrygs: undefined,
nickname: '',
number1: undefined,
number2: undefined,
number3: undefined,
oxygenCharging: undefined,
powerTool: undefined,
ptgzt: undefined,
qtgj: [],
qtxhp: undefined,
shockStrutCharging: undefined,
sjcptcc: undefined,
sjcptcr: undefined,
station: '',
tails: undefined,
tireCharging: undefined,
tjpxs: undefined,
tjpzk: undefined,
tools: undefined,
tractor: undefined,
ttfj: undefined,
updateTime: '',
updateUser: undefined,
username: '',
work1: '',
work2: '',
work3: '',
workingHours1: undefined,
workingHours2: undefined,
workingHours3: undefined
workingHours3: undefined,
xbgkcc: undefined,
xbgkcr: undefined,
yyy: undefined
})
export const rules = reactive({
......
......@@ -18,3 +18,12 @@ export const changeAcreg = async (acreg) => {
uni.$mocpMessage.error(res.message)
}
}
export const addQtgj = () => {
formData.qtgj.push({
jh: '',
ts: undefined
})
}
export const delQtgj = (index) => {
formData.qtgj.splice(index, 1)
}
import { upload } from 'mocp/utils/http'
import { canvasImage } from './sign.compositions'
import { formData } from './add.compositions'
import { addNonRoutineWorkApi } from 'mocp/api/electronicBill'
import { addNonRoutineWorkApi, updateNonRoutineWorkApi } from 'mocp/api/electronicBill'
import Day from 'mocp/utils/dayjs'
import { isBase64Image } from 'mocp/utils/tool'
export const handleSubmit = async () => {
uni.showLoading({
......@@ -9,8 +11,14 @@ export const handleSubmit = async () => {
mask: true
})
try {
await uploadFile()
await addNonRoutineWork()
if (isBase64Image(canvasImage.value)) {
await uploadFile()
}
if (formData.id > 0) {
await updateNonRoutineWork()
} else {
await addNonRoutineWork()
}
} catch (error) {
console.error(error)
} finally {
......@@ -25,52 +33,129 @@ export const uploadFile = async () => {
uni.$mocpMessage.error(res.message)
}
}
//获取其他工具
export const getQtgj = (qtgj) => {
//[{jh:abc,ts:1},{jh:abc,ts:2},{jh:abc,ts:3] => abc-1,abc-2,abc-3
//判断是否数组
if (Array.isArray(qtgj)) {
return qtgj.map((item) => `${item.jh}-${item.ts}`).join(',')
}
if (typeof qtgj == 'string') {
if (!qtgj) return []
//abc-1,abc-2,abc-3 => [{jh:abc,ts:1},{jh:abc,ts:2},{jh:abc,ts:3]
return qtgj.split(',').map((item) => {
const [jh, ts] = item.split('-')
return { jh, ts }
})
}
return qtgj
}
export const addNonRoutineWork = async () => {
const res = await addNonRoutineWorkApi(formData, { loading: true })
const res = await addNonRoutineWorkApi({ ...formData, qtgj: getQtgj(formData.qtgj) }, { loading: true })
if (res.code == 200) {
uni.$mocpJump.navigateBack()
Object.assign(formData, {
acreg: '',
acu: undefined,
aircaraftoperator: '',
asu: undefined,
charger: undefined,
cherryPicker: undefined,
customerSignImg: '',
date: '',
flightNo: '',
gpu: undefined,
hanger: undefined,
id: 0,
jackscrew: undefined,
ladder: undefined,
legs: '',
material1: '',
material2: '',
material3: '',
model: '',
nickname: '',
number1: undefined,
number2: undefined,
number3: undefined,
oxygenCharging: undefined,
powerTool: undefined,
shockStrutCharging: undefined,
station: '',
tails: undefined,
tireCharging: undefined,
tools: undefined,
tractor: undefined,
username: '',
work1: '',
work2: '',
work3: '',
workingHours1: undefined,
workingHours2: undefined,
workingHours3: undefined
})
uni.$emit('nonRoutineWorkReload')
uni.$mocpJump.navigateBack(2)
resetData()
uni.$mocpMessage.success(res.message)
} else {
uni.$mocpMessage.error(res.message)
}
}
export const updateNonRoutineWork = async () => {
const res = await updateNonRoutineWorkApi({ ...formData, qtgj: getQtgj(formData.qtgj) }, { loading: true })
if (res.code == 200) {
uni.$emit('nonRoutineWorkReload')
uni.$mocpJump.navigateBack(2)
resetData()
uni.$mocpMessage.success(res.message)
} else {
uni.$mocpMessage.error(res.message)
}
}
export const resetData = () => {
Object.assign(formData, {
acreg: '',
acu: undefined,
aircaraftoperator: '',
asu: undefined,
bjjkzyxs: undefined,
bjjkzyzk: undefined,
bjscpxs: undefined,
bjscpzk: undefined,
cdydq: undefined,
cgydq: undefined,
charger: undefined,
cherryPicker: undefined,
cy: undefined,
createTime: '',
createUser: undefined,
customerSignImg: '',
customerSignTime: '',
cyfdlgjcs: '',
cyfdlgjjh: '',
cydlgjcs: '',
cydlgjjh: '',
date: Day().valueOf(),
fbjjkzyxs: undefined,
fbjjkzyzk: undefined,
fbjscpxs: undefined,
fbjscpzk: undefined,
flightNo: '',
flightNoIn: '',
flightNoOut: '',
gjcl: undefined,
gpu: undefined,
hanger: undefined,
hlgj: undefined,
hy: undefined,
id: 0,
isDel: '',
jackscrew: undefined,
jgrygs: undefined,
jsjd: undefined,
jsqjd: undefined,
ladder: undefined,
legs: '',
gkgzt: undefined,
lzqjd: undefined,
material1: '',
material2: '',
material3: '',
model: '',
ndtktsbjh: '',
ndtktsbts: undefined,
ndtrygs: undefined,
nickname: '',
number1: undefined,
number2: undefined,
number3: undefined,
oxygenCharging: undefined,
powerTool: undefined,
ptgzt: undefined,
qtgj: [],
qtxhp: undefined,
shockStrutCharging: undefined,
sjcptcc: undefined,
sjcptcr: undefined,
station: '',
tails: undefined,
tireCharging: undefined,
tjpxs: undefined,
tjpzk: undefined,
tools: undefined,
tractor: undefined,
ttfj: undefined,
updateTime: '',
updateUser: undefined,
username: '',
work1: '',
work2: '',
work3: '',
workingHours1: undefined,
workingHours2: undefined,
workingHours3: undefined,
xbgkcc: undefined,
xbgkcr: undefined,
yyy: undefined
})
}
......@@ -14,7 +14,7 @@
}"
>
<template #default="{ item }">
<view class="item">
<view class="item" @tap="goDetails(item)">
<view class="item-title">
<view class="left">
<text class="txt">{{ item.acreg }}</text>
......@@ -45,9 +45,26 @@ import { noRoutineWorkListApi } from 'mocp/api/electronicBill'
import { timeStampFormat } from 'mocp/utils/tool'
import useBaseStore from 'mocp/store/base'
import useUserStore from 'mocp/store/user'
import { formData } from './constants/add.compositions'
import { onUnload } from '@dcloudio/uni-app'
import { ref } from 'vue'
import { getQtgj } from './constants/sign.functionals'
const baseStore = useBaseStore()
const userStore = useUserStore()
const goDetails = (data) => {
Object.assign(formData, data)
formData.qtgj = getQtgj(formData.qtgj)
uni.$mocpJump.navigateTo('/panel/electronicBill/nonRoutineWork/add')
}
//刷新
const paging = ref()
uni.$on('nonRoutineWorkReload', () => {
paging.value?.reload()
})
onUnload(() => {
uni.$off('nonRoutineWorkReload')
})
</script>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
......
......@@ -9,6 +9,7 @@
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
id="canvas"
/>
</view>
<view class="footer-btns">
......@@ -24,7 +25,7 @@
</view>
<view class="mocp-title">用户签名预览</view>
<view class="mocp-preview">
<image :src="canvasImage" mode="widthFix" :show-loading="true" width="100%" height="100%" v-if="canvasImage"></image>
<image :src="canvasImage" mode="widthFix" :show-loading="true" v-if="canvasImage"></image>
</view>
</global-page>
</template>
......@@ -33,9 +34,14 @@ import { useDrawSignature } from 'mocp/hooks/use-sign/useSign'
import { canvasImage } from './constants/sign.compositions'
import { handleSubmit } from './constants/sign.functionals'
import { formData } from './constants/add.compositions'
import { onBeforeUnmount } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const { isSigned, touchStart, touchMove, touchEnd, clear, getPath } = useDrawSignature('canvas')
const { isSigned, touchStart, touchMove, touchEnd, clear, getPath } = useDrawSignature('canvas', {
path: formData.customerSignImg
})
onLoad(() => {
canvasImage.value = formData.customerSignImg
})
//保存签名
const handleSave = () => {
if (isSigned.value) {
......@@ -52,10 +58,6 @@ const handleClear = () => {
canvasImage.value = ''
clear()
}
onBeforeUnmount(() => {
handleClear()
formData.customerSignImg = ''
})
</script>
<style lang="scss" scoped>
.mocp-sign,
......@@ -67,6 +69,10 @@ onBeforeUnmount(() => {
.mocp-preview {
width: 100%;
height: 300rpx;
uni-image {
width: 100%;
height: 100%;
}
}
.mocp-title {
padding: 24rpx 0;
......
<template>
<global-page
title="新建例行维护工作单"
:showNavRight="true"
:title="formData.id > 0 ? '编辑例行维护工作单' : '新建例行维护工作单'"
:showNavRight="formData.id > 0 ? false : true"
navRightText="今天签单"
@handleRightClick="navigateTo('/panel/electronicBill/routineWork/list')"
showFooterBtn
......@@ -18,49 +18,70 @@
<global-date pickAlign="right" clearable v-model="formData.date" defaultToday></global-date>
</up-form-item>
<up-form-item label="机号" prop="acreg" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.acreg" :options="allAc" clearable filter @change="changeAcreg"></global-picker>
<global-picker
pickAlign="right"
v-model="formData.acreg"
:options="allAc"
clearable
filter
customize
@change="changeAcreg"
></global-picker>
</up-form-item>
<up-form-item label="飞机所属单位" prop="aircaraftoperator" :borderBottom="true" required>
<global-picker pickAlign="right" v-model="formData.aircaraftoperator" :options="allAirline" clearable filter></global-picker>
<global-picker
pickAlign="right"
v-model="formData.aircaraftoperator"
:options="allAirline"
clearable
filter
customize
></global-picker>
</up-form-item>
<up-form-item label="机型" prop="model" :borderBottom="true" required>
<global-picker v-model="formData.model" pickAlign="right" :options="allAcType" clearable filter></global-picker>
<global-picker v-model="formData.model" pickAlign="right" :options="allAcType" clearable filter customize></global-picker>
</up-form-item>
<up-form-item label="进港航班号" prop="flightNoIn" :borderBottom="true" required>
<up-input v-model="formData.flightNoIn" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="出港航班号" prop="flightNoOut" :borderBottom="true">
<up-form-item label="出港航班号" prop="flightNoOut" :borderBottom="true" required>
<up-input v-model="formData.flightNoOut" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="航段" prop="legs" :borderBottom="true">
<up-form-item label="航段" prop="legs" :borderBottom="true" required>
<up-input v-model="formData.legs" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
</view>
<view class="mocp-title">过站维护TR</view>
<view class="mocp-form">
<up-form-item label="过站TR" prop="tr" :borderBottom="true">
<global-switch v-model="formData.tr" switchAlign="right"></global-switch>
<up-form-item label="过站维护TR" prop="tr" :borderBottom="true">
<global-switch v-model="formData.tr" switchAlign="right" :disabled="formData.overnightAfPf == '1'"></global-switch>
</up-form-item>
<up-form-item label="一般勤务" prop="serviceTr" :borderBottom="true">
<global-switch v-model="formData.serviceTr" switchAlign="right"></global-switch>
<global-switch
v-model="formData.serviceTr"
switchAlign="right"
:disabled="formData.tr == '1' || formData.overnightAfPf == '1'"
></global-switch>
</up-form-item>
<up-form-item label="例行检查" prop="routineInspection" :borderBottom="true">
<global-switch
v-model="formData.routineInspection"
switchAlign="right"
:disabled="formData.tr == '1' || formData.overnightAfPf == '1'"
></global-switch>
</up-form-item>
<up-form-item label="飞机放行" prop="fly" :borderBottom="true">
<global-switch
v-model="formData.fly"
switchAlign="right"
:disabled="formData.tr == '1' || formData.overnightAfPf == '1'"
></global-switch>
</up-form-item>
</view>
<view class="mocp-title">航前维护PF</view>
<view class="mocp-title">过夜维护AF+PF</view>
<view class="mocp-form">
<up-form-item label="航前PR" prop="pf" :borderBottom="true">
<global-switch v-model="formData.pf" switchAlign="right"></global-switch>
</up-form-item>
<up-form-item label="一般勤务" prop="servicePf" :borderBottom="true">
<global-switch v-model="formData.servicePf" switchAlign="right"></global-switch>
</up-form-item>
</view>
<view class="mocp-title">航后维护AF</view>
<view class="mocp-form">
<up-form-item label="航后AF" prop="af" :borderBottom="true">
<global-switch v-model="formData.af" switchAlign="right"></global-switch>
</up-form-item>
<up-form-item label="一般勤务" prop="serviceAf" :borderBottom="true">
<global-switch v-model="formData.serviceAf" switchAlign="right"></global-switch>
<up-form-item label="过夜维护AF+PF" prop="overnightAfPf" :borderBottom="true">
<global-switch v-model="formData.overnightAfPf" switchAlign="right"></global-switch>
</up-form-item>
</view>
<view class="mocp-title">设备使用记录</view>
......@@ -107,9 +128,10 @@
import useElectronicBillStore from 'mocp/store/electronicBill'
import { formData, rules } from './constants/add.compositions'
import { navigateTo } from 'mocp/utils/jump'
import { ref } from 'vue'
import { onUnmounted, ref, watchEffect } from 'vue'
import { changeAcreg } from './constants/add.functionals'
import { getTerminalSelect } from 'mocp/utils/permission'
import { resetData } from './constants/sign.functionals'
const electronicBillStore = useElectronicBillStore()
const {
......@@ -121,6 +143,22 @@ const handleFooterClick = async () => {
await formRef.value?.validate()
navigateTo('/panel/electronicBill/routineWork/sign')
}
watchEffect(() => {
if (formData.tr == '1') {
formData.serviceTr = '0'
formData.routineInspection = '0'
formData.fly = '0'
}
if (formData.overnightAfPf == '1') {
formData.tr = '0'
formData.serviceTr = '0'
formData.routineInspection = '0'
formData.fly = '0'
}
})
onUnmounted(() => {
resetData()
})
</script>
<style lang="scss" scoped>
.mocp-form {
......
......@@ -2,13 +2,13 @@ import { reactive } from 'vue'
export const formData = reactive({
acreg: '',
af: 0,
af: '0',
airConditioning: undefined,
airStarter: undefined,
aircaraftoperator: '',
customerSignImg: '',
date: '',
diversion: 0,
diversion: '0',
flightNoIn: '',
flightNoOut: '',
groundPower: undefined,
......@@ -16,19 +16,22 @@ export const formData = reactive({
legs: '',
model: '',
nickname: '',
onCall: 0,
onCall: '0',
others1: '',
others2: '',
pf: 0,
pf: '0',
remark: '',
returnFlight: 0,
serviceAf: 0,
servicePf: 0,
serviceTr: 0,
returnFlight: '0',
serviceAf: '0',
servicePf: '0',
serviceTr: '0',
station: '',
towPus: undefined,
tr: 1,
username: ''
tr: '0',
username: '',
routineInspection: '0',
fly: '0',
overnightAfPf: '0'
})
export const rules = reactive({
......@@ -74,5 +77,19 @@ export const rules = reactive({
message: '请选择进港航班号',
trigger: ['blur', 'change']
}
],
flightNoOut: [
{
required: true,
message: '请输入出港航班号',
trigger: ['blur', 'change']
}
],
legs: [
{
required: true,
message: '请输入航段',
trigger: ['blur', 'change']
}
]
})
import { ref } from 'vue'
export const canvasImage = ref('')
export const showConfirm = ref(false)
import { upload } from 'mocp/utils/http'
import { canvasImage } from './sign.compositions'
import { canvasImage, showConfirm } from './sign.compositions'
import { formData } from './add.compositions'
import { addRoutineWorkApi } from 'mocp/api/electronicBill'
import { addRoutineWorkApi, routineWorkCheckRepeatApi, updateRoutineWorkApi } from 'mocp/api/electronicBill'
import { isBase64Image, timeStampFormat } from 'mocp/utils/tool'
import Day from 'mocp/utils/dayjs'
export const handleSubmit = async () => {
uni.showLoading({
......@@ -9,14 +11,38 @@ export const handleSubmit = async () => {
mask: true
})
try {
await uploadFile()
await addRoutineWork()
if (isBase64Image(formData.customerSignImg)) {
await uploadFile()
}
if (formData.id > 0) {
await updateRoutineWork()
} else {
await addRoutineWork()
}
} catch (error) {
console.error(error)
} finally {
uni.hideLoading()
}
}
export const routineWorkCheckRepeat = async () => {
0
const params = {
acreg: formData.acreg,
date: timeStampFormat(formData.date, { format: 'YYYY-MM-DD' }),
id: formData.id
}
const res = await routineWorkCheckRepeatApi(params, { loading: true })
if (res.code == 200) {
if (res.data > 0) {
showConfirm.value = true
} else {
handleSubmit()
}
} else {
uni.$mocpMessage.error(res.message)
}
}
export const uploadFile = async () => {
const res = await upload({ url: '/resource/uploadFile', filePath: canvasImage.value, name: 'file' })
if (res.code == 200) {
......@@ -28,39 +54,58 @@ export const uploadFile = async () => {
export const addRoutineWork = async () => {
const res = await addRoutineWorkApi(formData, { loading: true })
if (res.code == 200) {
uni.$mocpJump.navigateBack()
Object.assign(formData, {
acreg: '',
af: 0,
airConditioning: undefined,
airStarter: undefined,
aircaraftoperator: '',
customerSignImg: '',
date: '',
diversion: 0,
flightNoIn: '',
flightNoOut: '',
groundPower: undefined,
id: 0,
legs: '',
model: '',
nickname: '',
onCall: 0,
others1: '',
others2: '',
pf: 0,
remark: '',
returnFlight: 0,
serviceAf: 0,
servicePf: 0,
serviceTr: 0,
station: '',
towPus: undefined,
tr: 1,
username: ''
})
uni.$emit('routineWorkReload')
uni.$mocpJump.navigateBack(2)
resetData()
uni.$mocpMessage.success(res.message)
} else {
uni.$mocpMessage.error(res.message)
}
}
export const updateRoutineWork = async () => {
const res = await updateRoutineWorkApi(formData, { loading: true })
if (res.code == 200) {
uni.$emit('routineWorkReload')
uni.$mocpJump.navigateBack(2)
resetData()
uni.$mocpMessage.success(res.message)
} else {
uni.$mocpMessage.error(res.message)
}
}
export const resetData = () => {
showConfirm.value = false
Object.assign(formData, {
acreg: '',
af: '0',
airConditioning: undefined,
airStarter: undefined,
aircaraftoperator: '',
customerSignImg: '',
date: Day().valueOf(),
diversion: '0',
flightNoIn: '',
flightNoOut: '',
groundPower: undefined,
id: 0,
legs: '',
model: '',
nickname: '',
onCall: '0',
others1: '',
others2: '',
pf: '0',
remark: '',
returnFlight: '0',
serviceAf: '0',
servicePf: '0',
serviceTr: '0',
station: '',
towPus: undefined,
tr: '0',
username: '',
routineInspection: '0',
fly: '0',
overnightAfPf: '0'
})
}
......@@ -14,7 +14,7 @@
}"
>
<template #default="{ item }">
<view class="item">
<view class="item" @tap="goDetails(item)">
<view class="item-title">
<view class="left">
<text class="txt">{{ item.acreg }}</text>
......@@ -23,9 +23,10 @@
<text class="txt">{{ baseStore.getTerminalObject[item.station] }}</text>
</view>
</view>
<view class="item-content u-line-3">
<view class="item-content">
<text class="txt">{{ item.aircaraftoperator }}</text>
<text class="txt">{{ item.model }}</text>
<text class="txt">{{ item.overnightAfPf == '1' ? '过夜维护AF+PF' : '' }}</text>
</view>
<view class="item-footer">
<view class="label">
......@@ -45,9 +46,24 @@ import { routineWorkListApi } from 'mocp/api/electronicBill'
import { timeStampFormat } from 'mocp/utils/tool'
import useBaseStore from 'mocp/store/base'
import useUserStore from 'mocp/store/user'
import { formData } from './constants/add.compositions'
import { ref } from 'vue'
import { onUnload } from '@dcloudio/uni-app'
const baseStore = useBaseStore()
const userStore = useUserStore()
const goDetails = (data) => {
Object.assign(formData, data)
uni.$mocpJump.navigateTo('/panel/electronicBill/routineWork/add')
}
//刷新
const paging = ref()
uni.$on('routineWorkReload', () => {
paging.value?.reload()
})
onUnload(() => {
uni.$off('routineWorkReload')
})
</script>
<style lang="scss" scoped>
@import 'mocpStatic/css/list.scss';
......
......@@ -9,6 +9,7 @@
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
id="canvas"
/>
</view>
<view class="footer-btns">
......@@ -16,7 +17,7 @@
<global-button type="primary" size="large" :radius="5" @tap="handleSave">保存签名</global-button>
</view>
<view class="footer-btn">
<global-button type="primary" size="large" :radius="5" @tap="handleSubmit" :disabled="!canvasImage">保存单据</global-button>
<global-button type="primary" size="large" :radius="5" @tap="routineWorkCheckRepeat" :disabled="!canvasImage">保存单据</global-button>
</view>
<view class="footer-btn">
<global-button type="primary" plain size="large" :radius="5" @tap="handleClear">重新签名</global-button>
......@@ -24,18 +25,33 @@
</view>
<view class="mocp-title">用户签名预览</view>
<view class="mocp-preview">
<image :src="canvasImage" mode="widthFix" :show-loading="true" width="100%" height="100%" v-if="canvasImage"></image>
<image :src="canvasImage" mode="widthFix" :show-loading="true" v-if="canvasImage"></image>
</view>
<up-modal
title="单据重复"
content="系统检测到今日已有过夜数据,是否继续提交?"
:show="showConfirm"
showCancelButton
closeOnClickOverlay
@confirm="handleSubmit"
@cancel="showConfirm = false"
@close="showConfirm = false"
></up-modal>
</global-page>
</template>
<script setup>
import { useDrawSignature } from 'mocp/hooks/use-sign/useSign'
import { canvasImage } from './constants/sign.compositions'
import { handleSubmit } from './constants/sign.functionals'
import { canvasImage, showConfirm } from './constants/sign.compositions'
import { handleSubmit, routineWorkCheckRepeat } from './constants/sign.functionals'
import { formData } from './constants/add.compositions'
import { onBeforeUnmount } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const { isSigned, touchStart, touchMove, touchEnd, clear, getPath } = useDrawSignature('canvas')
const { isSigned, touchStart, touchMove, touchEnd, clear, getPath } = useDrawSignature('canvas', {
path: formData.customerSignImg
})
onLoad(() => {
canvasImage.value = formData.customerSignImg
})
//保存签名
const handleSave = () => {
if (isSigned.value) {
......@@ -52,10 +68,6 @@ const handleClear = () => {
canvasImage.value = ''
clear()
}
onBeforeUnmount(() => {
handleClear()
formData.customerSignImg = ''
})
</script>
<style lang="scss" scoped>
.mocp-sign,
......@@ -67,6 +79,10 @@ onBeforeUnmount(() => {
.mocp-preview {
width: 100%;
height: 300rpx;
uni-image {
width: 100%;
height: 100%;
}
}
.mocp-title {
padding: 24rpx 0;
......
......@@ -2,7 +2,7 @@
<global-page title="新增非计划申请" showFooterBtn footerBtnText="提交" @handleFooterClick="handleFooterClick">
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto" :model="formData" :rules="rules" ref="formRef">
<up-form-item label="工作包号" prop="packageNo" :borderBottom="true" required>
<up-form-item label="工作包号" prop="packageNo" :borderBottom="true" required>
<up-input
v-model="formData.packageNo"
border="none"
......
......@@ -6,7 +6,7 @@ export const rules = reactive({
packageNo: [
{
required: true,
message: '请输入工作包号',
message: '请输入工作包号',
trigger: ['blur', 'change']
}
],
......
......@@ -18,7 +18,7 @@
</template>
</up-cell>
<up-cell title="数据来源" :value="useGetDictByValue('np_sourceType', details.sourceType)"></up-cell>
<up-cell title="工作包号" :value="details.packageNo || '-'"></up-cell>
<up-cell title="工作包号" :value="details.packageNo || '-'"></up-cell>
<up-cell title="工作包名称" :value="details.packageName || '-'"></up-cell>
<up-cell title="计划开始时间" :value="timeStampFormat(details.startTime) || '-'"></up-cell>
<up-cell title="计划结束时间" :value="timeStampFormat(details.endTime) || '-'"></up-cell>
......
......@@ -2,7 +2,7 @@
<global-page title="新增非计划预警" showFooterBtn footerBtnText="提交" @handleFooterClick="handleFooterClick">
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto" :model="formData" :rules="rules" ref="formRef">
<up-form-item label="工作包号" prop="packageNo" :borderBottom="true" required>
<up-form-item label="工作包号" prop="packageNo" :borderBottom="true" required>
<up-input
v-model="formData.packageNo"
border="none"
......
......@@ -6,7 +6,7 @@ export const rules = reactive({
packageNo: [
{
required: true,
message: '请输入工作包号',
message: '请输入工作包号',
trigger: ['blur', 'change']
}
],
......
......@@ -13,7 +13,7 @@
</template>
</up-cell>
<up-cell title="数据来源" :value="useGetDictByValue('np_sourceType', details.sourceType)"></up-cell>
<up-cell title="工作包号" :value="details.packageNo || '-'"></up-cell>
<up-cell title="工作包号" :value="details.packageNo || '-'"></up-cell>
<up-cell title="工作包名称" :value="details.packageName || '-'"></up-cell>
<up-cell title="计划开始时间" :value="timeStampFormat(details.startTime) || '-'"></up-cell>
<up-cell title="计划结束时间" :value="timeStampFormat(details.endTime) || '-'"></up-cell>
......
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