iZaiZaiA 2 years ago
parent
commit
b119035c16
5 changed files with 926 additions and 742 deletions
  1. 1 0
      src/layout/layout.scss
  2. 18 15
      src/styles/gauge/bezier.scss
  3. 117 724
      src/views/gauge/bezier.vue
  4. 787 0
      src/views/gauge/bezier_a.vue
  5. 3 3
      src/views/gauge/station.vue

+ 1 - 0
src/layout/layout.scss

@@ -51,6 +51,7 @@
             height: calc(100% - 216px);
             width: 100%;
             overflow: hidden;
+            user-select: none;
         }
         .hc-aside-bar-box {
             position: relative;

+ 18 - 15
src/styles/gauge/bezier.scss

@@ -1,23 +1,26 @@
 .hc-layout-box {
     position: relative;
-    height: calc(100% - 60px);
-    padding: 0 24px 24px;
-    .hc-card-header {
-        position: relative;
-        font-size: initial;
-        font-weight: initial;
-        .icon-btn {
-            cursor: pointer;
-            transition: color 0.2s;
-            i {
-                font-size: 21px;
-            }
-            &:hover {
-                color: var(--hc-primary);
-            }
+    height: 100%;
+    .hc-extra-icon-btn {
+        height: 40px;
+        width: 40px;
+        font-size: 32px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        margin-left: 10px;
+        color: #50545E;
+        cursor: pointer;
+        transition: 0.2s;
+        &:hover {
+            color: var(--el-color-primary);
         }
     }
+    .hc-extra-icon-btn + .hc-extra-icon-btn {
+        margin-left: 0;
+    }
 }
+
 .admin-part-data-table {
     position: relative;
     max-height: 400px;

+ 117 - 724
src/views/gauge/bezier.vue

@@ -1,784 +1,177 @@
 <template>
-    <n-divider dashed title-placement="left">平曲线</n-divider>
     <div class="hc-layout-box">
-        <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
+        <HcCard :scrollbar="false" actionSize="lg">
             <template #header>
-                <div class="hc-card-header flex items-center">
-                    <div class="w-60 mr-4">
-                        <n-select label-field="name" value-field="id" v-model:value="searchForm.partId" :options="partData" placeholder="片段查询" @update:value="searchChange" clearable/>
-                    </div>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_add_part?.textInfo" v-if="btn_add_part">
-                        <template #trigger>
-                            <span class="ml-3 icon-btn" @click="AddPartClick">
-                                <i class="cicon-add-round-o"/>
-                            </span>
-                        </template>
-                        <span>{{btn_add_part?.textInfo}}</span>
-                    </n-popover>
-                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_admin_part?.textInfo" v-if="btn_admin_part">
-                        <template #trigger>
-                            <span class="ml-3 icon-btn" @click="AdminPartClick">
-                                <i class="cicon-set-list"/>
-                            </span>
-                        </template>
-                        <span>{{btn_admin_part?.textInfo}}</span>
-                    </n-popover>
-                </div>
+                <HcTooltip keys="gauge-bezier-add">
+                    <el-button type="primary" hc-btn @click="addLineEleModal">
+                        <HcIcon name="add_box"/>
+                        <span>添加线元</span>
+                    </el-button>
+                </HcTooltip>
+                <HcTooltip keys="gauge-bezier-to">
+                    <el-button hc-btn @click="showToModalClick">
+                        <HcIcon name="add_box"/>
+                        <span>转换坐标</span>
+                    </el-button>
+                </HcTooltip>
+                <HcTooltip keys="gauge-bezier-pile">
+                    <el-button hc-btn @click="pileModalClick">
+                        <HcIcon name="add_box"/>
+                        <span>逐桩坐标</span>
+                    </el-button>
+                </HcTooltip>
+                <HcTooltip keys="gauge-bezier-import">
+                    <el-button hc-btn @click="importModalClick">
+                        <HcIcon name="drive_folder_upload"/>
+                        <span>导入</span>
+                    </el-button>
+                </HcTooltip>
+                <HcTooltip keys="gauge-bezier-export">
+                    <el-button hc-btn @click="exportModalClick">
+                        <HcIcon name="download"/>
+                        <span>导出</span>
+                    </el-button>
+                </HcTooltip>
             </template>
-            <template #header-extra>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_add?.textInfo" v-if="btn_add">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-5" @click="addLineEleModal">添加线元</n-button>
-                    </template>
-                    <span>{{btn_add?.textInfo}}</span>
-                </n-popover>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_to?.textInfo" v-if="btn_to">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="showToModalClick">转换坐标</n-button>
-                    </template>
-                    <span>{{btn_to?.textInfo}}</span>
-                </n-popover>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_import?.textInfo" v-if="btn_import">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="importModalClick">导入线元</n-button>
-                    </template>
-                    <span>{{btn_import?.textInfo}}</span>
-                </n-popover>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_pile?.textInfo" v-if="btn_pile">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="pileModalClick">逐桩坐标</n-button>
-                    </template>
-                    <span>{{btn_pile?.textInfo}}</span>
-                </n-popover>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_export?.textInfo" v-if="btn_export">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="exportModalClick">导出</n-button>
-                    </template>
-                    <span>{{btn_export?.textInfo}}</span>
-                </n-popover>
-            </template>
-            <n-data-table :columns="tableColumns" :data="tableData" :pagination="false" :row-key="row => row.name" :loading="tableLoading" :single-line="false" striped/>
-            <template #action>
-                <HcPage :pages="searchForm" @change="pageChange"/>
-            </template>
-        </n-card>
-    </div>
-    <!--新增片段弹框-->
-    <n-modal v-model:show="showAddPartModal">
-        <n-card class="w-606" title="新增片段" :segmented="{content: true}">
-            <n-form ref="formAddPartRef" :model="formAddPartValue" :rules="rulesAddPart" label-placement="left" label-width="auto" size="large">
-                <n-form-item label="名称" path="name">
-                    <n-input class="flex-1" v-model:value="formAddPartValue.name" placeholder="请输入名称"/>
-                </n-form-item>
-                <n-form-item label="桩号前缀" path="prefix">
-                    <n-input class="flex-1" v-model:value="formAddPartValue.prefix" placeholder="只允许输入大写的英文字母"/>
-                </n-form-item>
-            </n-form>
-            <template #action>
-                <div class="text-center">
-                    <n-button class="px-5" @click="showAddPartModal = false">取消</n-button>
-                    <n-button type="primary" class="px-5 ml-6" :loading="savePartLoading" @click="savePartInfo(formAddPartValue, true)">保存</n-button>
+            <template #extra>
+                <div class="w-60">
+                    <el-select v-model="searchForm.partId" block clearable size="large" @change="searchClick">
+                        <el-option v-for="item in partData" :label="item.name" :value="item.id" placeholder="片段查询"/>
+                    </el-select>
                 </div>
+                <HcTooltip keys="gauge-bezier-add-part">
+                    <div class="hc-extra-icon-btn" @click="AddPartClick">
+                        <HcIcon name="add_box"/>
+                    </div>
+                </HcTooltip>
+                <HcTooltip keys="gauge-bezier-admin-part">
+                    <div class="hc-extra-icon-btn" @click="AdminPartClick">
+                        <HcIcon name="grid_view"/>
+                    </div>
+                </HcTooltip>
             </template>
-        </n-card>
-    </n-modal>
-    <!--管理片段弹框-->
-    <n-modal v-model:show="showAdminPartModal">
-        <n-card class="w-750" title="管理片段" :segmented="{content: true}">
-            <div class="admin-part-data-table">
-                <n-data-table :key="(row) => row.id" :columns="AdminPartColumns" :data="AdminPartTableData" :single-line="false" striped/>
-            </div>
-            <template #action>
-                <div class="text-center">
-                    <n-button class="px-5" @click="showAdminPartModal = false">取消</n-button>
-                    <n-button type="primary" class="px-5 ml-6" @click="AddAdminPart">新增</n-button>
-                </div>
-            </template>
-        </n-card>
-    </n-modal>
-    <!--添加/编辑线元弹框-->
-    <n-modal v-model:show="showLineEleModal">
-        <n-card class="w-750" :title="(formLineEleValue.id == -1 || !formLineEleValue.id)?'添加线元':'编辑线元'" :segmented="{content: true}">
-            <n-form :model="formLineEleValue" label-placement="left" label-width="auto" size="large">
-                <n-form-item label="类型">
-                    <n-radio-group class="flex-1" v-model:value="formLineEleValue.type" name="radiogroup">
-                        <n-space>
-                            <n-radio v-for="item in lineElementType" :key="item.value" :value="item.value">{{ item.label }}</n-radio>
-                        </n-space>
-                    </n-radio-group>
-                </n-form-item>
-                <n-form-item label="开始里程">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.value" placeholder="请输入开始里程"/>
-                </n-form-item>
-                <n-form-item label="X">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.x" placeholder="请输入X"/>
-                </n-form-item>
-                <n-form-item label="Y">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.y" placeholder="请输入Y"/>
-                </n-form-item>
-                <n-form-item label="半径" v-if="formLineEleValue.type != 0">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.r" placeholder="请输入半径"/>
-                </n-form-item>
-                <n-form-item label="结束半径" v-if="formLineEleValue.type == 3">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.r2" placeholder="请输入半径"/>
-                </n-form-item>
-                <n-form-item label="转向" v-if="formLineEleValue.type != 0">
-                    <n-radio-group class="flex-1" v-model:value="formLineEleValue.swing" name="radiogroup">
-                        <n-space>
-                            <n-radio value="左转">左转</n-radio>
-                            <n-radio value="右转">右转</n-radio>
-                        </n-space>
-                    </n-radio-group>
-                </n-form-item>
-                <n-form-item label="线长度">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.l" placeholder="请输入线长度"/>
-                </n-form-item>
-                <div class="flex">
-                    <n-form-item class="flex-1" label="方位角">
-                        <n-input v-model:value="formLineEleValue.du" placeholder="输入度">
-                            <template #suffix>度</template>
-                        </n-input>
-                    </n-form-item>
-                    <n-form-item class="flex-1 ml-4">
-                        <n-input v-model:value="formLineEleValue.fen" placeholder="输入分">
-                            <template #suffix>分</template>
-                        </n-input>
-                    </n-form-item>
-                    <n-form-item class="flex-1 ml-4">
-                        <n-input v-model:value="formLineEleValue.miao" placeholder="输入秒">
-                            <template #suffix>秒</template>
-                        </n-input>
-                    </n-form-item>
-                </div>
-                <n-form-item label="断链前里程" v-if="formLineEleValue.type != 3">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.dlq" placeholder="请输入断链前里程"/>
-                </n-form-item>
-                <n-form-item label="断链后里程" v-if="formLineEleValue.type != 3">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.dlh" placeholder="请输入断链后里程"/>
-                </n-form-item>
-                <n-form-item label="顺序">
-                    <n-input class="flex-1" v-model:value="formLineEleValue.orderNum" placeholder="请输入顺序"/>
-                </n-form-item>
-            </n-form>
-            <template #action>
-                <div class="text-center">
-                    <n-button class="px-5" @click="showLineEleModal = false">取消</n-button>
-                    <n-button type="primary" strong secondary class="px-5 ml-6" @click="refreshable" v-if="formLineEleValue.id == -1 || !formLineEleValue.id">刷新</n-button>
-                    <n-button type="primary" class="px-5 ml-6" :loading="saveLoading" @click="saveClick">保存</n-button>
-                </div>
-            </template>
-        </n-card>
-    </n-modal>
-    <!--里程转换坐标-->
-    <n-modal v-model:show="showToModal">
-        <n-card class="w-606" title="里程转换坐标" :segmented="{content: true}">
-            <n-form :model="formToValue" label-placement="left" label-width="auto" size="large">
-                <n-form-item label="里程">
-                    <n-input class="flex-1" v-model:value="formToValue.value" placeholder="请输入里程"/>
-                </n-form-item>
-                <n-form-item label="偏移">
-                    <n-input class="flex-1" v-model:value="formToValue.b" placeholder="请输入偏移"/>
-                </n-form-item>
-                <n-form-item label="夹角">
-                    <n-input class="flex-1" v-model:value="formToValue.jj" placeholder="请输入夹角"/>
-                </n-form-item>
-                <n-form-item label="X">{{formToValue.x}}</n-form-item>
-                <n-form-item label="Y">{{formToValue.y}}</n-form-item>
-            </n-form>
-            <template #action>
-                <div class="text-center">
-                    <n-button class="px-5" @click="showToModal = false">取消</n-button>
-                    <n-button type="primary" class="px-5 ml-6" @click="queryPsChange">转换</n-button>
-                </div>
-            </template>
-        </n-card>
-    </n-modal>
-    <!--导入 弹框-->
-    <n-modal v-model:show="showImportModal">
-        <n-card class="w-414" title="导入线元" :segmented="{content: true}">
-            <template #header-extra>
-                <a href="https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220614/a8bb45b57e409ff6bd5a5aad4bc7b22e.xlsx" target="_blank" class="text-link">下载导入模板</a>
-            </template>
-            <div class="text-center">
-                <n-upload ref="uploadRef" :action="action" :headers="getTokenHeader()" :data="upData" :max="1" :accept="accept" :default-upload="false" multiple @change="handleUploadChange" @finish="uploadFinish">
-                    <n-button type="primary" class="px-4">选择文件</n-button>
-                </n-upload>
-            </div>
+            <el-scrollbar>
+                123456
+            </el-scrollbar>
             <template #action>
-                <div class="text-center">
-                    <n-button class="px-4" @click="showImportModal = false">取消</n-button>
-                    <n-button type="primary" :disabled="!fileListLength" class="px-4 ml-6" :loading="importLoading" @click="handleImportClick">确认导入</n-button>
-                </div>
+                <HcPages :pages="searchForm" @change="pageChange"/>
             </template>
-        </n-card>
-    </n-modal>
-    <!--逐桩坐标弹框-->
-    <n-modal v-model:show="showPileModal">
-        <n-card class="w-990" title="逐桩坐标" :segmented="{content: true}">
-            <n-form :model="formPileValue" inline label-width="auto">
-                <n-form-item label="开始桩号">
-                    <n-input v-model:value="formPileValue.x" placeholder="开始桩号" />
-                </n-form-item>
-                <n-form-item label="结束桩号">
-                    <n-input v-model:value="formPileValue.y" placeholder="结束桩号" />
-                </n-form-item>
-                <n-form-item label="桩距">
-                    <n-input v-model:value="formPileValue.value" placeholder="桩距" />
-                </n-form-item>
-                <n-form-item label="偏距">
-                    <n-input v-model:value="formPileValue.b" placeholder="偏距" />
-                </n-form-item>
-                <n-form-item>
-                    <n-button attr-type="button" type="primary" class="px-4" :loading="generateLoading" @click="generateClick">生成</n-button>
-                </n-form-item>
-            </n-form>
+        </HcCard>
+        <!--管理片段弹框-->
+        <el-dialog v-model="showAdminPartModal" title="管理片段" width="47rem" custom-class="hc-modal-border">
             <div class="admin-part-data-table">
-                <n-data-table :key="(row) => row.key" :columns="pileColumns" :data="pileTable" :single-line="false" striped/>
+                <el-scrollbar>
+                    <div class="hc-table-ref-box">
+                        <el-table hc :data="AdminPartTableData" stripe>
+                            <el-table-column prop="name" label="片段名称">
+                                <template #default="scope">
+                                    <el-input v-model="scope.row.name" placeholder="片段名称"/>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="name" label="桩号前缀">
+                                <template #default="scope">
+                                    <el-input v-model="scope.row.prefix" placeholder="桩号前缀"/>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="操作" align="center" width="130">
+                                <template #default="scope">
+                                    <HcTooltip keys="gauge-station-edit">
+                                        <el-button type="primary" size="small" text @click="handleAdminPartdit(scope.row)">编辑</el-button>
+                                    </HcTooltip>
+                                    <HcTooltip keys="gauge-station-del">
+                                        <el-button type="danger" size="small" text @click="handleAdminPartDelete(scope.row)">删除</el-button>
+                                    </HcTooltip>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </div>
+                </el-scrollbar>
             </div>
-            <template #action>
-                <div class="text-center">
-                    <n-button class="px-5" @click="showPileModal = false">关闭</n-button>
+            <template #footer>
+                <div class="dialog-footer">
+                    <el-button size="large" @click="showAdminPartModal = false">取消</el-button>
+                    <el-button type="primary" hc-btn @click="AddAdminPart">新增</el-button>
                 </div>
             </template>
-        </n-card>
-    </n-modal>
+        </el-dialog>
+
+    </div>
 </template>
 
 <script setup>
-import {h, onMounted, ref, watch} from "vue";
+import {ref, onMounted} from "vue";
 import {useAppStore} from "~src/store/index";
-import bezier from '~api/gauge/bezier';
-import HcPage from "~com/plugins/naive/HcPage.vue"
+import bezierApi from '~api/gauge/bezier';
 import {getTokenHeader} from '~src/api/request/header';
-import {download} from '~src/utils/lib/tools';
-//import {renderTableEditDelButton,renderTableEditInput, renderTableEditInputButton} from "~src/plugins/renderele";
+import {getArrValue, downloadBlob, formValidate} from "vue-utils-plus"
 
 //初始变量
 const useAppState = useAppStore()
 const projectId = ref(useAppState.getProjectId);
 const contractId = ref(useAppState.getContractId);
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getBubble,
-], ([UserProjectId,UserContractId,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-//气泡数据
-const btn_add_part = ref(getButtonsVal('gauge-bezier-add-part'))
-const btn_admin_part = ref(getButtonsVal('gauge-bezier-admin-part'))
-
-const btn_add = ref(getButtonsVal('gauge-bezier-add'))
-const btn_to = ref(getButtonsVal('gauge-bezier-to'))
-const btn_import = ref(getButtonsVal('gauge-bezier-import'))
-const btn_pile = ref(getButtonsVal('gauge-bezier-pile'))
-const btn_export = ref(getButtonsVal('gauge-bezier-export'))
-const btn_edit = ref(getButtonsVal('gauge-bezier-edit'))
-const btn_del = ref(getButtonsVal('gauge-bezier-del'))
-
-//片段查询
-const partData = ref([])
-//搜索表单
-const searchForm = ref({partId: '', current: 1, size: 20, total: 0})
-const lineElementType = ref([
-    {value: 0, label: "直线段"},
-    {value: 1, label: "圆曲线"},
-    {value: 2, label: "入缓和曲线"},
-    {value: 3, label: "出缓和曲线"},
-    {value: 4, label: "不完整缓和曲线"},
-])
-
-//获取类型名称
-const GetTypeName = (val) => {
-    if (val != -1 || val >= 0) {
-        return lineElementType.value[val].label || '';
-    } else {
-        return '-';
-    }
-}
 
 //渲染完成
 onMounted(() => {
-    queryPartList().then()
+    queryPartList()
 })
 
-async function queryPartList() {
-    const partList = await bezier.queryPartList({
+//获取下拉列表
+const partData = ref([])
+const queryPartList = async () => {
+    const { error, code, data } = await bezierApi.queryPartList({
         projectId: projectId.value,
         contractId: contractId.value
     })
-    let partListData = partList?.data?.data || [];
-    partData.value = partListData;
-    if (partListData.length > 0 && !searchForm.value.partId) {
-        searchForm.value.partId = partListData[0].id;
-        getTableData()
+    if (!error && code === 200) {
+        let records = getArrValue(data)
+        partData.value = records
+        if (records.length > 0 && !searchForm.value.partId) {
+            searchForm.value.partId = records[0].id;
+            //getTableData()
+        }
+    } else {
+        partData.value = []
+        searchForm.value.partId = null;
     }
 }
 
-//导线点的 表格表头
-const tableLoading = ref(false)
-const createColumns = ({edit,del}) => {
-    return [
-        {title: '序号', key: 'num', width: 80, align: 'center',
-            render(_, index) {
-                return index + 1
-            }
-        },
-        {title: '里程', key: 'name',
-            render(row) {
-                return `${row.valueStr}~${row.valueEndStr}`
-            }
-        },
-        {title: '排序', key: 'orderNum'},
-        {title: '长度', key: 'l'},
-        {title: '方位角', key: 'angle'},
-        {title: '类型', key: 'type',
-            render(row) {
-                return GetTypeName(row.type)
-            }
-        },
-        {title: '转向', key: 'swing'},
-        {title: 'X', key: 'xxStr'},
-        {title: 'Y', key: 'yyStr'},
-        {title: '半径', key: 'r'},
-        {title: "操作", key: "actions", width: 160, align: 'center',
-            render(row) {
-                /*return renderTableEditDelButton({
-                    bubble: bubbleVal.value,
-                    btn_edit: btn_edit.value,
-                    btn_del: btn_del.value,
-                    edit_event: edit,
-                    del_event: del,
-                    row:row
-                })*/
-            }
-        }
-    ];
-};
-const tableColumns = createColumns({
-    edit(row) {
-        const form = JSON.parse(JSON.stringify(row))
-        formLineEleValue.value['id'] = form.id;
-        formLineEleValue.value['type'] = form['type'];
-        formLineEleValue.value['projectId'] = projectId.value;
-        formLineEleValue.value['contractId'] = contractId.value;
-        formLineEleValue.value['partId'] = searchForm.value.partId;
-        let mile = ['x', 'y', 'fen', 'miao', 'du', 'value', 'l',  'dlq', 'dlh', 'swing', 'r', 'r2', 'orderNum']
-        mile.forEach((key) => {
-            formLineEleValue.value[key] = form[key] + '';
-        })
-        showLineEleModal.value = true
-    },
-    del(row) {
-        bezier.saveDelMileage({
-            id: row.id
-        }).then(({data}) => {
-            if (data.code === 200) {
-                window?.$message?.success('删除成功')
-                getTableData()
-            } else {
-                window?.$message?.error('删除失败')
-            }
-        })
-    },
-})
-const tableData = ref([]);
+//搜索表单
+const searchForm = ref({partId: '', current: 1, size: 20, total: 0})
 
 //重新搜索数据
-const searchChange = (res) => {
+const searchClick = () => {
     searchForm.value.current = 1
     getTableData()
 }
+
 //分页被点击
-const pageChange = (res) => {
-    searchForm.value.current = res.current;
-    searchForm.value.size = res.size;
+const pageChange = ({current, size}) => {
+    searchForm.value.current = current
+    searchForm.value.size = size
     getTableData()
 }
+
 //获取数据
 const getTableData = () => {
-    tableLoading.value = true
-    bezier.queryListData(searchForm.value).then(({data}) => {
-        let res = data['data'] || {}
-        tableData.value = res['records'] || []
-        searchForm.value.total = res.total || 0
-        tableLoading.value = false
-    }).catch(() => {
-        tableLoading.value = false
-    })
-}
 
-//新增片段弹框
-const showAddPartModal = ref(false)
-const formAddPartRef = ref(null)
-const formAddPartValue = ref({name: '', prefix: ''})
-const rulesAddPart = {
-    name: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入名称"
-    },
-    prefix: {
-        required: true,
-        validator(rule, value) {
-            const reg = /^[A-Z]+$/
-            if (!value) {
-                return new Error("请输入桩号前缀");
-            } else if (!reg.test(value)) {
-                return new Error("只允许输入大写的英文字母");
-            }
-            return true;
-        },
-        trigger: ["blur", "input"],
-    }
-}
-//添加片段按钮
-const AddPartClick = () => {
-    formAddPartValue.value.name = ''
-    formAddPartValue.value.prefix = ''
-    showAddPartModal.value = true
 }
+
 //管理片段弹窗
 const showAdminPartModal = ref(false)
 const AdminPartTableData = ref([])
-const AdminPartColumns = [
-    {
-        title: '片段名称',
-        key: 'name',
-        render (row) {
-            /*return h(renderTableEditInput, {
-                value: row.name,
-                isEdit: row.isEdit,
-                onUpdateValue (val) {
-                    row.name = val
-                }
-            })*/
-        }
-    },
-    {
-        title: '桩号前缀',
-        key: 'prefix',
-        render (row) {
-            /*return h(renderTableEditInput, {
-                value: row.prefix,
-                isEdit: row.isEdit,
-                onUpdateValue (val) {
-                    row.prefix = val
-                }
-            })*/
-        }
-    },
-    {title: "操作", key: "actions", width: 160, align: 'center',
-        render(row,index) {
-            /*return h(renderTableEditInputButton, {
-                row: row,
-                onSave (res) {
-                    const reg = /^[A-Z]+$/
-                    if (!res.name) {
-                        row.isEdit = true
-                        window?.$message?.warning('请输入片段名称')
-                    } else if (!res.prefix) {
-                        row.isEdit = true
-                        window?.$message?.warning('请输入桩号前缀')
-                    } else if (!reg.test(res.prefix)) {
-                        row.isEdit = true
-                        window?.$message?.warning('桩号前缀只允许输入大写的英文字母')
-                    } else {
-                        row.isEdit = false
-                        savePartInfo(row)
-                    }
-                },
-                onDel (res) {
-                    if (!!row.id) {
-                        bezier.delPartData({
-                            ids: row.id
-                        }).then(({data}) => {
-                            if (data.code === 200) {
-                                queryPartList().then()
-                                AdminPartTableData.value.splice(index, 1)
-                                window?.$message?.success('删除成功')
-                            } else {
-                                window?.$message?.error('删除失败')
-                            }
-                        })
-                    } else {
-                        AdminPartTableData.value.splice(index, 1)
-                    }
-                }
-            })*/
-        }
-    }
-];
-//保存片段数据
-const savePartLoading = ref(false)
-const savePartInfo = (row,modal = false) => {
-    if (!!row.id) {
-        savePartLoading.value = true
-        bezier.savePartUpdate(row).then(({data}) => {
-            savePartLoading.value = false
-            if (data.code === 200) {
-                row.isEdit = false
-                queryPartList().then()
-                window?.$message?.success('更新成功')
-                if (modal) showAddPartModal.value = false
-            } else {
-                row.isEdit = true
-                window?.$message?.error('更新失败')
-            }
-        }).catch(() => {
-            savePartLoading.value = false
-        })
-    } else {
-        savePartLoading.value = true
-        row.projectId = projectId.value;
-        row.contractId = contractId.value;
-        bezier.savePartAdd(row).then(({data}) => {
-            savePartLoading.value = false
-            if (data.code === 200) {
-                row = data.data
-                row.isEdit = false
-                queryPartList().then()
-                window?.$message?.success('新增成功')
-                if (modal) showAddPartModal.value = false
-            } else {
-                row.isEdit = true
-                window?.$message?.error('新增失败')
-            }
-        }).catch(() => {
-            savePartLoading.value = false
-        })
-    }
-}
 const AdminPartClick = () => {
-    AdminPartTableData.value = JSON.parse(JSON.stringify(partData.value));
-    showAdminPartModal.value = true
-}
-const AddAdminPart = () => {
-    AdminPartTableData.value.push({
-        id: '', name: '', prefix: '',
-        isEdit: true
-    })
-}
-
-//线元类型
-const showLineEleModal = ref(false)
-const formLineEleValue = ref({type: 0})
-//添加线元弹窗
-const addLineEleModal = () => {
-    showLineEleModal.value = true
-    getNextMileagexy()
-}
-//刷新
-const refreshable = () => {
-    getNextMileagexy({
-        orderNum: formLineEleValue.value['orderNum']
-    })
-}
-
-//获取初始信息
-const getNextMileagexy = (obj = {}) => {
-    bezier.getNextMileagexy({
-        projectId: projectId.value,
-        partId: searchForm.value.partId,
-        ...obj
-    }).then(({data}) => {
-        if(!!data) {
-            let mile = ['x', 'y', 'fen', 'miao', 'du', 'value', 'l',  'dlq', 'dlh', 'swing', 'r', 'r2', 'orderNum']
-            mile.forEach((key) => {
-                formLineEleValue.value[key] = data[key] + '';
-            })
-            formLineEleValue.value['type'] = data['type'];
-            formLineEleValue.value['projectId'] = projectId.value;
-            formLineEleValue.value['contractId'] = contractId.value;
-            formLineEleValue.value['partId'] = searchForm.value.partId;
-        } else {
-            formLineEleValue.value = {type: 0}
-            formLineEleValue.value['projectId'] = projectId.value;
-            formLineEleValue.value['contractId'] = contractId.value;
-            formLineEleValue.value['partId'] = searchForm.value.partId;
-        }
-    })
-}
 
-//保存线元数据
-const saveLoading = ref(false)
-const saveClick = () => {
-    let form = formLineEleValue.value || {};
-    form.partId = searchForm.value.partId;
-    if (form.id === -1 || !form.id) {
-        saveLoading.value = true
-        bezier.saveAddMileage(form).then(({data}) => {
-            saveLoading.value = false
-            if (data.code === 200) {
-                window?.$message?.success('保存成功')
-                showLineEleModal.value = false
-                getTableData()
-            } else {
-                window?.$message?.error('保存失败')
-            }
-        }).catch(() => {
-            saveLoading.value = false
-        })
-    } else {
-        saveLoading.value = true
-        bezier.saveUpdateMileage(form).then(({data}) => {
-            saveLoading.value = false
-            if (data.code === 200) {
-                window?.$message?.success('保存成功')
-                showLineEleModal.value = false
-                getTableData()
-            } else {
-                window?.$message?.error('保存失败')
-            }
-        }).catch(() => {
-            saveLoading.value = false
-        })
-    }
 }
+//编辑
+const handleAdminPartdit = () => {
 
-//里程转换坐标
-const showToModal = ref(false)
-const formToValue = ref({value: '', b: '0', jj: '90', x: '', y: ''})
-const showToModalClick = () => {
-    formToValue.value = {value: '', b: '0', jj: '90', x: '', y: ''}
-    showToModal.value = true
-}
-//转换坐标
-const queryPsChange = () => {
-    bezier.queryPsChange({
-        projectId: projectId.value,
-        partId: searchForm.value.partId,
-        value: formToValue.value.value,
-        b: formToValue.value.b,
-        jj: formToValue.value.jj
-    }).then(({data}) => {
-        if (data.code === 200) {
-            formToValue.value['x'] = data?.data?.x + '';
-            formToValue.value['y'] = data?.data?.y + '';
-            window?.$message?.success('转换成功')
-        } else {
-            window?.$message?.error('转换失败')
-        }
-    })
 }
 
-//导入弹窗
-const showImportModal = ref(false)
-const fileListLength = ref(0);
-const uploadRef = ref(null);
+//删除
+const handleAdminPartDelete = () => {
 
-//上传组件参数
-const action = '/api/blade-business/mileage/import';
-const accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel';
-const upData = ref({
-    projectId: projectId.value,
-    contractId: contractId.value,
-    partId: searchForm.value.partId
-})
-
-const importLoading = ref(false)
-const importModalClick = () => {
-    showImportModal.value = true
-    upData.value = {
-        projectId: projectId.value,
-        contractId: contractId.value,
-        partId: searchForm.value.partId
-    }
-}
-const handleUploadChange = (options) => {
-    fileListLength.value = options.fileList.length;
-}
-const handleImportClick = () => {
-    importLoading.value = true
-    uploadRef.value?.submit();
-}
-//上传完成
-const uploadFinish = ({event}) => {
-    importLoading.value = false
-    let res = JSON.parse(event?.target?.response);
-    if (res.code === 200) {
-        window?.$message?.success('导入成功')
-        showImportModal.value = false
-        getTableData()
-    } else {
-        window?.$message?.error('导入失败')
-    }
-}
-
-//逐桩坐标
-const showPileModal = ref(false)
-const formPileValue = ref({x: '0', y: '0', value: '0', b: '0'})
-const pileColumns = [
-    {title: '序号', key: 'key', width: 80, align: 'center',
-        render(_, index) {
-            return index + 1
-        }
-    },
-    {title: '里程', key: 'valueStr'},
-    {title: '偏距', key: 'b'},
-    {title: 'X', key: 'xxStr'},
-    {title: 'Y', key: 'yyStr'}
-];
-const pileTable = ref([]);
-const pileModalClick = () => {
-    formPileValue.value = {
-        projectId: projectId.value,
-        partId: searchForm.value.partId,
-        x: '0',
-        y: '0',
-        value: '0',
-        b: '0'
-    }
-    showPileModal.value = true
-}
-//生成
-const generateLoading = ref(false)
-const generateClick = () => {
-    generateLoading.value = true
-    bezier.getZzList(formPileValue.value).then(({data}) => {
-        generateLoading.value = false
-        if (data.code === 200) {
-            pileTable.value = data.data;
-        } else {
-            window?.$message?.error('生成失败')
-        }
-    }).catch(() => {
-        generateLoading.value = false
-    })
 }
 
-//导出弹窗
-const exportModalClick  = () => {
-    window?.$dialog?.warning({
-        title: "导出数据",
-        content: "请确认当前查询条件,系统将以当前筛选条件导出数据",
-        positiveText: "确定导出",
-        negativeText: "取消",
-        onPositiveClick: () => {
-            bezier.getExportExcel({
-                projectId: projectId.value,
-                partId: searchForm.value.partId,
-                partNo: ''
-            }).then(res => {
-                download(res)
-            })
-        }
-    });
-}
 </script>
 
 <style lang="scss" scoped>

+ 787 - 0
src/views/gauge/bezier_a.vue

@@ -0,0 +1,787 @@
+<template>
+    <n-divider dashed title-placement="left">平曲线</n-divider>
+    <div class="hc-layout-box">
+        <n-card class="hc-card-overflow-p-box" :segmented="{content: true}">
+            <template #header>
+                <div class="hc-card-header flex items-center">
+                    <div class="w-60 mr-4">
+                        <n-select label-field="name" value-field="id" v-model:value="searchForm.partId" :options="partData" placeholder="片段查询" @update:value="searchChange" clearable/>
+                    </div>
+                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_add_part?.textInfo" v-if="btn_add_part">
+                        <template #trigger>
+                            <span class="ml-3 icon-btn" @click="AddPartClick">
+                                <i class="cicon-add-round-o"/>
+                            </span>
+                        </template>
+                        <span>{{btn_add_part?.textInfo}}</span>
+                    </n-popover>
+                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_admin_part?.textInfo" v-if="btn_admin_part">
+                        <template #trigger>
+                            <span class="ml-3 icon-btn" @click="AdminPartClick">
+                                <i class="cicon-set-list"/>
+                            </span>
+                        </template>
+                        <span>{{btn_admin_part?.textInfo}}</span>
+                    </n-popover>
+                </div>
+            </template>
+            <template #header-extra>
+                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_add?.textInfo" v-if="btn_add">
+                    <template #trigger>
+                        <n-button type="primary" strong secondary class="px-5" @click="addLineEleModal">添加线元</n-button>
+                    </template>
+                    <span>{{btn_add?.textInfo}}</span>
+                </n-popover>
+                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_to?.textInfo" v-if="btn_to">
+                    <template #trigger>
+                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="showToModalClick">转换坐标</n-button>
+                    </template>
+                    <span>{{btn_to?.textInfo}}</span>
+                </n-popover>
+                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_import?.textInfo" v-if="btn_import">
+                    <template #trigger>
+                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="importModalClick">导入线元</n-button>
+                    </template>
+                    <span>{{btn_import?.textInfo}}</span>
+                </n-popover>
+                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_pile?.textInfo" v-if="btn_pile">
+                    <template #trigger>
+                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="pileModalClick">逐桩坐标</n-button>
+                    </template>
+                    <span>{{btn_pile?.textInfo}}</span>
+                </n-popover>
+                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_export?.textInfo" v-if="btn_export">
+                    <template #trigger>
+                        <n-button type="primary" strong secondary class="px-5 ml-3" @click="exportModalClick">导出</n-button>
+                    </template>
+                    <span>{{btn_export?.textInfo}}</span>
+                </n-popover>
+            </template>
+            <n-data-table :columns="tableColumns" :data="tableData" :pagination="false" :row-key="row => row.name" :loading="tableLoading" :single-line="false" striped/>
+            <template #action>
+                <HcPage :pages="searchForm" @change="pageChange"/>
+            </template>
+        </n-card>
+    </div>
+    <!--新增片段弹框-->
+    <n-modal v-model:show="showAddPartModal">
+        <n-card class="w-606" title="新增片段" :segmented="{content: true}">
+            <n-form ref="formAddPartRef" :model="formAddPartValue" :rules="rulesAddPart" label-placement="left" label-width="auto" size="large">
+                <n-form-item label="名称" path="name">
+                    <n-input class="flex-1" v-model:value="formAddPartValue.name" placeholder="请输入名称"/>
+                </n-form-item>
+                <n-form-item label="桩号前缀" path="prefix">
+                    <n-input class="flex-1" v-model:value="formAddPartValue.prefix" placeholder="只允许输入大写的英文字母"/>
+                </n-form-item>
+            </n-form>
+            <template #action>
+                <div class="text-center">
+                    <n-button class="px-5" @click="showAddPartModal = false">取消</n-button>
+                    <n-button type="primary" class="px-5 ml-6" :loading="savePartLoading" @click="savePartInfo(formAddPartValue, true)">保存</n-button>
+                </div>
+            </template>
+        </n-card>
+    </n-modal>
+    <!--管理片段弹框-->
+    <n-modal v-model:show="showAdminPartModal">
+        <n-card class="w-750" title="管理片段" :segmented="{content: true}">
+            <div class="admin-part-data-table">
+                <n-data-table :key="(row) => row.id" :columns="AdminPartColumns" :data="AdminPartTableData" :single-line="false" striped/>
+            </div>
+            <template #action>
+                <div class="text-center">
+                    <n-button class="px-5" @click="showAdminPartModal = false">取消</n-button>
+                    <n-button type="primary" class="px-5 ml-6" @click="AddAdminPart">新增</n-button>
+                </div>
+            </template>
+        </n-card>
+    </n-modal>
+
+    <!--添加/编辑线元弹框-->
+    <n-modal v-model:show="showLineEleModal">
+        <n-card class="w-750" :title="(formLineEleValue.id == -1 || !formLineEleValue.id)?'添加线元':'编辑线元'" :segmented="{content: true}">
+            <n-form :model="formLineEleValue" label-placement="left" label-width="auto" size="large">
+                <n-form-item label="类型">
+                    <n-radio-group class="flex-1" v-model:value="formLineEleValue.type" name="radiogroup">
+                        <n-space>
+                            <n-radio v-for="item in lineElementType" :key="item.value" :value="item.value">{{ item.label }}</n-radio>
+                        </n-space>
+                    </n-radio-group>
+                </n-form-item>
+                <n-form-item label="开始里程">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.value" placeholder="请输入开始里程"/>
+                </n-form-item>
+                <n-form-item label="X">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.x" placeholder="请输入X"/>
+                </n-form-item>
+                <n-form-item label="Y">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.y" placeholder="请输入Y"/>
+                </n-form-item>
+                <n-form-item label="半径" v-if="formLineEleValue.type != 0">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.r" placeholder="请输入半径"/>
+                </n-form-item>
+                <n-form-item label="结束半径" v-if="formLineEleValue.type == 3">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.r2" placeholder="请输入半径"/>
+                </n-form-item>
+                <n-form-item label="转向" v-if="formLineEleValue.type != 0">
+                    <n-radio-group class="flex-1" v-model:value="formLineEleValue.swing" name="radiogroup">
+                        <n-space>
+                            <n-radio value="左转">左转</n-radio>
+                            <n-radio value="右转">右转</n-radio>
+                        </n-space>
+                    </n-radio-group>
+                </n-form-item>
+                <n-form-item label="线长度">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.l" placeholder="请输入线长度"/>
+                </n-form-item>
+                <div class="flex">
+                    <n-form-item class="flex-1" label="方位角">
+                        <n-input v-model:value="formLineEleValue.du" placeholder="输入度">
+                            <template #suffix>度</template>
+                        </n-input>
+                    </n-form-item>
+                    <n-form-item class="flex-1 ml-4">
+                        <n-input v-model:value="formLineEleValue.fen" placeholder="输入分">
+                            <template #suffix>分</template>
+                        </n-input>
+                    </n-form-item>
+                    <n-form-item class="flex-1 ml-4">
+                        <n-input v-model:value="formLineEleValue.miao" placeholder="输入秒">
+                            <template #suffix>秒</template>
+                        </n-input>
+                    </n-form-item>
+                </div>
+                <n-form-item label="断链前里程" v-if="formLineEleValue.type != 3">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.dlq" placeholder="请输入断链前里程"/>
+                </n-form-item>
+                <n-form-item label="断链后里程" v-if="formLineEleValue.type != 3">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.dlh" placeholder="请输入断链后里程"/>
+                </n-form-item>
+                <n-form-item label="顺序">
+                    <n-input class="flex-1" v-model:value="formLineEleValue.orderNum" placeholder="请输入顺序"/>
+                </n-form-item>
+            </n-form>
+            <template #action>
+                <div class="text-center">
+                    <n-button class="px-5" @click="showLineEleModal = false">取消</n-button>
+                    <n-button type="primary" strong secondary class="px-5 ml-6" @click="refreshable" v-if="formLineEleValue.id == -1 || !formLineEleValue.id">刷新</n-button>
+                    <n-button type="primary" class="px-5 ml-6" :loading="saveLoading" @click="saveClick">保存</n-button>
+                </div>
+            </template>
+        </n-card>
+    </n-modal>
+    <!--里程转换坐标-->
+    <n-modal v-model:show="showToModal">
+        <n-card class="w-606" title="里程转换坐标" :segmented="{content: true}">
+            <n-form :model="formToValue" label-placement="left" label-width="auto" size="large">
+                <n-form-item label="里程">
+                    <n-input class="flex-1" v-model:value="formToValue.value" placeholder="请输入里程"/>
+                </n-form-item>
+                <n-form-item label="偏移">
+                    <n-input class="flex-1" v-model:value="formToValue.b" placeholder="请输入偏移"/>
+                </n-form-item>
+                <n-form-item label="夹角">
+                    <n-input class="flex-1" v-model:value="formToValue.jj" placeholder="请输入夹角"/>
+                </n-form-item>
+                <n-form-item label="X">{{formToValue.x}}</n-form-item>
+                <n-form-item label="Y">{{formToValue.y}}</n-form-item>
+            </n-form>
+            <template #action>
+                <div class="text-center">
+                    <n-button class="px-5" @click="showToModal = false">取消</n-button>
+                    <n-button type="primary" class="px-5 ml-6" @click="queryPsChange">转换</n-button>
+                </div>
+            </template>
+        </n-card>
+    </n-modal>
+    <!--导入 弹框-->
+    <n-modal v-model:show="showImportModal">
+        <n-card class="w-414" title="导入线元" :segmented="{content: true}">
+            <template #header-extra>
+                <a href="https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220614/a8bb45b57e409ff6bd5a5aad4bc7b22e.xlsx" target="_blank" class="text-link">下载导入模板</a>
+            </template>
+            <div class="text-center">
+                <n-upload ref="uploadRef" :action="action" :headers="getTokenHeader()" :data="upData" :max="1" :accept="accept" :default-upload="false" multiple @change="handleUploadChange" @finish="uploadFinish">
+                    <n-button type="primary" class="px-4">选择文件</n-button>
+                </n-upload>
+            </div>
+            <template #action>
+                <div class="text-center">
+                    <n-button class="px-4" @click="showImportModal = false">取消</n-button>
+                    <n-button type="primary" :disabled="!fileListLength" class="px-4 ml-6" :loading="importLoading" @click="handleImportClick">确认导入</n-button>
+                </div>
+            </template>
+        </n-card>
+    </n-modal>
+    <!--逐桩坐标弹框-->
+    <n-modal v-model:show="showPileModal">
+        <n-card class="w-990" title="逐桩坐标" :segmented="{content: true}">
+            <n-form :model="formPileValue" inline label-width="auto">
+                <n-form-item label="开始桩号">
+                    <n-input v-model:value="formPileValue.x" placeholder="开始桩号" />
+                </n-form-item>
+                <n-form-item label="结束桩号">
+                    <n-input v-model:value="formPileValue.y" placeholder="结束桩号" />
+                </n-form-item>
+                <n-form-item label="桩距">
+                    <n-input v-model:value="formPileValue.value" placeholder="桩距" />
+                </n-form-item>
+                <n-form-item label="偏距">
+                    <n-input v-model:value="formPileValue.b" placeholder="偏距" />
+                </n-form-item>
+                <n-form-item>
+                    <n-button attr-type="button" type="primary" class="px-4" :loading="generateLoading" @click="generateClick">生成</n-button>
+                </n-form-item>
+            </n-form>
+            <div class="admin-part-data-table">
+                <n-data-table :key="(row) => row.key" :columns="pileColumns" :data="pileTable" :single-line="false" striped/>
+            </div>
+            <template #action>
+                <div class="text-center">
+                    <n-button class="px-5" @click="showPileModal = false">关闭</n-button>
+                </div>
+            </template>
+        </n-card>
+    </n-modal>
+</template>
+
+<script setup>
+import {h, onMounted, ref, watch} from "vue";
+import {useAppStore} from "~src/store/index";
+import bezier from '~api/gauge/bezier';
+import HcPage from "~com/plugins/naive/HcPage.vue"
+import {getTokenHeader} from '~src/api/request/header';
+import {download} from '~src/utils/lib/tools';
+//import {renderTableEditDelButton,renderTableEditInput, renderTableEditInputButton} from "~src/plugins/renderele";
+
+//初始变量
+const useAppState = useAppStore()
+const projectId = ref(useAppState.getProjectId);
+const contractId = ref(useAppState.getContractId);
+//按钮气泡开关
+const bubbleVal = ref(useAppState.getBubble);
+
+//监听
+watch(() => [
+    useAppState.getProjectId,
+    useAppState.getContractId,
+    useAppState.getBubble,
+], ([UserProjectId,UserContractId,Bubble]) => {
+    //项目合同数据
+    projectId.value = UserProjectId
+    contractId.value = UserContractId
+    //按钮气泡开关
+    bubbleVal.value = Bubble
+})
+
+//获取气泡数据
+const getButtonsVal = (value) => {
+    return useAppState.getButtonsVal(value)
+}
+
+//气泡数据
+const btn_add_part = ref(getButtonsVal('gauge-bezier-add-part'))
+const btn_admin_part = ref(getButtonsVal('gauge-bezier-admin-part'))
+
+const btn_add = ref(getButtonsVal('gauge-bezier-add'))
+const btn_to = ref(getButtonsVal('gauge-bezier-to'))
+const btn_import = ref(getButtonsVal('gauge-bezier-import'))
+const btn_pile = ref(getButtonsVal('gauge-bezier-pile'))
+const btn_export = ref(getButtonsVal('gauge-bezier-export'))
+const btn_edit = ref(getButtonsVal('gauge-bezier-edit'))
+const btn_del = ref(getButtonsVal('gauge-bezier-del'))
+
+//片段查询
+const partData = ref([])
+//搜索表单
+const searchForm = ref({partId: '', current: 1, size: 20, total: 0})
+const lineElementType = ref([
+    {value: 0, label: "直线段"},
+    {value: 1, label: "圆曲线"},
+    {value: 2, label: "入缓和曲线"},
+    {value: 3, label: "出缓和曲线"},
+    {value: 4, label: "不完整缓和曲线"},
+])
+
+//获取类型名称
+const GetTypeName = (val) => {
+    if (val != -1 || val >= 0) {
+        return lineElementType.value[val].label || '';
+    } else {
+        return '-';
+    }
+}
+
+//渲染完成
+onMounted(() => {
+    queryPartList().then()
+})
+
+async function queryPartList() {
+    const partList = await bezier.queryPartList({
+        projectId: projectId.value,
+        contractId: contractId.value
+    })
+    let partListData = partList?.data?.data || [];
+    partData.value = partListData;
+    if (partListData.length > 0 && !searchForm.value.partId) {
+        searchForm.value.partId = partListData[0].id;
+        getTableData()
+    }
+}
+
+//导线点的 表格表头
+const tableLoading = ref(false)
+const createColumns = ({edit,del}) => {
+    return [
+        {title: '序号', key: 'num', width: 80, align: 'center',
+            render(_, index) {
+                return index + 1
+            }
+        },
+        {title: '里程', key: 'name',
+            render(row) {
+                return `${row.valueStr}~${row.valueEndStr}`
+            }
+        },
+        {title: '排序', key: 'orderNum'},
+        {title: '长度', key: 'l'},
+        {title: '方位角', key: 'angle'},
+        {title: '类型', key: 'type',
+            render(row) {
+                return GetTypeName(row.type)
+            }
+        },
+        {title: '转向', key: 'swing'},
+        {title: 'X', key: 'xxStr'},
+        {title: 'Y', key: 'yyStr'},
+        {title: '半径', key: 'r'},
+        {title: "操作", key: "actions", width: 160, align: 'center',
+            render(row) {
+                /*return renderTableEditDelButton({
+                    bubble: bubbleVal.value,
+                    btn_edit: btn_edit.value,
+                    btn_del: btn_del.value,
+                    edit_event: edit,
+                    del_event: del,
+                    row:row
+                })*/
+            }
+        }
+    ];
+};
+const tableColumns = createColumns({
+    edit(row) {
+        const form = JSON.parse(JSON.stringify(row))
+        formLineEleValue.value['id'] = form.id;
+        formLineEleValue.value['type'] = form['type'];
+        formLineEleValue.value['projectId'] = projectId.value;
+        formLineEleValue.value['contractId'] = contractId.value;
+        formLineEleValue.value['partId'] = searchForm.value.partId;
+        let mile = ['x', 'y', 'fen', 'miao', 'du', 'value', 'l',  'dlq', 'dlh', 'swing', 'r', 'r2', 'orderNum']
+        mile.forEach((key) => {
+            formLineEleValue.value[key] = form[key] + '';
+        })
+        showLineEleModal.value = true
+    },
+    del(row) {
+        bezier.saveDelMileage({
+            id: row.id
+        }).then(({data}) => {
+            if (data.code === 200) {
+                window?.$message?.success('删除成功')
+                getTableData()
+            } else {
+                window?.$message?.error('删除失败')
+            }
+        })
+    },
+})
+const tableData = ref([]);
+
+//重新搜索数据
+const searchChange = (res) => {
+    searchForm.value.current = 1
+    getTableData()
+}
+//分页被点击
+const pageChange = (res) => {
+    searchForm.value.current = res.current;
+    searchForm.value.size = res.size;
+    getTableData()
+}
+//获取数据
+const getTableData = () => {
+    tableLoading.value = true
+    bezier.queryListData(searchForm.value).then(({data}) => {
+        let res = data['data'] || {}
+        tableData.value = res['records'] || []
+        searchForm.value.total = res.total || 0
+        tableLoading.value = false
+    }).catch(() => {
+        tableLoading.value = false
+    })
+}
+
+//新增片段弹框
+const showAddPartModal = ref(false)
+const formAddPartRef = ref(null)
+const formAddPartValue = ref({name: '', prefix: ''})
+const rulesAddPart = {
+    name: {
+        required: true,
+        trigger: ["blur", "input"],
+        message: "请输入名称"
+    },
+    prefix: {
+        required: true,
+        validator(rule, value) {
+            const reg = /^[A-Z]+$/
+            if (!value) {
+                return new Error("请输入桩号前缀");
+            } else if (!reg.test(value)) {
+                return new Error("只允许输入大写的英文字母");
+            }
+            return true;
+        },
+        trigger: ["blur", "input"],
+    }
+}
+//添加片段按钮
+const AddPartClick = () => {
+    formAddPartValue.value.name = ''
+    formAddPartValue.value.prefix = ''
+    showAddPartModal.value = true
+}
+//管理片段弹窗
+const showAdminPartModal = ref(false)
+const AdminPartTableData = ref([])
+const AdminPartColumns = [
+    {
+        title: '片段名称',
+        key: 'name',
+        render (row) {
+            /*return h(renderTableEditInput, {
+                value: row.name,
+                isEdit: row.isEdit,
+                onUpdateValue (val) {
+                    row.name = val
+                }
+            })*/
+        }
+    },
+    {
+        title: '桩号前缀',
+        key: 'prefix',
+        render (row) {
+            /*return h(renderTableEditInput, {
+                value: row.prefix,
+                isEdit: row.isEdit,
+                onUpdateValue (val) {
+                    row.prefix = val
+                }
+            })*/
+        }
+    },
+    {title: "操作", key: "actions", width: 160, align: 'center',
+        render(row,index) {
+            /*return h(renderTableEditInputButton, {
+                row: row,
+                onSave (res) {
+                    const reg = /^[A-Z]+$/
+                    if (!res.name) {
+                        row.isEdit = true
+                        window?.$message?.warning('请输入片段名称')
+                    } else if (!res.prefix) {
+                        row.isEdit = true
+                        window?.$message?.warning('请输入桩号前缀')
+                    } else if (!reg.test(res.prefix)) {
+                        row.isEdit = true
+                        window?.$message?.warning('桩号前缀只允许输入大写的英文字母')
+                    } else {
+                        row.isEdit = false
+                        savePartInfo(row)
+                    }
+                },
+                onDel (res) {
+                    if (!!row.id) {
+                        bezier.delPartData({
+                            ids: row.id
+                        }).then(({data}) => {
+                            if (data.code === 200) {
+                                queryPartList().then()
+                                AdminPartTableData.value.splice(index, 1)
+                                window?.$message?.success('删除成功')
+                            } else {
+                                window?.$message?.error('删除失败')
+                            }
+                        })
+                    } else {
+                        AdminPartTableData.value.splice(index, 1)
+                    }
+                }
+            })*/
+        }
+    }
+];
+//保存片段数据
+const savePartLoading = ref(false)
+const savePartInfo = (row,modal = false) => {
+    if (!!row.id) {
+        savePartLoading.value = true
+        bezier.savePartUpdate(row).then(({data}) => {
+            savePartLoading.value = false
+            if (data.code === 200) {
+                row.isEdit = false
+                queryPartList().then()
+                window?.$message?.success('更新成功')
+                if (modal) showAddPartModal.value = false
+            } else {
+                row.isEdit = true
+                window?.$message?.error('更新失败')
+            }
+        }).catch(() => {
+            savePartLoading.value = false
+        })
+    } else {
+        savePartLoading.value = true
+        row.projectId = projectId.value;
+        row.contractId = contractId.value;
+        bezier.savePartAdd(row).then(({data}) => {
+            savePartLoading.value = false
+            if (data.code === 200) {
+                row = data.data
+                row.isEdit = false
+                queryPartList().then()
+                window?.$message?.success('新增成功')
+                if (modal) showAddPartModal.value = false
+            } else {
+                row.isEdit = true
+                window?.$message?.error('新增失败')
+            }
+        }).catch(() => {
+            savePartLoading.value = false
+        })
+    }
+}
+const AdminPartClick = () => {
+    AdminPartTableData.value = JSON.parse(JSON.stringify(partData.value));
+    showAdminPartModal.value = true
+}
+const AddAdminPart = () => {
+    AdminPartTableData.value.push({
+        id: '', name: '', prefix: '',
+        isEdit: true
+    })
+}
+
+//线元类型
+const showLineEleModal = ref(false)
+const formLineEleValue = ref({type: 0})
+//添加线元弹窗
+const addLineEleModal = () => {
+    showLineEleModal.value = true
+    getNextMileagexy()
+}
+//刷新
+const refreshable = () => {
+    getNextMileagexy({
+        orderNum: formLineEleValue.value['orderNum']
+    })
+}
+
+//获取初始信息
+const getNextMileagexy = (obj = {}) => {
+    bezier.getNextMileagexy({
+        projectId: projectId.value,
+        partId: searchForm.value.partId,
+        ...obj
+    }).then(({data}) => {
+        if(!!data) {
+            let mile = ['x', 'y', 'fen', 'miao', 'du', 'value', 'l',  'dlq', 'dlh', 'swing', 'r', 'r2', 'orderNum']
+            mile.forEach((key) => {
+                formLineEleValue.value[key] = data[key] + '';
+            })
+            formLineEleValue.value['type'] = data['type'];
+            formLineEleValue.value['projectId'] = projectId.value;
+            formLineEleValue.value['contractId'] = contractId.value;
+            formLineEleValue.value['partId'] = searchForm.value.partId;
+        } else {
+            formLineEleValue.value = {type: 0}
+            formLineEleValue.value['projectId'] = projectId.value;
+            formLineEleValue.value['contractId'] = contractId.value;
+            formLineEleValue.value['partId'] = searchForm.value.partId;
+        }
+    })
+}
+
+//保存线元数据
+const saveLoading = ref(false)
+const saveClick = () => {
+    let form = formLineEleValue.value || {};
+    form.partId = searchForm.value.partId;
+    if (form.id === -1 || !form.id) {
+        saveLoading.value = true
+        bezier.saveAddMileage(form).then(({data}) => {
+            saveLoading.value = false
+            if (data.code === 200) {
+                window?.$message?.success('保存成功')
+                showLineEleModal.value = false
+                getTableData()
+            } else {
+                window?.$message?.error('保存失败')
+            }
+        }).catch(() => {
+            saveLoading.value = false
+        })
+    } else {
+        saveLoading.value = true
+        bezier.saveUpdateMileage(form).then(({data}) => {
+            saveLoading.value = false
+            if (data.code === 200) {
+                window?.$message?.success('保存成功')
+                showLineEleModal.value = false
+                getTableData()
+            } else {
+                window?.$message?.error('保存失败')
+            }
+        }).catch(() => {
+            saveLoading.value = false
+        })
+    }
+}
+
+//里程转换坐标
+const showToModal = ref(false)
+const formToValue = ref({value: '', b: '0', jj: '90', x: '', y: ''})
+const showToModalClick = () => {
+    formToValue.value = {value: '', b: '0', jj: '90', x: '', y: ''}
+    showToModal.value = true
+}
+//转换坐标
+const queryPsChange = () => {
+    bezier.queryPsChange({
+        projectId: projectId.value,
+        partId: searchForm.value.partId,
+        value: formToValue.value.value,
+        b: formToValue.value.b,
+        jj: formToValue.value.jj
+    }).then(({data}) => {
+        if (data.code === 200) {
+            formToValue.value['x'] = data?.data?.x + '';
+            formToValue.value['y'] = data?.data?.y + '';
+            window?.$message?.success('转换成功')
+        } else {
+            window?.$message?.error('转换失败')
+        }
+    })
+}
+
+//导入弹窗
+const showImportModal = ref(false)
+const fileListLength = ref(0);
+const uploadRef = ref(null);
+
+//上传组件参数
+const action = '/api/blade-business/mileage/import';
+const accept = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel';
+const upData = ref({
+    projectId: projectId.value,
+    contractId: contractId.value,
+    partId: searchForm.value.partId
+})
+
+const importLoading = ref(false)
+const importModalClick = () => {
+    showImportModal.value = true
+    upData.value = {
+        projectId: projectId.value,
+        contractId: contractId.value,
+        partId: searchForm.value.partId
+    }
+}
+const handleUploadChange = (options) => {
+    fileListLength.value = options.fileList.length;
+}
+const handleImportClick = () => {
+    importLoading.value = true
+    uploadRef.value?.submit();
+}
+//上传完成
+const uploadFinish = ({event}) => {
+    importLoading.value = false
+    let res = JSON.parse(event?.target?.response);
+    if (res.code === 200) {
+        window?.$message?.success('导入成功')
+        showImportModal.value = false
+        getTableData()
+    } else {
+        window?.$message?.error('导入失败')
+    }
+}
+
+//逐桩坐标
+const showPileModal = ref(false)
+const formPileValue = ref({x: '0', y: '0', value: '0', b: '0'})
+const pileColumns = [
+    {title: '序号', key: 'key', width: 80, align: 'center',
+        render(_, index) {
+            return index + 1
+        }
+    },
+    {title: '里程', key: 'valueStr'},
+    {title: '偏距', key: 'b'},
+    {title: 'X', key: 'xxStr'},
+    {title: 'Y', key: 'yyStr'}
+];
+const pileTable = ref([]);
+const pileModalClick = () => {
+    formPileValue.value = {
+        projectId: projectId.value,
+        partId: searchForm.value.partId,
+        x: '0',
+        y: '0',
+        value: '0',
+        b: '0'
+    }
+    showPileModal.value = true
+}
+//生成
+const generateLoading = ref(false)
+const generateClick = () => {
+    generateLoading.value = true
+    bezier.getZzList(formPileValue.value).then(({data}) => {
+        generateLoading.value = false
+        if (data.code === 200) {
+            pileTable.value = data.data;
+        } else {
+            window?.$message?.error('生成失败')
+        }
+    }).catch(() => {
+        generateLoading.value = false
+    })
+}
+
+//导出弹窗
+const exportModalClick  = () => {
+    window?.$dialog?.warning({
+        title: "导出数据",
+        content: "请确认当前查询条件,系统将以当前筛选条件导出数据",
+        positiveText: "确定导出",
+        negativeText: "取消",
+        onPositiveClick: () => {
+            bezier.getExportExcel({
+                projectId: projectId.value,
+                partId: searchForm.value.partId,
+                partNo: ''
+            }).then(res => {
+                download(res)
+            })
+        }
+    });
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../styles/gauge/bezier.scss';
+</style>

+ 3 - 3
src/views/gauge/station.vue

@@ -4,19 +4,19 @@
             <template #header>
                 <HcTooltip keys="gauge-station-add">
                     <el-button type="primary" hc-btn @click="AddRowClick">
-                        <HcIcon name="drive_folder_upload"/>
+                        <HcIcon name="add_box"/>
                         <span>新增</span>
                     </el-button>
                 </HcTooltip>
                 <HcTooltip keys="gauge-station-import">
                     <el-button hc-btn @click="importModalClick">
-                        <HcIcon name="download"/>
+                        <HcIcon name="drive_folder_upload"/>
                         <span>导入</span>
                     </el-button>
                 </HcTooltip>
                 <HcTooltip keys="gauge-station-export">
                     <el-button hc-btn :loading="downloadLoading" @click="exportModalClick">
-                        <HcIcon name="print"/>
+                        <HcIcon name="download"/>
                         <span>导出</span>
                     </el-button>
                 </HcTooltip>