Newer
Older
xc-business-system / src / views / resource / outsideService / consumable / handoverEdit.vue
dutingting on 3 Jan 13 KB 需求开发+10
<!-- 废弃物资处理交接记录 详情 -->
<script name="ConsumableHandoverEdit" lang="ts" setup>
import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { IConsumableHandover, IConsumableHandoverGoods } from './consumable-interface'
import HandoverDetailDialog from './handoverDetailDialog.vue'
import type { IDictType } from '@/commonInterface/resource-interface'
import { detailConsumableHandover, getStreamConsumableHandover as getStream, saveConsumableHandover, updateConsumableHandover } from '@/api/resource/supplierConsumable'
import useUserStore from '@/store/modules/user'
import { getDictByCode } from '@/api/system/dict'
import { exportFile } from '@/utils/exportUtils'
import { printPdf } from '@/utils/printUtils'

// 变量
// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')

// 关键字段是否可以编辑
const keyFieldsDisable = ref<boolean>(true)

const userInfo = useUserStore()
const route = useRoute()
const router = useRouter()
const title = ref('')

// 子组件
const consumableHandoverRef = ref()
const refHandoverDetailDialog = ref()

const consumableHandover = ref<IConsumableHandover>({
  id: '',
  labCode: '',
  groupCode: '',
  recordNo: '',
  recordName: '废弃物资处理交接记录',
  createUserId: '',
  createTime: '',
  goodsHandleDetailList: [],
  createUserName: '',
  draft: '1', // 1/2是否是草稿箱
})

const goodsList = ref<Array<IConsumableHandoverGoods>>([])
const goodsColumns = [
  { text: '物资名称', value: 'goodsName', align: 'center', required: true },
  { text: '交接时间', value: 'handoverTime', align: 'center', width: '200', required: true },
  { text: '交接数量', value: 'handoverAmount', align: 'center', width: '160', required: true },
  { text: '计量单位', value: 'company', align: 'center', width: '200' },
  { text: '交接人', value: 'handoverUserName', align: 'center', width: '200', required: true },
  { text: '接收人', value: 'receiver', align: 'center', width: '160' },
] // 表头

const handoverRules = ref({
  labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }],
  groupCode: [{ required: true, message: '部门不能为空,请选择', trigger: ['change', 'blur'] }],
}) // 表单验证规则

// 字典值
const labCodeDict = ref<IDictType[]>([])
const groupCodeDict = ref<IDictType[]>([])

const recordSelected = ref<IConsumableHandoverGoods[]>([])

// 逻辑
// 关闭
const resetForm = () => {
  router.go(-1)
}

// 新增
const addEditableRow = () => {
  refHandoverDetailDialog.value.showRecordDialog(true)
}

const delConsumableRecords = () => {
  if (recordSelected.value.length === 0) {
    ElMessage.warning('请至少选择一行')
    return
  }

  goodsList.value = goodsList.value.filter(item => recordSelected.value.includes(item) === false)
}

const consumableMultiSelect = (e: any) => {
  recordSelected.value = e
}

// 保存至草稿箱
const saveDraftHandover = () => {
  consumableHandover.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
  const params = {
    ...consumableHandover.value,
    draft: '1',
  }
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  saveConsumableHandover(params).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
      // 设置返回的id和编号
      consumableHandover.value.recordNo = res.data.recordNo
      consumableHandover.value.id = res.data.id
      id.value = res.data.id

      type.value = 'detail'
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loading.close()
  })
}
// 编辑草稿箱(不走流程审批)
const updateDraftHandover = () => {
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  updateConsumableHandover(consumableHandover.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loading.close()
  })
}

// 提交
const submit = () => {
  const params = {
    ...consumableHandover.value,
    draft: '2',
  }
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  updateConsumableHandover(params).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('提交成功')
      type.value = 'detail'
      consumableHandover.value.draft = '2'
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loading.close()
  })
}

// 新建时保存后的处理 获取返回的id
const saveButtonHandler = async () => {
  if (!consumableHandoverRef) { return }

  if (goodsList.value.length === 0) {
    ElMessage.error('交接详情不能为空,请添加使用详情明细')
    return
  }

  await consumableHandoverRef.value.validate((valid: boolean) => {
    if (valid === true) {
      consumableHandover.value.goodsHandleDetailList = goodsList.value

      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        if (type.value === 'create') {
          saveDraftHandover()
        }
        else if (type.value === 'update') {
          updateDraftHandover()
        }
      })
    }
  })
}

// 根据id查询详情
const detailById = async (id: string) => {
  await detailConsumableHandover({ id }).then((res) => {
    if (res.code === 200) {
      consumableHandover.value = res.data
      goodsList.value = consumableHandover.value.goodsHandleDetailList
      consumableHandover.value.draft = `${consumableHandover.value.draft}`
    }
  })
}

const consumableHandoverAddHandler = (useDetail: IConsumableHandoverGoods) => {
  goodsList.value.push(useDetail)
}

const getLabCodeDict = async () => {
  // 先从缓存中获取
  if (sessionStorage.getItem('bizLabCode') === null || sessionStorage.getItem('bizLabCode') === undefined) {
    // 缓存中没有则调用接口查询
    await getDictByCode('bizLabCode').then((res) => {
      if (res.code === 200) {
        labCodeDict.value = res.data
      }
    })
  }
  else {
    labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCode')!)
  }
}

