123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- <template>
- <div class="hc-uni-app-table-form" :class="[editType]">
- <hc-table-form ref="tableFormRef" :form="tableFormInfo" :html="excelHtml" :scroll="false" :pkey="appItem.excelId" @render="tableFormRender" />
- </div>
- </template>
- <script setup>
- import { onMounted, ref, watch } from 'vue'
- import { useAppStore } from '~src/store'
- import queryApi from '~api/ledger/query'
- import { getArrValue, getObjVal, getObjValue, isString } from 'js-fast-way'
- const props = defineProps({
- option: {
- type: Object,
- default: () => ({}),
- },
- })
- //初始变量
- const useAppState = useAppStore()
- //基础变量
- const appItem = ref(props.option)
- const tableFormRef = ref(null)
- const editType = ref('form')
- //深度监听
- watch(() => [
- props.option,
- ], ([option]) => {
- appItem.value = getObjValue(option)
- getDataApi()
- }, { deep: true })
- //渲染完成
- onMounted(() => {
- //设置主题
- useAppState.setTheme('light')
- useAppState.setThemeVal('light')
- if (getObjVal(appItem.value)) {
- getDataApi()
- }
- editTypeClick('form')
- //接受app传递过来的消息
- window.addEventListener('message', (event) => {
- if (event.data.source === 'app') {
- setMessage(event.data)
- }
- })
- })
- //设置消息
- const setMessage = ({ data, type }) => {
- if (type === 'editTypeClick') {
- editTypeClick(data)
- } else if (type === 'formSave') {
- toSaveClick()
- } else if (type === 'pageTap') {
- getBussDataInfo(data)
- } else if (type === 'addForm') {
- addTableFormClick()
- } else if (type === 'delForm') {
- delTableFormClick()
- } else if (type === 'linkIds') {
- let ids = data ? JSON.parse(data) : []
- linkTableFormClick(ids)
- } else if (type === 'copyFormData') {
- copyTableFormClick()
- } else if (type === 'getPdfUrl') {
- getBussPdfInfo()
- }
- }
- const getDataApi = async () => {
- const { excelId } = appItem.value
- if (excelId) {
- await getTableFormInfo()
- await getExcelHtml()
- }
- }
- //获取表单初始数据
- const getFormDataInit = (data = {}) => {
- const { projectId, contractId, excelId, date } = appItem.value
- return {
- linkTabIds: [],
- ...data,
- projectId: projectId,
- contractId: contractId,
- recordTime: date,
- pkeyId: excelId,
- isTheLog: '1',
- theLogId: '',
- classify: 1,
- }
- }
- //获取已填写的数据
- const formLogDataList = ref([])
- const getTableFormInfo = async () => {
- const { contractId, excelId, pkeyId, date } = appItem.value
- const { data } = await queryApi.getTheLogBusinessData({
- contractId: contractId,
- pkeyId: excelId,
- nodePrimaryKeyId: pkeyId,
- recordTime: date,
- theLogId: '',
- }, false)
- let res = getArrValue(data), formArrData = []
- if (res.length > 0) {
- for (let i = 0; i < res.length; i++) {
- formArrData.push(getFormDataInit(res[i]))
- }
- } else {
- formArrData.push(getFormDataInit())
- }
- formLogDataList.value = formArrData
- setFormLength()
- getBussDataInfo()
- }
- //获取表单初始数据
- const formLogIndex = ref(0)
- const tableFormInfo = ref({})
- const getBussDataInfo = (index = 0) => {
- const formLog = formLogDataList.value
- const info = getObjValue(formLog[index])
- formLogIndex.value = index
- if (getObjVal(info)) {
- tableFormInfo.value = info
- } else {
- tableFormInfo.value = {}
- }
- window?.postMessage({
- type: 'formIndex',
- source: 'web',
- data: {
- id: info?.id ?? '',
- page: index + 1,
- },
- })
- }
- //获取模板标签数据
- const excelHtml = ref('')
- const isTableForm = ref(false)
- const getExcelHtml = async () => {
- const { contractId, excelId } = appItem.value
- if (excelId) {
- //获取数据
- const { error, code, data } = await queryApi.getExcelHtml({
- contractId: contractId,
- pkeyId: excelId,
- }, false)
- //处理数据
- const resData = isString(data) ? data || '' : ''
- if (!error && code === 200 && resData) {
- excelHtml.value = resData
- isTableForm.value = true
- } else {
- excelHtml.value = ''
- isTableForm.value = false
- postMsg('暂无表单', 'error')
- }
- } else {
- isTableForm.value = false
- postMsg('参数异常', 'error')
- }
- }
- //渲染完成
- const tableFormRender = (form) => {
- tableFormInfo.value = form
- window?.postMessage({
- type: 'formRender',
- source: 'web',
- data: {},
- })
- }
- //新增表格
- const addTableFormClick = () => {
- const defaultData = getFormDataInit()
- formLogDataList.value.push(defaultData)
- const index = formLogDataList.value.length - 1
- setFormLength()
- getBussDataInfo(index)
- postMsg('新增成功', 'success')
- }
- //删除当前页
- const delTableFormClick = () => {
- const index = formLogIndex.value
- formLogDataList.value.splice(index, 1)
- const logIndex = index <= 0 ? 0 : index - 1
- formLogIndex.value = logIndex
- setFormLength()
- getBussDataInfo(logIndex)
- postMsg('删除成功', 'success')
- }
- //复制当前表格及内容
- const copyTableFormClick = () => {
- const index = formLogIndex.value
- const formLog = formLogDataList.value
- const info = getObjValue(formLog[index])
- const defaultData = getFormDataInit(info)
- formLogDataList.value.push({
- ...defaultData,
- id: '',
- })
- setFormLength()
- getBussDataInfo(formLogDataList.value.length - 1)
- postMsg('复制成功', 'success')
- }
- //更新表单数量
- const setFormLength = () => {
- window?.postMessage({
- type: 'formLength',
- source: 'web',
- data: formLogDataList.value.length,
- })
- }
- //更新关联工序
- const linkTableFormClick = (data) => {
- const index = formLogIndex.value
- const formLog = formLogDataList.value
- const info = getObjValue(formLog[index])
- info.linkTabIds = data
- formLogDataList.value[index] = info
- tableFormInfo.value.linkTabIds = data
- }
- //预览PDF
- const getBussPdfInfo = async () => {
- const { contractId, excelId, pkeyId, date } = appItem.value
- const { data } = await queryApi.getBussPdfInfo({
- contractId: contractId,
- pkeyId: excelId,
- nodePrimaryKeyId: pkeyId,
- recordTime: date,
- theLogId: '',
- }, false)
- //处理数据
- const resData = isString(data) ? data ?? '' : ''
- window?.postMessage({
- type: 'formPdfUrl',
- source: 'web',
- data: resData,
- })
- }
- //切换显示模式
- const tableWidth = ref(0)
- const editTypeClick = (type) => {
- let metaEle = document.getElementsByName('viewport')[0]
- if (type === 'form') {
- metaEle.setAttribute('content', 'width=device-width,user-scalable=no,initial-scale=1.0')
- tableWidth.value = 0
- } else if (type === 'table') {
- metaEle.setAttribute('content', 'width=1080, initial-scale=0.5,user-scalable=yes')
- tableWidth.value = document.body.offsetWidth
- }
- editType.value = type
- }
- //保存表单
- const toSaveClick = async () => {
- const formLog = formLogDataList.value
- let isLink = await isLinkTabIds(formLog)
- if (!isLink) {
- postMessage({
- type: 'saveRes',
- data: false,
- })
- return
- }
- //发起请求
- const { error, code } = await queryApi.saveExcelBussData({
- dataInfo: { orderList: formLog },
- }, false)
- if (!error && code === 200) {
- postMessage({
- type: 'saveRes',
- data: true,
- })
- postMsg('保存成功', 'success')
- getBussPdfInfo().then()
- } else {
- postMessage({
- type: 'saveRes',
- data: false,
- })
- postMsg('保存失败', 'error')
- }
- }
- //判断工序节点
- const isLinkTabIds = async (data) => {
- const { nodeType } = appItem.value
- if (nodeType === 7 || nodeType === 11) {
- const isLink = data.some(({ linkTabIds }) => {
- const linkIds = getArrValue(linkTabIds)
- return linkIds.length > 0
- })
- if (isLink) {
- return true
- } else {
- postMsg('请先关联工序', 'error')
- return false
- }
- } else {
- return true
- }
- }
- //发送消息
- const postMessage = ({ type, data = {} }) => {
- window?.postMessage({
- type: type,
- source: 'web',
- data: data,
- })
- }
- //弹出提示
- const postMsg = (title, icon) => {
- window?.postMessage({
- type: 'msg',
- source: 'web',
- data: {
- title: title,
- icon: icon,
- },
- })
- }
- </script>
- <style lang="scss">
- @import "~src/styles/uni-app/table-form.scss";
- </style>
|