Ver código fonte

微功能中心的大批量数据处理任务添加“OBJ 三维模型轻量化”任务。并在《任务管理》页面添加失败重试按钮

DESKTOP-6LTVLN7\Liumouren 3 semanas atrás
pai
commit
1b8d8a664a
3 arquivos alterados com 512 adições e 300 exclusões
  1. 88 23
      src/components/wgn/controlPanel.vue
  2. 407 276
      src/views/Wgn.vue
  3. 17 1
      src/views/rwgl/Index.vue

+ 88 - 23
src/components/wgn/controlPanel.vue

@@ -119,10 +119,7 @@
                 >渲染到地图中</span
               >
               <el-tooltip content="定位到当前入参渲染要素" placement="top">
-                <span
-                  v-if="renderStatus.input"
-                  @click="locateRenderedGeojson('input')"
-                >
+                <span v-if="renderStatus.input" @click="locateRenderedGeojson('input')">
                   定位
                 </span>
               </el-tooltip>
@@ -164,10 +161,7 @@
                 >渲染到地图中</span
               >
               <el-tooltip content="定位到当前返回渲染要素" placement="top">
-                <span
-                  v-if="renderStatus.output"
-                  @click="locateRenderedGeojson('output')"
-                >
+                <span v-if="renderStatus.output" @click="locateRenderedGeojson('output')">
                   定位
                 </span>
               </el-tooltip>
@@ -318,6 +312,7 @@ export default {
         outFileType: "",
         outPrj: "",
         inPrj: "",
+        compressionRatio: "",
         lon: "",
         lat: "",
       },
@@ -467,6 +462,16 @@ export default {
             },
           ],
         },
+        {
+          value: "1.5.8",
+          label: "1.5.8自定义工具",
+          children: [
+            {
+              value: "1.5.8.1",
+              label: "obj三维模型轻量化",
+            },
+          ],
+        },
         // 时空算子库
         {
           value: "1.2.5",
@@ -530,6 +535,24 @@ export default {
             label: "WEB_Mercator",
           },
         ],
