bill преди 1 година
родител
ревизия
07d50e58bb
променени са 6 файла, в които са добавени 59 реда и са изтрити 22 реда
  1. 9 1
      src/app/fire/view/dispatch/index.vue
  2. 1 1
      src/app/fire/view/dispatch/list.vue
  3. 3 2
      src/request/urls.ts
  4. 14 9
      src/store/case.ts
  5. 22 1
      src/view/camera/bind.vue
  6. 10 8
      src/view/case/editMenu.vue

+ 9 - 1
src/app/fire/view/dispatch/index.vue

@@ -63,6 +63,9 @@
           <span class="oper-span" @click="gotoQuery(row.caseId)" v-pdpath="['view']">
             查看
           </span>
+          <span class="oper-span" @click="copy(row.caseId)" v-pdpath="['view']">
+            复制
+          </span>
           <span
             class="oper-span"
             @click="pagging.del(row)"
@@ -101,6 +104,7 @@ import Header from "./header.vue";
 import List from "./list.vue";
 import { useFirePagging } from "./pagging";
 import { Fire, revokeFireTeachs, setFireTeachs, setFire } from "@/app/fire/store/fire";
+import { copyCase } from "@/store/case";
 import CaseEditMenu from "@/view/case/editMenu.vue";
 import { gotoQuery } from "@/view/case/help";
 import { confirm } from "@/helper/message";
@@ -110,6 +114,11 @@ import { ElMessage } from "element-plus";
 
 const { pagging, isTeached, isRecycle } = useFirePagging();
 
