<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>
