337 lines
9.5 KiB
Vue
337 lines
9.5 KiB
Vue
<template>
|
||
<view>
|
||
<navbar-back :autoBack="false" title="数据上报" @leftClick="customBack"></navbar-back>
|
||
<u-row gutter="16">
|
||
<u-col span="4">
|
||
<view class="content-title-name">
|
||
<text>任务列表</text>
|
||
<up-badge v-if="taskList.length > 0" class="ml5" :value="taskList.length" type="warning"></up-badge>
|
||
</view>
|
||
<u-gap height="5" bg-color="#0055A2"></u-gap>
|
||
<scroll-view
|
||
style="height: 75vh"
|
||
scroll-y
|
||
scroll-with-animation
|
||
class="content-main-left"
|
||
:scroll-top="scrollTop"
|
||
>
|
||
<TaskItem
|
||
v-for="(task, index) in taskList"
|
||
:key="index"
|
||
:task="task"
|
||
:active="current === index"
|
||
@click="switchTask(index)"
|
||
/>
|
||
</scroll-view>
|
||
</u-col>
|
||
<u-col span="8">
|
||
<view class="content-title-name">
|
||
<text>样品列表</text>
|
||
</view>
|
||
<u-gap height="5" bg-color="#0055A2"></u-gap>
|
||
<view>
|
||
<scroll-view scroll-y scroll-with-animation style="height: calc(75vh - 60px)">
|
||
<block v-for="(sample, index) in sampleList" :key="index">
|
||
<view class="p5 fs16">
|
||
<u-row
|
||
@click="showSampleDetail(sample.id, index)"
|
||
:class="selectedIndex === index ? 'selected_Sample' : ''"
|
||
>
|
||
<u-col span="2" class="text-center" :style="sampleStyle(sample)">
|
||
<view>
|
||
<text>【{{ sample.sort }}】</text>
|
||
</view>
|
||
</u-col>
|
||
<u-col span="5">
|
||
<view>
|
||
<text class="pl10">{{ sample.sampleCode }}</text>
|
||
</view>
|
||
<view>
|
||
<text class="pl10"
|
||
>{{ getDataSourceTypeShow(sample.dataSourceType) }}{{ sample.sampleName }}</text
|
||
>
|
||
</view>
|
||
</u-col>
|
||
<u-col span="5">
|
||
<view class="sample_desc_warn" v-if="sample.sampleProcessNo !== currentNode">
|
||
当前节点:{{ getProcessNameShow(sample.sampleProcessNo) }}
|
||
</view>
|
||
</u-col>
|
||
</u-row>
|
||
<u-line class="p5" color="#bbb" />
|
||
</view>
|
||
</block>
|
||
</scroll-view>
|
||
<view class="content-main-right-operation">
|
||
<u-row :gutter="16">
|
||
<u-col span="4">
|
||
<u-button class="btn-operation" type="primary" @click="previewPDF" v-if="currentTaskId">
|
||
任务单预览
|
||
</u-button>
|
||
</u-col>
|
||
<u-col span="4">
|
||
<u-button
|
||
class="btn-operation"
|
||
v-if="currentTaskId"
|
||
type="warning"
|
||
:disabled="taskReviewDisabled"
|
||
@click="taskReview"
|
||
>
|
||
撤回任务单
|
||
</u-button>
|
||
</u-col>
|
||
<u-col span="4">
|
||
<u-button class="btn-operation" :disabled="dataReportDisabled" type="success" @click="dataReport">
|
||
数据上报
|
||
</u-button>
|
||
</u-col>
|
||
</u-row>
|
||
</view>
|
||
</view>
|
||
</u-col>
|
||
</u-row>
|
||
<!-- 样品详情 -->
|
||
<sample-detail-popup
|
||
ref="sampleDetailPopup"
|
||
v-model:showPopup="showDetailPopup"
|
||
:detailPopupParam="detailPopupParam"
|
||
></sample-detail-popup>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { ref, computed, onMounted } from 'vue'
|
||
import { onLoad, onBackPress } from '@dcloudio/uni-app'
|
||
import SampleDetailPopup from '@/components/sample/sample-detail-popup.vue'
|
||
import TaskItem from './components/task-item.vue'
|
||
import { getDataSourceTypeShow } from '../common'
|
||
import nx from '@/nx'
|
||
|
||
// 响应式数据
|
||
const scrollTop = ref(0)
|
||
const current = ref(0)
|
||
const currentTask = ref({})
|
||
const currentTaskId = ref('')
|
||
const currentTaskNo = ref('')
|
||
const conAssayTask = ref('')
|
||
const reviewNum = ref(0)
|
||
const selectedIndex = ref(-1)
|
||
const taskList = ref([])
|
||
const sampleList = ref([])
|
||
const showDetailPopup = ref(false)
|
||
const detailPopupParam = ref({ taskDetailId: '' })
|
||
const currentNode = ref('F31')
|
||
const dicSampleProcessCodeList = ref([])
|
||
|
||
// 计算属性
|
||
const taskReviewDisabled = computed(() => currentTask.value.finishStatus !== 'finished')
|
||
const dataReportDisabled = computed(() => currentTask.value.finishStatus !== 'finished')
|
||
const userInfo = computed(() => nx.$store('user').userInfo)
|
||
|
||
// 方法
|
||
const customBack = () => {
|
||
uni.reLaunch({ url: '/pages/analysis/index/index' })
|
||
}
|
||
|
||
const sampleStyle = sample => {
|
||
if ((sample.weightSubmitStatus === 0 || sample.weightSubmitStatus === 1) && sample.reviewCount > 0) {
|
||
return 'color: red'
|
||
}
|
||
if (sample.weightSubmitStatus === 2 && sample.reviewCount > 0) {
|
||
return 'color: green'
|
||
}
|
||
return ''
|
||
}
|
||
|
||
const switchTask = async index => {
|
||
if (index === current.value) return
|
||
current.value = index
|
||
const task = taskList.value[index]
|
||
currentTask.value = task
|
||
currentTaskNo.value = task.taskNo
|
||
currentTaskId.value = task.id
|
||
getAssayTaskDetail(task.taskNo)
|
||
}
|
||
|
||
const showSampleDetail = (detailId, index) => {
|
||
selectedIndex.value = index
|
||
detailPopupParam.value = { taskDetailId: detailId }
|
||
showDetailPopup.value = true
|
||
}
|
||
|
||
const getAssayTask = () => {
|
||
taskList.value = []
|
||
sampleList.value = []
|
||
const param = {
|
||
finishStatus: 'finished',
|
||
wfStatus: '0,revoke',
|
||
assayOper: userInfo.value.nickname
|
||
}
|
||
nx.$api.auncel
|
||
.getAssayTaskList(param)
|
||
.then(res => {
|
||
taskList.value = res
|
||
if (taskList.value.length > 0) {
|
||
current.value = 0
|
||
currentTask.value = taskList.value[0]
|
||
currentTaskNo.value = taskList.value[0].taskNo
|
||
currentTaskId.value = taskList.value[0].id
|
||
getAssayTaskDetail(currentTaskNo.value)
|
||
} else {
|
||
current.value = 0
|
||
currentTask.value = {}
|
||
currentTaskNo.value = ''
|
||
currentTaskId.value = ''
|
||
}
|
||
})
|
||
.catch(err => {
|
||
console.error(err)
|
||
})
|
||
}
|
||
|
||
const getAssayTaskDetail = taskNo => {
|
||
reviewNum.value = 0
|
||
$u.api
|
||
.getAssayTaskDetailListByTaskNo({ taskNo })
|
||
.then(res => {
|
||
sampleList.value = res.result || []
|
||
if (res.additionalProperties?.conAssayTask) {
|
||
conAssayTask.value = res.additionalProperties.conAssayTask
|
||
}
|
||
})
|
||
.catch(err => {
|
||
console.error(err)
|
||
})
|
||
}
|
||
|
||
const previewPDF = () => {
|
||
const url = `/pages/analysis/sample/pdf-preview?taskId=${currentTaskId.value}&reportKey=${conAssayTask.value.assayTaskTemplateKey}&hideResultFlag=true`
|
||
uni.navigateTo({ url })
|
||
}
|
||
|
||
const taskReview = () => {
|
||
const errNodeList = sampleList.value.filter(item => item.sampleProcessNo !== currentNode.value)
|
||
if (errNodeList.length > 0) {
|
||
uni.showToast({ title: '存在异常节点,联系管理员处理!', icon: 'none', duration: 3000 })
|
||
return
|
||
}
|
||
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: '撤回当前任务指派单,是否继续?',
|
||
cancelColor: '#0055A2',
|
||
confirmColor: '#0055A2',
|
||
success: res => {
|
||
if (res.confirm) {
|
||
nx.$api.assayTask.rollbackAssayTask(currentTaskId.value).then(() => {
|
||
currentTaskId.value = ''
|
||
currentTask.value = {}
|
||
uni.showToast({ title: '撤回成功!' })
|
||
uni.navigateTo({ url: '/pages/analysis/sample/sample-work-list' })
|
||
})
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
const dataReport = () => {
|
||
const errNodeList = sampleList.value.filter(item => item.sampleProcessNo !== currentNode.value)
|
||
if (errNodeList.length > 0) {
|
||
uni.showToast({ title: '存在异常节点,联系管理员处理!', icon: 'none', duration: 3000 })
|
||
return
|
||
}
|
||
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: '确定上报数据?',
|
||
cancelColor: '#0055A2',
|
||
confirmColor: '#0055A2',
|
||
success: res => {
|
||
if (res.confirm) {
|
||
nx.$api.assayTask.reportAssayTask(currentTaskId.value).then(res => {
|
||
currentTaskId.value = ''
|
||
currentTask.value = {}
|
||
if (res.additionalProperties?.conAssayTask?.isPrint === 1) {
|
||
printTask()
|
||
}
|
||
getAssayTask()
|
||
})
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
const getDicSampleProcessCodeList = () => {
|
||
nx.$api.assayTask.queryQmsDicSampleProcessCodeList().then(res => {
|
||
dicSampleProcessCodeList.value = res.records
|
||
})
|
||
}
|
||
|
||
const getProcessNameShow = val => {
|
||
const item = dicSampleProcessCodeList.value.find(i => i.processCode === val)
|
||
return item ? item.processName : val
|
||
}
|
||
|
||
const printTask = () => {
|
||
uni.showModal({
|
||
title: '提示',
|
||
content: '数据上报成功!是否打印“原始记录单”?',
|
||
cancelColor: '#0055A2',
|
||
confirmColor: '#0055A2',
|
||
success: res => {
|
||
if (res.confirm) {
|
||
nx.$print.getPrintTemplateAndPrint(currentTask.value)
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
// 生命周期
|
||
onMounted(() => {
|
||
getDicSampleProcessCodeList()
|
||
getAssayTask()
|
||
})
|
||
|
||
onBackPress(() => {
|
||
customBack()
|
||
return true
|
||
})
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.content-title-name {
|
||
height: 50px;
|
||
box-sizing: border-box;
|
||
font-size: 20px;
|
||
font-weight: 300;
|
||
padding: 10px;
|
||
text-align: center;
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
|
||
.content-main-left {
|
||
background-color: #f6f6f6;
|
||
}
|
||
|
||
.content-main-right-operation {
|
||
height: 50px;
|
||
padding-top: 10px;
|
||
padding-right: 10px;
|
||
}
|
||
|
||
.btn-operation {
|
||
font-size: 18px;
|
||
width: 95%;
|
||
}
|
||
|
||
.selected_Sample {
|
||
background-color: #d7e9fa;
|
||
}
|
||
.sample_desc_warn {
|
||
color: red;
|
||
padding-right: 10px;
|
||
}
|
||
</style>
|