Commit 230e11af by pangchong

feat: 运行决策开发

parent c24653ce
......@@ -22,10 +22,13 @@ declare module 'vue' {
GlobalPageSwiperItem: typeof import('./src/mocp/components/global-page-swiper-item/global-page-swiper-item.vue')['default']
GlobalPicker: typeof import('./src/mocp/components/global-picker/global-picker.vue')['default']
GlobalPopup: typeof import('./src/mocp/components/global-popup/global-popup.vue')['default']
GlobalRadio: typeof import('./src/mocp/components/global-radio/global-radio.vue')['default']
GlobalTabs: typeof import('./src/mocp/components/global-tabs/global-tabs.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']
// 自定义组件
CustomCardDetails: typeof import('./src/mocp/components/widget/custom-card-details.vue')['default']
CustomCardDetailsItem: typeof import('./src/mocp/components/widget/custom-card-details-item.vue')['default']
CustomScore: typeof import('./src/mocp/components/widget/custom-score.vue')['default']
CustomState: typeof import('./src/mocp/components/widget/custom-state.vue')['default']
CustomTabbar: typeof import('./src/mocp/components/widget/custom-tabbar.vue')['default']
......
......@@ -27,6 +27,16 @@ export function createApp() {
activeColor: '#165dff',
labelColor: '#1D2129',
labelSize: 16
},
radio: {
activeColor: '#165dff',
labelColor: '#1D2129',
labelSize: 16
},
radioGroup: {
activeColor: '#165dff',
labelColor: '#1D2129',
labelSize: 16
}
}
})
......
......@@ -16,3 +16,19 @@ export const updateDecisionApi = (data, config) => {
config
})
}
export const updateMcoDirectorInfoApi = (data, config) => {
return http({
method: 'POST',
url: '/workbench/updateMcoDirectorInfo',
data,
config
})
}
export const updateApproverInfoApi = (data, config) => {
return http({
method: 'POST',
url: '/workbench/updateApproverInfo',
data,
config
})
}
<template>
<!-- 全局复选框 -->
<view class="checkbox" :style="getStyle">
<up-checkbox-group
v-model="checkboxValue"
:placement="placement"
@change="checkboxChange"
:disabled="disabled"
:activeColor="activeColor"
:labelSize="labelSize"
:labelColor="labelColor"
:borderBottom="borderBottom"
>
<view class="checkbox-group" :style="getStyle">
<up-checkbox-group v-model="checkboxValue" :placement="placement" @change="checkboxChange" :disabled="disabled" :borderBottom="borderBottom">
<up-checkbox
:customStyle="getCustomStyle"
0
v-for="(item, index) in getColumns"
:key="index"
:label="item.label"
......@@ -74,22 +66,18 @@ const ps = defineProps({
return {}
}
},
activeColor: {
type: String,
default: '#165dff'
},
// row|column
placement: {
type: String,
default: 'row'
},
labelSize: {
type: String,
default: '28rpx'
marginLeft: {
type: [String, Number],
default: 16
},
labelColor: {
type: String,
default: '#1D2129'
marginBottom: {
type: [String, Number],
default: 40
},
borderBottom: {
type: Boolean,
......@@ -114,10 +102,10 @@ const getCustomStyle = computed(() => {
...ps.customStyle
}
if (ps.placement == 'row') {
_style.marginLeft = '16rpx'
_style.marginLeft = ps.marginLeft
}
if (ps.placement == 'column') {
_style.marginBottom = '40rpx'
_style.marginBottom = ps.marginBottom
}
return _style
})
......@@ -157,7 +145,7 @@ const checkboxChange = (value) => {
}
</script>
<style lang="scss" scoped>
.checkbox {
.checkbox-group {
display: flex;
}
:deep(.u-checkbox) {
......
......@@ -56,7 +56,6 @@
</z-paging>
</template>
<script setup>
import { onUnload } from '@dcloudio/uni-app'
import { filterEmptyValues } from 'mocp/utils/tool'
import { computed, nextTick, onUnmounted, ref } from 'vue'
......
......@@ -9,7 +9,7 @@
</template>
<view class="popup-content-list" v-if="getFilterColumns.length">
<view
class="popup-content-item"
class="popup-content-item u-line-1"
:class="{ 'mocp-color-primary-6': modelValue == item[valueField] }"
v-for="(item, index) in getFilterColumns"
:key="index"
......
<template>
<!-- 全局单选框 -->
<up-radio-group
:style="getStyle"
class="radio-group"
v-model="radioValue"
:placement="placement"
@change="radioChange"
:disabled="disabled"
:borderBottom="borderBottom"
>
<up-radio :customStyle="getCustomStyle" v-for="(item, index) in getColumns" :key="index" :label="item.label" :name="item.value"></up-radio>
</up-radio-group>
</template>
<script setup>
import { computed, ref, watch } from 'vue'
import * as dictData from 'mocp/hooks/use-dict/dict-data'
import { cloneDeep } from 'lodash'
const es = defineEmits(['update:modelValue', 'change'])
const ps = defineProps({
//显示为空的value值
emptyValue: {
type: [String, Number],
default: ''
},
dictkey: {
type: String,
default: ''
},
modelValue: {
type: [String, Number],
default: ''
},
options: {
type: Array,
default: () => {
return []
}
},
labelField: {
type: String,
default: 'label'
},
valueField: {
type: String,
default: 'value'
},
radioAlign: {
type: String,
default: 'left'
},
disabled: {
type: Boolean,
default: false
},
customStyle: {
type: Object,
default: () => {
return {}
}
},
// row|column
placement: {
type: String,
default: 'row'
},
marginLeft: {
type: [String, Number],
default: 16
},
marginBottom: {
type: [String, Number],
default: 40
},
borderBottom: {
type: Boolean,
default: false
}
})
const radioValue = ref('')
//获取单选框样式
const getAlign = computed(() => {
let radioAlign = 'flex-start'
if (ps.radioAlign == 'center') {
radioAlign = 'center'
} else if (ps.radioAlign == 'right') {
radioAlign = 'flex-end'
}
return radioAlign
})
const getStyle = computed(() => {
return {
justifyContent: getAlign.value
}
})
const getCustomStyle = computed(() => {
const _style = {
...ps.customStyle
}
if (ps.placement == 'row') {
_style.marginLeft = ps.marginLeft + 'rpx'
}
if (ps.placement == 'column') {
_style.marginBottom = ps.marginBottom + 'rpx'
}
return _style
})
//获取下拉框的内容Columns
const getColumns = computed(() => {
if (ps.dictkey) {
return cloneDeep(dictData[ps.dictkey])
} else {
if (ps.options && Object.prototype.toString.call(ps.options[0]) == '[object Object]') {
return ps.options
} else {
return ps.options.map((item) => {
return {
[ps.labelField]: item,
[ps.valueField]: item
}
})
}
}
})
//监听设置默认值
watch(
[() => ps.modelValue, () => ps.options],
() => {
let option = getColumns.value.find((option) => String(option[ps.valueField]) === String(ps.modelValue))
if (option) {
radioValue.value = option[ps.valueField]
} else {
radioValue.value = ps.emptyValue
}
},
{ immediate: true }
)
const radioChange = (value) => {
es('update:modelValue', value)
es('change', value)
}
</script>
<style lang="scss" scoped></style>
......@@ -6,16 +6,11 @@
<text class="txt">{{ title }}</text>
</view>
<view class="right" v-if="edit">
<global-button type="text" @tap="handleAdd">{{ calendar != -1 ? '编辑' : '添加' }}</global-button>
<global-button type="text" @tap="handleAdd">编辑</global-button>
</view>
</view>
<view class="card-content">
<template v-if="type == 'appeal'">
<slot></slot>
</template>
<template v-else>
<slot></slot>
</template>
<slot></slot>
</view>
<slot name="footer" v-if="showfooter">
<view class="card-footer">
......@@ -36,11 +31,6 @@
import { timeStampFormat } from 'mocp/utils/tool'
const es = defineEmits(['handleAdd'])
const ps = defineProps({
// company,quality,appeal
type: {
type: String,
default: 'company'
},
title: {
type: String,
default: ''
......
......@@ -16,3 +16,7 @@ export const aw_validateType = [
{ label: '重复事件', value: '1' },
{ label: '同类事件', value: '2' }
]
export const aw_followUpFeedback = [
{ label: '是', value: '1' },
{ label: '否', value: '0' }
]
......@@ -76,10 +76,10 @@ const useBaseStore = defineStore('base', {
},
actions: {
async initSysData() {
uni.showLoading({
title: '正在加载系统所有基本参数中,请稍后!',
mask: true
})
// uni.showLoading({
// title: '正在加载系统所有基本参数中,请稍后!',
// mask: true
// })
try {
await Promise.all([
this.getAircraftNumbers(),
......
......@@ -77,13 +77,7 @@
{
"path": "pages/modules/mocp/panel/appraisal-record/edit",
"style": {
"navigationBarTitleText": "考核记录登记"
}
},
{
"path": "pages/modules/mocp/panel/appraisal-record/add",
"style": {
"navigationBarTitleText": "添加公司值班信息"
"navigationBarTitleText": ""
}
},
{
......@@ -101,7 +95,7 @@
{
"path": "pages/modules/mocp/panel/assign-work/details",
"style": {
"navigationBarTitleText": "早会工作详情"
"navigationBarTitleText": "布置工作详情"
}
},
{
......@@ -165,9 +159,15 @@
}
},
{
"path": "pages/modules/mocp/panel/move-decision/edit",
"path": "pages/modules/mocp/panel/move-decision/edit-mco-director",
"style": {
"navigationBarTitleText": "MCO主任意见"
}
},
{
"path": "pages/modules/mocp/panel/move-decision/edit-approver",
"style": {
"navigationBarTitleText": "编辑运行决策"
"navigationBarTitleText": "公司值班经理意见"
}
},
{
......
<template>
<global-page :padding="24" title="考核记录详情" showNavRight @handleRightClick="handleRightClick">
<global-page :padding="24" title="考核记录详情">
<template v-if="details">
<view class="details">
<view class="details-header">
......@@ -52,33 +52,45 @@
</view>
</view>
</view>
<card-details type="company" title="公司值班信息" showfooter :idcard="details.dmName" :calendar="details.optionSaveTime">
<card-details-item label="公司值班经理" :value="details.dmName || '-'"></card-details-item>
<card-details-item
<custom-card-details
title="公司值班信息"
showfooter
:idcard="details.dmName"
:calendar="details.optionSaveTime"
edit
@handleAdd="handleAdd(0)"
>
<custom-card-details-item label="公司值班经理" :value="details.dmName || '-'"></custom-card-details-item>
<custom-card-details-item
label="公司值班经理意见"
:value="details.opinionType != -1 ? useGetDictByValue('ar_opinionType', details.opinionType) : '-'"
></card-details-item>
<card-details-item label="公司值班经理意见描述" :value="details.dmMsg || '-'"></card-details-item>
</card-details>
<card-details type="quality" title="品质中心信息" showfooter :idcard="details.qmName" :calendar="details.qualitySaveTime">
<card-details-item label="品质中心经理" :value="details.qmName || '-'"></card-details-item>
<card-details-item
></custom-card-details-item>
<custom-card-details-item label="公司值班经理意见描述" :value="details.dmMsg || '-'"></custom-card-details-item>
</custom-card-details>
<custom-card-details
title="品质中心信息"
showfooter
:idcard="details.qmName"
:calendar="details.qualitySaveTime"
edit
@handleAdd="handleAdd(1)"
>
<custom-card-details-item label="品质中心经理" :value="details.qmName || '-'"></custom-card-details-item>
<custom-card-details-item
label="品质中心经理意见"
:value="details.qualityOpinionType != -1 ? useGetDictByValue('ar_opinionType', details.qualityOpinionType) : '-'"
></card-details-item>
<card-details-item label="品质中心经理意见描述" :value="details.qmMsg || '-'"></card-details-item>
</card-details>
<card-details type="appeal" title="申诉状态" titleIcon="email">
></custom-card-details-item>
<custom-card-details-item label="品质中心经理意见描述" :value="details.qmMsg || '-'"></custom-card-details-item>
</custom-card-details>
<custom-card-details title="申诉状态" titleIcon="email">
<view class="appeal-status">{{ useGetDictByValue('ar_appealInfo', details.appealInfo) }}</view>
<global-upload :fileList="getFileList" :showUpload="false"></global-upload>
</card-details>
</custom-card-details>
</template>
</global-page>
</template>
<script setup>
import CardDetails from './components/card-details.vue'
import CardDetailsItem from './components/card-details-item.vue'
import { timeStampFormat } from 'mocp/utils/tool'
import useAppraisalRecordStore from 'mocp/store/appraisal-record'
import { storeToRefs } from 'pinia'
......@@ -92,9 +104,20 @@ onLoad(() => {
appraisalRecordStore.setState('id', query.id)
appraisalRecordStore.getRqmDetails()
})
//跳转
const handleRightClick = () => {
uni.$mocpJump.navigateTo('/panel/appraisal-record/edit')
// 添加
const handleAdd = (isDuty) => {
let params = {}
let realName = ''
if (isDuty == 0) {
params = { id: details.value.id, isDuty, mid: details.value.dmUid, opinionType: details.value.opinionType, msg: details.value.dmMsg }
realName = details.value.dmName
} else {
params = { id: details.value.id, isDuty, mid: details.value.qmUid, opinionType: details.value.qualityOpinionType, msg: details.value.qmMsg }
realName = details.value.qmName
}
uni.$mocpJump.navigateTo('/panel/appraisal-record/edit').then(() => {
uni.$emit('appraisalRecordEdit', params, realName)
})
}
</script>
<style lang="scss" scoped>
......
<template>
<global-page :padding="24" title="筛选">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="状态" prop="status" :borderBottom="true">
<global-picker
v-model="formData.status"
pickAlign="right"
clearable
:options="[
{ label: 'OPEN', value: '1' },
{ label: 'CLOSE', value: '0' }
]"
></global-picker>
</up-form-item>
<up-form-item label="是否有效" prop="valid" :borderBottom="true">
<global-picker
v-model="formData.valid"
pickAlign="right"
:options="[
{ label: '有效', value: '1' },
{ label: '无效', value: '0' }
]"
clearable
></global-picker>
</up-form-item>
<up-form-item label="基地/职能部门" prop="department" :borderBottom="true">
<global-picker v-model="formData.department" pickAlign="right" :options="department" clearable filter></global-picker>
</up-form-item>
<up-form-item label="考核对象" prop="appraisee" :borderBottom="true">
<global-picker v-model="formData.appraisee" pickAlign="right" :options="appraisee" clearable filter></global-picker>
</up-form-item>
<up-form-item label="事件类别" prop="eventType" :borderBottom="true">
<global-picker v-model="formData.eventType" pickAlign="right" clearable dictkey="ar_eventType"></global-picker>
</up-form-item>
<up-form-item label="机号" prop="ac" :borderBottom="true">
<global-picker v-model="formData.ac" pickAlign="right" clearable :options="deviceNumList" filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startTime"
v-model:endTime="formData.stopTime"
clearable
></global-calendar>
</up-form-item>
</up-form>
<global-page title="筛选">
<view class="search-form">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="状态" prop="status" :borderBottom="true">
<global-picker
v-model="formData.status"
pickAlign="right"
clearable
:options="[
{ label: 'OPEN', value: '1' },
{ label: 'CLOSE', value: '0' }
]"
></global-picker>
</up-form-item>
<up-form-item label="是否有效" prop="valid" :borderBottom="true">
<global-picker
v-model="formData.valid"
pickAlign="right"
:options="[
{ label: '有效', value: '1' },
{ label: '无效', value: '0' }
]"
clearable
></global-picker>
</up-form-item>
<up-form-item label="基地/职能部门" prop="department" :borderBottom="true">
<global-picker v-model="formData.department" pickAlign="right" :options="department" clearable filter></global-picker>
</up-form-item>
<up-form-item label="考核对象" prop="appraisee" :borderBottom="true">
<global-picker v-model="formData.appraisee" pickAlign="right" :options="appraisee" clearable filter></global-picker>
</up-form-item>
<up-form-item label="事件类别" prop="eventType" :borderBottom="true">
<global-picker v-model="formData.eventType" pickAlign="right" clearable dictkey="ar_eventType"></global-picker>
</up-form-item>
<up-form-item label="机号" prop="ac" :borderBottom="true">
<global-picker v-model="formData.ac" pickAlign="right" clearable :options="deviceNumList" filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startTime"
v-model:endTime="formData.stopTime"
clearable
></global-calendar>
</up-form-item>
</up-form>
</view>
<template #bottom>
<view class="footer-btn">
<up-row gutter="10">
......@@ -71,6 +73,10 @@ const {
} = useAppraisalRecordStore()
</script>
<style lang="scss" scoped>
.search-form {
padding: 24rpx 24rpx 0 24rpx;
background: #fff;
}
.footer-btn {
padding: 24rpx 32rpx;
background-color: #fff;
......
<template>
<global-page
:padding="24"
:title="arrangeWorkExtend?.companyFullName"
title="布置工作详情"
:showNavRight="arrangeWorkExtendList.length > 1"
navRightType="icon"
:showFooterBtn="!!assignWorkStore.getDetailsFooterBtn"
......@@ -50,11 +50,14 @@
</view>
</view>
<template v-if="arrangeWorkExtend">
<card-details title="工作反馈" :showEmpty="arrangeWorkExtend.feedbackTime == '0'" v-if="arrangeWorkExtend.feedbackTime != '0'">
<card-details title="工作反馈" :showEmpty="arrangeWorkExtend.feedbackTime == '0'">
<card-details-item title="问题分析" :content="arrangeWorkExtend.problem"></card-details-item>
<card-details-item title="解决措施" label="工作目标" :content="arrangeWorkExtend.workTarget"></card-details-item>
<template v-for="(item, index) in assignWorkStore.getDecompose" :key="index">
<card-details-item :label="assignWorkStore.getDecompose.length > 1 ? '分解计划' + (index + 1) : '分解计划'" :content="item.plan">
<card-details-item
:label="assignWorkStore.getDecompose.length > 1 && index > 0 ? '分解计划' + (index + 1) : '分解计划'"
:content="item.plan"
>
<card-details-footer
rightLabel="完成时限:"
:rightValue="timeStampFormat(item.time, { format: 'YYYY/MM/DD' }) || '-'"
......@@ -90,7 +93,7 @@
></card-details-footer>
</card-details-item>
</card-details>
<card-details title="领导批示" :showEmpty="arrangeWorkExtend.approvalTime == '0'" v-if="arrangeWorkExtend.approvalTime != '0'">
<card-details title="领导批示" :showEmpty="arrangeWorkExtend.approvalTime == '0'">
<card-details-item
title="领导批示意见"
:content="useGetDictByValue('aw_leaderState', arrangeWorkExtend.leaderApprovalComments)"
......@@ -106,11 +109,7 @@
<card-details
title="跟踪反馈"
:showEmpty="arrangeWorkExtend.gzFeedbackTime == '0'"
v-if="
arrangeWorkExtend.gzFeedbackTime != '0' &&
arrangeWorkExtend.leaderApprovalComments != '' &&
arrangeWorkExtend.leaderApprovalComments != '1'
"
v-if="arrangeWorkExtend.feedbackTime && arrangeWorkExtend.approvalTime && arrangeWorkExtend.leaderApprovalComments != 1"
>
<card-details-item title="跟踪反馈" :content="arrangeWorkExtend.gzFeedbackContent"></card-details-item>
<card-details-footer
......@@ -123,11 +122,7 @@
<card-details
title="跟踪批示"
:showEmpty="arrangeWorkExtend.gzApprovalTime == '0'"
v-if="
arrangeWorkExtend.gzApprovalTime != '0' &&
arrangeWorkExtend.leaderApprovalComments != '' &&
arrangeWorkExtend.leaderApprovalComments != '1'
"
v-if="arrangeWorkExtend.approvalTime && arrangeWorkExtend.gzFeedbackTime && arrangeWorkExtend.leaderApprovalComments != 1"
>
<card-details-item
title="领导批示意见"
......@@ -144,7 +139,7 @@
<card-details
title="后续措施反馈"
:showEmpty="arrangeWorkExtend.followUpFeedbackTime == '0'"
v-if="arrangeWorkExtend.followUpFeedbackTime != '0' && arrangeWorkExtend.followUpFeedback == '1'"
v-if="arrangeWorkExtend.followUpFeedback == '1'"
>
<card-details-item :borderBottom="false" title="反馈内容" :content="arrangeWorkExtend.followUpFeedbackContent"></card-details-item>
<card-details-item
......@@ -162,7 +157,7 @@
></card-details-footer>
</card-details-item>
</card-details>
<card-details title="工作验证" :showEmpty="arrangeWorkExtend.eventType == ''" v-if="arrangeWorkExtend.eventType != ''">
<card-details title="工作验证" :showEmpty="arrangeWorkExtend.eventType == ''" v-if="assignWorkStore.isCreateUser">
<card-details-item title="跟踪要点" :content="arrangeWorkExtend.trackingPoints"></card-details-item>
<card-details-item label="批复附件">
<global-upload :fileList="arrangeWorkExtend.validateFileVoList" :showUpload="false"></global-upload>
......
......@@ -14,7 +14,7 @@
<template v-for="(item, index) in formData" :key="index">
<view class="form">
<up-form-item
:label="formData.length > 1 ? '分解计划' + (index + 1) : '分解计划'"
:label="formData.length > 1 && index > 0 ? '分解计划' + (index + 1) : '分解计划'"
:borderBottom="true"
labelPosition="top"
required
......
......@@ -49,7 +49,7 @@
<view class="plan-body-item">
<view class="plan-body-title">
<view class="left">
{{ decompose.length > 1 ? '分解计划' + (index + 1) : '分解计划' }}
{{ decompose.length > 1 && index > 0 ? '分解计划' + (index + 1) : '分解计划' }}
</view>
<view class="right">{{ timeStampFormat(item.time, { format: 'YYYY/MM/DD' }) }}</view>
</view>
......@@ -106,7 +106,12 @@
</up-form-item>
<up-form-item label="后续措施反馈" :borderBottom="true" required>
<view class="switch">
<up-switch v-model="formData.followUpFeedback" activeValue="1" inactiveValue="0"></up-switch>
<global-radio
radioAlign="right"
v-model="formData.followUpFeedback"
dictkey="aw_followUpFeedback"
empty-value="0"
></global-radio>
</view>
</up-form-item>
<up-form-item label="计划完成时间" :borderBottom="true" v-if="formData.followUpFeedback == 1" prop="pcTime" required>
......
......@@ -19,7 +19,7 @@
<view class="item-title">
<view class="left">
<custom-state :value="item.state == 1 ? 'OPEN' : 'CLOSE'"></custom-state>
<view class="txt u-line-1">{{ baseStore.getParamNameByValue('LayoutWorkType', item.workType) }}详情</view>
<view class="txt u-line-1">{{ item.seat }}</view>
</view>
<view class="right u-line-1">{{ baseStore.getParamNameByValue('LayoutWorkType', item.workType) }}</view>
</view>
......@@ -37,7 +37,7 @@
</view>
<view class="label">
<global-icon icon="idcard"></global-icon>
<text class="txt">{{ item.presenter }}</text>
<text class="txt">提出人:{{ item.presenter || '-' }}</text>
</view>
</view>
</view>
......
<template>
<global-page :padding="24" title="筛选">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="任务状态" prop="state" :borderBottom="true">
<global-picker
v-model="formData.state"
pickAlign="right"
clearable
:options="[
{ label: 'OPEN', value: '1' },
{ label: 'CLOSE', value: '2' }
]"
></global-picker>
</up-form-item>
<up-form-item label="提出人" prop="presenter" :borderBottom="true">
<up-input v-model="formData.presenter" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="管理席位" prop="seat" :borderBottom="true">
<global-picker
v-model="formData.seat"
pickAlign="right"
:options="assignWorkStore.getSeatUnitSelect"
clearable
filter
></global-picker>
</up-form-item>
<up-form-item label="工作类型" prop="workType" :borderBottom="true">
<global-picker
v-model="formData.workType"
pickAlign="right"
:options="baseStore.getParamsByType('LayoutWorkType')"
clearable
filter
></global-picker>
</up-form-item>
<up-form-item label="开始日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startTimeS"
v-model:endTime="formData.startTimeE"
clearable
></global-calendar>
</up-form-item>
</up-form>
<global-page title="筛选">
<view class="search-form">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="任务状态" prop="state" :borderBottom="true">
<global-picker
v-model="formData.state"
pickAlign="right"
clearable
:options="[
{ label: 'OPEN', value: '1' },
{ label: 'CLOSE', value: '2' }
]"
></global-picker>
</up-form-item>
<up-form-item label="提出人" prop="presenter" :borderBottom="true">
<up-input v-model="formData.presenter" inputAlign="right" border="none" placeholder="请输入" clearable></up-input>
</up-form-item>
<up-form-item label="管理席位" prop="seat" :borderBottom="true">
<global-picker
v-model="formData.seat"
pickAlign="right"
:options="assignWorkStore.getSeatUnitSelect"
clearable
filter
></global-picker>
</up-form-item>
<up-form-item label="工作类型" prop="workType" :borderBottom="true">
<global-picker
v-model="formData.workType"
pickAlign="right"
:options="baseStore.getParamsByType('LayoutWorkType')"
clearable
filter
></global-picker>
</up-form-item>
<up-form-item label="开始日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startTimeS"
v-model:endTime="formData.startTimeE"
clearable
></global-calendar>
</up-form-item>
</up-form>
</view>
<template #bottom>
<view class="footer-btn">
<up-row gutter="10">
......@@ -66,6 +68,10 @@ const assignWorkStore = useAssignWorkStore()
const baseStore = useBaseStore()
</script>
<style lang="scss" scoped>
.search-form {
padding: 24rpx 24rpx 0 24rpx;
background: #fff;
}
.footer-btn {
padding: 24rpx 32rpx;
background-color: #fff;
......
......@@ -32,11 +32,6 @@
}
}
}
&-footer {
&-item {
margin-top: 16rpx;
}
}
}
.time-list {
background: #fff;
......
......@@ -6,14 +6,20 @@
&-title {
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 16rpx;
border-bottom: 2rpx solid #f4f4f4;
.left {
display: flex;
align-items: center;
}
.right {
display: flex;
align-items: center;
justify-content: space-between;
.txt {
color: $mocp-text-5;
font-size: 34rpx;
font-size: 28rpx;
margin-left: 16rpx;
}
}
......
<template>
<global-page :padding="24" title="查看运行决策" showNavRight @handleRightClick="handleRightClick">
<global-page :padding="24" title="运行决策详情">
<template v-if="details">
<view class="details">
<view class="details-header">
......@@ -42,7 +42,7 @@
></global-field>
</view>
</view>
<view class="details-body-box">
<view class="details-body-wrap">
<view class="details-body-list">
<view class="details-body-item">
<view class="title">故障描述</view>
......@@ -60,24 +60,38 @@
</view>
</view>
</view>
<view class="details-footer">
<view class="details-footer-list">
<view class="details-footer-item">
<global-field label="批准人:" :value="details.approver || '-'"></global-field>
</view>
<view class="details-footer-item">
<global-field
label="决策结果:"
:value="useGetDictByValue('md_decisionState', details.decisionState) || '-'"
></global-field>
</view>
<view class="details-footer-item" v-if="details.decisionState == '0' && details.remark">
<global-field :value="details.remark"></global-field>
</view>
</view>
</view>
</view>
</view>
<custom-card-details
title="公司值班经理意见"
showfooter
:idcard="details.approverUpdateName"
:calendar="details.approverUpdateTime"
edit
@handleAdd="handleAdd('edit-approver')"
>
<custom-card-details-item label="公司值班经理" :value="details.approverName || '-'"></custom-card-details-item>
<custom-card-details-item
label="公司值班经理意见"
:value="useGetDictByValue('md_decisionState', details.decisionState) || '-'"
></custom-card-details-item>
<custom-card-details-item label="公司值班经理意见描述" :value="details.decisionOpinion || '-'"></custom-card-details-item>
</custom-card-details>
<custom-card-details
title="MCO主任意见"
showfooter
:idcard="details.mcoDirectorUpdateName"
:calendar="details.mcoDirectorUpdateTime"
edit
@handleAdd="handleAdd('edit-mco-director')"
>
<custom-card-details-item label="MCO主任" :value="details.mcoDirectorName || '-'"></custom-card-details-item>
<custom-card-details-item
label="MCO主任意见"
:value="useGetDictByValue('md_decisionState', details.mcoDirectorDecisionState) || '-'"
></custom-card-details-item>
<custom-card-details-item label="MCO主任意见描述" :value="details.mcoDirectorOpinion || '-'"></custom-card-details-item>
</custom-card-details>
<view class="time-list">
<view class="time-item">
<global-field label="填报人:" :value="details.filledBy"></global-field>
......@@ -103,8 +117,8 @@ const baseStore = useBaseStore()
const moveDecisionStore = useMoveDecisionStore()
const { details, getFileList } = storeToRefs(moveDecisionStore)
//跳转
const handleRightClick = () => {
uni.$mocpJump.navigateTo('/panel/move-decision/edit')
const handleAdd = (path) => {
uni.$mocpJump.navigateTo(`/panel/move-decision/${path}`)
}
</script>
<style lang="scss" scoped>
......
<template>
<global-page
:title="formData.isDuty == 0 ? '添加公司值班信息' : '添加品质中心信息'"
title="公司值班经理意见"
navLeftType="text"
showNavRight
navRightType="button"
......@@ -9,28 +9,18 @@
>
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto">
<up-form-item :label="formData.isDuty == 0 ? '公司值班经理' : '品质中心经理'" :borderBottom="true">
<global-picker pickAlign="right" clearable v-model="formData.mid" :options="selectList" emptyValue="-1"></global-picker>
<up-form-item label="公司值班经理" :borderBottom="true">
<global-picker pickAlign="right" clearable v-model="formData.approver" :options="selectList" filter></global-picker>
</up-form-item>
<up-form-item :label="formData.isDuty == 0 ? '公司值班经理意见' : '品质中心经理意见'" :borderBottom="true">
<global-picker
pickAlign="right"
clearable
v-model="formData.opinionType"
dictkey="ar_opinionType"
:emptyValue="-1"
></global-picker>
<up-form-item label="公司值班经理意见" :borderBottom="true">
<global-radio radioAlign="right" clearable v-model="formData.decisionState" dictkey="md_decisionState"></global-radio>
</up-form-item>
<up-form-item
:label="formData.isDuty == 0 ? '公司值班经理意见描述' : '品质中心经理意见描述'"
:borderBottom="true"
labelPosition="top"
>
<up-form-item label="公司值班经理意见描述" :borderBottom="true" labelPosition="top">
<up-textarea
placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"
:height="40"
border="none"
v-model="formData.msg"
v-model="formData.decisionOpinion"
></up-textarea>
</up-form-item>
</up-form>
......@@ -39,54 +29,45 @@
</template>
<script setup>
import { saveRqmOpinionApi } from 'mocp/api/appraisal-record'
import { getAdminListApi } from 'mocp/api/base'
import { onLoad } from '@dcloudio/uni-app'
import { reactive, ref } from 'vue'
import useAppraisalRecordStore from 'mocp/store/appraisal-record'
import useBaseStore from 'mocp/store/base'
import { storeToRefs } from 'pinia'
import useMoveDecisionStore from 'mocp/store/move-decision'
import { updateApproverInfoApi } from 'mocp/api/move-decision'
const appraisalRecordStore = useAppraisalRecordStore()
const baseStore = useBaseStore()
const moveDecisionStore = useMoveDecisionStore()
const { details } = storeToRefs(moveDecisionStore)
//表单数据
const formData = reactive({
id: '',
isDuty: 0,
mid: '-1',
opinionType: -1,
msg: ''
approver: '',
decisionState: '',
decisionOpinion: ''
})
//获取下拉框列表
const selectList = ref([])
onLoad(() => {
uni.$once('appraisalRecordAdd', (data, realName) => {
Object.assign(formData, data)
getAdminList(realName || '')
formData.id = details.value.id
formData.approver = details.value.approver
formData.decisionState = details.value.decisionState
formData.decisionOpinion = details.value.decisionOpinion
baseStore.getAdminList().then((res) => {
selectList.value = res
})
})
//获取下拉框列表
const selectList = ref([])
const getAdminList = async (realName) => {
const params = {
pageIndex: 1,
pageSize: 100,
realName
}
const res = await getAdminListApi(params, { loading: true })
if (res.code == 200) {
selectList.value = res.data.list.map((item) => {
return {
label: `${item.nickname}(${(item.enetAccount || '无易网号') + '-' + (item.deptFullName || '无机构')})`,
value: item.id
}
})
} else {
uni.$mocpMessage.error(res.message)
}
}
const handleRightClick = async () => {
const res = await saveRqmOpinionApi(formData, { loading: true })
const res = await updateApproverInfoApi(formData, { loading: true })
if (res.code == 200) {
uni.$mocpJump.navigateBack()
appraisalRecordStore.getRqmDetails()
uni.$mocpMessage.success(res.message)
res.data.approver = formData.approver
res.data.approverName = selectList.value.find((item) => item.value == formData.approver)?.label.split('(')[0] || ''
res.data.decisionState = formData.decisionState
res.data.decisionOpinion = formData.decisionOpinion
//更新详情
moveDecisionStore.setState('details', res.data)
} else {
uni.$mocpMessage.error(res.message)
}
......
<template>
<global-page title="MCO主任意见" navLeftType="text" showNavRight navRightType="button" navRightText="保存" @handleRightClick="handleRightClick">
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto">
<up-form-item label="MCO主任" :borderBottom="true">
<global-picker pickAlign="right" clearable v-model="formData.mcoDirector" :options="selectList" filter></global-picker>
</up-form-item>
<up-form-item label="MCP主任意见" :borderBottom="true">
<global-radio radioAlign="right" clearable v-model="formData.mcoDirectorDecisionState" dictkey="md_decisionState"></global-radio>
</up-form-item>
<up-form-item label="MCP主任意见描述" :borderBottom="true" labelPosition="top">
<up-textarea
placeholder="一段很长很长的内容文字,长文本自动换行,该选项的描述是一段很长的内容"
:height="40"
border="none"
v-model="formData.mcoDirectorOpinion"
></up-textarea>
</up-form-item>
</up-form>
</view>
</global-page>
</template>
<script setup>
import { onLoad } from '@dcloudio/uni-app'
import { reactive, ref } from 'vue'
import useBaseStore from 'mocp/store/base'
import { storeToRefs } from 'pinia'
import useMoveDecisionStore from 'mocp/store/move-decision'
import { updateMcoDirectorInfoApi } from 'mocp/api/move-decision'
const baseStore = useBaseStore()
const moveDecisionStore = useMoveDecisionStore()
const { details } = storeToRefs(moveDecisionStore)
//表单数据
const formData = reactive({
id: '',
mcoDirector: '',
mcoDirectorDecisionState: '',
mcoDirectorOpinion: ''
})
//获取下拉框列表
const selectList = ref([])
onLoad(() => {
formData.id = details.value.id
formData.mcoDirector = details.value.mcoDirector
formData.mcoDirectorDecisionState = details.value.mcoDirectorDecisionState
formData.mcoDirectorOpinion = details.value.mcoDirectorOpinion
baseStore.getAdminList().then((res) => {
selectList.value = res
})
})
const handleRightClick = async () => {
const res = await updateMcoDirectorInfoApi(formData, { loading: true })
if (res.code == 200) {
uni.$mocpJump.navigateBack()
uni.$mocpMessage.success(res.message)
res.data.mcoDirector = formData.mcoDirector
res.data.mcoDirectorName = selectList.value.find((item) => item.value == formData.mcoDirector)?.label.split('(')[0] || ''
res.data.mcoDirectorDecisionState = formData.mcoDirectorDecisionState
res.data.mcoDirectorOpinion = formData.mcoDirectorOpinion
//更新详情
moveDecisionStore.setState('details', res.data)
} else {
uni.$mocpMessage.error(res.message)
}
}
</script>
<style lang="scss" scoped>
.mocp-form {
background: #fff;
padding: 0 32rpx;
}
</style>
......@@ -19,7 +19,10 @@
<view class="item-title">
<view class="left">
<custom-state :value="useGetDictByValue('md_state', item.state)"></custom-state>
<text class="txt u-line-1">{{ item.decisionNumber }}</text>
</view>
<view class="right">
<text class="txt u-line-1" v-if="item.machineNumber">{{ item.machineNumber }}</text>
<text class="txt u-line-1" v-if="item.aviation">{{ item.aviation }}</text>
</view>
</view>
<view class="item-content u-line-3">
......@@ -32,10 +35,6 @@
{{ timeStampFormat(item.filledTime, { format: 'YYYY/MM/DD HH:mm' }) }}
</text>
</view>
<view class="label">
<global-icon icon="idcard"></global-icon>
<text class="txt">{{ item.filledBy }}</text>
</view>
</view>
</view>
</template>
......
<template>
<global-page :padding="24" title="筛选">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="状态" prop="state" :borderBottom="true">
<global-picker
v-model="formData.state"
pickAlign="right"
clearable
dictkey="md_state"
></global-picker>
</up-form-item>
<up-form-item label="航站" prop="terminal" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.terminal" clearable :options="baseStore.getTerminalSelect" filter></global-picker>
</up-form-item>
<up-form-item label="是否有效" prop="valid" :borderBottom="true">
<global-picker
v-model="formData.valid"
pickAlign="right"
:options="[
{ label: '有效', value: '1' },
{ label: '无效', value: '0' }
]"
clearable
></global-picker>
</up-form-item>
<up-form-item label="决策结果" prop="decisionState" :borderBottom="true">
<global-picker
v-model="formData.decisionState"
pickAlign="right"
:options="[
{ label: '同意', value: '1' },
{ label: '不同意', value: '0' }
]"
clearable
></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="机号" prop="machineNumber" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.machineNumber" :options="deviceNumList" clearable filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startDateTime"
v-model:endTime="formData.endDateTime"
clearable
></global-calendar>
</up-form-item>
</up-form>
<global-page title="筛选">
<view class="search-form">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="状态" prop="state" :borderBottom="true">
<global-picker v-model="formData.state" pickAlign="right" clearable dictkey="md_state"></global-picker>
</up-form-item>
<up-form-item label="航站" prop="terminal" :borderBottom="true">
<global-picker
pickAlign="right"
v-model="formData.terminal"
clearable
:options="baseStore.getTerminalSelect"
filter
></global-picker>
</up-form-item>
<up-form-item label="是否有效" prop="valid" :borderBottom="true">
<global-picker
v-model="formData.valid"
pickAlign="right"
:options="[
{ label: '有效', value: '1' },
{ label: '无效', value: '0' }
]"
clearable
></global-picker>
</up-form-item>
<up-form-item label="决策结果" prop="decisionState" :borderBottom="true">
<global-picker
v-model="formData.decisionState"
pickAlign="right"
:options="[
{ label: '同意', value: '1' },
{ label: '不同意', value: '0' }
]"
clearable
></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="机号" prop="machineNumber" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.machineNumber" :options="deviceNumList" clearable filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startDateTime"
v-model:endTime="formData.endDateTime"
clearable
></global-calendar>
</up-form-item>
</up-form>
</view>
<template #bottom>
<view class="footer-btn">
<up-row gutter="10">
......@@ -74,6 +83,10 @@ const {
} = useBaseStore()
</script>
<style lang="scss" scoped>
.search-form {
padding: 24rpx 24rpx 0 24rpx;
background: #fff;
}
.footer-btn {
padding: 24rpx 32rpx;
background-color: #fff;
......
......@@ -10,7 +10,7 @@
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto">
<up-form-item label="授权工程师" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.estimateEngineer" clearable :options="estimateOpts"></global-picker>
<global-picker pickAlign="right" v-model="formData.estimateEngineer" clearable :options="estimateOpts" filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-date pickAlign="right" v-model="formData.engineerTime" clearable :timestamp="false"></global-date>
......@@ -89,7 +89,7 @@ onLoad(() => {
formData.estimateEngineer = details.value.estimateEngineer
formData.estimateType = details.value.estimateType
formData.engineerTime = details.value.engineerTime
baseStore.getAdminList(details.value.estimateEngineerName).then((res) => {
baseStore.getAdminList().then((res) => {
estimateOpts.value = res
})
})
......
......@@ -10,7 +10,7 @@
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto">
<up-form-item label="机队经理或其授权人" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.otherName" clearable :options="otherNameOpts"></global-picker>
<global-picker pickAlign="right" v-model="formData.otherName" clearable :options="otherNameOpts" filter></global-picker>
</up-form-item>
<up-form-item label="机队经理或其授权人意见" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.opinionType" clearable dictkey="te_opinionType" emptyValue="0"></global-picker>
......@@ -44,7 +44,7 @@ onLoad(() => {
formData.num = details.value.num
formData.otherName = details.value.otherName
formData.opinionType = details.value.opinionType
baseStore.getAdminList(details.value.otherFullName).then((res) => {
baseStore.getAdminList().then((res) => {
otherNameOpts.value = res
})
})
......
......@@ -10,7 +10,7 @@
<view class="mocp-form">
<up-form labelPosition="left" labelWidth="auto">
<up-form-item label="客户工程授权人" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.customName" clearable :options="customNameOpts"></global-picker>
<global-picker pickAlign="right" v-model="formData.customName" clearable :options="customNameOpts" filter></global-picker>
</up-form-item>
<up-form-item label="客户工程授权人意见" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.customType" clearable dictkey="te_customType" emptyValue="0"></global-picker>
......@@ -44,7 +44,7 @@ onLoad(() => {
formData.num = details.value.num
formData.customName = details.value.customName
formData.customType = details.value.customType
baseStore.getAdminList(details.value.customFullName).then((res) => {
baseStore.getAdminList().then((res) => {
customNameOpts.value = res
})
})
......
<template>
<global-page :padding="24" title="筛选">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="状态" prop="state" :borderBottom="true">
<global-picker v-model="formData.state" pickAlign="right" clearable dictkey="te_state"></global-picker>
</up-form-item>
<up-form-item label="机号" prop="ac" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.ac" :options="deviceNumList" clearable filter></global-picker>
</up-form-item>
<up-form-item label="机型" prop="model" :borderBottom="true">
<global-picker v-model="formData.model" pickAlign="right" :options="baseStore.getTypeSelect" clearable filter></global-picker>
</up-form-item>
<up-form-item label="ATA章节" prop="ata" :borderBottom="true">
<global-picker v-model="formData.ata" pickAlign="right" :options="baseStore.getATASelect" clearable filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startDateTime"
v-model:endTime="formData.endDateTime"
clearable
></global-calendar>
</up-form-item>
</up-form>
<global-page title="筛选">
<view class="search-form">
<up-form labelPosition="left" labelWidth="auto" :model="formData" ref="formRef">
<up-form-item label="状态" prop="state" :borderBottom="true">
<global-picker v-model="formData.state" pickAlign="right" clearable dictkey="te_state"></global-picker>
</up-form-item>
<up-form-item label="机号" prop="ac" :borderBottom="true">
<global-picker pickAlign="right" v-model="formData.ac" :options="deviceNumList" clearable filter></global-picker>
</up-form-item>
<up-form-item label="机型" prop="model" :borderBottom="true">
<global-picker v-model="formData.model" pickAlign="right" :options="baseStore.getTypeSelect" clearable filter></global-picker>
</up-form-item>
<up-form-item label="ATA章节" prop="ata" :borderBottom="true">
<global-picker v-model="formData.ata" pickAlign="right" :options="baseStore.getATASelect" clearable filter></global-picker>
</up-form-item>
<up-form-item label="日期" :borderBottom="true">
<global-calendar
pickAlign="right"
v-model:startTime="formData.startDateTime"
v-model:endTime="formData.endDateTime"
clearable
></global-calendar>
</up-form-item>
</up-form>
</view>
<template #bottom>
<view class="footer-btn">
<up-row gutter="10">
......@@ -47,6 +49,10 @@ const {
} = useBaseStore()
</script>
<style lang="scss" scoped>
.search-form {
padding: 24rpx 24rpx 0 24rpx;
background: #fff;
}
.footer-btn {
padding: 24rpx 32rpx;
background-color: #fff;
......
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