Commit fc3e847d by pangchong

feat: AOG收尾

parent e4690ef6
......@@ -11,6 +11,7 @@ import 'uview-plus/types'
declare module 'vue' {
export interface GlobalComponents {
// 全局组件
GlobalActionSheet: typeof import('./src/mocp/components/global-action-sheet/global-action-sheet.vue')['default']
GlobalAlbum: typeof import('./src/mocp/components/global-album/global-album.vue')['default']
GlobalButton: typeof import('./src/mocp/components/global-button/global-button.vue')['default']
GlobalCalendar: typeof import('./src/mocp/components/global-calendar/global-calendar.vue')['default']
......@@ -29,6 +30,7 @@ declare module 'vue' {
GlobalRadio: typeof import('./src/mocp/components/global-radio/global-radio.vue')['default']
GlobalTabs: typeof import('./src/mocp/components/global-tabs/global-tabs.vue')['default']
GlobalTag: typeof import('./src/mocp/components/global-tag/global-tag.vue')['default']
GlobalTextStatus: typeof import('./src/mocp/components/global-text-status/global-text-status.vue')['default']
GlobalUpload: typeof import('./src/mocp/components/global-upload/global-upload.vue')['default']
GlobalUploadImage: typeof import('./src/mocp/components/global-upload-image/global-upload-image.vue')['default']
// 自定义组件
......
......@@ -71,3 +71,12 @@ export const updateAogMaterialApi = (data, config) => {
config
})
}
export const updateAogConstructionApi = (data, config) => {
return http({
method: 'POST',
url: '/technical-support/updateAogConstruction',
data,
config
})
}
<template>
<up-action-sheet
:actions="actions"
:actions="getActions"
:title="title"
:description="description"
:cancelText="cancelText"
:round="round"
:show="show"
:show="modelValue"
:closeOnClickAction="true"
:closeOnClickOverlay="true"
@select="handleSelect"
......@@ -14,12 +14,23 @@
</template>
<script setup>
import { ref } from 'vue'
import { computed } from 'vue'
const show = ref(false)
const es = defineEmits(['select', 'close'])
const es = defineEmits(['update:modelValue', 'select', 'close'])
const ps = defineProps({
actions: {
modelValue: {
type: Boolean,
default: false
},
labelField: {
type: String,
default: 'label'
},
valueField: {
type: String,
default: 'value'
},
options: {
type: Array,
default: () => {
return []
......@@ -42,19 +53,21 @@ const ps = defineProps({
default: 10
}
})
const open = () => {
show.value = true
}
const getActions = computed(() => {
return ps.options.map((item) => {
return {
...item,
name: item[ps.labelField]
}
})
})
const handleSelect = (data) => {
show.value = false
es('select', data)
es('update:modelValue', false)
es('select', data[ps.valueField], data)
}
const handleClose = () => {
show.value = false
es('update:modelValue', false)
es('close')
}
defineExpose({
open
})
</script>
<style lang="scss" scoped></style>
export const aog_status = [
{ text: '未到位', class: 'mocp-color-warning-6', value: 0 },
{ text: '部分到位', class: 'mocp-color-primary-6', value: 1 },
{ text: '全部到位', class: 'mocp-color-success-6', value: 2 },
{ text: '-', class: 'mocp-color-text-4', value: 3 }
]
export const aogDetails_status = [
{ text: '未到位', class: 'mocp-color-warning-6', value: '0' },
{ text: '已到位', class: 'mocp-color-success-6', value: '1' }
]
export const bbDetails_status = [
{ text: '开始施工', class: 'mocp-color-primary-6', value: '0' },
{ text: '已完成', class: 'mocp-color-success-6', value: '1' },
{ text: '-', class: 'mocp-color-text-4', value: '-1' }
]
export const otherDetails_status = [
{ text: '已完成', class: 'mocp-color-success-6', value: '0' },
{ text: '未完成', class: 'mocp-color-danger-6', value: '1' }
]
<template>
<text :class="getStatus.class">{{ getStatus.text }}</text>
</template>
<script setup>
import { computed } from 'vue'
import * as dictData from './dictData'
import { cloneDeep } from 'lodash'
const ps = defineProps({
dictkey: {
type: String,
default: ''
},
options: {
type: Array,
default: () => {
return []
}
},
value: {
type: [String, Number],
default: ''
},
valueField: {
type: String,
default: 'value'
}
})
const getData = computed(() => {
if (ps.dictkey) {
if (dictData[ps.dictkey]) {
return cloneDeep(dictData[ps.dictkey])
} else {
throw new Error('请输入存在的dictkey值')
}
} else {
return ps.options || []
}
})
const getStatus = computed(() => {
const data = getData.value.find((item) => item[ps.valueField] == ps.value)
return data || {}
})
</script>
<style lang="scss" scoped></style>
......@@ -29,16 +29,28 @@ const useAogStore = defineStore('aog', {
details: undefined,
workBench: undefined, //工作台详情
disposalPlan: [], //处置方案
avData: [], //航材
toolData: [], //工具
materialIndex: -1, //航材(或工具)详情的下标
materialType: 1, //1-航材,2-工具
pData: [], //人员
pIndex: -1, //人员详情的下标
bbData: [], //施工情况
oData: [] //其他特殊保障
bbIndex: -1, //施工情况详情的下标
oData: undefined, //其他特殊保障
oIndex: -1 //其他特殊保障的下标
}
},
getters: {
/**
*
* @param {*} state
* @returns 获取对应状态
*/
getAvStatus(state) {
let avStatus = 3
if (state.avData && state.avData.length) {
......@@ -106,6 +118,11 @@ const useAogStore = defineStore('aog', {
}
return otherStatus
},
/**
*
* @param {*} state
* @returns 获取对应数据
*/
getMaterialData(state) {
if (state.materialType == 1) {
return state.avData
......@@ -123,52 +140,82 @@ const useAogStore = defineStore('aog', {
} else {
return undefined
}
},
getPDetails(state) {
if (state.pIndex >= 0) {
return state.pData[state.pIndex]
} else {
return undefined
}
},
getBbDetails(state) {
if (state.bbIndex >= 0) {
return state.bbData[state.bbIndex]
} else {
return undefined
}
},
getODetails(state) {
if (state.oIndex >= 0) {
return state.oData[state.oIndex]
} else {
return undefined
}
}
},
actions: {
async getWorkBenchList() {
const res = await getWorkBenchListApi({ workbenchId: this.details.workbenchId })
const res = await getWorkBenchListApi({ workbenchId: this.details?.workbenchId })
if (res.code == 200) {
this.workBench = res.data?.list[0]
}
},
async getAogDisposalPlan() {
const res = await getAogDisposalPlanApi({ workbenchId: this.details.workbenchId })
const res = await getAogDisposalPlanApi({ workbenchId: this.details?.workbenchId })
if (res.code == 200) {
this.disposalPlan = res.data
} else {
this.disposalPlan = []
}
},
async getAogMaterialList(materialType) {
const res = await getAogMaterialListApi({ workbenchId: this.details.workbenchId, materialType })
if (res.code == 200) {
const res = await getAogMaterialListApi({ workbenchId: this.details?.workbenchId, materialType })
if (res.code == 200 && res.data.materialMap) {
if (materialType == 1) {
this.avData = Object.values(res.data.materialMap).flat()
} else if (materialType == 2) {
this.toolData = Object.values(res.data.materialMap).flat()
}
} else {
this.avData = []
this.toolData = []
}
},
async getAogSupBase() {
const res = await getAogSupBaseApi({ workbenchId: this.details.workbenchId })
if (res.code == 200) {
const res = await getAogSupBaseApi({ workbenchId: this.details?.workbenchId })
if (res.code == 200 && res.data.mapList) {
this.pData = Object.values(res.data.mapList).flat()
} else {
this.pData = []
}
},
async getAogConstruction() {
const res = await getAogConstructionApi({ workbenchId: this.details.workbenchId })
const res = await getAogConstructionApi({ workbenchId: this.details?.workbenchId })
if (res.code == 200) {
this.bbData = res.data.constructionList
this.bbData = res.data.constructionList || []
}
},
async getAogOtherSup() {
const res = await getAogOtherSupApi({ workbenchId: this.details.workbenchId })
if (res.code == 200) {
const res = await getAogOtherSupApi({ workbenchId: this.details?.workbenchId })
if (res.code == 200 && res.data) {
this.oData = Object.entries(res.data).reduce((q, w) => {
if (w[0] !== 'otherData') {
q.push(w[1])
q.push({ ...w[1], key: w[0] })
}
return q
}, [])
} else {
this.oData = []
}
},
resetForm() {
......
......@@ -271,6 +271,42 @@
"style": {
"navigationBarTitleText": " "
}
},
{
"path": "pages/modules/mocp/panel/aog/personal-list",
"style": {
"navigationBarTitleText": "人员保障列表"
}
},
{
"path": "pages/modules/mocp/panel/aog/personal-details",
"style": {
"navigationBarTitleText": "人员保障详情"
}
},
{
"path": "pages/modules/mocp/panel/aog/construction-list",
"style": {
"navigationBarTitleText": "AOG施工列表"
}
},
{
"path": "pages/modules/mocp/panel/aog/construction-details",
"style": {
"navigationBarTitleText": "AOG施工详情"
}
},
{
"path": "pages/modules/mocp/panel/aog/other-list",
"style": {
"navigationBarTitleText": "其他特殊保障列表"
}
},
{
"path": "pages/modules/mocp/panel/aog/other-details",
"style": {
"navigationBarTitleText": "其他特殊保障详情"
}
}
],
"globalStyle": {
......
<template>
<text :class="getStatus.class">{{ getStatus.text }}</text>
</template>
<script setup>
import { computed } from 'vue'
const ps = defineProps({
//0-未到位,1-部分到位,2-全部到位,3-无
status: {
type: Number,
default: 3
}
})
const getStatus = computed(function () {
if (ps.status === 1) {
return {
text: '部分到位',
class: 'mocp-color-primary-6'
}
}
if (ps.status === 2) {
return {
text: '全部到位',
class: 'mocp-color-success-6'
}
}
if (ps.status === 3) {
return {
text: '无',
class: 'mocp-color-text-4'
}
}
return {
text: '未到位',
class: 'mocp-color-warning-6'
}
})
</script>
<style lang="scss" scoped></style>
<template>
<global-page title="AOG施工详情" showFooterBtn footerBtnText="修改状态" @handleFooterClick="handleFooterClick">
<view class="mocp-cell">
<up-cell-group v-if="getBbDetails">
<up-cell title="负责人" :value="getBbDetails.personLiable || '-'"></up-cell>
<up-cell title="开始时间" :value="getBbDetails.startTime || '-'"></up-cell>
<up-cell title="预计完成时间" :value="getBbDetails.expectCompleteTime || '-'"></up-cell>
<up-cell title="实际完成时间" :value="getBbDetails.realityCompleteTime || '-'"></up-cell>
<up-cell title="状态">
<template #value>
<global-text-status :value="getBbDetails.state" dictkey="bbDetails_status"></global-text-status>
</template>
</up-cell>
<up-cell title="步骤" :label="getBbDetails.stepContent || '-'"></up-cell>
</up-cell-group>
</view>
<global-action-sheet
v-model="showAction"
:options="[
{ label: '无', value: '-1' },
{ label: '开始施工', value: '0' },
{ label: '已完成', value: '1' }
]"
@select="handleSelect"
></global-action-sheet>
<up-modal
title="重置状态"
content="重置施工状态后,开始时间和完成时间将会清空,确认操作?"
:show="showConfirm"
showCancelButton
closeOnClickOverlay
@confirm="updateAogConstruction"
@cancel="show = false"
@close="show = false"
></up-modal>
</global-page>
</template>
<script setup>
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
import { ref } from 'vue'
import { updateAogConstructionApi } from 'mocp/api/aog'
const aogStore = useAogStore()
const { getBbDetails, details } = storeToRefs(aogStore)
//修改状态
const showAction = ref(false)
const showConfirm = ref(false)
const handleFooterClick = () => {
showAction.value = true
}
const state = ref('')
const handleSelect = (value) => {
state.value = value
if (value == '-1') {
showConfirm.value = true
} else {
updateAogConstruction()
}
}
const updateAogConstruction = async () => {
const params = {
id: getBbDetails.value?.id,
realityCompleteTime: 0,
startTime: 0,
state: state.value,
workbenchId: details.value?.workbenchId
}
if (state.value === '0') {
params.startTime = Date.now()
} else if (state.value === '1') {
params.realityCompleteTime = Date.now()
}
const res = await updateAogConstructionApi(params, { loading: true })
if (res.code == 200) {
uni.$mocpJump.navigateBack()
uni.$mocpMessage.success(res.message)
uni.$emit('updateBbData')
} else {
uni.$mocpMessage.error(res.message)
}
}
</script>
<style lang="scss" scoped>
.mocp-cell {
background: #fff;
}
</style>
<template>
<global-page :padding="24" title="AOG施工列表">
<template v-for="(item, index) in bbData" :key="item.id">
<global-card :title="`步骤${index + 1}`" titleSuffix="查看详情" @handleTitleClick="goTo(index)">
<global-text-status :value="item.state" dictkey="bbDetails_status"></global-text-status>
</global-card>
</template>
</global-page>
</template>
<script setup>
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
const aogStore = useAogStore()
const { bbData } = storeToRefs(aogStore)
const goTo = (index) => {
uni.$mocpJump.navigateTo('/panel/aog/construction-details').then(() => {
aogStore.setState('bbIndex', index)
})
}
</script>
<style lang="scss" scoped></style>
......@@ -50,19 +50,19 @@
</view>
</global-card>
<global-card title="航材" titleSuffix="查看物流" @handleTitleClick="goTo('/panel/aog/material-list', { materialType: 1 })">
<text-status :status="aogStore.getAvStatus"></text-status>
<global-text-status :value="aogStore.getAvStatus" dictkey="aog_status"></global-text-status>
</global-card>
<global-card title="工具" titleSuffix="查看物流" @handleTitleClick="goTo('/panel/aog/material-list', { materialType: 2 })">
<text-status :status="aogStore.getToolStatus"></text-status>
<global-text-status :value="aogStore.getToolStatus" dictkey="aog_status"></global-text-status>
</global-card>
<global-card title="人员" titleSuffix="查看物流">
<text-status :status="aogStore.getPersonnelStatus"></text-status>
<global-card title="人员" titleSuffix="查看行程" @handleTitleClick="goTo('/panel/aog/personal-list')">
<global-text-status :value="aogStore.getPersonnelStatus" dictkey="aog_status"></global-text-status>
</global-card>
<global-card title="施工情况">
<text-status :status="aogStore.getBbStatus"></text-status>
<global-card title="施工情况" @handleTitleClick="goTo('/panel/aog/construction-list')">
<global-text-status :value="aogStore.getBbStatus" dictkey="aog_status"></global-text-status>
</global-card>
<global-card title="其他特殊保障">
<text-status :status="aogStore.getOtherStatus"></text-status>
<global-card title="其他特殊保障" @handleTitleClick="goTo('/panel/aog/other-list')">
<global-text-status :value="aogStore.getOtherStatus" dictkey="aog_status"></global-text-status>
</global-card>
</template>
</global-page>
......@@ -75,27 +75,29 @@ import { useGetDictByValue } from 'mocp/hooks/use-dict/useDict'
import useAogStore from 'mocp/store/aog'
import useBaseStore from 'mocp/store/base'
import { onLoad } from '@dcloudio/uni-app'
import TextStatus from './components/text-status.vue'
import { nextTick } from 'vue'
const baseStore = useBaseStore()
const aogStore = useAogStore()
const { getWorkBenchList, getAogDisposalPlan, getAogMaterialList, getAogSupBase, getAogConstruction, getAogOtherSup } = aogStore
const { details, disposalPlan, workBench, materialType } = storeToRefs(aogStore)
onLoad(async () => {
uni.showLoading({
title: '加载中',
mask: true
onLoad(() => {
nextTick(async () => {
uni.showLoading({
title: '加载中',
mask: true
})
await Promise.all([
getWorkBenchList(),
getAogDisposalPlan(),
getAogMaterialList(1),
getAogMaterialList(2),
getAogSupBase(),
getAogConstruction(),
getAogOtherSup()
])
uni.hideLoading()
})
await Promise.all([
getWorkBenchList(),
getAogDisposalPlan(),
getAogMaterialList(1),
getAogMaterialList(2),
getAogSupBase(),
getAogConstruction(),
getAogOtherSup()
])
uni.hideLoading()
})
const goTo = (url, params) => {
if (params) {
......@@ -109,6 +111,9 @@ const goTo = (url, params) => {
uni.$on('updateMaterialData', () => {
getAogMaterialList(materialType.value)
})
uni.$on('updateBbData', () => {
getAogConstruction()
})
</script>
<style lang="scss" scoped>
@import './constants/details.scss';
......
......@@ -62,7 +62,7 @@ const goDetails = (data) => {
}
//筛选
const handleRightClick = () => {
uni.$mocpJump.redirectTo('/panel/aog/search')
uni.$mocpJump.navigateTo('/panel/aog/search')
}
//刷新
const paging = ref()
......
<template>
<global-page
title="航材进展详情"
:title="getTitle"
showFooterBtn
@handleFooterClick="handleFooterClick"
:footerBtnText="getMaterialDetails?.actualArrivalTime ? '取消到位' : '到位'"
......@@ -25,9 +25,10 @@
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
import { updateAogMaterialApi } from 'mocp/api/aog'
import { computed } from 'vue'
const aogStore = useAogStore()
const { getMaterialDetails } = storeToRefs(aogStore)
const { getMaterialDetails, materialType } = storeToRefs(aogStore)
const handleFooterClick = async () => {
const params = {
id: getMaterialDetails.value.id,
......@@ -42,6 +43,13 @@ const handleFooterClick = async () => {
uni.$mocpMessage.error(res.message)
}
}
const getTitle = computed(() => {
if (materialType.value == 1) {
return '航材进展列表详情'
} else {
return '工具进展列表详情'
}
})
</script>
<style lang="scss" scoped>
.mocp-cell {
......
......@@ -2,7 +2,7 @@
<global-page :padding="24" :title="getTitle">
<template v-for="(item, index) in getMaterialData" :key="item.id">
<global-card :title="item.pn" titleSuffix="查看详情" @handleTitleClick="goTo(index)">
{{ item.actualArrivalTime ? '已到位' : '未到位' }}
<global-text-status :value="item.actualArrivalTime ? '1' : '0'" dictkey="aogDetails_status"></global-text-status>
</global-card>
</template>
</global-page>
......
<template>
<global-page title="其他特殊保障详情">
<view class="mocp-cell">
<up-cell-group v-if="getODetails">
<up-cell title="负责人" :value="getODetails.userName || '-'"></up-cell>
<up-cell title="开始时间" :value="getODetails.startTime || '-'"></up-cell>
<up-cell title="预计完成时间" :value="getODetails.expectCompleteTime || '-'"></up-cell>
<up-cell title="实际完成时间" :value="getODetails.realityCompleteTime || '-'"></up-cell>
<up-cell title="状态">
<template #value>
<global-text-status :value="getODetails.state || '1'" dictkey="otherDetails_status"></global-text-status>
</template>
</up-cell>
<up-cell title="工作内容" :label="getODetails.content || '-'"></up-cell>
</up-cell-group>
</view>
</global-page>
</template>
<script setup>
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
const aogStore = useAogStore()
const { getODetails } = storeToRefs(aogStore)
</script>
<style lang="scss" scoped>
.mocp-cell {
background: #fff;
}
</style>
<template>
<global-page :padding="24" title="其他特殊保障列表">
<template v-for="(item, index) in oData" :key="item.id">
<global-card :title="oType[item.key]" titleSuffix="查看详情" @handleTitleClick="goTo(index)">
<global-text-status :value="item.state || '1'" dictkey="otherDetails_status"></global-text-status>
</global-card>
</template>
</global-page>
</template>
<script setup>
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
const oType = {
towAirplane: '拖飞机',
testParking: '试车位',
aerialEquipment: '高空设备',
hangar: '机库',
other: '其他',
refueling: '加注燃油'
}
const aogStore = useAogStore()
const { oData } = storeToRefs(aogStore)
const goTo = (index) => {
uni.$mocpJump.navigateTo('/panel/aog/other-details').then(() => {
aogStore.setState('oIndex', index)
})
}
</script>
<style lang="scss" scoped></style>
<template>
<global-page title="人员保障详情">
<view class="mocp-cell">
<up-cell-group v-if="getPDetails">
<up-cell title="姓名" :value="getPDetails.personnel"></up-cell>
<up-cell title="基地" :value="getPDetails.supBase"></up-cell>
<up-cell title="类型" :value="personnelActType[getPDetails.type]"></up-cell>
<up-cell title="状态">
<template #value>
<global-text-status :value="getPDetails.state" dictkey="aogDetails_status"></global-text-status>
</template>
</up-cell>
<up-cell title="领取时间" :value="getPDetails.collectionTime || '-'"></up-cell>
<up-cell title="预计到位时间" :value="getPDetails.expectCompleteTime || '-'"></up-cell>
<up-cell title="实际到位时间" :value="getPDetails.realityCompleteTime || '-'"></up-cell>
</up-cell-group>
</view>
</global-page>
</template>
<script setup>
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
const personnelActType = ['责任放行', '机械员', 'NDT', '金工', '试车', '必检', '电子']
const aogStore = useAogStore()
const { getPDetails } = storeToRefs(aogStore)
</script>
<style lang="scss" scoped>
.mocp-cell {
background: #fff;
}
</style>
<template>
<global-page :padding="24" title="人员保障列表">
<template v-for="(item, index) in pData" :key="item.id">
<global-card :title="item.personnel" titleSuffix="查看详情" @handleTitleClick="goTo(index)">
<global-text-status :value="item.state" dictkey="aogDetails_status"></global-text-status>
</global-card>
</template>
</global-page>
</template>
<script setup>
import { storeToRefs } from 'pinia'
import useAogStore from 'mocp/store/aog'
const aogStore = useAogStore()
const { pData } = storeToRefs(aogStore)
const goTo = (index) => {
uni.$mocpJump.navigateTo('/panel/aog/personal-details').then(() => {
aogStore.setState('pIndex', index)
})
}
</script>
<style lang="scss" scoped></style>
......@@ -102,12 +102,12 @@ const { searchData } = storeToRefs(aogStore)
const formData = ref(cloneDeep(searchData.value))
const handleReset = () => {
aogStore.resetForm()
uni.$mocpJump.redirectTo('/panel/aog/list')
uni.$mocpJump.navigateTo('/panel/aog/list')
uni.$emit('aogReload')
}
const handleConfirm = () => {
aogStore.setState('searchData', formData.value)
uni.$mocpJump.redirectTo('/panel/aog/list')
uni.$mocpJump.navigateTo('/panel/aog/list')
uni.$emit('aogReload')
}
</script>
......
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