iZaiZaiA 3 жил өмнө
parent
commit
e48e19e33f

+ 2 - 2
src/layout/index.vue

@@ -50,7 +50,7 @@
 
 <script setup>
 import {onMounted, ref, nextTick, watch} from "vue";
-import { useRouter, useRoute } from 'vue-router'
+import {useRouter, useRoute} from 'vue-router'
 import {useAppStore} from "~src/store/index";
 import MenuBar from "./modules/MenuBar.vue"
 import HelpInfoBar from "./modules/HelpInfoBar.vue"
@@ -111,7 +111,7 @@ watch(() => [
     useRoutes?.name,
     useRoutes?.meta?.title,
     useAppState.getCollapse,
-], ([projectContractArr, userMenus, theme, ColorVal, RouteName, RouteTitle,collapse]) => {
+], ([projectContractArr, userMenus, theme, ColorVal, RouteName, RouteTitle, collapse]) => {
     MenuBarData.value = userMenus
     HomeTheme.value = theme
     AppColor.value = ColorVal

+ 1 - 1
src/layout/modules/MenuBar.vue

@@ -1,6 +1,6 @@
 <template>
     <el-menu class="hc-aside-menu" :default-active="curKey" :collapse="isCollapse" unique-opened>
-        <el-menu-item index="home-index" @click="MenuClick({key: 'home-index'})">
+        <el-menu-item index="home-index" @click="MenuClick({code: 'home-index'})">
             <div class="hc-aside-menu-item">
                 <HcIcon name="home" class="hc-menu-icon" :ui="curKey === 'home-index'?'fill':''"/>
                 <div class="name">首页</div>

+ 9 - 1
src/plugins/HTableForm.js

@@ -1,4 +1,5 @@
 import {createApp} from "vue/dist/vue.esm-bundler.js";
+import {getTokenHeader} from '~src/api/request/header';
 import {ElInput,ElDatePicker,ElUpload,ElInputNumber,ElTimePicker,ElSelect,ElOption,ElRadioGroup,ElRadio,ElCheckbox,ElCheckboxGroup} from 'element-plus'
 
 const components = {ElInput, ElDatePicker, ElUpload, ElInputNumber, ElTimePicker, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCheckbox, ElCheckboxGroup}
@@ -8,6 +9,7 @@ export const HTableForm = ({template, formData, appId, onRight}) => {
     const app = createApp({
         data() {
             return {
+                getTokenHeader: getTokenHeader(),
                 formData,
             }
         },
@@ -19,7 +21,13 @@ export const HTableForm = ({template, formData, appId, onRight}) => {
                 const KeyName = event?.target?.getAttribute('keyname') || ''
                 onRight(event, KeyName)
             },
-            getInformation(a,b,c) {},
+            getInformation() {},
+            formUploadSuccess(event,key) {
+                console.log(event,key)
+            },
+            formUploadExceed() {
+                console.log('格式错误')
+            }
         }
     })
     app.mount(appId)

+ 7 - 0
src/plugins/IsButtons.js

@@ -0,0 +1,7 @@
+import {useAppStore} from "~src/store/index";
+const useAppState = useAppStore()
+
+//是否显示
+export const HcIsButton = (value) => {
+    return useAppState.getButtonsVal(value)
+}

+ 146 - 12
src/views/data-fill/components/ListItem.vue

@@ -99,18 +99,38 @@
             </div>
         </template>
     </el-dialog>
-
+    <!--插入特殊字符-->
+    <el-dialog v-model="specialModal" title="插入特殊字符" width="600px" custom-class="hc-modal-border">
+        <el-form ref="specialFormRef" :model="specialFormModel" :rules="specialFormRules" label-width="0px" size="large" class="mb-6">
+            <el-form-item prop="val" class="special-form-item">
+                <el-input v-model="specialFormModel.val" ref="specialRef" id="specialId" placeholder="请选择特殊字符代码" clearable @blur="specialInputBlur"/>
+            </el-form-item>
+        </el-form>
+        <el-row :gutter="20" style="margin: -10px;">
+            <el-col :span="3" style="padding: 10px;" v-for="item in specialCharacters">
+                <div class="special-box" @click="specialClick">
+                    <span class="font-EUDC" :title="`字符代码(C):${item !== 'K̅'?item.slice(2,7):'K̅'}`" v-html="item"/>
+                </div>
+            </el-col>
+        </el-row>
+        <template #footer>
+            <div class="dialog-footer">
+                <el-button size="large" @click="specialModal = false">取消</el-button>
+                <el-button type="primary" hc-btn @click="specialNodeClick">确认插入</el-button>
+            </div>
+        </template>
+    </el-dialog>
 </template>
 
 <script setup>
-import {ref,watch,nextTick,onMounted} from "vue";
+import {ref,watch,nextTick} from "vue";
 import notableform from '~src/assets/view/notableform.svg';
 import {HTableForm} from "~src/plugins/HTableForm"
-import {isString, getObjNullValue, getArrValue} from "vue-utils-plus"
+import {isType, formValidate} from "vue-utils-plus"
 import wbsApi from "~api/data-fill/wbs"
 import HcUpload from "./HcUpload.vue"
 import {NDropdown} from 'naive-ui';
-
+const {isString, getObjNullValue, getArrValue} = isType()
 //初始
 const props = defineProps({
     datas: {
@@ -229,6 +249,18 @@ const getBussDataInfo = async (pkeyId, index) => {
     const { data } = await wbsApi.getBussDataInfo({pkeyId: pkeyId})
     const resData = getObjNullValue(data?.data)
     if (resData) {
+        //处理日期范围数据
+        const pickerKey = resData['pickerKey'] || ''
+        const pickerKeys = pickerKey.split(',')
+        for (let i = 0; i < pickerKeys.length; i++) {
+            const val = resData[pickerKeys[i]] || ''
+            if (val) {
+                const data = val.replace(/'/g,'"');
+                resData[pickerKeys[i]] = toParse(data) || []
+            } else {
+                resData[pickerKeys[i]] = []
+            }
+        }
         //有数据,关联数据
         const InitObj = getFormDataInit(pkeyId)
         formData.value[index] = { ...InitObj, ...resData }
@@ -237,6 +269,15 @@ const getBussDataInfo = async (pkeyId, index) => {
     }
 }
 
+//字符串转数组或JSON
+const toParse = (val) => {
+    try {
+        return JSON.parse(val)
+    } catch (e) {
+        return false;
+    }
+}
+
 //单个保存
 const tableFormSaveClick = async (item,index) => {
     const res = await saveExcelBussData(item,index)
@@ -379,7 +420,6 @@ const uploadChange = async ({type}) => {
     }
 }
 
-
 //相关变量
 const tableFormItemNode = ref({})
 const tableFormMenuShow = ref(false)
@@ -415,7 +455,7 @@ const handleMenuSelect = (key) => {
     if (key === 'IDVF') {
         IDVFModal.value = true
     } else if (key === 'special') {
-        //specialModalShow()
+        specialModalShow()
     } else if (key === 'CTD') {
         CTDModal.value = true
     }
@@ -443,6 +483,94 @@ const formIDVFRules = {
     }
 }
 
+//插入特殊字符
+const specialModal = ref(false)
+const specialCharacters = ref([
+    '&#57344;', "&#57345;", "&#57346;", "&#57347;", '&#8804;', '&#8805;', '&#8451;',
+    '&#9312;', '&#9313;', '&#9314;', '&#9315;', '&#9316;', '&#9317;', '&#9318;', '&#9319;', '&#9320;', '&#9321;', '&#9322;', '&#9323;',
+    '&#9324;', '&#9325;', '&#9326;', '&#9327;', '&#9328;', '&#9329;', '&#9330;', '&#9331;',
+    "&#8544;", "&#8545;", "&#8546;", "&#8547;", "&#8548;", "&#8549;", "&#8550;", "&#8551;", "&#8552;", "&#8553;", "&#8554;", "&#8555;","K̅"
+])
+
+//输入框验证
+const specialFormRef = ref(null)
+const specialFormModel = ref({val: ''})
+const specialFormRules = {
+    val: {
+        required: true,
+        trigger: "blur",
+        message: "请选择特殊字符代码"
+    }
+}
+//显示插入特殊字符
+const specialRef = ref(null)
+const specialModalShow = () => {
+    specialFormModel.value.val = ''
+    specialModal.value = true
+    nextTick(() => {
+        specialRef.value?.focus();
+    })
+}
+//失去焦点
+const specialPos = ref({start: 0, end: 0})
+const specialInputBlur = (e) => {
+    specialPos.value = {
+        start: e?.target?.selectionStart || 0,
+        end: e?.target?.selectionEnd || 0
+    }
+}
+//点击符号
+const specialClick = (event) => {
+    const text = event?.target?.innerText ?? ''
+    const start = specialPos.value.start
+    specialFormModel.value.val = inputPosInsert({
+        pos: specialPos.value,
+        input: specialFormModel.value.val,
+        val: text
+    })
+    specialRef.value?.focus();
+    let posVal = start + text.length;
+    setSelectionRange('specialId', posVal)
+}
+
+//确认插入
+const specialNodeClick = async () => {
+    const res = await formValidate(specialFormRef.value)
+    if (res) {
+        const item = tableFormItemNode.value
+        const form = formData.value[item.index]
+        const val = specialFormModel.value.val ?? ''
+        formData.value[item.index][item.KeyName] = inputPosInsert({
+            pos: {start: item.startPos, end: item.endPos},
+            input: form[item.KeyName],
+            val: val
+        })
+        specialModal.value = false
+        specialRef.value?.focus();
+        let posVal = item.startPos + val.length;
+        setSelectionRange('specialId', posVal)
+    }
+}
+
+//输入框插入内容
+const inputPosInsert = ({pos, input, val}) => {
+    const startPos = pos.start, endPos = pos.end
+    if (!input) return val; //输入框无内容时,直接覆盖
+    if (input.length === startPos) {
+        //光标在最后时,直接追加
+        return input + val
+    } else {
+        //光标在其它位置时,裁取文本,并拼接
+        return input.substring(0, startPos) + val + input.substring(endPos, input.length)
+    }
+}
+
+//设置光标位置
+const setSelectionRange = (id, pos) => {
+    nextTick(() => {
+        document.getElementById(id)?.setSelectionRange(pos,pos)
+    })
+}
 
 //事件
 const emit = defineEmits(['renew','offsetTop'])
@@ -556,17 +684,17 @@ const renewData = () => {
     align-items: center;
     border: 1px solid #eee;
     border-radius: 3px;
-    height: 60px;
-    cursor: default;
+    height: 52px;
+    width: 52px;
+    cursor: pointer;
     user-select: none;
     transition: color .3s, background-color .3s;
     &:hover {
         color: var(--el-color-primary);
-        background-color: var(--el-color-primary-light-3);
+        background-color: var(--el-color-primary-light-8);
     }
     .font-EUDC {
-        font-size: 30px;
-        cursor: default;
+        font-size: 22px;
     }
 }
 </style>
@@ -615,7 +743,6 @@ const renewData = () => {
     .data-fill-table-form-box {
         td {
             padding: 6px;
-            font-family: "EUDC", 宋体, v-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important;
             .el-input {
                 background-color: #ffffff !important;
                 border-radius: 3px;
@@ -632,4 +759,11 @@ const renewData = () => {
         }
     }
 }
+
+//插入特殊字符弹窗的输入框
+.data-fill-list-box .data-fill-table-form-box td,
+.data-fill-list-box .data-fill-table-form-box td .el-input .el-input__wrapper .el-input__inner,
+.el-form-item.special-form-item .el-form-item__content .el-input .el-input__wrapper .el-input__inner {
+    font-family: "EUDC", 宋体, v-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+}
 </style>

+ 49 - 72
src/views/data-fill/wbs.vue

@@ -52,12 +52,12 @@
             <div class="hc-layout-content-box">
                 <HcCard :scrollbar="false" actionSize="lg">
                     <template #header>
-                        <el-tooltip :content="btn_drawings?.textInfo" placement="top-start" :disabled="!bubbleVal || !btn_drawings?.textInfo" v-if="btn_drawings">
+                        <HcTooltip keys="wbs_views_drawings" v-if="NodeStatus !== '3'">
                             <el-button hc-btn :disabled="!nodeDataInfo?.fileUrl" @click="viewsDrawings">
                                 <HcIcon name="wallpaper"/>
                                 <span>查看图纸</span>
                             </el-button>
-                        </el-tooltip>
+                        </HcTooltip>
                         <el-button :type="authBtnTabKey === '1'?'primary':''" hc-btn @click="authBtnTabClick('1')">
                             <HcIcon name="e911_emergency"/>
                             <span>施工质检</span>
@@ -80,30 +80,30 @@
 
                     <!--底部按钮区域-->
                     <template #action>
-                        <el-tooltip :content="btn_save?.textInfo" placement="top-start" :disabled="!bubbleVal || !btn_save?.textInfo" v-if="btn_save && NodeStatus !== '3'">
+                        <HcTooltip keys="wbs_save" v-if="NodeStatus !== '3'">
                             <el-button type="primary" hc-btn :disabled="NodeStatus === '3'" :loading="tableFormSaveLoading" @click="tableFormSaveClick">
                                 <HcIcon name="save"/>
                                 <span>保存</span>
                             </el-button>
-                        </el-tooltip>
-                        <el-tooltip :content="btn_report?.textInfo" placement="top-start" :disabled="!bubbleVal || !btn_report?.textInfo" v-if="btn_report && NodeStatus !== '3'">
+                        </HcTooltip>
+                        <HcTooltip keys="wbs_report" v-if="NodeStatus !== '3'">
                             <el-button hc-btn :disabled="NodeStatus === '3' || NodeStatus === '1'" @click="reportModalClick">
                                 <HcIcon name="drive_folder_upload"/>
                                 <span>上报</span>
                             </el-button>
-                        </el-tooltip>
-                        <el-tooltip :content="btn_preview?.textInfo" placement="top-start" :disabled="!bubbleVal || !btn_preview?.textInfo" v-if="btn_preview">
+                        </HcTooltip>
+                        <HcTooltip keys="wbs_preview">
                             <el-button hc-btn :disabled="NodeStatus === '1'" :loading="bussPdfsLoading" @click="bussPdfsClick">
                                 <HcIcon name="visibility"/>
                                 <span>预览</span>
                             </el-button>
-                        </el-tooltip>
-                        <el-tooltip :content="btn_abolish?.textInfo" placement="top-start" :disabled="!bubbleVal || !btn_abolish?.textInfo" v-if="btn_abolish && NodeStatus === '3'">
+                        </HcTooltip>
+                        <HcTooltip keys="wbs_abolish" v-if="NodeStatus === '3'">
                             <el-button hc-btn @click="abolishOneClick">
                                 <HcIcon name="undo"/>
                                 <span>撤回上报流程</span>
                             </el-button>
-                        </el-tooltip>
+                        </HcTooltip>
                     </template>
                 </HcCard>
             </div>
@@ -256,6 +256,7 @@ import {ref,watch,nextTick,onMounted} from "vue";
 import {useRouter, useRoute} from 'vue-router'
 import {useAppStore} from "~src/store/index";
 import {hIconJs} from "~src/plugins/renderele";
+import {HcIsButton} from "~src/plugins/IsButtons";
 import ListItem from "./components/ListItem.vue"
 import NodeTree from "./components/nodeTree/index.vue"
 import ImgPreview from "~com/imgPreview/index.vue"
@@ -281,7 +282,6 @@ const contractId = ref(useAppState.getContractId);
 const projectInfo = ref(useAppState.getProjectInfo);
 const contractInfo = ref(useAppState.getContractInfo);
 const isCollapse = ref(useAppState.getCollapse)
-const bubbleVal = ref(useAppState.getBubble);
 
 //路由参数
 const routerQuery = useRoutes?.query;
@@ -292,41 +292,15 @@ const TreeAutoExpandKeys = ref(getStoreData('wbsTreeExpandKeys') || [])
 
 //监听
 watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getContractInfo,
-    useAppState.getBubble,
     useAppState.getCollapse
-], ([UserProjectId, UserContractId, UserProjectInfo, UserContractInfo, Bubble, Collapse]) => {
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-    contractInfo.value = UserContractInfo
-    bubbleVal.value = Bubble
+], ([Collapse]) => {
     isCollapse.value = Collapse
-    setContractType(UserContractInfo?.contractType)
 })
 
-//获取气泡数据
-const getButtons = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-//气泡数据
-const btn_drawings = ref(getButtons('wbs_views_drawings'))  //查看图纸
-const btn_save = ref(getButtons('wbs_save'))                //保存
-const btn_preview = ref(getButtons('wbs_preview'))          //预览
-const btn_report = ref(getButtons('wbs_report'))            //上报
-const btn_abolish = ref(getButtons('wbs_abolish'))          //撤回上报流程
-
-//树菜单
-const tree_menu_edit = ref(getButtons('wbs_tree_edit'))  //编辑节点
-const tree_menu_mark = ref(getButtons('wbs_tree_mark'))  //标记为首件
-const tree_menu_copy = ref(getButtons('wbs_tree_copy'))  //复制节点
-const tree_menu_add = ref(getButtons('wbs_tree_add'))    //新增节点
-const tree_menu_up = ref(getButtons('wbs_tree_upload'))  //上传图纸
-const tree_menu_del = ref(getButtons('wbs_tree_del'))    //删除节点
-const tree_menu_sort = ref(getButtons('wbs_tree_sort'))  //调整排序
+//渲染完成
+onMounted(()=> {
+    setContractType(contractInfo.value?.contractType)
+})
 
 //身份按钮切换数据
 const authBtnTabKey = ref('1')
@@ -336,13 +310,14 @@ const authBtnTabClick = (val) => {
         getTableDataAll()
     }
 }
+//contractType,  1施工,2监理
 const setContractType = (contractType) => {
-    //contractType,  1施工,2监理
     if (contractType <= 0) {
         authBtnTabKey.value = '1'
     } else {
         authBtnTabKey.value = contractType + ''
     }
+    setElTreeMenu(contractType)
 }
 
 const getTableDataAll = () => {
@@ -364,13 +339,6 @@ const wbsTypeTabChange = async (item) => {
     })
 }
 
-//渲染完成
-onMounted(()=> {
-    const contractType = contractInfo.value?.contractType
-    setContractType(contractType)
-    setElTreeMenu()
-})
-
 //上传文件的
 const action = ref("/api/blade-resource/oss/endpoint/put-file")
 const accept = ref("image/png,image/jpg,image/jpeg")
@@ -380,29 +348,38 @@ const NodeTreeAccordion = ref(true)
 //设置树菜单数据
 const ElTreeMenu = ref([])
 const TreeMark = ref(false)
-const setElTreeMenu = () => {
+const setElTreeMenu = (contractType) => {
     let newArr = [];
-    if (tree_menu_edit.value) {
-        newArr.push({icon: hIconJs({name:'border_color'}), label: '编辑节点', key: "edit"})
-    }
-    if (tree_menu_mark.value) {
-        newArr.push({icon: hIconJs({name:'grade'}), label: '标记为首件', key: "mark"})
-        TreeMark.value = true
-    }
-    if (tree_menu_copy.value) {
-        newArr.push({icon: hIconJs({name:'difference'}), label: '复制节点', key: "copy"})
-    }
-    if (tree_menu_add.value) {
-        newArr.push({icon: hIconJs({name:'add_box'}), label: '新增节点', key: "add"})
-    }
-    if (tree_menu_up.value) {
-        newArr.push({icon: hIconJs({name:'backup'}), label: '上传图纸', key: "upload"})
-    }
-    if (tree_menu_del.value) {
-        newArr.push({icon: hIconJs({name:'delete'}), label: '删除节点', key: "del"})
-    }
-    if (tree_menu_sort.value) {
-        newArr.push({icon: hIconJs({name:'sort'}), label: '调整排序', key: "sort"})
+    if (contractType === 1) {
+        if (HcIsButton('wbs_tree_edit')) {
+            newArr.push({icon: hIconJs({name:'border_color'}), label: '编辑节点', key: "edit"})
+        }
+        if (HcIsButton('wbs_tree_mark')) {
+            newArr.push({icon: hIconJs({name:'grade'}), label: '标记为首件', key: "mark"})
+            TreeMark.value = true
+        }
+        if (HcIsButton('wbs_tree_copy')) {
+            newArr.push({icon: hIconJs({name:'difference'}), label: '复制节点', key: "copy"})
+        }
+        if (HcIsButton('wbs_tree_add')) {
+            newArr.push({icon: hIconJs({name:'add_box'}), label: '新增节点', key: "add"})
+        }
+        if (HcIsButton('wbs_tree_upload')) {
+            newArr.push({icon: hIconJs({name:'backup'}), label: '上传图纸', key: "upload"})
+        }
+        if (HcIsButton('wbs_tree_del')) {
+            newArr.push({icon: hIconJs({name:'delete'}), label: '删除节点', key: "del"})
+        }
+        if (HcIsButton('wbs_tree_sort')) {
+            newArr.push({icon: hIconJs({name:'sort'}), label: '调整排序', key: "sort"})
+        }
+    } else if (contractType === 2) {
+        if (HcIsButton('wbs_tree_copy')) {
+            newArr.push({icon: hIconJs({name:'difference'}), label: '复制节点', key: "copy"})
+        }
+        if (HcIsButton('wbs_tree_add')) {
+            newArr.push({icon: hIconJs({name:'add_box'}), label: '新增节点', key: "add"})
+        }
     }
     ElTreeMenu.value = newArr
 }

+ 3 - 9
src/views/other/order-service.vue

@@ -197,16 +197,10 @@ const nameSelectData = ref([])
 
 //监听
 watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getScreenShort,
-    useAppState.getOrderServiceTipModal
-], ([UserProjectId, UserContractId,ScreenShort,OrderServiceTipModal]) => {
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
+    useAppState.getScreenShort
+], ([ScreenShort]) => {
     isScreenShort.value = ScreenShort
-    opinionView.value = OrderServiceTipModal
-    if(ScreenShort) {
+    if( ScreenShort ) {
         let base64 = window.sessionStorage.getItem('screenShort-base64') || '';
         if (base64) uploadImgFile(base64)
     }