+const copy = async (caseId: number) => {
+  await copyCase(caseId);
+  pagging.refresh();
+};
+
 // 撤销教学
 const revokeTeaching = async (row?: Fire) => {
   if (!(await confirm("撤销教学,火调项目将不再显示在教学平台。(火调项目不会删除)"))) {
@@ -155,5 +164,4 @@ const editHandler = async (row: Fire) => {
 const addHandler = async () => {
   (await addFire({})) && pagging.refresh();
 };
-
 </script>

+ 1 - 1
src/app/fire/view/dispatch/list.vue

@@ -89,7 +89,7 @@
         {{ fireStatusDesc[row.status as FireStatus] }}
       </el-table-column>
       <slot name="appendColumn" />
-      <el-table-column label="操作" v-slot:default="{ row }" :width="180">
+      <el-table-column label="操作" v-slot:default="{ row }" :width="220">
         <slot name="rowCtrl" :row="row" />
       </el-table-column>
     </el-table>

+ 3 - 2
src/request/urls.ts

@@ -100,6 +100,7 @@ export const deleteScene = "/web/scene/delete";
 /** ------------------------------------------ */
 
 // ---------example案件接口--------
+export const copyExample = "/fusion-xj/case/copyCase";
 export const exampleList = "/fusion-xj/case/list";
 export const setExample = "/fusion-xj/case/addOrUpdate";
 export const deleteExample = "/fusion-xj/case/delete";
@@ -168,7 +169,8 @@ export const fireDetail = "/fusion-xj/web/fireProject/getDetailWithoutAuth";
 // export const fireDetailByPsw = '/web/fireProject/getDetailWithoutAuth'
 
 // 获取火调详情
-export const fireDetailByPsw = "/fusion-xj/web/fireProject/getDetailWithoutAuth"; //wxAnonGetDetail
+export const fireDetailByPsw =
+  "/fusion-xj/web/fireProject/getDetailWithoutAuth"; //wxAnonGetDetail
 /** ------------------------------------------ */
 
 // case相关
@@ -191,7 +193,6 @@ export const caseExtractDetail = "/fusion-xj/caseExtractDetail/info";
 export const caseExtractDetailOpt = "/fusion-xj/caseExtractDetail/saveOrUpdate";
 export const caseExtractDetailExport = "/fusion-xj/caseExtractDetail/downDocx";
 
-
 // 火调链接地址设置密码
 export const setCasePsw = "/fusion-xj/web/fireProject/updateRandomCode";
 export const getCasePsw = "/fusion-xj/web/fireProject/getRandCode";

+ 14 - 9
src/store/case.ts

@@ -16,7 +16,8 @@ import {
   caseInquestExport,
   caseExtractDetail,
   caseExtractDetailOpt,
-  caseExtractDetailExport
+  caseExtractDetailExport,
+  copyExample,
 } from "@/request";
 import { ModelScene, QuoteScene, Scene, SceneType } from "./scene";
 import { CaseFile } from "./caseFile";
@@ -48,6 +49,8 @@ export const getCaseSharePWD = async (params: { caseId: number }) =>
 export const getCaseInfo = async (caseId: number) =>
   (await axios.get<Case>(caseInfo, { params: { caseId } })).data;
 
+export const copyCase = (caseId: number) => axios.post(copyExample, { caseId });
+
 export const updateCaseInfo = async (caseFile: CaseFile) =>
   await axios.post(updateCaseFile, {
     filesId: caseFile.filesId,
@@ -90,13 +93,12 @@ export const replaceCaseScenes = (caseId: number, caseScenes: CaseScenes) =>
   axios.post(repCaseScenes, { sceneNumParam: caseScenes, caseId });
 
 export const caseImgList = (caseId: number, orderBy: string | null) =>
-  axios.post(caseApiList, { orderBy: orderBy || '', caseId });
+  axios.post(caseApiList, { orderBy: orderBy || "", caseId });
 
 export const saveOrUpdate = (params: CaseImg) =>
   axios.post(saveApiOrUpdate, { ...params });
 
-export const caseDel = (id: number) =>
-  axios.post(caseApiDel, { id });
+export const caseDel = (id: number) => axios.post(caseApiDel, { id });
 
 export const caseUpdateSort = (list: [CaseImg]) =>
   axios.post(caseApiUpdateSort, { paramList: list });
@@ -104,20 +106,23 @@ export const caseUpdateSort = (list: [CaseImg]) =>
 export const getCaseInquestInfo = (caseId: number) =>
   axios.get(caseInquestInfo, { params: { caseId } });
 
-
 export const saveCaseInquestInfo = (caseId: number, data) =>
   axios.post(caseInquestOpt, { caseId, ...data });
 
 export const exportCaseInquestInfo = (caseId: number) =>
-  axios.get(caseInquestExport, { params: { caseId, ingoreRes: true }, responseType: 'blob' });
-
+  axios.get(caseInquestExport, {
+    params: { caseId, ingoreRes: true },
+    responseType: "blob",
+  });
 
 export const getCaseDetailInfo = (caseId: number) =>
   axios.get(caseExtractDetail, { params: { caseId } });
 
-
 export const saveCaseDetailInfo = (caseId: number, data) =>
   axios.post(caseExtractDetailOpt, { caseId, ...data });
 
 export const exportCaseDetailInfo = (caseId: number) =>
-  axios.get(caseExtractDetailExport, { params: { caseId, ingoreRes: true }, responseType: 'blob' });
+  axios.get(caseExtractDetailExport, {
+    params: { caseId, ingoreRes: true },
+    responseType: "blob",
+  });

+ 22 - 1
src/view/camera/bind.vue

@@ -8,6 +8,16 @@
         @update:modelValue="(val: string) => (bindCamera.snCode = val.trim())"
       />
     </el-form-item>
+    <el-form-item label="相机类型:" class="mandatory">
+      <el-select v-model="bindCamera.cameraType" placeholder="请选择" style="width: 100%">
+        <el-option
+          v-for="item in cameraTypes"
+          :key="item"
+          :label="cameraTypeDesc[item]"
+          :value="item.toString()"
+        />
+      </el-select>
+    </el-form-item>
     <el-form-item label="所属架构:" class="mandatory">
       <com-company
         v-model="bindCamera.deptId"
@@ -32,7 +42,8 @@
 import comCompany from "@/components/company-select/index.vue";
 import { operateIsPermissionByPath } from "@/directive/permission";
 
-import { Camera, addCamera, editCamera } from "@/store/camera";
+import { Camera, CameraType, addCamera, editCamera } from "@/store/camera";
+import { cameraTypeDesc } from "@/constant/camera";
 import { UserInfo, getUsers } from "@/store/user";
 import { ref, watchEffect } from "vue";
 import { ElMessage } from "element-plus";
@@ -42,6 +53,13 @@ const props = defineProps<{ camera?: Camera }>();
 const bindCamera = ref<Camera>(
   (props.camera ? { ...props.camera } : { cameraSn: "", snCode: "" }) as Camera
 );
+
+const cameraTypes = [
+  CameraType.SWKK,
+  CameraType.SWKJ,
+  CameraType.SWSS1,
+  CameraType.SWSS2,
+];
 const users = ref<UserInfo[]>([]);
 watchEffect(async () => {
   if (bindCamera.value.deptId) {
@@ -64,6 +82,9 @@ defineExpose<QuiskExpose>({
     if (!bindCamera.value.snCode || !bindCamera.value.snCode.trim()) {
       ElMessage.error("SN码不能为空");
       throw "SN码不能为空";
+    } else if (!bindCamera.value.cameraType) {
+      ElMessage.error("请选择相机类型");
+      throw "请选择相机类型";
     } else if (!bindCamera.value.userId) {
       ElMessage.error("请选择管理员");
       throw "请选择管理员";

+ 10 - 8
src/view/case/editMenu.vue

@@ -8,12 +8,8 @@
     </span>
     <template #dropdown>
       <el-dropdown-menu>
-        <el-dropdown-item
-          v-for="menu in menus"
-          :key="menu.key"
-          @click="menu.onClick()"
-          :disabled="!operateIsPermissionByPath('edit', menu.key)"
-        >
+        <!-- :disabled="!operateIsPermissionByPath('edit', menu.key)" -->
+        <el-dropdown-item v-for="menu in menus" :key="menu.key" @click="menu.onClick()">
           {{ menu.label }}
         </el-dropdown-item>
       </el-dropdown-menu>
@@ -26,9 +22,8 @@ import { computed } from "vue";
 import { getFuseCodeLink, checkScenesOpen, MenuItem, getSWKKSyncLink } from "./help";
 import { showCaseScenes, addCaseScenes, shareCase } from "./quisk";
 import { RouteName, router } from "@/router";
-import { getCaseSceneList } from "@/store/case";
+import { copyCase, getCaseSceneList } from "@/store/case";
 import { alert } from "@/helper/message";
-import { operateIsPermissionByPath } from "@/directive/permission";
 
 const props = defineProps<{
   caseId: number;
@@ -101,6 +96,13 @@ const menus = computed(() => {
         }
       },
     },
+    {
+      key: "fj",
+      label: "分镜配置",
+      onClick: async () => {
+        window.open(`mirror.html?caseId=${caseId}`);
+      },
+    },
     ...(props.lastMenu || []).map((item) => ({
       ...item,
       onClick: () => item.onClick(caseId),