+        compressionRatio: [
+          {
+            value: "100%",
+            label: "100%",
+          },
+          {
+            value: "80%",
+            label: "80%",
+          },
+          {
+            value: "50%",
+            label: "50%",
+          },
+          {
+            value: "25%",
+            label: "25%",
+          },
+        ],
         outPrj: [
           {
             value: "WGS84",
@@ -724,7 +747,8 @@ export default {
         this.showToMap(this.renderedGeojsonCache[source], source);
         return;
       }
-      const sourceGeojson = this.getSourceGeojsonData(source) || this.renderedGeojsonCache[source];
+      const sourceGeojson =
+        this.getSourceGeojsonData(source) || this.renderedGeojsonCache[source];
       this.flyToGeojson(sourceGeojson);
     },
     collectGeometryCoordinates(geometry) {
@@ -775,7 +799,11 @@ export default {
       }
       if (points.length === 1) {
         viewer.camera.flyTo({
-          destination: SkyScenery.Cartesian3.fromDegrees(points[0][0], points[0][1], 1200),
+          destination: SkyScenery.Cartesian3.fromDegrees(
+            points[0][0],
+            points[0][1],
+            1200
+          ),
           duration: 1.1,
           orientation: {
             heading: viewer.camera.heading,
@@ -850,7 +878,10 @@ export default {
       if (!isNaN(Number(value))) {
         return Number(value);
       }
-      if ((value.startsWith("{") && value.endsWith("}")) || (value.startsWith("[") && value.endsWith("]"))) {
+      if (
+        (value.startsWith("{") && value.endsWith("}")) ||
+        (value.startsWith("[") && value.endsWith("]"))
+      ) {
         try {
           return JSON.parse(value);
         } catch (e) {
@@ -916,11 +947,15 @@ export default {
         item.editKey = item.originalKey || "";
         return;
       }
-      this.propertyDialog.propertiesRef[currentKey] = this.parsePropertyValue(item.editValue);
+      this.propertyDialog.propertiesRef[currentKey] = this.parsePropertyValue(
+        item.editValue
+      );
       item.originalKey = currentKey;
       item.editKey = currentKey;
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     handlePropertyKeyChange(item) {
       if (!this.propertyDialog.propertiesRef || !item) {
@@ -936,7 +971,10 @@ export default {
         item.editKey = oldKey;
         return;
       }
-      if (newKey !== oldKey && Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)) {
+      if (
+        newKey !== oldKey &&
+        Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)
+      ) {
         this.$message({
           message: "属性名已存在,请更换",
           type: "warning",
@@ -952,19 +990,28 @@ export default {
       item.originalKey = newKey;
       item.editKey = newKey;
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     deleteProperty(item) {
       if (!this.propertyDialog.propertiesRef || !item) {
         return;
       }
       const key = (item.originalKey || "").trim();
-      if (key && Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, key)) {
+      if (
+        key &&
+        Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, key)
+      ) {
         delete this.propertyDialog.propertiesRef[key];
       }
-      this.propertyDialog.list = this.propertyDialog.list.filter((property) => property.id !== item.id);
+      this.propertyDialog.list = this.propertyDialog.list.filter(
+        (property) => property.id !== item.id
+      );
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     addProperty() {
       if (!this.propertyDialog.propertiesRef) {
@@ -976,7 +1023,9 @@ export default {
       }
       let index = 1;
       let newKey = "newKey";
-      while (Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)) {
+      while (
+        Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)
+      ) {
         newKey = `newKey${index}`;
         index += 1;
       }
@@ -988,7 +1037,9 @@ export default {
         editValue: "",
       });
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     syncPropertyToEntity(propertiesRef) {
       if (!propertiesRef || !viewer || !this.currentRenderedSource) {
@@ -1341,7 +1392,8 @@ export default {
           this.currentRenderedSource ||
           "input";
         const geojsonData =
-          this.getSourceGeojsonData(propertySource) || this.renderedGeojsonCache[propertySource];
+          this.getSourceGeojsonData(propertySource) ||
+          this.renderedGeojsonCache[propertySource];
         let propertiesRef = null;
         if (geojsonData) {
           if (
@@ -1354,7 +1406,8 @@ export default {
             if (!geojsonData.features[entity.__featureRef.featureIndex].properties) {
               geojsonData.features[entity.__featureRef.featureIndex].properties = {};
             }
-            propertiesRef = geojsonData.features[entity.__featureRef.featureIndex].properties;
+            propertiesRef =
+              geojsonData.features[entity.__featureRef.featureIndex].properties;
           } else {
             if (!geojsonData.properties) {
               geojsonData.properties = {};
@@ -1365,7 +1418,10 @@ export default {
         const propertyList = this.formatFeatureProperties(
           propertiesRef || entity.__featureProperties || {}
         );
-        if (propertiesRef || (entity.__featureProperties && typeof entity.__featureProperties === "object")) {
+        if (
+          propertiesRef ||
+          (entity.__featureProperties && typeof entity.__featureProperties === "object")
+        ) {
           this.propertyDialog.source = propertySource;
           this.propertyDialog.propertiesRef =
             propertiesRef || entity.__featureProperties || {};
@@ -1987,6 +2043,15 @@ export default {
       ) {
         requestData.inPrj = this.params.inPrj;
       }
+      if (
+        this.SceneValue &&
+        this.dmsServerItem &&
+        this.dmsServerItem.elementTypes &&
+        this.ifHasType("compressionRatio") &&
+        this.params.compressionRatio
+      ) {
+        requestData.compressionRatio = this.params.compressionRatio;
+      }
       if (
         this.SceneValue &&
         this.dmsServerItem &&

+ 407 - 276
src/views/Wgn.vue

@@ -1,288 +1,313 @@
 <template>
   <el-affix :offset="0">
-    <div style="height: 44px;width: 100vw;background: #00002a;"></div>
+    <div style="height: 44px; width: 100vw; background: #00002a"></div>
   </el-affix>
   <el-affix :offset="44">
-  <div class="application-overview">
-    <!-- 右侧主内容区 -->
-    <div class="main-content">
-        <div style="display: flex;justify-content: space-between;padding-right: 30px;">
-            <!-- 搜索栏 -->
-            <div class="search-bar">
-                <el-input
-                    placeholder="输入搜索关键词"
-                    v-model="searchStr"
-                    class="search-input"
-                    >
-                </el-input>
-                <el-button type="primary" class="search-btn" @click="searchServerList">搜索</el-button>
-                <!-- <span>搜索到{{total}}条微功能服务</span> -->
-            </div>
+    <div class="application-overview">
+      <!-- 右侧主内容区 -->
+      <div class="main-content">
+        <div style="display: flex; justify-content: space-between; padding-right: 30px">
+          <!-- 搜索栏 -->
+          <div class="search-bar">
+            <el-input
+              placeholder="输入搜索关键词"
+              v-model="searchStr"
+              class="search-input"
+            >
+            </el-input>
+            <el-button type="primary" class="search-btn" @click="searchServerList"
+              >搜索</el-button
+            >
+            <!-- <span>搜索到{{total}}条微功能服务</span> -->
+          </div>
 
-            <div>
-              <el-button type="primary" class="search-btn" @click="createTask">大批量数据处理任务</el-button>
-                <!-- <el-button type="primary" round plain size="large" @click="createTask"
-                  >大批量数据处理任务<el-icon><Position /></el-icon
-                ></el-button> -->
-            </div>
-            
+          <div>
+            <el-button
+              v-if="$getUserType() != 1"
+              type="primary"
+              class="search-btn"
+              @click="createTask"
+              >大批量数据处理任务</el-button
+            >
+          </div>
         </div>
-    
-      <!-- 应用卡片网格 -->
-      <div class="wgn-content">
-        <div class="applications-grid">
-          <div class="application-card" v-for="(item, index) in dmsServerList" :key="index">
-            
-            <div class="card-image">
-              <img :src="curUrl + item.c_picture" :alt="item.title" />
-            </div>
-            <div class="card-content">
-              <div class="wgn-header">
-                <h3 class="wgn-name">{{ item.title }}</h3>
-                <!-- <span class="wgn-version">{{ item.version }}</span> -->
+
+        <!-- 应用卡片网格 -->
+        <div class="wgn-content">
+          <div class="applications-grid">
+            <div
+              class="application-card"
+              v-for="(item, index) in dmsServerList"
+              :key="index"
+            >
+              <div class="card-image">
+                <img :src="curUrl + item.c_picture" :alt="item.title" />
               </div>
-              <!-- <div class="wgn-tags">
+              <div class="card-content">
+                <div class="wgn-header">
+                  <h3 class="wgn-name">{{ item.title }}</h3>
+                  <!-- <span class="wgn-version">{{ item.version }}</span> -->
+                </div>
+                <!-- <div class="wgn-tags">
                 <el-tag size="small" type="success">{{ item.buffName }}</el-tag>
                 <el-tag size="small" v-for="tag in item.tags" :key="tag">{{ tag }}</el-tag>
               </div> -->
-               <el-tooltip placement="top" effect="dark">
-                <template #content>
-                  <div style="max-width: 500px;">{{ item.content }}</div>
-                </template>
-                <p class="wgn-description">{{ item.content }}</p>
-              </el-tooltip>
-              <div class="wgn-footer">
-                <!-- <span class="wgn-date">{{ item.createTime }}</span> -->
-                <el-button
-                  type="primary"
-                  size="small"
-                  class="visit-button"
-                  @click="handleOnlineDemo(item)"
-                  >在线体验</el-button
-                >
-                <el-button
-                  type="primary"
-                  size="small"
-                  class="visit-button"
-                  @click="handleApply(item)"
-                  >申请使用</el-button
-                >
+                <el-tooltip placement="top" effect="dark">
+                  <template #content>
+                    <div style="max-width: 500px">{{ item.content }}</div>
+                  </template>
+                  <p class="wgn-description">{{ item.content }}</p>
+                </el-tooltip>
+                <div class="wgn-footer">
+                  <!-- <span class="wgn-date">{{ item.createTime }}</span> -->
+                  <el-button
+                    type="primary"
+                    size="small"
+                    class="visit-button"
+                    @click="handleOnlineDemo(item)"
+                    >在线体验</el-button
+                  >
+                  <el-button
+                    type="primary"
+                    size="small"
+                    class="visit-button"
+                    @click="handleApply(item)"
+                    >申请使用</el-button
+                  >
+                </div>
               </div>
             </div>
           </div>
         </div>
-      </div>
 
-
-       <!-- 申请使用微功能服务的表单弹窗 -->
-      <el-dialog
-        title="申请使用微功能服务"
-        v-model="showFrom"
-        width="60%"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        :show-close="true"
-      >
-        <el-form :model="column.from" :rules="rules" ref="formRef" label-width="120px">
-          <el-form-item label="应用名称" prop="c_application_name">
-            <el-input
-              v-model="column.from.c_application_name"
-              placeholder="请输入应用名称"
-            />
-          </el-form-item>
-          <el-form-item label="接口路径" prop="c_interface_path">
-            <el-input
-              v-model="column.from.c_interface_path"
-              disabled
-              placeholder="请输入接口路径"
-            />
-          </el-form-item>
-          <el-form-item label="联系电话" prop="c_phone">
-            <el-input v-model="column.from.c_phone" placeholder="请输入联系电话" />
-          </el-form-item>
-          <el-form-item label="单位名称" prop="c_unit_name">
-            <el-input v-model="column.from.c_unit_name" placeholder="请输入单位名称" />
-          </el-form-item>
-          <el-form-item label="部门名称" prop="c_department">
-            <el-input v-model="column.from.c_department" placeholder="请输入部门名称" />
-          </el-form-item>
-          <!-- 项目负责人 -->
-          <el-form-item label="项目负责人" prop="c_business_leader">
-            <el-input
-              v-model="column.from.c_business_leader"
-              placeholder="请输入项目负责人"
-            />
-          </el-form-item>
-          <!-- 申请使用微功能服务的详细信息 -->
-          <el-form-item label="申请使用微功能服务的详细信息" prop="content">
-            <el-input
-              type="textarea"
-              v-model="column.from.content"
-              placeholder="请输入申请使用微功能服务的详细信息"
-            />
-          </el-form-item>
-        </el-form>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button @click="showFrom = false">取消</el-button>
-            <el-button type="primary" @click="handleApplySubmit">确定</el-button>
-          </div>
-        </template>
-      </el-dialog>
-      <!-- 创建任务的表单弹窗 -->
-      <el-dialog
-        title="创建任务"
-        v-model="showTaskFrom"
-        width="60%"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        :show-close="true"
-      >
-        <el-form
-          :model="taskColumn.from"
-          :rules="taskColumn.rules"
-          ref="taskFormRef"
-          label-width="120px"
+        <!-- 申请使用微功能服务的表单弹窗 -->
+        <el-dialog
+          title="申请使用微功能服务"
+          v-model="showFrom"
+          width="60%"
+          :close-on-click-modal="false"
+          :close-on-press-escape="false"
+          :show-close="true"
         >
-          <el-form-item label="任务名称" prop="c_name">
-            <el-input
-              v-model="taskColumn.from.c_name"
-              placeholder="请输入任务名称"
-              clearable
-            >
-              <template #prepend>{{
-                $moment(new Date()).format("YYMMDD_HHmm") +
-                "_" +
-                (taskColumn.from.c_type
-                  ? $getDmsTypes("yzt_task_type", taskColumn.from.c_type) + "_"
-                  : "")
-              }}</template>
-            </el-input>
-          </el-form-item>
-          <el-form-item label="任务备注" prop="c_comment">
-            <el-input
-              type="textarea"
-              clearable
-              v-model="taskColumn.from.c_comment"
-              placeholder="请输入任务备注"
-            />
-          </el-form-item>
-          <!-- 下拉框选择任务类型 -->
-          <el-form-item label="任务类型" prop="c_type">
-            <el-select
-              v-model="taskColumn.from.c_type"
-              @change="changeTaskType"
-              placeholder="请选择任务类型"
-            >
-              <el-option
-                v-for="(name, index) in $store.state.DmsTypesMap['yzt_task_type']"
-                :key="index"
-                :label="name"
-                :value="index"
+          <el-form :model="column.from" :rules="rules" ref="formRef" label-width="120px">
+            <el-form-item label="应用名称" prop="c_application_name">
+              <el-input
+                v-model="column.from.c_application_name"
+                placeholder="请输入应用名称"
               />
-            </el-select>
-          </el-form-item>
-          <!-- 渲染任务描述:仅查看 -->
-          <el-form-item
-            label="任务描述"
-            prop="apiDescription"
-            v-if="taskColumn.apiFrom.apiDescription"
-          >
-            <el-input
-              type="textarea"
-              disabled
-              v-model="taskColumn.apiFrom.apiDescription"
-            />
-          </el-form-item>
-          <!-- 任务文件是必须的 -->
-          <el-form-item label="任务文件" prop="c_source_file">
-            <el-input disabled v-model="taskColumn.from.c_source_file" v-show="false" />
-            <el-upload class="avatar-uploader" :http-request="handleTCUpload" :limit="1">
-              <el-button size="small" type="primary">点击上传</el-button>
-            </el-upload>
-          </el-form-item>
-          <el-divider />
-          <!-- 其他参数数据 -->
-          <el-form-item label="其他参数数据" prop="c_source_data" v-show="false">
-            <el-input
-              type="textarea"
-              clearable
-              v-model="taskColumn.from.c_source_data"
-              placeholder="请输入其他参数数据"
-            />
-          </el-form-item>
-          <div
-            v-if="
-              taskColumn.apiFrom.apiParameterRules &&
-              includesKey(['lonKey', 'latKey', 'outFileType', 'inPrj', 'outPrj'])
-            "
+            </el-form-item>
+            <el-form-item label="接口路径" prop="c_interface_path">
+              <el-input
+                v-model="column.from.c_interface_path"
+                disabled
+                placeholder="请输入接口路径"
+              />
+            </el-form-item>
+            <el-form-item label="联系电话" prop="c_phone">
+              <el-input v-model="column.from.c_phone" placeholder="请输入联系电话" />
+            </el-form-item>
+            <el-form-item label="单位名称" prop="c_unit_name">
+              <el-input v-model="column.from.c_unit_name" placeholder="请输入单位名称" />
+            </el-form-item>
+            <el-form-item label="部门名称" prop="c_department">
+              <el-input v-model="column.from.c_department" placeholder="请输入部门名称" />
+            </el-form-item>
+            <!-- 项目负责人 -->
+            <el-form-item label="项目负责人" prop="c_business_leader">
+              <el-input
+                v-model="column.from.c_business_leader"
+                placeholder="请输入项目负责人"
+              />
+            </el-form-item>
+            <!-- 申请使用微功能服务的详细信息 -->
+            <el-form-item label="申请使用微功能服务的详细信息" prop="content">
+              <el-input
+                type="textarea"
+                v-model="column.from.content"
+                placeholder="请输入申请使用微功能服务的详细信息"
+              />
+            </el-form-item>
+          </el-form>
+          <template #footer>
+            <div class="dialog-footer">
+              <el-button @click="showFrom = false">取消</el-button>
+              <el-button type="primary" @click="handleApplySubmit">确定</el-button>
+            </div>
+          </template>
+        </el-dialog>
+        <!-- 创建任务的表单弹窗 -->
+        <el-dialog
+          title="创建任务"
+          v-model="showTaskFrom"
+          width="60%"
+          :close-on-click-modal="false"
+          :close-on-press-escape="false"
+          :show-close="true"
+        >
+          <el-form
+            :model="taskColumn.from"
+            :rules="taskColumn.rules"
+            ref="taskFormRef"
+            label-width="120px"
           >
-            <template
-              v-for="(rulesItem, index) in taskColumn.apiFrom.apiParameterRules"
-              :key="index"
-            >
-              <el-form-item
-                v-if="
-                  ['lonKey', 'latKey', 'outFileType', 'inPrj', 'outPrj'].includes(
-                    rulesItem
-                  )
-                "
-                :label="rulesItem"
+            <el-form-item label="任务名称" prop="c_name">
+              <el-input
+                v-model="taskColumn.from.c_name"
+                placeholder="请输入任务名称"
+                clearable
+              >
+                <template #prepend>{{
+                  $moment(new Date()).format("YYMMDD_HHmm") +
+                  "_" +
+                  (taskColumn.from.c_type
+                    ? $getDmsTypes("yzt_task_type", taskColumn.from.c_type) + "_"
+                    : "")
+                }}</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item label="任务备注" prop="c_comment">
+              <el-input
+                type="textarea"
+                clearable
+                v-model="taskColumn.from.c_comment"
+                placeholder="请输入任务备注"
+              />
+            </el-form-item>
+            <!-- 下拉框选择任务类型 -->
+            <el-form-item label="任务类型" prop="c_type">
+              <el-select
+                v-model="taskColumn.from.c_type"
+                @change="changeTaskType"
+                placeholder="请选择任务类型"
               >
-                <el-input
-                  v-if="['lonKey', 'latKey'].includes(rulesItem)"
-                  v-model="taskColumn.from.c_source_data[rulesItem]"
-                  placeholder="当文件为xlsx时必填"
+                <el-option
+                  v-for="(name, index) in $store.state.DmsTypesMap['yzt_task_type']"
+                  :key="index"
+                  :label="name"
+                  :value="index"
                 />
-                <el-select
-                  v-if="['outFileType', 'inPrj', 'outPrj'].includes(rulesItem)"
-                  v-model="taskColumn.from.c_source_data[rulesItem]"
-                  :placeholder="'请选择' + rulesItem"
-                >
-                  <el-option
-                    v-for="item in taskColumn.selectOptions[rulesItem]"
-                    :key="'wgn-task-selectOptions-form-' + item.label"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select>
-              </el-form-item>
-            </template>
-          </div>
-          <!-- 任务状态默认为初始化 -->
-          <el-form-item label="任务状态" prop="c_state" v-show="false">
-            <el-select
-              disabled
-              v-model="taskColumn.from.c_state"
-              placeholder="请选择任务状态"
+              </el-select>
+            </el-form-item>
+            <!-- 渲染任务描述:仅查看 -->
+            <el-form-item
+              label="任务描述"
+              prop="apiDescription"
+              v-if="taskColumn.apiFrom.apiDescription"
             >
-              <el-option
-                v-for="(name, index) in $store.state.DmsTypesMap['task_status']"
-                :key="'wgn-task-form-' + index"
-                :label="name"
-                :value="index"
+              <el-input
+                type="textarea"
+                disabled
+                v-model="taskColumn.apiFrom.apiDescription"
               />
-            </el-select>
-          </el-form-item>
-          <!-- 任务负责人默认为当前登录用户 -->
-          <el-form-item label="用户id" prop="c_user_id" v-show="false">
-            <el-input disabled v-model="taskColumn.from.c_user_id" />
-          </el-form-item>
-          <!-- 任务负责人默认为当前登录用户 -->
-          <el-form-item label="用户名" prop="c_user_name" v-show="false">
-            <el-input disabled v-model="taskColumn.from.c_user_name" />
-          </el-form-item>
-        </el-form>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button @click="showTaskFrom = false">取消</el-button>
-            <el-button type="primary" @click="handleTaskSubmit">确定</el-button>
-          </div>
-        </template>
-      </el-dialog>
-
+            </el-form-item>
+            <!-- 任务文件是必须的 -->
+            <el-form-item label="任务文件" prop="c_source_file">
+              <el-input disabled v-model="taskColumn.from.c_source_file" v-show="false" />
+              <el-upload
+                class="avatar-uploader"
+                :http-request="handleTCUpload"
+                :limit="1"
+              >
+                <el-button size="small" type="primary">点击上传</el-button>
+              </el-upload>
+            </el-form-item>
+            <el-divider />
+            <!-- 其他参数数据 -->
+            <el-form-item label="其他参数数据" prop="c_source_data" v-show="false">
+              <el-input
+                type="textarea"
+                clearable
+                v-model="taskColumn.from.c_source_data"
+                placeholder="请输入其他参数数据"
+              />
+            </el-form-item>
+            <div
+              v-if="
+                taskColumn.apiFrom.apiParameterRules &&
+                includesKey([
+                  'lonKey',
+                  'latKey',
+                  'outFileType',
+                  'inPrj',
+                  'outPrj',
+                  'compressionRatio',
+                ])
+              "
+            >
+              <template
+                v-for="(rulesItem, index) in taskColumn.apiFrom.apiParameterRules"
+                :key="index"
+              >
+                <el-form-item
+                  v-if="
+                    [
+                      'lonKey',
+                      'latKey',
+                      'outFileType',
+                      'inPrj',
+                      'outPrj',
+                      'compressionRatio',
+                    ].includes(rulesItem)
+                  "
+                  :label="rulesItem"
+                >
+                  <el-input
+                    v-if="['lonKey', 'latKey'].includes(rulesItem)"
+                    v-model="taskColumn.from.c_source_data[rulesItem]"
+                    placeholder="当文件为xlsx时必填"
+                  />
+                  <el-select
+                    v-if="
+                      ['outFileType', 'inPrj', 'outPrj', 'compressionRatio'].includes(
+                        rulesItem
+                      )
+                    "
+                    v-model="taskColumn.from.c_source_data[rulesItem]"
+                    :placeholder="'请选择' + rulesItem"
+                  >
+                    <el-option
+                      v-for="item in taskColumn.selectOptions[rulesItem]"
+                      :key="'wgn-task-selectOptions-form-' + item.label"
+                      :label="item.label"
+                      :value="item.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </template>
+            </div>
+            <!-- 任务状态默认为初始化 -->
+            <el-form-item label="任务状态" prop="c_state" v-show="false">
+              <el-select
+                disabled
+                v-model="taskColumn.from.c_state"
+                placeholder="请选择任务状态"
+              >
+                <el-option
+                  v-for="(name, index) in $store.state.DmsTypesMap['task_status']"
+                  :key="'wgn-task-form-' + index"
+                  :label="name"
+                  :value="index"
+                />
+              </el-select>
+            </el-form-item>
+            <!-- 任务负责人默认为当前登录用户 -->
+            <el-form-item label="用户id" prop="c_user_id" v-show="false">
+              <el-input disabled v-model="taskColumn.from.c_user_id" />
+            </el-form-item>
+            <!-- 任务负责人默认为当前登录用户 -->
+            <el-form-item label="用户名" prop="c_user_name" v-show="false">
+              <el-input disabled v-model="taskColumn.from.c_user_name" />
+            </el-form-item>
+          </el-form>
+          <template #footer>
+            <div class="dialog-footer">
+              <el-button @click="showTaskFrom = false">取消</el-button>
+              <el-button type="primary" @click="handleTaskSubmit">确定</el-button>
+            </div>
+          </template>
+        </el-dialog>
+      </div>
     </div>
-  </div>
   </el-affix>
 </template>
 
@@ -295,7 +320,7 @@ export default {
   data() {
     return {
       total: 0,
-      curUrl:systemConfig.dmsDataProxy,
+      curUrl: systemConfig.dmsDataProxy,
       // 搜索关键词
       searchStr: "",
       // 微功能服务列表
@@ -429,6 +454,24 @@ export default {
               label: "WEB_Mercator",
             },
           ],
+          compressionRatio: [
+            {
+              value: "100%",
+              label: "100%",
+            },
+            {
+              value: "80%",
+              label: "80%",
+            },
+            {
+              value: "50%",
+              label: "50%",
+            },
+            {
+              value: "25%",
+              label: "25%",
+            },
+          ],
           outPrj: [
             {
               value: "WGS84",
@@ -469,7 +512,6 @@ export default {
       },
       // 搜索微功能服务的防抖定时器
       searchTimeout: null,
-
     };
   },
   mounted() {
@@ -478,8 +520,6 @@ export default {
     // 任务创建人用户名默认为当前登录用户用户名
     this.taskColumn.from.c_user_name = this.$store.state.userInfo.username;
     this.searchServerList();
-
-
   },
   methods: {
     includesKey(keys) {
@@ -491,6 +531,93 @@ export default {
       });
       return hasKey;
     },
+    handleTCUpload(emit) {
+      // 上传任务文件
+      let formData = new FormData();
+      formData.append("file", emit.file);
+      formData.append("columnId", this.taskColumn.columnId);
+      formData.append("type", 0);
+      formData.append("paraName", emit.file.name);
+      api
+        .uploadFile(formData)
+        .then((res) => {
+          if (res.code === 200) {
+            this.taskColumn.from.c_source_file_name = emit.file.name;
+            this.taskColumn.from.c_source_file = res.content;
+            ElNotification.success({
+              title: "成功",
+              message: "上传任务文件成功",
+              offset: 80,
+            });
+          } else {
+            ElNotification.error({
+              title: "失败",
+              message: "上传任务文件失败" + res.msg,
+              offset: 80,
+            });
+          }
+        })
+        .catch((e) => {
+          ElNotification.error({
+            title: "失败",
+            message: "上传任务文件失败" + e,
+            offset: 80,
+          });
+        });
+    },
+    changeTaskType() {
+      if (this.taskColumn.from.c_type) {
+        // 先把任务类型每个字符中间都添加一个句号
+        let serviceId = this.taskColumn.from.c_type.split("").join(".");
+        // 根据任务类型获取任务参数
+        api
+          .getSimpleContentList({
+            columnId: systemConfig.columnIds[5],
+            states: 0,
+            pageSize: 1,
+            page: 0,
+            search: JSON.stringify([
+              {
+                field: "c_scene_name",
+                searchType: 1,
+                content: { value: serviceId },
+              },
+            ]),
+          })
+          .then((res) => {
+            if (res.code === 200) {
+              let apiInfo = res.content.data[0];
+              // 接口描述
+              this.taskColumn.apiFrom.apiDescription = apiInfo.content;
+              // 接口参数规则
+              this.taskColumn.apiFrom.apiParameterRules = JSON.parse(
+                apiInfo.c_input_parameter_rules
+              );
+              // 接口路径
+              this.taskColumn.apiFrom.apiUrl = apiInfo.c_url;
+            } else {
+              this.taskColumn.apiFrom.apiDescription = "";
+              this.taskColumn.apiFrom.apiParameterRules = [];
+              this.taskColumn.apiFrom.apiUrl = "";
+              ElNotification.error({
+                title: "失败",
+                message: "获取任务参数失败" + res.msg,
+                offset: 80,
+              });
+            }
+          })
+          .catch((e) => {
+            this.taskColumn.apiFrom.apiDescription = "";
+            this.taskColumn.apiFrom.apiParameterRules = "";
+            ElNotification.error({
+              title: "失败",
+              message: "获取任务参数失败" + e,
+              offset: 80,
+            });
+          });
+        this.taskColumn.from.c_source_data = {};
+      }
+    },
     // 申请使用微功能服务
     handleApply(item) {
       // 申请使用微功能服务时,先从localStorage中获取数据,填充到表单中
@@ -548,11 +675,15 @@ export default {
           .getSimpleContentList(requestParams)
           .then((res) => {
             if (res.code === 200) {
-              // this.dmsServerList = res.content.data;
-              this.dmsServerList = res.content.data.map((item) => ({
+              // 过滤掉自定义工具微功能服务1.5.8.1
+              this.dmsServerList = res.content.data.filter(
+                (item) => item.c_scene_name != "1.5.8.1"
+              );
+              // 转换时间格式
+              this.dmsServerList = this.dmsServerList.map((item) => ({
                 ...item,
-                createTime: moment(item.create_time).format('YYYY-MM-DD HH:mm:ss')
-              }))
+                createTime: moment(item.create_time).format("YYYY-MM-DD HH:mm:ss"),
+              }));
               this.total = this.dmsServerList.length;
               // ElNotification.success({
               //   title: "成功",
@@ -622,7 +753,7 @@ export default {
         }
       });
     },
-      // 创建任务
+    // 创建任务
     createTask() {
       // 打开弹窗,显示任务创建表单
       this.showTaskFrom = true;
@@ -756,11 +887,11 @@ export default {
     }
   }
 }
-.wgn-content{
-    // height: 640px;
-    height: calc(100vh - 160px);
-    overflow: auto;
-    padding-right: 20px;
+.wgn-content {
+  // height: 640px;
+  height: calc(100vh - 160px);
+  overflow: auto;
+  padding-right: 20px;
 }
 
 /* 应用卡片网格样式 */

+ 17 - 1
src/views/rwgl/Index.vue

@@ -147,6 +147,13 @@
               >
                 运行
               </el-button>
+              <el-button
+                v-if="scope.row.main_c_state == 3"
+                type="warning"
+                @click="runTask(scope.row.main_id)"
+              >
+                重试
+              </el-button>
               <template
                 v-if="scope.row.main_c_file != null && scope.row.main_c_file_name != null"
               >
@@ -180,7 +187,7 @@
             :total="taskNum"
             :current-page="page"
             :page-size="pageSize"
-            @current-change="pullTaskData(page)"
+            @current-change="pullTaskData"
           >
           </el-pagination>
         </div>
@@ -249,6 +256,15 @@
                 预览结果
               </el-button>
             </template>
+            <el-button
+              v-if="focusTask.main_c_state == 3"
+              type="warning"
+              size="small"
+              style="margin-left: 8px"
+              @click="runTask(focusTask.main_id)"
+            >
+              重新执行
+            </el-button>
           </el-descriptions-item>
           <el-descriptions-item label="原始数据">
             <template