const getGroupCodeDict = async () => {
  // 先从缓存中获取
  if (sessionStorage.getItem('bizGroupCode') === null || sessionStorage.getItem('bizLabbizGroupCodeCode') === undefined) {
    // 缓存中没有则调用接口查询
    await getDictByCode('bizGroupCode').then((res) => {
      if (res.code === 200) {
        groupCodeDict.value = res.data
      }
    })
  }
  else {
    groupCodeDict.value = JSON.parse(sessionStorage.getItem('bizGroupCode')!)
  }
}

const initDict = async () => {
  await getLabCodeDict()
  await getGroupCodeDict()
}

const initDialog = (params: any) => {
  // 从路由中获取参数
  type.value = params.type
  id.value = params.id !== undefined ? params.id : ''

  switch (params.type) {
    case 'create' :
      title.value = '废弃物资处理交接记录(新增)'

      consumableHandover.value.createUserId = userInfo.id
      consumableHandover.value.createUserName = userInfo.name
      consumableHandover.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')

      keyFieldsDisable.value = false

      break
    case 'update':
      title.value = '废弃物资处理交接记录(编辑)'

      detailById(id.value)

      break
    case 'detail':
      title.value = '废弃物资处理交接记录(详情)'

      detailById(id.value)

      break
    default:
      title.value = ''
      break
  }
}
// --------------------------------导出word、pdf、打印----------------------------------------------------
const stream = ref()
const streamNormal = ref(true) // 流是否正常
// 获取流
const fetchStream = async (isPdf = true) => {
  const loading = ElLoading.service({
    lock: true,
    text: '加载中...',
    background: 'rgba(255, 255, 255, 0.6)',
  })
  const res = await getStream({ id: id.value, pdf: isPdf })
  stream.value = res.data
  loading.close()
}

// 打印Word
const printToWord = () => {
  fetchStream(false).then(() => {
    if (streamNormal.value) {
      exportFile(stream.value, '废弃物资处理交接记录.doc')
    }
  })
}

// 导出PDF
const printToPDF = () => {
  fetchStream().then(() => {
    if (streamNormal.value) {
      exportFile(new Blob([stream.value]), '废弃物资处理交接记录.pdf')
    }
  })
}

// 打印
const printClickedHandler = () => {
  fetchStream().then(() => {
    if (streamNormal.value) {
      const blobUrl = URL.createObjectURL(stream.value)
      printPdf(blobUrl)
    }
  })
}

onMounted(() => {
  initDict()
  initDialog(route.query)
})
</script>

<template>
  <app-container>
    <el-form ref="consumableHandoverRef" :model="consumableHandover" :rules="handoverRules" label-position="right" label-width="110px" border stripe>
      <detail-page :title="`${title}`">
        <template #btns>
          <template v-if="type === 'detail'">
            <el-button type="primary" @click="printToWord">
              导出Word
            </el-button>
            <el-button type="primary" @click="printToPDF">
              导出PDF
            </el-button>
            <el-button type="primary" @click="printClickedHandler">
              打印
            </el-button>
          </template>
          <el-button v-if="(type === 'detail' || type === 'update') && consumableHandover.draft === '1'" type="primary" @click="submit">
            提交
          </el-button>
          <el-button v-if="type !== 'detail'" type="primary" @click="saveButtonHandler">
            保存
          </el-button>

          <el-button type="info" @click="resetForm()">
            关闭
          </el-button>
        </template>

        <!-- 第一行 第一列
          <el-row :gutter="24">
            <el-col :span="6">
              <el-form-item label="实验室" prop="labCode">
                <el-select v-model="consumableUse.labCode" placeholder="请选择实验室" :disabled="keyFieldsDisable" style="width: 100%;">
                  <el-option v-for="dict in labCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
                </el-select>
              </el-form-item>
            </el-col>

            <el-col :span="6">
              <el-form-item label="部门" prop="groupCode">
                <el-select v-model="consumableUse.groupCode" placeholder="请选择部门" :disabled="keyFieldsDisable" style="width: 100%;">
                  <el-option v-for="dict in groupCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          -->
        <el-row :gutter="24">
          <el-col :span="6">
            <el-form-item label="文件编号">
              <el-input v-model="consumableHandover.recordNo" placeholder="文件编号,保存后自动生成" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="文件名称">
              <el-input v-model="consumableHandover.recordName" :disabled="true" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="创建人">
              <el-input v-model="consumableHandover.createUserName" :disabled="true" />
              <el-input v-model="consumableHandover.createUserId" type="hidden" />
            </el-form-item>
          </el-col>

          <el-col :span="6">
            <el-form-item label="创建时间">
              <el-input v-model="consumableHandover.createTime" :disabled="true" />
            </el-form-item>
          </el-col>
        </el-row>
      </detail-page>

      <table-container title="交接详情">
        <template v-if="type !== 'detail'" #btns-right>
          <el-button type="primary" @click="addEditableRow">
            增加行
          </el-button>
          <el-button type="info" @click="delConsumableRecords">
            删除行
          </el-button>
        </template>

        <!-- 表格区域 -->
        <el-table :data="goodsList" border style="width: 100%;" @selection-change="consumableMultiSelect">
          <el-table-column v-if="type !== 'detail'" type="selection" align="center" width="38" />
          <el-table-column align="center" label="序号" width="55" type="index" />
          <el-table-column
            v-for="item in goodsColumns"
            :key="item.value"
            :prop="item.value"
            :label="item.text"
            :width="item.width"
            align="center"
          >
            <template #header>
              <span v-show="item.required && type !== 'detail'" style="color: red;">*</span><span>{{ item.text }}</span>
            </template>
          </el-table-column>
        </el-table>
      </table-container>
    </el-form>

    <handover-detail-dialog ref="refHandoverDetailDialog" @record-saved="consumableHandoverAddHandler" />
  </app-container>
</template>