iZaiZaiA 2 years ago
parent
commit
936f8266f7
48 changed files with 1138 additions and 2909 deletions
  1. 2 2
      package.json
  2. 5 12
      src/api/index.js
  3. 12 12
      src/api/modules/data-fill/query.js
  4. 24 24
      src/api/modules/data-fill/wbs.js
  5. 13 13
      src/api/modules/gauge/bezier.js
  6. 6 6
      src/api/modules/gauge/station.js
  7. 6 6
      src/api/modules/ledger/construction.js
  8. 6 6
      src/api/modules/ledger/query.js
  9. 3 3
      src/api/modules/ledger/weather.js
  10. 3 3
      src/api/modules/menu.js
  11. 10 10
      src/api/modules/oss.js
  12. 13 13
      src/api/modules/other-file/imageData.js
  13. 9 9
      src/api/modules/other-file/projectScanning.js
  14. 6 6
      src/api/modules/other.js
  15. 4 4
      src/api/modules/other/first-item.js
  16. 11 11
      src/api/modules/other/orderServe.js
  17. 6 6
      src/api/modules/schedule/data.js
  18. 11 11
      src/api/modules/tasks/data.js
  19. 6 6
      src/api/modules/tasks/flow.js
  20. 10 10
      src/api/modules/user.js
  21. 12 12
      src/api/modules/userInfo/index.js
  22. 29 0
      src/api/request/httpApi.js
  23. 6 13
      src/api/request/index.js
  24. 3 4
      src/components/AppConfig/index.vue
  25. 115 0
      src/global/components/hc-counter/index.vue
  26. 193 0
      src/global/components/hc-report-modal/index.vue
  27. 4 0
      src/global/components/index.js
  28. 2 2
      src/layout/index.vue
  29. 11 10
      src/layout/modules/UserInfoBar.vue
  30. 9 7
      src/plugins/HTableForm.js
  31. 3 2
      src/router/routers.js
  32. 13 19
      src/store/modules/app.js
  33. 29 21
      src/store/modules/user.js
  34. 26 0
      src/styles/app/element.scss
  35. 19 9
      src/views/data-fill/components/HcTreeNode.vue
  36. 4 4
      src/views/data-fill/components/HcUpload.vue
  37. 83 93
      src/views/data-fill/components/ListItem.vue
  38. 0 839
      src/views/data-fill/components/ListItem_bak.vue
  39. 30 26
      src/views/data-fill/components/WbsTree.vue
  40. 9 3
      src/views/data-fill/components/nodeTree/index.vue
  41. 97 120
      src/views/data-fill/wbs.vue
  42. 0 1225
      src/views/data-fill/wbs_bak.vue
  43. 37 28
      src/views/data-fill/wbs_new.vue
  44. 5 22
      src/views/home/config.vue
  45. 2 2
      src/views/login/index.vue
  46. 107 101
      src/views/other/order-service.vue
  47. 116 166
      src/views/user/index.vue
  48. 8 8
      yarn.lock

+ 2 - 2
package.json

@@ -20,7 +20,7 @@
         "pinia": "^2.0.18",
         "vue": "^3.2.37",
         "vue-router": "^4.1.3",
-        "vue-utils-plus": "^1.0.0",
+        "vue-utils-plus": "^1.0.1",
         "vuedraggable": "^4.1.0"
     },
     "devDependencies": {
@@ -34,7 +34,7 @@
         "unplugin-auto-import": "^0.11.1",
         "unplugin-vue-components": "^0.22.4",
         "vfonts": "^0.0.3",
-        "vite": "^3.0.7",
+        "vite": "^3.0.8",
         "vooks": "^0.2.12"
     }
 }

+ 5 - 12
src/api/index.js

@@ -1,13 +1,6 @@
-import request from "./request/index";
-
-/**
- * 文件流返回
- * @param url 接口地址
- */
-export const exportBlob = (url) => {
-    return request({
-        url: url,
-        method: 'get',
-        responseType: 'blob'
-    })
+//请求配置
+export default {
+    putFile: '/api/blade-resource/oss/endpoint/put-file',       //上传文件
+    removeFile: '/api/blade-resource/oss/endpoint/remove-file', //移除文件
+    uploadFile: '/api/blade-resource/oss/endpoint/upload-file', //上传文件,转PDF
 }

+ 12 - 12
src/api/modules/data-fill/query.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取当前合同段的划分树
     async queryWbsTreeData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/queryContractWbsTreeByContractIdAndType',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //根据合同段ID获取所有填报人
     async getFileUser(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/getFileUserByContractId',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //获取当前合同段下所有的上报批次
     async getReportNumber(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/getReportNumberByContractId',
             method: 'get',
             params: form
@@ -27,7 +27,7 @@ export default {
     },
     //获取流程状态分类和文件类型分类
     async getDictBizClassify(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/getDictBizClassifyByCode',
             method: 'get',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //分页数据
     async getPageData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/page',
             method: 'post',
             data: form
@@ -43,7 +43,7 @@ export default {
     },
     //批量废除
     async batchAbolish(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/batchAbolish',
             method: 'post',
             params: form
@@ -51,7 +51,7 @@ export default {
     },
     //批量下载
     async batchDownloadFileToZip(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/batchDownloadFileToZip',
             method: 'post',
             params: form,
@@ -60,7 +60,7 @@ export default {
     },
     //批量打印
     async batchPrint(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/batchPrint',
             method: 'post',
             params: form
@@ -68,7 +68,7 @@ export default {
     },
     //本地验签
     async localVerify(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/localVerify',
             method: 'post',
             params: form
@@ -76,7 +76,7 @@ export default {
     },
     //在线验签
     async onlineVerify(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/onlineVerify',
             method: 'post',
             params: form
@@ -84,7 +84,7 @@ export default {
     },
     //输入框查询合同段树
     async searchContractTree(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/searchContractTree',
             method: 'get',
             params: form

+ 24 - 24
src/api/modules/data-fill/wbs.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //新增或删除 合同段划分树首件关联
     async wbsTreeFirstSave(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/treeContractFirst/saveOrDelete',
             method: 'post',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //修改树节点
     async wbsTreeUpdateNode(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/updateContractNodeParameter',
             method: 'post',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //导图结构树节点查询
     async queryMappingStructureTree(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/queryMappingStructureTree',
             method: 'get',
             params: form
@@ -27,7 +27,7 @@ export default {
     },
     //保存或修改节点上传的图纸记录
     async saveContractTreeDrawings(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/contractTreeDrawings/saveContractTreeDrawings',
             method: 'post',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //删除节点
     async removeContractTreeNode(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/removeContractTreeNode',
             method: 'post',
             params: form
@@ -43,7 +43,7 @@ export default {
     },
     //查询当前节点下所有元素表信息
     async searchNodeAllTable(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/wbsTreeContract/searchNodeAllTable',
             method: 'get',
             params: form
@@ -51,7 +51,7 @@ export default {
     },
     //清表生成html
     async getExcelHtml(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/get-excel-html_buss',
             method: 'get',
             params: form
@@ -59,7 +59,7 @@ export default {
     },
     //填报页面数据保存
     async saveExcelBussData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/save_buss_data',
             method: 'post',
             data: form
@@ -67,7 +67,7 @@ export default {
     },
     //懒加载项目级工程划分树
     async queryWbsTreePrivateByProjectIdAndId(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/queryWbsTreePrivateByProjectIdAndId',
             method: 'post',
             params: form
@@ -75,7 +75,7 @@ export default {
     },
     //新增节点及其子节点
     async saveContractTreeNode(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/saveContractTreeNode',
             method: 'post',
             data: form
@@ -83,7 +83,7 @@ export default {
     },
     //复制节点
     async copyContractTreeNode(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/copyContractTreeNode',
             method: 'post',
             data: form
@@ -91,7 +91,7 @@ export default {
     },
     //自定义排序
     async diySortTreeNode(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/diySort',
             method: 'post',
             data: form
@@ -99,7 +99,7 @@ export default {
     },
     //获取表单数据
     async getBussDataInfo(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/get-buss-dataInfo',
             method: 'get',
             params: form
@@ -107,7 +107,7 @@ export default {
     },
     //查询节点状态
     async queryNodeStatus(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/queryNodeStatus',
             method: 'post',
             params: form
@@ -115,7 +115,7 @@ export default {
     },
     //单个废除
     async abolishOne(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/abolishOne',
             method: 'post',
             params: form
@@ -123,7 +123,7 @@ export default {
     },
     //隐藏表单
     async showBussTab(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/show-buss-tab',
             method: 'get',
             params: form
@@ -131,7 +131,7 @@ export default {
     },
     //单表pdf预览
     async getBussPdfInfo(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/get-buss-pdfInfo',
             method: 'get',
             params: form
@@ -139,7 +139,7 @@ export default {
     },
     //表单复制
     async copeBussTab(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/cope-buss-tab',
             method: 'get',
             params: form
@@ -147,7 +147,7 @@ export default {
     },
     //多表预览
     async getBussPdfs(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/get-buss-pdfs',
             method: 'get',
             params: form
@@ -155,7 +155,7 @@ export default {
     },
     //获取附件列表
     async getBussFileList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/tablefile/get-buss-fileList',
             method: 'get',
             params: form
@@ -163,7 +163,7 @@ export default {
     },
     //逻辑删除
     async removeBussFile(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/tablefile/remove',
             method: 'post',
             params: form
@@ -171,7 +171,7 @@ export default {
     },
     //用户端删除复制信息表
     async removeBussTabInfo(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-manager/exceltab/remove-buss-tabInfo',
             method: 'post',
             params: form
@@ -179,7 +179,7 @@ export default {
     },
     //复制节点填报数据
     async copyContractNodeSubmitBusinessData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/copyContractNodeSubmitBusinessData',
             method: 'post',
             data: form

+ 13 - 13
src/api/modules/gauge/bezier.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取平曲线数据
     async queryListData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/list',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //获取片段列表
     async queryPartList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/part/list',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //新增片段
     async savePartAdd(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/part/add',
             method: 'post',
             data: form
@@ -27,7 +27,7 @@ export default {
     },
     //编辑片段
     async savePartUpdate(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/part/update',
             method: 'post',
             data: form
@@ -35,7 +35,7 @@ export default {
     },
     //删除片段
     async delPartData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/part/del',
             method: 'post',
             params: form
@@ -43,7 +43,7 @@ export default {
     },
     //获取新增线元信息的初始数据
     async getNextMileagexy(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/getNextMileagexy',
             method: 'post',
             data: form
@@ -51,7 +51,7 @@ export default {
     },
     //里程转换坐标
     async queryPsChange(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/pschange',
             method: 'get',
             params: form
@@ -59,7 +59,7 @@ export default {
     },
     //新增保存线元
     async saveAddMileage(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/add',
             method: 'post',
             data: form
@@ -67,7 +67,7 @@ export default {
     },
     //编辑保存线元
     async saveUpdateMileage(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/update',
             method: 'post',
             data: form
@@ -75,7 +75,7 @@ export default {
     },
     //删除线元
     async saveDelMileage(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/del',
             method: 'post',
             params: form
@@ -83,7 +83,7 @@ export default {
     },
     //生成坐标
     async getZzList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/getZzList',
             method: 'get',
             params: form
@@ -91,7 +91,7 @@ export default {
     },
     //导出数据
     async getExportExcel(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/mileage/exportExcel',
             method: 'get',
             params: form,

+ 6 - 6
src/api/modules/gauge/station.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取数据
     async queryListData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/dap/list',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //新增
     async addSave(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/dap/add',
             method: 'post',
             data: form
@@ -19,7 +19,7 @@ export default {
     },
     //编辑
     async updateSave(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/dap/update',
             method: 'post',
             data: form
@@ -27,7 +27,7 @@ export default {
     },
     //删除
     async delData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/dap/del',
             method: 'post',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //导出数据
     async getExportExcel(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/dap/exportExcel',
             method: 'get',
             params: form,

+ 6 - 6
src/api/modules/ledger/construction.js

@@ -1,30 +1,30 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
-export const queryWbsTree = (form) => request({
+export const queryWbsTree = (form) => httpApi({
     url: '/api/blade-business/constructionLedger/queryContractWbsTreeByContractIdAndType',
     method: 'get',
     params: form
 });
 
-export const queryWbsTable = (form) => request({
+export const queryWbsTable = (form) => httpApi({
     url: '/api/blade-business/constructionLedger/list',
     method: 'post',
     data: form
 });
 
-export const updateWbsTable = (form) => request({
+export const updateWbsTable = (form) => httpApi({
     url: '/api/blade-business/constructionLedger/update',
     method: 'post',
     data: form
 });
 
-export const queryNeiYeTree = (form) => request({
+export const queryNeiYeTree = (form) => httpApi({
     url: '/api/blade-business/neiYeController/queryContractWbsTreeByContractIdAndType',
     method: 'get',
     params: form
 });
 
-export const queryNeiYeTable = (form) => request({
+export const queryNeiYeTable = (form) => httpApi({
     url: '/api/blade-business/neiYeController/queryCurrentNodeNeiYeLedger',
     method: 'post',
     data: form

+ 6 - 6
src/api/modules/ledger/query.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取当前合同段下的日志类型
     async queryLogList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/contractLog/queryCurrentContractLogList',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //获取当前日志类型的填报人
     async queryFillUser(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/contractLog/queryFillUser',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //施工日志分页
     async constructionLogPage(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/contractLog/constructionLogPage',
             method: 'post',
             data: form
@@ -27,7 +27,7 @@ export default {
     },
     //批量废除
     async batchAbolish(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/contractLog/batchAbolish',
             method: 'post',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //获取合同段当前日志节点下的填报日期记录
     async getSubmitLogDateList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/contractLog/getSubmitLogDateList',
             method: 'post',
             params: form

+ 3 - 3
src/api/modules/ledger/weather.js

@@ -1,12 +1,12 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
-export const queryWeatherPage = (form) => request({
+export const queryWeatherPage = (form) => httpApi({
     url: '/api/blade-business/weather/queryWeatherPage',
     method: 'get',
     params: form
 });
 
-export const updateWeatherById = (form) => request({
+export const updateWeatherById = (form) => httpApi({
     url: '/api/blade-business/weather/updateWeatherById',
     method: 'post',
     data: form

+ 3 - 3
src/api/modules/menu.js

@@ -1,7 +1,7 @@
-import request from "../request/index";
+import {httpApi} from "../request/httpApi";
 import website from "~src/config/index";
 
-export const getRoutes = () => request({
+export const getRoutes = () => httpApi({
   url: '/api/blade-system/menu/routes',
   method: 'get',
   params: {
@@ -9,7 +9,7 @@ export const getRoutes = () => request({
   }
 });
 
-export const getButtons = () => request({
+export const getButtons = () => httpApi({
     url: '/api/blade-system/menu/buttons',
     method: 'get'
 });

+ 10 - 10
src/api/modules/oss.js

@@ -1,28 +1,28 @@
-import request from "../request/index";
+import {httpApi} from "../request/httpApi";
 
 export default {
     //上传文件
-    async putFile(form) {
-        return request({
+    async putFile(form, msg = true) {
+        return httpApi({
             url: '/api/blade-resource/oss/endpoint/put-file',
             method: 'post',
             data: form
-        });
+        }, msg);
     },
     //移除文件
-    async removeFile(form) {
-        return request({
+    async removeFile(form, msg = true) {
+        return httpApi({
             url: '/api/blade-resource/oss/endpoint/remove-file',
             method: 'post',
             params: form
-        });
+        }, msg);
     },
     //上传文件
-    async uploadFile(form) {
-        return request({
+    async uploadFile(form, msg = true) {
+        return httpApi({
             url: '/api/blade-resource/oss/endpoint/upload-file',
             method: 'post',
             data: form
-        });
+        }, msg);
     },
 }

+ 13 - 13
src/api/modules/other-file/imageData.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取类型列表(类型主页)
     async getClassIfyList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/getClassIfyList',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //获取当前项目类型的显隐配置列表
     async getClassifyShowConfigList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/getClassifyShowConfigList',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //保存客户端分类显隐记录
     async saveClassifyShowConfig(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/saveClassifyShowConfig',
             method: 'post',
             data: form
@@ -27,7 +27,7 @@ export default {
     },
     //获取时间结构
     async getYearDateTree(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/getYearDateTree',
             method: 'get',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //获取当前合同段的工程划分
     async getWbsTreeList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/queryContractWbsTreeByContractIdAndType',
             method: 'get',
             params: form
@@ -43,7 +43,7 @@ export default {
     },
     //获取分页数据
     async getPageList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/page',
             method: 'get',
             params: form
@@ -51,7 +51,7 @@ export default {
     },
     //新增影音资料信息
     async addImageclassifyFile(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/save',
             method: 'post',
             data: form
@@ -59,7 +59,7 @@ export default {
     },
     //修改影音资料信息
     async updateImageclassifyFile(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/update',
             method: 'post',
             data: form
@@ -67,7 +67,7 @@ export default {
     },
     //详情
     async queryById(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/queryById',
             method: 'post',
             params: form
@@ -75,7 +75,7 @@ export default {
     },
     //影音资料信息逻辑删除
     async removeImageclassifyFile(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/remove',
             method: 'post',
             params: form
@@ -83,7 +83,7 @@ export default {
     },
     //影音资料览(图片)
     async imageClassificationFile(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/preview',
             method: 'post',
             params: form
@@ -91,7 +91,7 @@ export default {
     },
     //下载
     async batchDownloadFileToZip(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/imageClassificationFile/batchDownloadFileToZip',
             method: 'post',
             params: form,

+ 9 - 9
src/api/modules/other-file/projectScanning.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取归档划分树
     async getClassIfyList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/tree',
             method: 'post',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //分页
     async getarchiveFilePage(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/page',
             method: 'post',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //批量新增
     async batchUploadSave(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/batchSave',
             method: 'post',
             data: form
@@ -27,7 +27,7 @@ export default {
     },
     //逻辑删除
     async removeArchiveFile(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/remove',
             method: 'post',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //批量编辑
     async batchEditSave(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/batchEdit',
             method: 'post',
             data: form
@@ -43,7 +43,7 @@ export default {
     },
     //批量废除
     async batchAbolishSave(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/batchAbolish',
             method: 'post',
             params: form
@@ -51,7 +51,7 @@ export default {
     },
     //批量下载
     async batchDownloadFileToZip(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/batchDownloadFileToZip',
             method: 'post',
             params: form,
@@ -60,7 +60,7 @@ export default {
     },
     //批量认证
     async batchCertification(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/archiveFile/batchCertification',
             method: 'post',
             data: form

+ 6 - 6
src/api/modules/other.js

@@ -1,33 +1,33 @@
-import request from "../request/index";
+import {httpApi} from "../request/httpApi";
 
-export const ApprovalApi = (url,form) => request({
+export const ApprovalApi = (url,form) => httpApi({
     url: '/api/blade-business/' + url,
     method: 'post',
     data: form
 });
 
-export const batchApproval = (form) => request({
+export const batchApproval = (form) => httpApi({
     url: '/api/blade-business/archiveFile/batchApproval',
     method: 'post',
     data: form
 });
 
 //短信验证
-export const sendNotice = (form) => request({
+export const sendNotice = (form) => httpApi({
     url: '/api/blade-business/task/send-notice',
     method: 'post',
     params: form
 });
 
 //用户配置保存
-export const userConfigSave = (form) => request({
+export const userConfigSave = (form) => httpApi({
     url: '/api/blade-business/defaultConfig/saveOrUpdate',
     method: 'post',
     data: form
 });
 
 //用户配置详情
-export const userConfigInfo = (form) => request({
+export const userConfigInfo = (form) => httpApi({
     url: '/api/blade-business/defaultConfig/detail',
     method: 'get',
     params: form

+ 4 - 4
src/api/modules/other/first-item.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取合同段划分树中被标记为首件的节点
     async queryWbsTreeData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/treeContractFirst/queryContractWbsTreeFirstByContractIdAndType',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //分页数据
     async getPageData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/firstInformation/page',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //分页数据
     async getQueryPageData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/informationWriteQuery/page',
             method: 'post',
             data: form

+ 11 - 11
src/api/modules/other/orderServe.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取工单服务列表
     async queryUserOpinionPage(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinion/queryUserOpinionPage',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //获取当前用户提交的工单服务
     async queryCurrentUserOpinionList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinion/queryCurrentUserOpinionList',
             method: 'post',
             data: form
@@ -19,7 +19,7 @@ export default {
     },
     //新增工单服务信息
     async saveUserOpinion(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinion/saveUserOpinion',
             method: 'post',
             data: form
@@ -27,7 +27,7 @@ export default {
     },
     //获取当前工单的最新流程
     async queryUserFlowOpinion(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinionFlow/queryCurrentUserOpinionFlowByUserOpinionId',
             method: 'get',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //统合处理意见接口
     async disposeUserFeedback(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinionFlow/disposeUserOpinionFeedback',
             method: 'post',
             params: form
@@ -43,14 +43,14 @@ export default {
     },
     //获取字典信息
     async queryDictBizList() {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinion/queryDictBizList',
             method: 'get'
         })
     },
     //获取当前工单下的所有评论
     async queryCommentsList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinionComments/queryUserOpinionCommentsByUserOpinionId',
             method: 'get',
             params: form
@@ -58,7 +58,7 @@ export default {
     },
     //新增评论
     async saveUserComments(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinionComments/saveUserOpinionComments',
             method: 'post',
             data: form
@@ -66,7 +66,7 @@ export default {
     },
     //点赞
     async addGoodNumber(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinion/addGoodNumber',
             method: 'post',
             params: form
@@ -74,7 +74,7 @@ export default {
     },
     //取消点赞
     async cancelGood(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userOpinion/cancelGood',
             method: 'post',
             params: form

+ 6 - 6
src/api/modules/schedule/data.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //查询内业资料进度
     async queryMaterialProgress(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/materialProgress/queryMaterialProgress',
             method: 'post',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //报表资料审批统计
     async queryMaterialProgressStatus(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/materialProgress/queryMaterialProgressStatus',
             method: 'post',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //声像媒体资料统计
     async queryImageClassification(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/materialProgress/queryImageClassification',
             method: 'post',
             params: form
@@ -27,7 +27,7 @@ export default {
     },
     //资料进度
     async queryContractTreeMaterialProgress(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/materialProgress/queryContractTreeMaterialProgress',
             method: 'post',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     // 内外业进度
     async queryNeiWaiYeProgress(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/neiWaiYeProgressController/neiWaiYeProgress',
             method: 'get',
             params: form

+ 11 - 11
src/api/modules/tasks/data.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //获取任务类型或任务状态
     async queryTaskTypeStatus(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/query-task-type-status',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //获取当前合同段的上报批次
     async queryBatchList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/query-batch-list',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //获取当前用户待办流程
     async queryUserToDoTaskList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/user-to-do-task-list',
             method: 'get',
             params: form
@@ -27,7 +27,7 @@ export default {
     },
     //审批页详情
     async queryApprovalParameter(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/query-approval-parameter',
             method: 'get',
             params: form
@@ -35,7 +35,7 @@ export default {
     },
     //完成任务
     async saveCompleteApprovalTask(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/complete-approval-task',
             method: 'post',
             data: form
@@ -43,7 +43,7 @@ export default {
     },
     //已办任务
     async queryUserDoneTaskList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/query-user-done-task-list',
             method: 'get',
             params: form
@@ -51,7 +51,7 @@ export default {
     },
     //批量审批
     async batchCompleteApprovalTask(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/batch-complete-approval-task',
             method: 'post',
             data: form
@@ -59,7 +59,7 @@ export default {
     },
     //获取发起
     async queryUserStartFlow(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/query-user-start-flow',
             method: 'get',
             params: form
@@ -67,7 +67,7 @@ export default {
     },
     //批量页详情
     async queryTaskInfo(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/batch-approval-parameter',
             method: 'get',
             params: form
@@ -75,7 +75,7 @@ export default {
     },
     //校验电签短信验证码
     async checkSmsCode(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/task/check-sms-code',
             method: 'post',
             data: form

+ 6 - 6
src/api/modules/tasks/flow.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //分页数据
     async getPageData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/fixedFlow/page',
             method: 'get',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //获取系统所有角色划分
     async queryAllRoleList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/fixedFlow/queryAllRoleList',
             method: 'get',
             params: form
@@ -19,7 +19,7 @@ export default {
     },
     //详情
     async queryFixedFlowDetail(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/fixedFlow/detail',
             method: 'get',
             params: form
@@ -27,7 +27,7 @@ export default {
     },
     //新增
     async addFixedFlowData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/fixedFlow/save',
             method: 'post',
             data: form
@@ -35,7 +35,7 @@ export default {
     },
     //修改
     async updateFixedFlowData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/fixedFlow/update',
             method: 'post',
             data: form

+ 10 - 10
src/api/modules/user.js

@@ -1,8 +1,8 @@
-import request from "../request/index";
+import {httpApi} from "../request/httpApi";
 import website from "~src/config/index";
 import md5 from 'js-md5'
 
-export const userLogin = ({tenantId, deptId, roleId, username, password, type, key, code}) => request({
+export const userLogin = ({tenantId, deptId, roleId, username, password, type, key, code}) => httpApi({
     url: '/api/blade-auth/oauth/token',
     method: 'post',
     headers: {
@@ -22,7 +22,7 @@ export const userLogin = ({tenantId, deptId, roleId, username, password, type, k
     }
 });
 
-export const refreshToken = (refresh_token, tenantId, deptId, roleId) => request({
+export const refreshToken = (refresh_token, tenantId, deptId, roleId) => httpApi({
     url: '/api/blade-auth/oauth/token',
     method: 'post',
     headers: {
@@ -38,13 +38,13 @@ export const refreshToken = (refresh_token, tenantId, deptId, roleId) => request
     }
 });
 
-export const logout = () => request({
+export const logout = () => httpApi({
     url: '/api/blade-auth/oauth/logout',
     method: 'get'
 });
 
 
-export const registerGuest = (form, oauthId) => request({
+export const registerGuest = (form, oauthId) => httpApi({
     url: '/api/blade-user/register-guest',
     method: 'post',
     params: {
@@ -56,28 +56,28 @@ export const registerGuest = (form, oauthId) => request({
     }
 });
 
-export const getProjectAndContract = () => request({
+export const getProjectAndContract = () => httpApi({
     url: '/api/blade-business/userViewProjectContract/queryUserViewProjectAndContract',
     method: 'get'
 });
 
-export const getCaptcha = () => request({
+export const getCaptcha = () => httpApi({
     url: '/api/blade-auth/oauth/captcha',
     method: 'get'
 });
 
-export const getUserInfo = () => request({
+export const getUserInfo = () => httpApi({
     url: '/api/blade-auth/oauth/user-info',
     method: 'get'
 });
 
-export const sendLogs = (list) => request({
+export const sendLogs = (list) => httpApi({
     url: '/api/blade-auth/oauth/logout',
     method: 'post',
     data: list
 });
 
-export const clearCache = () => request({
+export const clearCache = () => httpApi({
     url: '/api/blade-auth/oauth/clear-cache',
     method: 'get'
 });

+ 12 - 12
src/api/modules/userInfo/index.js

@@ -1,9 +1,9 @@
-import request from "../../request/index";
+import {httpApi} from "../../request/httpApi";
 
 export default {
     //修改密码
     async updatePassword(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-user/update-password',
             method: 'post',
             params: form
@@ -11,7 +11,7 @@ export default {
     },
     //设置默认项目
     async setDefaultProject(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/defaultProject/save',
             method: 'post',
             data: form
@@ -19,7 +19,7 @@ export default {
     },
     //获取默认项目
     async getDefaultProject(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/defaultProject/queryUserDefault',
             method: 'get',
             params: form
@@ -27,7 +27,7 @@ export default {
     },
     //更新用户信息
     async updateUserInfo(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-user/update-info',
             method: 'post',
             data: form
@@ -35,7 +35,7 @@ export default {
     },
     //获取操作日志
     async getOperationLog(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/operationLog/list',
             method: 'get',
             params: form
@@ -43,7 +43,7 @@ export default {
     },
     //获取业务模块
     async queryBusinessModule(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/operationLog/queryBusinessModule',
             method: 'get',
             params: form
@@ -51,7 +51,7 @@ export default {
     },
     //获取操作页面
     async queryOperationView(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/operationLog/queryOperationView',
             method: 'get',
             params: form
@@ -59,7 +59,7 @@ export default {
     },
     //获取操作类型
     async queryOperationTypeList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/operationLog/queryOperationTypeList',
             method: 'get',
             params: form
@@ -67,7 +67,7 @@ export default {
     },
     //获取用户信息
     async queryCurrentUserData(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/userViewProjectContract/queryCurrentUserData',
             method: 'post',
             data: form
@@ -75,7 +75,7 @@ export default {
     },
     //回收站分页
     async queryRecycleBinList(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/recycleBin/list',
             method: 'get',
             params: form
@@ -83,7 +83,7 @@ export default {
     },
     //回收站恢复
     async recycleBinRegain(form) {
-        return request({
+        return httpApi({
             url: '/api/blade-business/recycleBin/regain',
             method: 'post',
             data: form

+ 29 - 0
src/api/request/httpApi.js

@@ -0,0 +1,29 @@
+import request from "./index";
+
+//封装的请求
+export const httpApi = async (obj, message= true) => {
+    return new Promise( (resolve) => {
+        //发起请求
+        request(obj).then((response) => {
+            resolve(getResData(response,false));
+        }).catch((response) => {
+            if (message) {
+                window.$message?.error(response?.data?.msg || '未知错误!');
+            }
+            resolve(getResData(response,true));
+        })
+    });
+}
+
+//处理数据
+const getResData = (response, error = false) => {
+    return {
+        response,
+        res: response?.data,
+        data: response?.data?.data,
+        code: response?.data?.code,
+        msg: response?.data?.msg,
+        status: response?.status,
+        error: error
+    }
+}

+ 6 - 13
src/api/request/index.js

@@ -39,27 +39,20 @@ axios.interceptors.request.use(config => {
 //http response 拦截
 axios.interceptors.response.use(res => {
     //获取状态码
-    const status = res.data.code || res.status;
-    const statusWhiteList = website.statusWhiteList || [];
-    const message = res.data.msg || res.data['error_description'] || '未知错误';
-    //如果在白名单里则自行catch逻辑处理
-    if (statusWhiteList.includes(status)) {
-        return Promise.reject(res);
-    }
+    const status = res.data?.code || res.status;
+    const message = res.data?.msg || res.data['error_description'] || '未知错误';
     //如果是401则跳转到登录页面
     if (status === 401) {
-        window.$ElMessage?.error(message || '身份失效!');
+        window.$message?.error(message || '身份失效!');
         router.push({path: '/login'})
-        //store.dispatch('FedLogOut').then(() => router.push({path: '/login'}));
     }
-    // 如果请求为非200否者默认统一处理
+    // 如果请求为非200, 自行catch逻辑处理
     if (status !== 200) {
-        window.$ElMessage?.error(message || '操作失败!');
-        return Promise.reject(new Error(message))
+        return Promise.reject(res);
     }
     return res;
 }, error => {
-    window.$ElMessage?.error('请求异常!');
+    window.$message?.error('请求异常!');
     return Promise.reject(new Error(error));
 });
 

+ 3 - 4
src/components/AppConfig/index.vue

@@ -10,11 +10,10 @@ import zhCn from 'element-plus/es/locale/lang/zh-cn'
 
 // 将ui的函数挂载在windows对象上
 function registerElTools () {
-    window['$ElLoading'] = ElLoading;
-    window['$ElMessageBox'] = ElMessageBox;
-    window['$ElMessage'] = ElMessage;
+    window['$loading'] = ElLoading;
+    window['$messageBox'] = ElMessageBox;
     window['$message'] = ElMessage;
-    window['$ElNotification'] = ElNotification;
+    window['$notification'] = ElNotification;
 }
 
 registerElTools()

+ 115 - 0
src/global/components/hc-counter/index.vue

@@ -0,0 +1,115 @@
+<template>
+    <div :class="ui" class="hc-counter-box">
+        <div class="counter-box">
+            <div class="counter-btn first" :disabled="modelVal <= 1" @click="moveBtnClick">-</div>
+            <div class='counter-val w-20'>
+                <span>{{modelVal}}</span>
+                <span class="ml-2" v-if="text">{{text}}</span>
+            </div>
+            <div class="counter-btn end" @click="addBtnClick">+</div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import {ref, watch} from "vue";
+const props = defineProps({
+    ui: {
+        type: String,
+        default: ''
+    },
+    modelValue: {
+        type: [String,Number],
+        default: 1
+    },
+    text: {
+        type: String,
+        default: ''
+    },
+})
+
+//转换
+const setModelVal = (value) => {
+    return parseInt(value || 1 + '');
+}
+
+const modelVal = ref(setModelVal(props.modelValue))
+
+//监听
+watch(() => props.modelValue, (value) => {
+    modelVal.value = setModelVal(value)
+})
+
+const emit = defineEmits(['update:modelValue','addClick','moveClick'])
+
+//减少
+const moveBtnClick = () => {
+    let val = modelVal.value - 1;
+    if (val <= 1) {
+        modelVal.value =  1;
+    } else {
+        modelVal.value =  val;
+        emit('update:modelValue', val)
+        emit('moveClick', val)
+    }
+}
+
+//增加
+const addBtnClick = () => {
+    let val = modelVal.value + 1;
+    modelVal.value =  val;
+    emit('update:modelValue', val)
+    emit('addClick', val)
+}
+</script>
+
+<style lang="scss" scoped>
+.hc-counter-box {
+    position: relative;
+    display: inline-block;
+    height: 32px;
+    .counter-box {
+        display: flex;
+        align-items: center;
+        height: inherit;
+        color: #000000;
+        .counter-btn {
+            height: 32px;
+            width: 32px;
+            border: 1px solid #eeeeee;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: 22px;
+            font-weight: 100;
+            cursor: pointer;
+            user-select: none;
+            background-color: white;
+            transition: color 0.2s, background-color 0.2s;
+            &.first {
+                border-radius: 4px 0 0 4px;
+            }
+            &.end {
+                border-radius: 0 4px 4px 0;
+            }
+            &:hover {
+                color: var(--el-color-primary);
+                background-color: var(--el-color-primary-light-8);
+            }
+            &[disabled=true] {
+                cursor: not-allowed;
+                color: #c5c5c5;
+                background-color: #f3f3f3;
+            }
+        }
+        .counter-val {
+            height: inherit;
+            border-top: 1px solid #eeeeee;
+            border-bottom: 1px solid #eeeeee;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+    }
+}
+</style>

+ 193 - 0
src/global/components/hc-report-modal/index.vue

@@ -0,0 +1,193 @@
+<template>
+    <el-dialog v-model="isShow" :title="title" width="47rem" custom-class="hc-modal-border">
+        <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large">
+            <el-form-item label="任务名称" prop="taskName">
+                <el-input v-model="formModel.taskName" disabled/>
+            </el-form-item>
+            <el-form-item label="任务描述" path="taskContent">
+                <el-input type="textarea" v-model="formModel.taskContent" placeholder="请输入任务描述" :autosize="{ minRows: 3, maxRows: 5 }"/>
+            </el-form-item>
+            <el-form-item label="任务流程" path="fixedFlowId">
+                <el-select v-model="formModel.fixedFlowId" block @change="handleProcessValue">
+                    <el-option v-for="item in processData" :label="item.fixedFlowName" :value="item.id"/>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="任务人" path="user" v-if="false">
+                <!--TasksUser class="w-full"/-->
+            </el-form-item>
+            <el-form-item label="任务人">{{linkUserJoinString}}</el-form-item>
+            <el-form-item label="上报批次" path="batch">
+                <HcCounter v-model:value="formModel.batch" @update:modelValue="batchUpdateValue"/>
+            </el-form-item>
+            <el-form-item label="限定审批时间" path="restrictDay">
+                <HcCounter v-model:value="formModel.restrictDay" @update:modelValue="restrictDayUpdateValue"/>
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <div class="dialog-footer">
+                <el-button size="large" @click="cancelReportClick">取消</el-button>
+                <el-button type="primary" hc-btn :loading="formReportLoading" @click="formReportClick">提交</el-button>
+            </div>
+        </template>
+    </el-dialog>
+</template>
+
+<script setup>
+import {ref,watch,onMounted} from "vue";
+//import TasksUser from "~com/tasksUser/index.vue"
+import {getArrValue,getIndex} from "vue-utils-plus"
+import tasksFlowApi from '~api/tasks/flow';
+import {ApprovalApi} from '~api/other';
+
+const props = defineProps({
+    show: {
+        type: Boolean,
+        default: false
+    },
+    title: {
+        type: String,
+        default: '上报审批'
+    },
+    taskName: {
+        type: String,
+        default: ''
+    },
+    ids: {
+        type: String,
+        default: ''
+    },
+    projectId: {
+        type: [String,Number],
+        default: ''
+    },
+    contractId: {
+        type: [String,Number],
+        default: ''
+    },
+    url: {
+        type: [String,Number],
+        default: ''
+    },
+})
+
+//变量
+const isShow = ref(props.show)
+const projectId = ref(props.projectId)
+const contractId = ref(props.contractId)
+const ApiUrl = ref(props.url)
+
+//表单
+const formRef = ref(null)
+const processData = ref([])
+const formModel = ref({
+    projectId: projectId.value, contractId: contractId.value, ids: props.ids,
+    taskName: props.taskName, taskContent: '', fixedFlowId: '', batch: 1, restrictDay: 1
+})
+const formRules = ref({
+    taskContent: {
+        required: true,
+        trigger: ["blur", "input"],
+        message: "请输入任务描述"
+    },
+    fixedFlowId: {
+        required: true,
+        trigger: ["blur", "change"],
+        message: "请选择任务流程"
+    },
+    user: {
+        required: true,
+        trigger: ["blur", "change"],
+        message: "请选择任务人"
+    }
+})
+
+//监听
+watch(() => [
+    props.show,
+    props.projectId,
+    props.contractId,
+    props.taskName,
+    props.ids,
+    props.url,
+], ([val,pid,cid,name,ids,url]) => {
+    isShow.value = val
+    projectId.value = pid
+    contractId.value = cid
+    ApiUrl.value = url
+    //更新到表单数据
+    formModel.value.ids = ids
+    formModel.value.taskName = name
+    formModel.value.projectId = pid
+    formModel.value.contractId = cid
+})
+
+//渲染完成
+onMounted(() => {
+    getProcessData()
+})
+
+//获取流程数据
+const linkUserJoinString = ref('')
+const getProcessData = async () => {
+    const { error, code, data } = await tasksFlowApi.getPageData({
+        projectId: projectId.value,
+        contractId: contractId.value,
+        current: 1, size: 100
+    })
+    if (!error && code === 200) {
+        processData.value = getArrValue(data['records'])
+    } else {
+        processData.value = []
+    }
+}
+
+//流程数据切换
+const handleProcessValue = (val) => {
+    const list = processData.value
+    const index = getIndex(list, 'id', val)
+    linkUserJoinString.value = list[index]?.linkUserJoinString
+}
+
+//上报批次改变
+const batchUpdateValue = (val) => {
+    formModel.value.batch = val
+}
+
+//上报批次改变
+const restrictDayUpdateValue = (val) => {
+    formModel.value.restrictDay = val
+}
+
+const emit = defineEmits(['hide','finish'])
+//取消
+const cancelReportClick = () => {
+    isShow.value = false
+    emit('hide', false)
+}
+//上报
+const formReportClick = () => {
+    formRef.value?.validate((errors) => {
+        if (!errors) batchApprovalApi()
+    });
+}
+
+//上报请求
+const formReportLoading = ref(false)
+const batchApprovalApi = async () => {
+    formReportLoading.value = true
+    const { error, code, data } = await ApprovalApi(ApiUrl.value, {
+        projectId: projectId.value,
+        contractId: contractId.value,
+        ...formModel.value
+    })
+    formReportLoading.value = false
+    if (!error && code === 200) {
+        isShow.value = false
+        window.$message?.success('上报成功')
+        emit('hide', false)
+        emit('finish', data)
+    } else {
+        processData.value = []
+    }
+}
+</script>

+ 4 - 0
src/global/components/index.js

@@ -2,11 +2,13 @@ import HcImg from './hc-img/index.vue'
 import HcIcon from './hc-icon/index.vue'
 import HcCard from './hc-card/index.vue'
 import HcPages from './hc-page/index.vue'
+import HcCounter from './hc-counter/index.vue'
 import HcTooltip from './hc-tooltip/index.vue'
 import HcMenuSimple from './hc-menu-simple/index.vue'
 import HcDatePicker from './hc-date-picker/index.vue'
 import HcNewSwitch from './hc-new-switch/index.vue'
 import HcDragModal from './hc-drag-modal/index.vue'
+import HcReportModal from './hc-report-modal/index.vue'
 
 //注册全局组件
 export const setupComponents = (App) => {
@@ -14,9 +16,11 @@ export const setupComponents = (App) => {
     App.component('HcIcon', HcIcon)
     App.component('HcCard', HcCard)
     App.component('HcPages', HcPages)
+    App.component('HcCounter', HcCounter)
     App.component('HcTooltip', HcTooltip)
     App.component('HcMenuSimple', HcMenuSimple)
     App.component('HcDatePicker', HcDatePicker)
     App.component('HcNewSwitch', HcNewSwitch)
     App.component('HcDragModal', HcDragModal)
+    App.component('HcReportModal', HcReportModal)
 }

+ 2 - 2
src/layout/index.vue

@@ -95,8 +95,8 @@ const projectProps = ref({
 
 //渲染完成
 onMounted(() => {
-    initButtons().then()
-    initProjectContract().then()
+    initButtons()
+    initProjectContract()
     const info = useAppState.getProjectContract || []
     projectContractData(info);
     setIsCollapse(RoutesName.value)

+ 11 - 10
src/layout/modules/UserInfoBar.vue

@@ -20,7 +20,7 @@
 
 <script setup>
 import {onMounted, ref, watch} from "vue";
-import { useRouter } from 'vue-router'
+import {useRouter} from 'vue-router'
 import {useAppStore} from "~src/store/index";
 import {getStore} from "~src/utils/lib/storage";
 import {calcDate} from "~src/utils/lib/date";
@@ -43,7 +43,11 @@ watch(() => [
 })
 
 onMounted(() => {
-    //刷新token
+    getRefreshToken()
+})
+
+//刷新token
+const getRefreshToken = () => {
     setInterval(() => {
         const token = getStore({name: "token", debug: true}) || {};
         const date = calcDate(token.datetime, new Date().getTime());
@@ -58,7 +62,7 @@ onMounted(() => {
             });
         }
     }, 10000)
-})
+}
 
 const options = [
     {
@@ -75,16 +79,13 @@ const options = [
 
 //事件
 const emit = defineEmits(['change'])
-const handleSelect = (key) => {
+const handleSelect = async (key) => {
     if (key === 'my') {
         router.push({name:'user-index'});
     } else if (key === 'logout') {
-        LogOut().then(() => {
-            window.$message?.info('退出成功');
-            router.push({name:'login'});
-        }).catch(() => {
-            router.push({name:'login'});
-        })
+        await LogOut();
+        window.$message?.info('退出成功');
+        router.push({name:'login'});
     }
 }
 </script>

+ 9 - 7
src/plugins/HTableForm.js

@@ -5,7 +5,7 @@ import {ElInput,ElDatePicker,ElUpload,ElInputNumber,ElTimePicker,ElSelect,ElOpti
 const components = {ElInput, ElDatePicker, ElUpload, ElInputNumber, ElTimePicker, ElSelect, ElOption, ElRadioGroup, ElRadio, ElCheckbox, ElCheckboxGroup}
 
 //表单渲染
-export const HTableForm = ({template, formData, appId, onRight}) => {
+export const HTableForm = ({template, formData, appId, onRight, uploadFinish}) => {
     const app = createApp({
         data() {
             return {
@@ -19,15 +19,17 @@ export const HTableForm = ({template, formData, appId, onRight}) => {
             RightClick(a,b,c,d,e,f,event) {
                 event.preventDefault();
                 const KeyName = event?.target?.getAttribute('keyname') || ''
-                onRight(event, KeyName)
+                if (onRight) {
+                    onRight(event, KeyName)
+                }
             },
             getInformation() {},
-            formUploadSuccess(event,key) {
-                console.log(event,key)
+            formUploadSuccess(res,key) {
+                if (uploadFinish) {
+                    uploadFinish(res,key)
+                }
             },
-            formUploadExceed() {
-                console.log('格式错误')
-            }
+            formUploadExceed() {}
         }
     })
     app.mount(appId)

+ 3 - 2
src/router/routers.js

@@ -13,8 +13,9 @@ export const getRouterData = async () => {
     const route = getObjNullValue(getStoreData('route'))
     if (!route) {
         //请求接口,获取路由数据
-        const {data} = await getRoutes()
-        const resData = getArrValue(data?.data)
+        const {error, data} = await getRoutes()
+        if (error) return []
+        const resData = getArrValue(data)
         //数据转换
         let routesObj = {}, routesArr = []
         await ArrToOneObj(resData, 'code', routesObj, routesArr)

+ 13 - 19
src/store/modules/app.js

@@ -11,16 +11,13 @@ const store = useAppStore(pinia)
 export const initProjectContract = async () => {
     const value = getStoreData('projectContract')
     if (!value) {
-        try {
-            const { data } = await getProjectAndContract();
-            const datas = getArrValue(data?.data)
-            store.setProjectContract(datas)
-            return Promise.resolve(data);
-        } catch (e) {
-            return Promise.reject(e);
-        }
+        const { error, data } = await getProjectAndContract();
+        if (error) return Promise.reject('error');
+        const datas = getArrValue(data)
+        store.setProjectContract(datas)
+        return Promise.resolve(data);
     } else {
-        return value
+        return Promise.resolve(value);
     }
 }
 
@@ -28,17 +25,14 @@ export const initProjectContract = async () => {
 export const initButtons = async () => {
     const value = getStoreData('buttons')
     if (!value) {
-        try {
-            const { data } = await getButtons();
-            const buttons = getArrValue(data?.data)
-            const buttonsArr = await setButtonsData(buttons)
-            store.setButtons(buttonsArr)
-            return Promise.resolve(true);
-        } catch (e) {
-            return Promise.reject(false);
-        }
+        const { error, data } = await getButtons();
+        if (error) return Promise.reject('error');
+        const buttons = getArrValue(data)
+        const buttonsArr = await setButtonsData(buttons)
+        store.setButtons(buttonsArr)
+        return Promise.resolve(true);
     } else {
-        return true
+        return Promise.resolve(true);
     }
 }
 

+ 29 - 21
src/store/modules/user.js

@@ -11,23 +11,29 @@ const store = useAppStore(pinia)
 
 //登录
 export const useAppLogin = async (form) => {
-    const { status, data } = await userLogin(form);
-    if (status === 200) {
-        store.setToken(data['access_token'])
-        store.setRefreshToken(data['refresh_token'])
-        store.setTenantId(data['tenant_id'])
-        store.setUserInfo(data)
-        await initUserConfigInfo()
-        return data;
-    } else {
-        return {}
+    try {
+        const { error, status, res } = await userLogin(form);
+        if (!error && status === 200) {
+            store.setToken(res['access_token'])
+            store.setRefreshToken(res['refresh_token'])
+            store.setTenantId(res['tenant_id'])
+            store.setUserInfo(res)
+            await initUserConfigInfo()
+            return Promise.resolve(res);
+        } else {
+            return Promise.reject(res);
+        }
+    } catch (e) {
+        window.console.warn('token 刷新失败: ', e);
+        return Promise.reject(e);
     }
 }
 
 //用户信息初始化
 export const initUserConfigInfo = async () => {
-    const {data} = await userConfigInfo();
-    const res = getObjValue(data?.data)
+    const {error, data} = await userConfigInfo();
+    if (error) return true
+    const res = getObjValue(data)
     if (res?.theme) {
         const {theme,color,homeTheme,shotWebRtc,fullScreen,opinionView} = res
         //设置主题
@@ -75,14 +81,16 @@ export const RefreshToken = async () => {
         const { dept_id, role_id } = store.getUserInfo;
         const refresh = store.getRefreshToken;
         const tenantId = store.getTenantId;
-        const { status, data } = await refreshToken(refresh, tenantId, dept_id, role_id);
-        if (status === 200) {
-            store.setToken(data['access_token'])
-            store.setRefreshToken(data['refresh_token'])
-            store.setTenantId(data['tenant_id'])
-            store.setUserInfo(data)
+        const { error, status, res } = await refreshToken(refresh, tenantId, dept_id, role_id);
+        if (!error && status === 200) {
+            store.setToken(res['access_token'])
+            store.setRefreshToken(res['refresh_token'])
+            store.setTenantId(res['tenant_id'])
+            store.setUserInfo(res)
+            return Promise.resolve(res);
+        } else {
+            return Promise.reject(res);
         }
-        return Promise.resolve(data);
     } catch (e) {
         window.console.warn('token 刷新失败: ', e);
         return Promise.reject(e);
@@ -91,6 +99,6 @@ export const RefreshToken = async () => {
 
 //登出
 export const LogOut = async () => {
-    return await logout();
+    await logout();
+    return Promise.resolve(true);
 }
-

+ 26 - 0
src/styles/app/element.scss

@@ -335,3 +335,29 @@
         padding-top: 24px;
     }
 }
+
+//表单上传组件
+.hc-upload-table-form {
+    position: relative;
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    .el-upload {
+        position: relative;
+        flex: 1;
+        height: 100%;
+        color: #ccc;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        .hc-table-form-icon {
+            font-size: 24px;
+            font-weight: 100;
+        }
+        .hc-table-form-img {
+            width: 100%;
+            height: 100%;
+        }
+    }
+}

+ 19 - 9
src/views/data-fill/components/HcTreeNode.vue

@@ -1,5 +1,5 @@
 <template>
-    <ElTree class="hc-tree-node-box" ref="ElTreeRef" :props="ElTreeProps" :data="ElTreeData" :node-key="nodeKey" highlight-current accordion show-checkbox :expand-on-click-node="false" @check="ElTreeCheckChange">
+    <ElTree class="hc-tree-node-box" ref="ElTreeRef" :props="ElTreeProps" :data="ElTreeData" :node-key="nodeKey" highlight-current accordion show-checkbox :check-strictly="isStrictly" :expand-on-click-node="false" @check="ElTreeCheckChange">
         <template #default="{ node, data }">
             <div class="custom-tree-node">
                 <div class="label" @dblclick="ElTreeDblClick(data)">
@@ -19,8 +19,9 @@
 
 <script setup>
 import {nextTick, onMounted, ref, watch} from "vue";
+import {getArrValue} from "vue-utils-plus"
 import wbsApi from '~api/data-fill/wbs';
-import { getArrValue } from "vue-utils-plus"
+
 //参数
 const props = defineProps({
     projectId: {
@@ -39,18 +40,25 @@ const props = defineProps({
         type: [String,Number],
         default: ''
     },
+    strictly: {
+        type: Boolean,
+        default: false
+    },
 })
 
 //变量
 const ElTreeRef = ref(null)
 const projectId = ref(props.projectId)
+const isStrictly = ref(props.strictly)
 const ElTreeProps = ref({label: 'title', children: 'children', isLeaf: 'notExsitChild'})
 
 //监听
 watch(() => [
     props.projectId,
-], ([pid]) => {
+    props.strictly,
+], ([pid,strictly]) => {
     projectId.value = pid
+    isStrictly.value = strictly
 })
 
 //渲染完成
@@ -65,14 +73,16 @@ const emit = defineEmits(['check-change'])
 const ElTreeData = ref([])
 const ElTreeLoadNode = async () => {
     let nodeId = props.oldId || props.nodeId || ''
-    const {data} = await wbsApi.queryWbsTreePrivateByProjectIdAndId({
+    const {error, code, data} = await wbsApi.queryWbsTreePrivateByProjectIdAndId({
         id: nodeId,
         projectId: projectId.value
     })
-    ElTreeData.value = getArrValue(data?.data)
-    await nextTick(() => {
-        ElTreeCheckedKeys()
-    })
+    if (!error && code === 200) {
+        ElTreeData.value = getArrValue(data)
+        await nextTick(() => {
+            ElTreeCheckedKeys()
+        })
+    }
 }
 
 //被选择的
@@ -103,7 +113,7 @@ const keyUpEvent = (e,item) => {
 //更改节点名称完成
 const ElTreeBtnClick = (item) => {
     if (!item?.title) {
-        window?.$ElMessage?.warning('节点名称不能为空')
+        window?.$message?.warning('节点名称不能为空')
     } else {
         item.isInputName = false;
         ElTreeCheckedKeys()

+ 4 - 4
src/views/data-fill/components/HcUpload.vue

@@ -60,14 +60,14 @@ const beforeUpload = async (file) => {
         beforeFileNum.value ++;
         return true;
     } else {
-        window?.$ElMessage?.warning('文件大小, 不能过60M!');
+        window?.$message?.warning('文件大小, 不能过60M!');
         return false;
     }
 }
 
 //超出限制时
 const uploadExceed = () => {
-    window?.$ElMessage?.warning('请上传 jpg/png/pdf/excel/word 的文件,文件大小 不超过60M');
+    window?.$message?.warning('请上传 jpg/png/pdf/excel/word 的文件,文件大小 不超过60M');
 }
 
 //上传中
@@ -89,7 +89,7 @@ const uploadSuccess = () => {
 const errorFileNum = ref(0)
 const uploadError = () => {
     errorFileNum.value ++;
-    window?.$ElMessage?.error('上传失败');
+    window?.$message?.error('上传失败');
     const num = finishFileNum.value + errorFileNum.value;
     if (beforeFileNum.value === num) {
         uploadDisabled.value = false
@@ -108,7 +108,7 @@ const uploadPreview = ({url}) => {
 const delUploadData = async ({id}) => {
     const {data} = await wbsApi.removeBussFile({ids: id})
     if(data && data.code === 200) {
-        window.$ElMessage?.success('删除成功');
+        window.$message?.success('删除成功');
         return true
     } else {
         return false

+ 83 - 93
src/views/data-fill/components/ListItem.vue

@@ -120,17 +120,26 @@
             </div>
         </template>
     </el-dialog>
+    <!--关联试验数据-->
+    <el-dialog v-model="CTDModal" title="关联试验数据" width="850px" custom-class="hc-modal-border">
+        开发中...
+        <template #footer>
+            <div class="dialog-footer">
+                <el-button size="large" @click="CTDModal = false">取消</el-button>
+                <el-button type="primary" hc-btn @click="CTDModal = false">确认</el-button>
+            </div>
+        </template>
+    </el-dialog>
 </template>
 
 <script setup>
 import {ref,watch,nextTick} from "vue";
 import notableform from '~src/assets/view/notableform.svg';
 import {HTableForm} from "~src/plugins/HTableForm"
-import {isType, formValidate} from "vue-utils-plus"
+import {utilsText, isType, toParse, formValidate} from "vue-utils-plus"
 import wbsApi from "~api/data-fill/wbs"
 import HcUpload from "./HcUpload.vue"
 import {NDropdown} from 'naive-ui';
-const {isString, getObjNullValue, getArrValue} = isType()
 //初始
 const props = defineProps({
     datas: {
@@ -150,7 +159,8 @@ const props = defineProps({
         default: ''
     },
 })
-
+const {isString, getObjNullValue, getArrValue} = isType()
+const {setPosInsert, setPosRange} = utilsText()
 const projectId = ref(props.projectId)
 const contractId = ref(props.contractId)
 const listDatas = ref(props.datas)
@@ -220,9 +230,9 @@ const CollapseChange = (name) => {
 const getExcelHtml = async (item,index) => {
     const pkeyId = item.pkeyId || ''
     if (pkeyId) {
-        const { data } = await wbsApi.getExcelHtml({pkeyId: pkeyId + ''})
-        const resData = isString(data?.data) ? data?.data : ''
-        if (resData) {
+        const {error, code, data} = await wbsApi.getExcelHtml({pkeyId: pkeyId + ''}, false)
+        const resData = isString(data) ? data || '' : ''
+        if (!error && code === 200 && resData) {
             item.isTableForm = true
             //渲染表单
             HTableForm({
@@ -231,24 +241,30 @@ const getExcelHtml = async (item,index) => {
                 appId: `#table-form-${pkeyId}`,
                 onRight: (event, KeyName) => {
                     onRightClick(event, KeyName, index)
-                }
+                },
+                uploadFinish: (res, KeyName) => {
+                    if (res.code === 200) {
+                        const link = res.data?.link || '';
+                        onUploadFinish(link, KeyName, index)
+                    }
+                },
             })
             item.isTableFormRender = true
         } else {
             item.isTableForm = false
-            window?.$Elmessage?.warning('暂无表单')
+            window?.$message?.warning('暂无表单')
         }
     } else {
         item.isTableForm = false
-        window?.$Elmessage?.warning('pkeyId为空')
+        window?.$message?.warning('pkeyId为空')
     }
 }
 
 //获取已填写的数据
 const getBussDataInfo = async (pkeyId, index) => {
-    const { data } = await wbsApi.getBussDataInfo({pkeyId: pkeyId})
-    const resData = getObjNullValue(data?.data)
-    if (resData) {
+    const {error, code, data} = await wbsApi.getBussDataInfo({pkeyId: pkeyId}, false)
+    const resData = getObjNullValue(data)
+    if (!error && code === 200 && resData) {
         //处理日期范围数据
         const pickerKey = resData['pickerKey'] || ''
         const pickerKeys = pickerKey.split(',')
@@ -269,15 +285,6 @@ const getBussDataInfo = async (pkeyId, index) => {
     }
 }
 
-//字符串转数组或JSON
-const toParse = (val) => {
-    try {
-        return JSON.parse(val)
-    } catch (e) {
-        return false;
-    }
-}
-
 //单个保存
 const tableFormSaveClick = async (item,index) => {
     const res = await saveExcelBussData(item,index)
@@ -289,56 +296,48 @@ const tableFormSaveClick = async (item,index) => {
 
 //保存表单数据
 const saveExcelBussData = async (item, index, showTip = true) => {
-    const { data } = await wbsApi.saveExcelBussData({
+    const {error, code, data} = await wbsApi.saveExcelBussData({
         pkeyId: item.pkeyId + '',
         classify: classify.value,
         ...formData.value[index]
-    })
-    if(data && data.code === 200) {
-        if(showTip) {
-            window?.$Elmessage?.success('保存成功')
-        }
+    }, false)
+    //处理数据
+    if (!error && code === 200) {
+        if(showTip) window?.$message?.success('保存成功')
         return true
     } else {
-        if(showTip) {
-            window?.$Elmessage?.warning(data.msg || '保存失败')
-        }
+        if(showTip) window?.$message?.warning(data.msg || '保存失败')
         return false
     }
 }
 
 //预览PDF
 const getBussPdfInfo = async (item, showTip = true) => {
-    const { data } = await wbsApi.getBussPdfInfo({
+    const {error, code, data} = await wbsApi.getBussPdfInfo({
         pkeyId: item.pkeyId + ''
-    })
-    if(data && data.code === 200) {
-        const url = data?.data || ''
-        if (url) {
-            window.open(url, '_blank')
-        } else {
-            if(showTip) {
-                window?.$Elmessage?.warning('PDF错误')
-            }
+    },false)
+    if (!error && code === 200) {
+        if (data) {
+            window.open(data, '_blank')
+        } else if(showTip) {
+            window?.$message?.warning('PDF错误')
         }
     } else {
         if(showTip) {
-            window?.$Elmessage?.warning('暂无PDF')
+            window?.$message?.warning(data.msg || '获取PDF失败')
         }
     }
 }
 
 //删除本表
 const delClick = async (item) => {
-    const { data } = await wbsApi.removeBussTabInfo({
+    const {error, code} = await wbsApi.removeBussTabInfo({
         pkeyid: item.pkeyId + '',
         classify: classify.value,
     })
-    if(data && data.code === 200) {
-        window?.$Elmessage?.warning('操作成功')
+    if (!error && code === 200) {
+        window?.$message?.warning('操作成功')
         renewData()
-    } else {
-        window?.$Elmessage?.warning('操作失败')
     }
 }
 
@@ -346,30 +345,26 @@ const delClick = async (item) => {
 const copyClick = async (item,index) => {
     const res = await saveExcelBussData(item,index,false)
     if (res) {
-        const { data } = await wbsApi.copeBussTab({pkeyId: item.pkeyId + ''})
-        if(data && data.code === 200) {
-            window?.$Elmessage?.success('操作成功')
+        const {error, code} = await wbsApi.copeBussTab({pkeyId: item.pkeyId + ''})
+        if (!error && code === 200) {
+            window?.$message?.warning('操作成功')
             renewData()
-        } else {
-            window?.$Elmessage?.warning('操作失败')
         }
     } else {
-        window?.$Elmessage?.warning('复制本表操作失败')
+        window?.$message?.warning('复制本表操作失败')
     }
 }
 
 //隐藏本表
 const hideClick = async (item) => {
     const isBussShow = item?.isBussShow === 2 ? 1 : 2 //状态(1显示 2隐藏)
-    const { data } = await wbsApi.showBussTab({
+    const {error, code} = await wbsApi.showBussTab({
         pkeyId: item.pkeyId + '',
         status: isBussShow
     })
-    if(data && data.code === 200) {
-        window?.$Elmessage?.success('操作成功')
+    if (!error && code === 200) {
+        window?.$message?.warning('操作成功')
         renewData()
-    } else {
-        window?.$Elmessage?.warning('操作失败')
     }
 }
 
@@ -380,7 +375,7 @@ const previewClick = async (item,index) => {
         await getBussPdfInfo(item)
         renewData()
     } else {
-        window?.$Elmessage?.warning('操作失败')
+        window?.$message?.warning('操作失败')
     }
 }
 
@@ -399,11 +394,11 @@ const uploadClick = (item) => {
 
 //获取文件列表
 const getBussFileList = async (pkeyId) => {
-    const { data } = await wbsApi.getBussFileList({
+    const {error, code, data} = await wbsApi.getBussFileList({
         pkeyid: pkeyId
     })
-    if(data && data.code === 200) {
-        fileListData.value = getArrValue(data?.data)
+    if (!error && code === 200) {
+        fileListData.value = getArrValue(data)
     } else {
         fileListData.value = []
     }
@@ -411,7 +406,6 @@ const getBussFileList = async (pkeyId) => {
 
 //上传文件
 const uploadChange = async ({type}) => {
-    console.log(type)
     if(type === 'success') {
         uploadModal.value = false
         renewData()
@@ -433,6 +427,11 @@ const tableFormMenu = ref([
     {label: '关联试验数据', key: "CTD"},
 ])
 
+//上传完成
+const onUploadFinish = (link, KeyName, index) => {
+    formData.value[index][KeyName] = link
+}
+
 //鼠标右键事件
 const onRightClick = (event, KeyName, index) => {
     //取光标位置
@@ -523,14 +522,14 @@ const specialInputBlur = (e) => {
 const specialClick = (event) => {
     const text = event?.target?.innerText ?? ''
     const start = specialPos.value.start
-    specialFormModel.value.val = inputPosInsert({
-        pos: specialPos.value,
-        input: specialFormModel.value.val,
-        val: text
-    })
+    const end = specialPos.value.end
+    const form = specialFormModel.value.val
+    specialFormModel.value.val = setPosInsert(start, end, form, text)
     specialRef.value?.focus();
     let posVal = start + text.length;
-    setSelectionRange('specialId', posVal)
+    nextTick(() => {
+        setPosRange('specialId', posVal)
+    })
 }
 
 //确认插入
@@ -540,37 +539,18 @@ const specialNodeClick = async () => {
         const item = tableFormItemNode.value
         const form = formData.value[item.index]
         const val = specialFormModel.value.val ?? ''
-        formData.value[item.index][item.KeyName] = inputPosInsert({
-            pos: {start: item.startPos, end: item.endPos},
-            input: form[item.KeyName],
-            val: val
-        })
+        formData.value[item.index][item.KeyName] = setPosInsert(item.startPos, item.endPos, form[item.KeyName], val)
         specialModal.value = false
         specialRef.value?.focus();
         let posVal = item.startPos + val.length;
-        setSelectionRange('specialId', posVal)
-    }
-}
-
-//输入框插入内容
-const inputPosInsert = ({pos, input, val}) => {
-    const startPos = pos.start, endPos = pos.end
-    if (!input) return val; //输入框无内容时,直接覆盖
-    if (input.length === startPos) {
-        //光标在最后时,直接追加
-        return input + val
-    } else {
-        //光标在其它位置时,裁取文本,并拼接
-        return input.substring(0, startPos) + val + input.substring(endPos, input.length)
+        nextTick(() => {
+            setPosRange(item.KeyName, posVal)
+        })
     }
 }
 
-//设置光标位置
-const setSelectionRange = (id, pos) => {
-    nextTick(() => {
-        document.getElementById(id)?.setSelectionRange(pos,pos)
-    })
-}
+//关联试验数据
+const CTDModal = ref(false)
 
 //事件
 const emit = defineEmits(['renew','offsetTop'])
@@ -589,6 +569,16 @@ const getOffsetTop = (key = '') => {
 const renewData = () => {
     emit('renew')
 }
+
+//获取表单数据
+const getFormData = () => {
+    return formData.value
+}
+
+// 暴露出去
+defineExpose({
+    getFormData
+})
 </script>
 
 <style lang="scss" scoped>

+ 0 - 839
src/views/data-fill/components/ListItem_bak.vue

@@ -1,839 +0,0 @@
-<template>
-    <div class="data-fill-list-box">
-        <n-collapse accordion :expanded-names="expandedNames" @update:expanded-names="updateExpandedNames">
-            <template v-for="(item,index) in listDatas" :key="item?.pkeyId">
-                <n-collapse-item display-directive="show" :id="`item-${index}-${item?.pkeyId}`" :name="`item-${index}-${item?.pkeyId}`">
-                    <template #header>
-                        <div class="text-lg truncate item-title">{{item.name}}</div>
-                    </template>
-                    <template #header-extra>
-                        <div class="flex items-center hc-extra-text-box">
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_del_table?.textInfo" v-if="btn_del_table && item?.isCopeTab === 2">
-                                <template #trigger>
-                                    <div class="mr-8 text-main extra-text-item" @click.stop="delClick(item,index)">
-                                        <i class="hcicon-a-Frame3"/>
-                                        <span class="ml-1">删除本表</span>
-                                    </div>
-                                </template>
-                                <span>{{btn_del_table?.textInfo}}</span>
-                            </n-popover>
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_copy_table?.textInfo" v-if="btn_copy_table">
-                                <template #trigger>
-                                    <div class="text-gray-400 extra-text-item" v-if="item?.isBussShow == 2" @click.stop>
-                                        <i class="hcicon-a-Frame3"/>
-                                        <span class="ml-1">复制本表</span>
-                                    </div>
-                                    <div class="text-main extra-text-item" v-else @click.stop="copyClick(item,index)">
-                                        <i class="hcicon-a-Frame3"/>
-                                        <span class="ml-1">复制本表</span>
-                                    </div>
-                                </template>
-                                <span>{{btn_copy_table?.textInfo}}</span>
-                            </n-popover>
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_hide_table?.textInfo" v-if="btn_hide_table">
-                                <template #trigger>
-                                    <div class="ml-8 text-main extra-text-item" @click.stop="hideClick(item,index)">
-                                        <template v-if="item?.isBussShow == 1">
-                                            <i class="hcicon-a-Frame4"/>
-                                            <span class="ml-1">隐藏本表</span>
-                                        </template>
-                                        <template v-else>
-                                            <i class="hcicon-zhengkaiyanjing4"/>
-                                            <span class="ml-1">显示本表</span>
-                                        </template>
-                                    </div>
-                                </template>
-                                <span>{{btn_hide_table?.textInfo}}</span>
-                            </n-popover>
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_pre_table?.textInfo" v-if="btn_pre_table">
-                                <template #trigger>
-                                    <div class="ml-8 text-gray-400 extra-text-item" v-if="item?.isBussShow == 2 || item?.isTabPdf === 1" @click.stop>
-                                        <i class="hcicon-Frame"/>
-                                        <span class="ml-1">预览</span>
-                                    </div>
-                                    <div class="ml-8 text-main extra-text-item" v-else @click.stop="previewClick(item,index)">
-                                        <i class="hcicon-Frame"/>
-                                        <span class="ml-1">预览</span>
-                                    </div>
-                                </template>
-                                <span>{{btn_pre_table?.textInfo}}</span>
-                            </n-popover>
-                            <n-popover trigger="hover" :disabled="!bubbleVal || !btn_up_table?.textInfo" v-if="btn_up_table">
-                                <template #trigger>
-                                    <div class="ml-8 text-gray-400 extra-text-item" v-if="item?.isBussShow == 2" @click.stop>
-                                        <i class="hcicon-shangchuan"/>
-                                        <span class="ml-1">上传</span>
-                                    </div>
-                                    <div class="ml-8 extra-text-item" :class="item?.tabFileType === 2?'text-green':'text-main'" v-else @click.stop="uploadClick(item,index)">
-                                        <i class="hcicon-shangchuan"/>
-                                        <span class="ml-1">{{item?.tabFileType === 2?'已上传':'上传' }}</span>
-                                    </div>
-                                </template>
-                                <span>{{btn_up_table?.textInfo}}</span>
-                            </n-popover>
-                        </div>
-                    </template>
-                    <div class="data-fill-list-item-content">
-                        <div class="data-fill-table-form-box">
-                            <div :id="`table-form-${item?.pkeyId}`"></div>
-                            <div class="hc-no-table-form" v-if="item?.isTableForm === false">
-                                <div class="table-form-no">
-                                    <img :src="notableform" alt=""/>
-                                    <div class="desc">暂无表单数据</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="data-fill-table-tip-box">
-                            <div class="text-orange tip-title">
-                                <i class="_icon-info-o"/>
-                                <span class="ml-1">提示</span>
-                            </div>
-                            <div class="text-gray-400 tip-item">1、灰色框代表可通过系统识别计算,公式自动引用,可通过公式计算少量数据,(表头数据及简单),也可只填写白色框数据</div>
-                            <div class="text-gray-400 tip-item">2、系统支持键盘中,shift + tab键向上一个填报框切换,tab向下一个填报框切换。暂不支持上下按键切换输入框</div>
-                            <div class="table-tip-foot">
-                                <div class="tip-left-btn">
-                                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_impo_table?.textInfo" v-if="btn_impo_table">
-                                        <template #trigger>
-                                            <div class="text-gray-400 dow-text">
-                                                <i class="hcicon-Frame1"/>
-                                                <span class="ml-1">导入列表数据</span>
-                                            </div>
-                                        </template>
-                                        <span>{{btn_impo_table?.textInfo}}</span>
-                                    </n-popover>
-                                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_down_table?.textInfo" v-if="btn_down_table">
-                                        <template #trigger>
-                                            <div class="text-main dow-text">
-                                                <i class="hcicon-a-Frame11"/>
-                                                <span class="ml-1">下载导入模板</span>
-                                            </div>
-                                        </template>
-                                        <span>{{btn_down_table?.textInfo}}</span>
-                                    </n-popover>
-                                </div>
-                                <div class="tip-right-btn">
-                                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_save_table?.textInfo" v-if="btn_save_table">
-                                        <template #trigger>
-                                            <n-button type="primary" strong secondary size="large" @click="tableFormSaveClick(item,index)">保存</n-button>
-                                        </template>
-                                        <span>{{btn_save_table?.textInfo}}</span>
-                                    </n-popover>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </n-collapse-item>
-            </template>
-        </n-collapse>
-    </div>
-    <!--鼠标右键菜单-->
-    <n-dropdown placement="bottom" inverted trigger="manual" :x="tableFormMenuX" :y="tableFormMenuY" size="huge" :options="tableFormMenu" :show="tableFormMenuShow" @clickoutside="onClickoutside" @select="handleMenuSelect"/>
-    <!--插入设计值/频率-->
-    <n-modal v-model:show="IDVFModal" class="hc-custom-card" title="插入设计值/频率" preset="card" style="width: 600px;" :segmented="{content: 'soft', footer: 'soft'}">
-        <div class="text-base mb-6 ml-16 pl-1">填写完设计值和频率,系统自动计算实测值</div>
-        <n-form ref="formIDVFRef" :model="formIDVFModel" :rules="formIDVFRules" label-placement="left" label-width="auto" size="large">
-            <n-form-item label="设计值" path="designValue">
-                <n-input v-model:value="formIDVFModel.designValue" placeholder="请输入设计值"/>
-            </n-form-item>
-            <n-form-item label="频率" path="frequency">
-                <n-input v-model:value="formIDVFModel.frequency" placeholder="请输入频率"/>
-            </n-form-item>
-        </n-form>
-        <template #footer>
-            <div class="text-center">
-                <n-button @click="IDVFModal = false">取消</n-button>
-                <n-button type="primary" class="ml-6">确认插入</n-button>
-            </div>
-        </template>
-    </n-modal>
-    <!--插入特殊字符-->
-    <n-modal v-model:show="specialModal" class="hc-custom-card" title="插入特殊字符" preset="card" style="width: 600px;" :segmented="{content: 'soft', footer: 'soft'}">
-        <n-input ref="specialRef" id="specialId" class="font-EUDC mb-6" v-model:value="specialValue" size="large" placeholder="请选择特殊字符代码" clearable autofocus/>
-        <n-grid :x-gap="10" :y-gap="10" :cols="8">
-            <n-grid-item v-for="item in specialCharacters" :key="item">
-                <div class="special-box" @click="specialClick">
-                    <span class="font-EUDC" :title="`字符代码(C):${item !== 'K̅'?item.slice(2,7):'K̅'}`" v-html="item"/>
-                </div>
-            </n-grid-item>
-        </n-grid>
-        <template #footer>
-            <div class="text-center">
-                <n-button @click="specialModal = false">取消</n-button>
-                <n-button type="primary" class="ml-6" @click="specialNodeClick">确认插入</n-button>
-            </div>
-        </template>
-    </n-modal>
-    <!--关联试验数据-->
-    <n-modal v-model:show="CTDModal" class="hc-custom-card" title="关联试验数据" preset="card" style="width: 850px;" :segmented="{content: 'soft', footer: 'soft'}">
-        123456
-        <template #footer>
-            <div class="text-center">
-                <n-button @click="CTDModal = false">取消</n-button>
-                <n-button type="primary" class="ml-6">确认插入</n-button>
-            </div>
-        </template>
-    </n-modal>
-    <!--上传文件-->
-    <n-modal v-model:show="uploadModal" class="hc-custom-card w-606" title="上传文件" preset="card" :segmented="{content: 'soft', footer: 'soft'}">
-        <n-upload v-model:file-list="fileListData" :action="action" :headers="getTokenHeader()" :data="addData" :accept="accept" multiple @before-upload="beforeUpload" @finish="uploadFinish" @change="UploadChange" @remove="delUploadData"  @update:file-list="fileListUpdate">
-            <n-button type="primary">选择文件并上传</n-button>
-        </n-upload>
-    </n-modal>
-</template>
-
-<script setup>
-import {ref,watch,nextTick} from "vue";
-import {useAppStore} from "~src/store/index";
-import wbsApi from "~api/data-fill/wbs"
-import {ElInput,ElDatePicker} from 'element-plus'
-import {createApp} from "vue/dist/vue.esm-bundler.js";
-import {isString,isObject} from "~src/utils/lib/isApp";
-import notableform from '~src/assets/view/notableform.svg';
-import {isObjNull} from "../../utils/lib/isApp";
-import {getTokenHeader} from '~src/api/request/header';
-
-//初始
-const useAppState = useAppStore()
-const props = defineProps({
-    datas: {
-        type: Array,
-        default: () => ([])
-    },
-    projectId: {
-        type: [String,Number],
-        default: ''
-    },
-    contractId: {
-        type: [String,Number],
-        default: ''
-    },
-    classify: {
-        type: [String,Number],
-        default: ''
-    },
-})
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-const projectId = ref(props.projectId)
-const contractId = ref(props.contractId)
-const listDatas = ref(props.datas)
-const classify = ref(props.classify)
-const expandedNames = ref(null)
-
-//监听
-watch(() => [
-    props.datas,
-    props.projectId,
-    props.contractId,
-    useAppState.getBubble,
-    props.classify,
-], ([datas, pid, cid, Bubble,classifyVal]) => {
-    listDatas.value = datas
-    bubbleVal.value = Bubble
-    projectId.value = pid
-    contractId.value = cid
-    classify.value = classifyVal
-    expandedNames.value = null
-    setFormDataNum(datas)
-})
-
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-
-const btn_copy_table = ref(getButtonsVal('wbs_copy_table')) //复制本表
-const btn_hide_table = ref(getButtonsVal('wbs_hide_table')) //隐藏本表
-const btn_pre_table = ref(getButtonsVal('wbs_preview_table')) //预览本表
-const btn_up_table = ref(getButtonsVal('wbs_upload_table')) //上传
-const btn_del_table = ref(getButtonsVal('wbs_del_table')) //删除
-
-const btn_down_table = ref(getButtonsVal('wbs_download_table')) //下载导入模板
-const btn_impo_table = ref(getButtonsVal('wbs_import_table')) //导入列表数据
-const btn_save_table = ref(getButtonsVal('wbs_save_table'))//保存本表
-
-//事件
-const emit = defineEmits(['uploadData','uploadTap','saveTap','itemTap','copyTap','hideTap','previewTap','offsetTop', 'delTap'])
-
-nextTick(() => {
-    setFormDataNum(props.datas)
-})
-
-//渲染模板标签
-const formData = ref([])
-
-//展开事件
-const updateExpandedNames = async (name) => {
-    expandedNames.value = name
-    const keys = name.length > 0 ? name[0]:'';
-    const names = name.length > 0 ? name[0].split('-'): []
-    if (names.length > 0) {
-        getOffsetTop(keys)
-        const index = names[1]
-        const item = listDatas.value[index]
-        if (!item.isTableFormRender) {
-            getExcelHtml(item,index)
-        }
-        //获取已填写的数据
-        const {data: valData} = await wbsApi.getBussDataInfo({pkeyId: item.pkeyId + ''})
-        const valRes = isObject(valData.data) ? valData.data : {}
-        if (!isObjNull(valRes)) {
-            //有数据,关联数据
-            formData.value[index] = {
-                projectId: projectId.value,
-                contractId: contractId.value,
-                pkeyId: item.pkeyId + '',
-                classify: classify.value,
-                ...valRes
-            }
-        } else {
-            formData.value[index] = {
-                projectId: projectId.value,
-                contractId: contractId.value,
-                pkeyId: item.pkeyId + '',
-                classify: classify.value
-            }
-        }
-    } else {
-        emit('offsetTop', {offsetTop: 0, dom: null})
-    }
-}
-
-//获取模板标签数据
-const getExcelHtml = (item,index) => {
-    if (item.pkeyId !== 0) {
-        wbsApi.getExcelHtml({
-            pkeyId: item.pkeyId + ''
-        }).then(({data}) => {
-            const res = isString(data.data)?data.data:''
-            if (res) {
-                item.isTableForm = true
-                HTableForm(res, item, index)
-            } else {
-                item.isTableForm = false
-                window?.$message?.warning(res.msg || '暂无表单')
-            }
-        }).catch(() => {
-            item.isTableForm = false
-        })
-    } else {
-        item.isTableForm = false
-        window?.$message?.warning('pkeyId为空')
-    }
-}
-
-//设置表单对象的数量
-const setFormDataNum = (datas) => {
-    let newArr = [];
-    for (let i = 0; i < datas.length; i++) {
-        newArr.push({
-            projectId: projectId.value,
-            contractId: contractId.value,
-            pkeyId: datas[i].pkeyId + '',
-            classify: classify.value
-        })
-    }
-    formData.value = newArr
-}
-
-//渲染表格表单
-const HTableForm = (templateData,item,index) => {
-    const app = createApp({
-        data() {
-            return {
-                formData: formData.value[index],
-            }
-        },
-        template: templateData,
-        components: {ElInput,ElDatePicker},
-        methods: {
-            RightClick(a,b,c,d,e,f,event) {
-                event.preventDefault();
-                const key = event?.target?.getAttribute('keyname') || ''
-                onRightClick(event,key,index)
-            },
-            getInformation(a,b,c) {
-
-            },
-        }
-    })
-    app.mount(`#table-form-${item.pkeyId}`)
-    item.isTableFormRender = true
-}
-
-//树的菜单相关变量
-const tableFormMenuShow = ref(false)
-const tableFormItemNode = ref({})
-const tableFormMenuX = ref(0);
-const tableFormMenuY = ref(0);
-
-//树的菜单数据
-const tableFormMenu = ref([
-    {label: '插入设计值/频率', key: "IDVF"},
-    {label: '插入特殊字符', key: "special"},
-    {label: '关联试验数据', key: "CTD"},
-])
-
-//鼠标右键事件
-const onRightClick = (event,key,index) => {
-    //取光标位置
-    let specialDom = document.getElementById(key + "");
-    let startPos = specialDom?.selectionStart, endPos = specialDom?.selectionEnd;
-    //存储临时信息
-    tableFormItemNode.value = {key, index, startPos, endPos}
-    //取坐标
-    nextTick().then(() => {
-        tableFormMenuShow.value = true;
-        tableFormMenuX.value = event.clientX;
-        tableFormMenuY.value = event.clientY;
-    });
-}
-
-//鼠标右键菜单被点击
-const handleMenuSelect = (key) => {
-    //const item = tableFormItemNode.value;
-    tableFormMenuShow.value = false;
-    if (key === 'IDVF') {
-        IDVFModal.value = true
-    } else if (key === 'special') {
-        specialModalShow()
-    } else if (key === 'CTD') {
-        CTDModal.value = true
-    }
-}
-
-const onClickoutside = () => {
-    tableFormItemNode.value = {};
-    tableFormMenuShow.value = false;
-}
-
-const saveExcelBussData = async (item,index) => {
-    const {data} = await wbsApi.saveExcelBussData({
-        pkeyId: item.pkeyId,
-        classify: classify.value,
-        ...formData.value[index]
-    })
-    if(data && data.code === 200) {
-        window?.$message?.success('保存成功')
-        return true
-    } else {
-        window?.$message?.warning(data.msg || '保存失败')
-        return false
-    }
-}
-
-//单个保存
-const tableFormSaveClick = async (item,index) => {
-    const res = await saveExcelBussData(item,index)
-    if (res) {
-        getBussPdfInfo(item,index)
-        emit('uploadData')
-        emit('saveTap', {item,index})
-    }
-}
-
-//删除本表
-const delClick = (item,index) => {
-    wbsApi.removeBussTabInfo({
-        pkeyid: item.pkeyId,
-        classify: classify.value,
-    }).then(({data}) => {
-        if(data.code === 200) {
-            window?.$message?.success('操作成功')
-            emit('uploadData')
-            emit('delTap', {item,index})
-        } else {
-            window?.$message?.warning(data.msg || '操作失败')
-        }
-    })
-}
-
-//复制本表
-const copyClick = async (item,index) => {
-    const res = await saveExcelBussData(item,index)
-    if (res) {
-        const {data} = await wbsApi.copeBussTab({pkeyId: item.pkeyId})
-        if(data && data.code === 200) {
-            window?.$message?.success('操作成功')
-            emit('uploadData')
-            emit('copyTap', {item,index})
-        } else {
-            window?.$message?.warning(data.msg || '操作失败')
-        }
-    } else {
-        window?.$message?.warning('复制本表操作失败')
-    }
-}
-
-//隐藏本表
-const hideClick = (item,index) => {
-    //状态(1显示 2隐藏)
-    const isBussShow = item?.isBussShow == 2 ? 1 : 2
-    //发起请求
-    wbsApi.showBussTab({
-        pkeyId: item.pkeyId,
-        status: isBussShow
-    }).then(({data}) => {
-        if(data.code === 200) {
-            window?.$message?.success('操作成功')
-            emit('uploadData')
-            emit('hideTap', {item,index})
-        } else {
-            window?.$message?.warning(data.msg || '操作失败')
-        }
-    })
-}
-
-const getBussPdfInfo = (item,index) => {
-    wbsApi.getBussPdfInfo({
-        pkeyId: item.pkeyId
-    }).then(({data}) => {
-        if(data.code === 200 && data?.data) {
-            window.open(data?.data,'_blank')
-            emit('previewTap', {item,index})
-        } else {
-            window.$message?.warning('暂无PDF')
-        }
-    })
-}
-
-//预览
-const previewClick = async (item,index) => {
-    const res = await saveExcelBussData(item,index)
-    if (res) {
-        getBussPdfInfo(item,index)
-    } else {
-        window?.$message?.warning('操作失败')
-    }
-}
-
-//上传被点击
-const uploadModal = ref(false)
-const addData = ref({})
-const uploadClick = (item) => {
-    addData.value = {
-        projectId: projectId.value,
-        contractId: contractId.value,
-        classify: classify.value,
-        pkeyId: item.pkeyId
-    }
-    uploadModal.value = true
-    //获取文件列表
-    wbsApi.getBussFileList({
-        pkeyid: item.pkeyId
-    }).then(({data}) => {
-        if(data.code === 200) {
-            fileListData.value = isObjNull(data?.data) ? [] : data?.data
-        } else {
-            fileListData.value = []
-        }
-    }).catch(() => {
-        fileListData.value = []
-    })
-}
-//上传组件参数
-const action = '/api/blade-manager/exceltab/add-buss-file';
-const accept = 'image/png,image/jpg,image/jpeg,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel,application/pdf,.doc,.docx,application/msword';
-const fileListData = ref([]);
-//上传前
-const uploadLoading = ref(false)
-const beforeUpload = async ({file}) => {
-    let maxTrillion = 60;
-    let fileSizeData = file?.file?.size
-    let maxSize = maxTrillion * 1024 * 1024
-    if (fileSizeData > maxSize) {
-        window.$message?.warning(`文件大小,不能过${maxTrillion}M!`);
-        return false;
-    } else {
-        uploadLoading.value = true
-        return true;
-    }
-}
-//上传完成
-const uploadFinish = ({file,event}) => {
-    uploadLoading.value = false
-    let res = JSON.parse(event?.target?.response);
-    if (res.code === 200) {
-        window.$message?.success('上传成功');
-        uploadModal.value = false
-        emit('uploadData')
-        emit('uploadTap')
-    } else {
-        window.$message?.error('上传失败');
-    }
-}
-
-//列表改变
-const UploadChange = (data) => {
-    fileListData.value = data.fileList;
-}
-const fileListUpdate = (data) => {
-    fileListData.value = data
-}
-//删除
-const delUploadData = async ({file}) => {
-    const {data} = await wbsApi.removeBussFile({ids: file?.id})
-    if(data && data.code === 200) {
-        window.$message?.success('删除成功');
-        emit('uploadData')
-        return true
-    } else {
-        return false
-    }
-}
-
-//被点击
-const getOffsetTop = (key) => {
-    const dom = document.getElementById(key)
-    emit('offsetTop', dom.offsetTop)
-}
-
-//插入设计值/频率
-const IDVFModal = ref(false)
-const formIDVFRef = ref(null)
-const formIDVFModel = ref({
-    designValue: '', frequency: ''
-})
-const formIDVFRules = {
-    designValue: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入设计值"
-    },
-    frequency: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入频率"
-    }
-}
-
-//插入特殊字符
-const specialModal = ref(false)
-const specialCharacters = ref([
-    '&#57344;', "&#57345;", "&#57346;", "&#57347;", '&#8804;', '&#8805;', '&#8451;',
-    '&#9312;', '&#9313;', '&#9314;', '&#9315;', '&#9316;', '&#9317;', '&#9318;', '&#9319;', '&#9320;', '&#9321;', '&#9322;', '&#9323;',
-    '&#9324;', '&#9325;', '&#9326;', '&#9327;', '&#9328;', '&#9329;', '&#9330;', '&#9331;',
-    "&#8544;", "&#8545;", "&#8546;", "&#8547;", "&#8548;", "&#8549;", "&#8550;", "&#8551;", "&#8552;", "&#8553;", "&#8554;", "&#8555;","K̅"
-])
-const specialRef = ref(null)
-const specialValue = ref('')
-const specialModalShow = () => {
-    specialValue.value = ''
-    specialModal.value = true
-    nextTick(() => {
-        specialRef.value?.focus();
-    })
-}
-const specialClick = (event) => {
-    inputInsertValue("specialId", event.target.innerText)
-}
-//输入框插入内容
-const inputInsertValue = (Id,val) => {
-    let specialDom = document.getElementById(Id + "").getElementsByTagName('input')[0];
-    let startPos = specialDom?.selectionStart, endPos = specialDom?.selectionEnd;
-    if (startPos || startPos === 0) {
-        let specialVal = specialValue.value;
-        specialValue.value = specialVal.substring(0, startPos) + val + specialVal.substring(endPos, specialVal.length)
-        specialDom?.focus();
-        //设置光标位置
-        let posVal = startPos + val.length;
-        nextTick(() => {
-            specialDom?.setSelectionRange(posVal,posVal)
-        })
-    } else {
-        specialValue.value += val;
-        specialDom?.focus();
-    }
-}
-
-//插入内容
-const inputPosInsert = (dom, startPos = 0, endPos = 0, special, value) => {
-    let val = value || '', specialVal = special || ''
-    console.log(startPos,endPos)
-    if(startPos === 0 && endPos === 0) {
-        val = specialVal;
-        dom?.focus();
-    } else if (startPos !== 0 && endPos !== 0) {
-        val = val.substring(0, startPos) + specialVal + val.substring(endPos, val.length)
-        dom?.focus();
-        //设置光标位置
-        let posVal = startPos + specialVal.length;
-        nextTick(() => {
-            dom?.setSelectionRange(posVal,posVal)
-        })
-    } else {
-        val += specialVal;
-        dom?.focus();
-    }
-    return val
-}
-
-//确认插入
-const specialNodeClick = () => {
-    const item = tableFormItemNode.value;
-    const form = formData.value[item.index]
-    let keyDom = document.getElementById(item.key);
-    const res = inputPosInsert(keyDom,item.startPos,item.endPos,specialValue.value,form[item.key])
-    console.log(res)
-    formData.value[item.index][item.key] = res
-    specialModal.value = false
-}
-
-//关联试验数据
-const CTDModal = ref(false)
-
-//获取表单数据
-const getFormData = () => {
-    console.log(formData.value)
-    return formData.value
-}
-
-// 暴露出去
-defineExpose({
-    getFormData
-})
-</script>
-
-<style lang="scss" scoped>
-@import "../../styles/EUDC/index";
-
-.data-fill-list-box {
-    position: relative;
-    .item-title {
-        position: relative;
-        padding-left: 10px;
-        user-select: none;
-    }
-    .hc-extra-text-box .extra-text-item {
-        font-size: 16px;
-        user-select: none;
-    }
-    .data-fill-list-item-content {
-        position: relative;
-        display: flex;
-        .data-fill-table-form-box {
-            position: relative;
-            padding: 24px 20px;
-            height: calc(100vh - 380px);
-            overflow: auto;
-            flex: 1;
-            .hc-no-table-form {
-                position: relative;
-                height: 100%;
-                display: flex;
-                justify-content: center;
-                align-items: center;
-                .table-form-no {
-                    position: relative;
-                    img {
-                        width: 350px;
-                    }
-                    .desc {
-                        text-align: center;
-                        font-size: 20px;
-                        color: #aaa;
-                    }
-                }
-            }
-        }
-        .data-fill-table-tip-box {
-            width: 240px;
-            position: relative;
-            border-left: 1px solid #e4e4e4;
-            padding: 20px 15px 80px;
-            .tip-title {
-                font-size: 16px;
-                margin-bottom: 10px;
-            }
-            .tip-item {
-                margin-bottom: 20px;
-            }
-            .table-tip-foot {
-                position: absolute;
-                bottom: 15px;
-                right: 0;
-                left: 0;
-                display: flex;
-                align-items: center;
-                padding: 0 15px;
-                .tip-left-btn {
-                    flex: 1;
-                    .dow-text {
-                        cursor: pointer;
-                    }
-                }
-            }
-        }
-    }
-}
-.special-box {
-    position: relative;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    border: 1px solid #eee;
-    border-radius: 3px;
-    height: 60px;
-    cursor: default;
-    user-select: none;
-    transition: color .3s, background-color .3s;
-    &:hover {
-        color: var(--hc-primary);
-        background-color: var(--hc-primary-light-1);
-    }
-    .font-EUDC {
-        font-size: 30px;
-        cursor: default;
-    }
-}
-</style>
-
-<style lang="scss">
-.data-fill-list-box {
-    .n-collapse .n-collapse-item {
-        border: 1px solid #ddd;
-        border-radius: 3px;
-        margin: 0 0 15px;
-        background-color: white;
-        .n-collapse-item__header {
-            padding: 0;
-            transition: color .3s var(--n-bezier), background-color .3s;
-            border-radius: 3px 3px 0 0;
-            .n-collapse-item__header-main {
-                padding: 15px 20px;
-            }
-            .n-collapse-item__header-extra {
-                padding-right: 20px;
-            }
-            &.n-collapse-item__header--active {
-                background-color: #F9F9F9;
-                border-bottom: 1px solid #ddd;
-            }
-        }
-        .n-collapse-item__content-wrapper .n-collapse-item__content-inner {
-            padding-top: 0;
-        }
-    }
-}
-//设置表单样式
-.data-fill-table-form-box {
-    td {
-        padding: 6px;
-        font-family: "EUDC", 宋体, v-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important;
-        .el-input {
-            background-color: #ffffff !important;
-            border-radius: 3px;
-            .el-input__wrapper {
-                background-color: inherit;
-            }
-            .el-input__wrapper.is-focus, .el-input__wrapper:hover {
-                box-shadow: 0 0 0 1.5px var(--el-input-focus-border-color) inset;
-                background-color: #eddac4;
-            }
-            //公式 #dcdcdc
-            //焦点 #eddac4
-        }
-    }
-}
-</style>

+ 30 - 26
src/views/data-fill/components/WbsTree.vue

@@ -27,7 +27,7 @@
 import {ref,nextTick,watch} from "vue";
 import {hIconJs} from "~src/plugins/renderele";
 import dataFillQuery from '~api/data-fill/query';
-import {isItem} from "vue-utils-plus"
+import {isItem,getArrValue} from "vue-utils-plus"
 import {NDropdown} from 'naive-ui';
 
 //参数
@@ -120,38 +120,42 @@ const ElTreeLoadNode = async (node, resolve) => {
         parentId = contractIdRelation ? nodeData?.primaryKeyId : nodeData?.id
     }
     //获取数据
-    const { data } = await dataFillQuery.queryWbsTreeData({
+    const {error, code, data} = await dataFillQuery.queryWbsTreeData({
         contractId: contractId.value || '',
         contractIdRelation,
         parentId
     })
     //处理数据
-    let clickKey = '', defaultExpandedArr = [];
-    const keys = TreeExpandKey.value || []
-    const resData = data?.data || []
-    if (keys.length > 0) {
-        let lastKey = keys[keys.length-1];
-        for (const item of resData) {
-            //自动展开
-            if (isItem(keys,item?.primaryKeyId)) {
-                defaultExpandedArr.push(item?.primaryKeyId)
-            }
-            //最后一个,选中点击
-            if (item?.primaryKeyId === lastKey) {
-                clickKey = item?.primaryKeyId
+    if (!error && code === 200) {
+        let clickKey = '', defaultExpandedArr = [];
+        const keys = TreeExpandKey.value || []
+        const resData = getArrValue(data)
+        if (keys.length > 0) {
+            let lastKey = keys[keys.length-1];
+            for (const item of resData) {
+                //自动展开
+                if (isItem(keys,item?.primaryKeyId)) {
+                    defaultExpandedArr.push(item?.primaryKeyId)
+                }
+                //最后一个,选中点击
+                if (item?.primaryKeyId === lastKey) {
+                    clickKey = item?.primaryKeyId
+                }
             }
+        } else if (node.level === 0) {
+            defaultExpandedArr.push(resData[0]?.primaryKeyId)
         }
-    } else if (node.level === 0) {
-        defaultExpandedArr.push(resData[0]?.primaryKeyId)
-    }
-    //自动展开
-    defaultExpandedCids.value = defaultExpandedArr
-    resolve(resData)
-    //最后一个,执行点击
-    if (props.isAutoClick && clickKey) {
-        await nextTick(() => {
-            document.getElementById(`${idPrefix.value}${clickKey}`)?.click()
-        })
+        //自动展开
+        defaultExpandedCids.value = defaultExpandedArr
+        resolve(resData)
+        //最后一个,执行点击
+        if (props.isAutoClick && clickKey) {
+            await nextTick(() => {
+                document.getElementById(`${idPrefix.value}${clickKey}`)?.click()
+            })
+        }
+    } else {
+        resolve([])
     }
 }
 

+ 9 - 3
src/views/data-fill/components/nodeTree/index.vue

@@ -17,10 +17,11 @@
 
 <script setup>
 import {watch,ref,onMounted,nextTick} from "vue";
-import wbsApi from "~api/data-fill/wbs"
 import TreeNodeChildren from "./children.vue";
 import {isType, getRandom, isItem} from "vue-utils-plus"
+import wbsApi from "~api/data-fill/wbs"
 const {getObjValue,getArrValue} = isType()
+
 //参数
 const props = defineProps({
     autoExpandKeys: {
@@ -125,11 +126,16 @@ const setTreeExpandKey = async (arr,res) => {
 
 //获取数据
 const queryMappingStructureTree = async (form) => {
-    const {data} = await wbsApi.queryMappingStructureTree({
+    const {error, code, data} = await wbsApi.queryMappingStructureTree({
         ...form,
         wbsType: 1
     })
-    return getArrValue(data?.data)
+    //处理数据
+    if (!error && code === 200) {
+        return getArrValue(data)
+    } else {
+        return []
+    }
 }
 
 //处理为node节点类型的数据

+ 97 - 120
src/views/data-fill/wbs.vue

@@ -198,7 +198,8 @@
         <!--新增子节点-->
         <el-dialog v-model="addNodeModal" title="新增子节点" width="720px" custom-class="hc-modal-border">
             <el-alert title="双击节点,可编辑节点名称,编辑完成后,请按回车或输入框消失后,再点提交" type="warning" :closable="false"/>
-            <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" @check-change="addTreeNodeCheckChange"/>
+            <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" @check-change="addTreeNodeCheckChange" v-if="addTreeNodeType === '1'"/>
+            <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" strictly @check-change="addTreeNodeCheckChange" v-if="addTreeNodeType === '2'"/>
             <template #footer>
                 <div class="lr-dialog-footer">
                     <div class="left flex items-center">
@@ -248,11 +249,14 @@
                 </div>
             </template>
         </el-dialog>
+        <!--批量上报审批 showReportModal-->
+        <HcReportModal  title="批量上报审批" url="informationWriteQuery/taskOne" :show="true" :projectId="projectId" :contractId="contractId"
+                        :taskName="reportTaskName" :ids="reportIds" :addition="reportAddition" @hide="showReportModal = false" @finish="showReportFinish"/>
     </div>
 </template>
 
 <script setup>
-import {ref,watch,nextTick,onMounted} from "vue";
+import {ref,watch,onMounted} from "vue";
 import {useRouter, useRoute} from 'vue-router'
 import {useAppStore} from "~src/store/index";
 import {hIconJs} from "~src/plugins/renderele";
@@ -260,7 +264,7 @@ import {HcIsButton} from "~src/plugins/IsButtons";
 import ListItem from "./components/ListItem.vue"
 import NodeTree from "./components/nodeTree/index.vue"
 import ImgPreview from "~com/imgPreview/index.vue"
-import HcReportModal from "~com/reportModal/index.vue"
+//import HcReportModal from "~com/reportModal/index.vue"
 import HcTreeNode from "./components/HcTreeNode.vue"
 import WbsTree from "./components/WbsTree.vue"
 import {getTokenHeader} from '~src/api/request/header';
@@ -268,7 +272,6 @@ import {getStoreData, setStoreData} from '~src/utils/storage'
 import {isType, deepClone, formValidate} from "vue-utils-plus"
 import wbsApi from "~api/data-fill/wbs"
 import Draggable from "vuedraggable";
-import md5 from "js-md5";
 
 //初始变量
 const router = useRouter()
@@ -489,7 +492,7 @@ const setTreeMenuDataClick = ({key,node,data}) => {
 //上传前
 const loadingReactive = ref(null)
 const beforeUpload = () => {
-    loadingReactive.value = window.$ElLoading?.service({
+    loadingReactive.value = window.$loading?.service({
         lock: true,
         text: '图纸上传中...',
         background: 'rgba(0, 0, 0, 0.7)',
@@ -501,35 +504,35 @@ const uploadFinish = async (response) => {
     const res = getObjValue(response.data)
     const info = nodeDataInfo.value;
     if (res?.link) {
-        const {data} = await wbsApi.saveContractTreeDrawings({
+        const { error, code, data } = await wbsApi.saveContractTreeDrawings({
             fileUrl: res?.link,
             id: info['drawingsId'],
             primaryKeyId: info['primaryKeyId']
-        })
+        },false)
         //处理数据
         loadingReactive.value.close();
-        if (data && data?.code === 200) {
-            nodeDataInfo.value['drawingsId'] = data?.data
+        if (!error && code === 200) {
+            nodeDataInfo.value['drawingsId'] = data
             nodeDataInfo.value['fileUrl'] = res?.link
-            window?.$ElMessage?.success('图纸上传成功')
+            window?.$message?.success('图纸上传成功')
         } else {
-            window?.$ElMessage?.error('图纸上传失败')
+            window?.$message?.error('图纸保存失败')
         }
     } else {
         loadingReactive.value.close();
-        window?.$ElMessage?.error('图纸上传失败')
+        window?.$message?.error('图纸上传失败')
     }
 }
 //上传失败
 const uploadError = () => {
     loadingReactive.value.close();
-    window?.$ElMessage?.error('图纸上传失败')
+    window?.$message?.error('图纸上传失败')
 }
 
 //确认标记为首件
 const firstItemBox = () => {
     const info = nodeDataInfo.value;
-    window?.$ElMessageBox?.alert(`<div class="text-base font-bold">
+    window?.$messageBox?.alert(`<div class="text-base font-bold">
             <span>请确认将</span>
             <span class="text-main">【${info.title}】</span>
             <span>${info.isFirst?'取消':''}标记为首件</span>
@@ -545,16 +548,14 @@ const firstItemBox = () => {
 }
 //首件请求
 const firstItemHttp = async (info) => {
-    const {data} = await wbsApi.wbsTreeFirstSave({
+    const { error, code } = await wbsApi.wbsTreeFirstSave({
         primaryKeyId: info['primaryKeyId'],
         saveOrDeleted: !!info['isFirst']?1:0,
     })
     //处理数据
-    if (data && data.code === 200) {
-        window?.$ElMessage?.success('操作成功')
+    if (!error && code === 200) {
+        window?.$message?.success('操作成功')
         window?.location?.reload()  //刷新页面
-    } else {
-        window?.$ElMessage?.error(data.msg || '操作失败')
     }
 }
 
@@ -578,20 +579,18 @@ const editNodeClick = async () => {
         //发起请求
         editNodeLoading.value = true
         const { primaryKeyId, title, partitionCode } = formEditNodeModel.value
-        const { data } = await wbsApi.wbsTreeUpdateNode({
+        const { error, code } = await wbsApi.wbsTreeUpdateNode({
             deptName: title || '',
             pKeyId: primaryKeyId || '',
             partitionCode: partitionCode || ''
         })
         //处理数据
         editNodeLoading.value = false
-        if (data.code === 200) {
-            window?.$ElMessage?.success('修改成功')
+        if (!error && code === 200) {
+            window?.$message?.success('修改成功')
             nodeDataInfo.value['title'] = title || ''
             nodeDataInfo.value['partitionCode'] = partitionCode || ''
             editNodeModal.value = false
-        } else {
-            window?.$ElMessage?.error(data.msg || '修改失败')
         }
     }
 }
@@ -677,20 +676,20 @@ const copyNodeClick = async () => {
             const validate = await formValidate(copyNodeTableRef.value)
             if (validate) await copyContractTreeNode(form,table)
         } else {
-            window?.$ElMessage?.warning('请先在左侧选择要复制到的节点')
+            window?.$message?.warning('请先在左侧选择要复制到的节点')
         }
     } else if (type === '3') {
         if (table.length > 0) {
             await copyContractNodeSubmitBusinessData(form,table)
         } else {
-            window?.$ElMessage?.warning('请先在左侧选择要复制的节点')
+            window?.$message?.warning('请先在左侧选择要复制的节点')
         }
     }
 }
 //单个复制、多份复制请求
 const copyContractTreeNode = async (form,table) => {
     copyNodeLoading.value = true
-    const {data} = await wbsApi.copyContractTreeNode({
+    const {error, code} = await wbsApi.copyContractTreeNode({
         copyType: type,
         needCopyNodeName: form?.title || '',
         needCopyPrimaryKeyId: form?.primaryKeyId || '',
@@ -698,32 +697,26 @@ const copyContractTreeNode = async (form,table) => {
         copyBatchToPaths: table
     })
     //判断状态
-    if (data.code === 200) {
-        window?.$ElMessage?.success('复制成功')
+    if (!error && code === 200) {
+        window?.$message?.success('复制成功')
         copyNodeLoading.value = false
         copyNodeModal.value = false
         window?.location?.reload()  //刷新页面
-    } else {
-        copyNodeLoading.value = false
-        window?.$ElMessage?.error(data.msg || '复制失败')
     }
 }
 //复制数据
 const copyContractNodeSubmitBusinessData = async (form,table) => {
     copyNodeLoading.value = true
-    const {data} = await wbsApi.copyContractNodeSubmitBusinessData({
+    const {error, code} = await wbsApi.copyContractNodeSubmitBusinessData({
         needCopyPrimaryKeyId: form?.primaryKeyId || '',
         copyBatchToPaths: table
     })
     //判断状态
-    if (data && data.code === 200) {
-        window?.$ElMessage?.success('复制成功')
+    if (!error && code === 200) {
+        window?.$message?.success('复制成功')
         copyNodeLoading.value = false
         copyNodeModal.value = false
         window?.location?.reload()  //刷新页面
-    } else {
-        copyNodeLoading.value = false
-        window?.$ElMessage?.error(data.msg || '复制失败')
     }
 }
 
@@ -763,12 +756,12 @@ const addNodeLoading = ref(false)
 const addNodeClick = async () => {
     const keys = allSelectedList.value || []
     if (keys.length <= 0) {
-        window?.$ElMessage?.warning('请先选择节点')
+        window?.$message?.warning('请先选择节点')
     } else {
         //发起请求
         addNodeLoading.value = true
         const primaryKeyId = nodeDataInfo.value?.primaryKeyId || ''
-        const {data} = await wbsApi.saveContractTreeNode({
+        const {error, code} = await wbsApi.saveContractTreeNode({
             projectId: projectId.value,
             contractId: contractId.value,
             saveType: addTreeNodeType.value,
@@ -777,21 +770,18 @@ const addNodeClick = async () => {
             currentNodePrimaryKeyId: primaryKeyId
         })
         //判断状态
-        if (data.code === 200) {
-            window?.$ElMessage?.success('新增成功')
-            addNodeLoading.value = false
+        addNodeLoading.value = false
+        if (!error && code === 200) {
+            window?.$message?.success('新增成功')
             addNodeModal.value = false
             window?.location?.reload()  //刷新页面
-        } else {
-            addNodeLoading.value = false
-            window?.$ElMessage?.error(data.msg || '新增失败')
         }
     }
 }
 
 //删除节点
 const delModalClick  = () => {
-    window?.$ElMessageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除节点', {
+    window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除节点', {
         showCancelButton: true,
         confirmButtonText: '确认删除',
         cancelButtonText: '取消',
@@ -803,15 +793,12 @@ const delModalClick  = () => {
     })
 }
 const removeContractTreeNode = async () => {
-    const {data} = await  wbsApi.removeContractTreeNode({
+    const {error, code} = await wbsApi.removeContractTreeNode({
         ids: nodeDataInfo.value?.primaryKeyId || ''
     })
-    if (data && data.code === 200) {
-        window?.$ElMessage?.success('删除成功')
+    if (!error && code === 200) {
+        window?.$message?.success('删除成功')
         window?.location?.reload()  //刷新页面
-    } else {
-        addNodeLoading.value = false
-        window?.$ElMessage?.error(data.msg || '删除失败')
     }
 }
 
@@ -828,7 +815,7 @@ const downSortClick = (index) => {
         const tmp = data.splice(indexs,1);
         sortNodeData.value.splice(index,0,tmp[0]);
     } else {
-        window?.$ElMessage?.warning('已经处于置底,无法下移')
+        window?.$message?.warning('已经处于置底,无法下移')
     }
 }
 //向上
@@ -838,7 +825,7 @@ const upSortClick = (index) => {
         const tmp = data.splice(index - 1,1);
         sortNodeData.value.splice(index,0,tmp[0]);
     } else {
-        window?.$ElMessage?.warning('已经处于置顶,无法上移')
+        window?.$message?.warning('已经处于置顶,无法上移')
     }
 }
 //确认排序
@@ -850,16 +837,13 @@ const sortNodeClick = async () => {
     })
     //发起请求
     sortNodeLoading.value = true
-    const { data } = await wbsApi.diySortTreeNode({sortList})
+    const { error, code } = await wbsApi.diySortTreeNode({sortList})
+    sortNodeLoading.value = false
     //判断状态
-    if (data.code === 200) {
-        window?.$ElMessage?.success('保存成功')
-        sortNodeLoading.value = false
+    if (!error && code === 200) {
+        window?.$message?.success('保存成功')
         sortNodeModal.value = false
         window?.location?.reload()  //刷新页面
-    } else {
-        sortNodeLoading.value = false
-        window?.$ElMessage?.error(data.msg || '保存失败')
     }
 }
 
@@ -868,9 +852,9 @@ const drawingsShow = ref(false);
 const viewsDrawings = () => {
     const {primaryKeyId, fileUrl} = nodeDataInfo.value
     if (!primaryKeyId) {
-        window?.$ElMessage?.warning('请先选择树节点')
+        window?.$message?.warning('请先选择树节点')
     } else if (!fileUrl) {
-        window?.$ElMessage?.warning('该节点暂未上传图纸')
+        window?.$message?.warning('该节点暂未上传图纸')
     } else {
         drawingsShow.value = true
     }
@@ -898,25 +882,33 @@ const ListItemOffsetTop = (offsetTop) => {
 const ListItemDatas = ref([]);
 const searchNodeAllTable = async () => {
     const info = nodeDataInfo.value;
-    const {data} = await wbsApi.searchNodeAllTable({
+    const {error, code, data} = await wbsApi.searchNodeAllTable({
         projectId: projectId.value,
         contractId: contractId.value,
         primaryKeyId: info['contractIdRelation'] ? info['id'] : info['primaryKeyId'],
         type: authBtnTabKey.value
     })
-    ListItemDatas.value = getArrValue(data?.data)
+    if (!error && code === 200) {
+        ListItemDatas.value = getArrValue(data)
+    } else {
+        ListItemDatas.value = []
+    }
 }
 
 //查询状态
 const NodeStatus = ref('1')
 const queryNodeStatus = async () => {
     const info = nodeDataInfo.value;
-    const {data} = await wbsApi.queryNodeStatus({
+    const {error, code, data} = await wbsApi.queryNodeStatus({
         primaryKeyId: info['contractIdRelation'] ? info['id'] : info['primaryKeyId'],
         classify: authBtnTabKey.value
     })
     //1 未填报,2待上报,3已上报
-    NodeStatus.value = getObjNullValue(data?.data) || '1'
+    if (!error && code === 200) {
+        NodeStatus.value = getObjNullValue(data?.data) || '1'
+    } else {
+        NodeStatus.value = '1'
+    }
 }
 
 //批量上报
@@ -927,23 +919,23 @@ const showReportModal = ref(false)
 const reportModalClick = () => {
     const info = nodeDataInfo.value;
     const rows = ListItemDatas.value;
-    reportIds.value = info?.primaryKeyId || ''
+    reportIds.value = info['contractIdRelation'] ? info['id'] : info['primaryKeyId']
     if (rows.length > 0) {
         reportTaskName.value = rows.length > 1?`${rows[0].name}等${rows.length}个文件`:rows[0].name
         reportAddition.value = {
-            classify: authBtnTabKey.value
+            classify: authBtnTabKey.value,
+            contractIdRelation: info['contractIdRelation'],
         }
         showReportModal.value = true
     } else {
-        window.$ElMessage?.warning('暂无相关数据')
+        window.$message?.warning('暂无相关数据')
     }
 }
 
 //上报完成
 const showReportFinish = () => {
     showReportModal.value = false
-    searchNodeAllTable()
-    queryNodeStatus()
+    getTableDataAll()
 }
 
 //表单变量
@@ -952,85 +944,70 @@ const ListItemsRef = ref(null)
 
 //保存
 const tableFormSaveLoading = ref(false)
-const tableFormSaveClick = () => {
+const tableFormSaveClick = async () => {
     let FormData = [];
     if (isDrawer.value) {
         FormData = ListItemsRef.value.getFormData()
     } else {
         FormData = ListItemRef.value.getFormData()
     }
-    console.log(FormData)
     tableFormSaveLoading.value = true
-    wbsApi.saveExcelBussData({
+    const {error, code} = await wbsApi.saveExcelBussData({
         dataInfo: {orderList: FormData}
-    }).then(({data}) => {
-        if(data.code === 200) {
-            window?.$ElMessage?.success('保存成功')
-            bussPdfsClick()
-            searchNodeAllTable()
-            queryNodeStatus()
-        } else {
-            window?.$ElMessage?.warning(data.msg || '保存失败')
-        }
-    }).catch(() => {
-        tableFormSaveLoading.value = false
     })
+    tableFormSaveLoading.value = false
+    if (!error && code === 200) {
+        window?.$message?.success('保存成功')
+        bussPdfsClick()
+        getTableDataAll()
+    }
 }
 
 //多表预览
 const bussPdfsLoading = ref(false)
-const bussPdfsClick = () => {
+const bussPdfsClick = async () => {
     const info = nodeDataInfo.value;
     bussPdfsLoading.value = true
-    wbsApi.getBussPdfs({
+    const {error, code, data} = await wbsApi.getBussPdfs({
         nodeId:  info?.primaryKeyId || '',
         classify: authBtnTabKey.value,
         projectId: projectId.value,
         contractId: contractId.value
-    }).then(({data}) => {
-        tableFormSaveLoading.value = false
-        bussPdfsLoading.value = false
-        if(data.code === 200 && data?.data) {
-            window.open(data?.data,'_blank')
-        } else {
-            window.$ElMessage?.warning('暂无PDF')
-        }
-    }).catch(() => {
-        tableFormSaveLoading.value = false
-        bussPdfsLoading.value = false
     })
+    tableFormSaveLoading.value = false
+    bussPdfsLoading.value = false
+    if (!error && code === 200) {
+        window.open(data,'_blank')
+    } else {
+        window.$message?.warning('获取PDF失败')
+    }
 }
 
 //撤回上报流程
 const abolishOneClick = () => {
-    window?.$dialog?.warning({
-        title: "确认操作",
-        content: "请谨慎操作",
-        positiveText: "确定撤回",
-        negativeText: "取消",
-        onPositiveClick: () => {
-            abolishOneSave()
+    window?.$messageBox?.alert('请谨慎考虑后,是否确定撤回?', '撤回上报', {
+        showCancelButton: true,
+        confirmButtonText: '确定撤回',
+        cancelButtonText: '取消',
+        callback: (action) => {
+            if (action === 'confirm') {
+                abolishOneSave()
+            }
         }
-    });
+    })
 }
 
 //撤回请求
-const abolishOneSave = () => {
+const abolishOneSave = async () => {
     const info = nodeDataInfo.value;
-    wbsApi.abolishOne({
+    const {error, code} = await wbsApi.abolishOne({
         primaryKeyId:  info?.primaryKeyId || '',
         classify: authBtnTabKey.value
-    }).then(({data}) => {
-        if (data.code === 200) {
-            window.$ElMessage?.success('撤回成功')
-            searchNodeAllTable()
-            queryNodeStatus()
-        } else {
-            window.$ElMessage?.error(data.msg || '撤回失败')
-            searchNodeAllTable()
-            queryNodeStatus()
-        }
     })
+    if (!error && code === 200) {
+        window.$message?.success('撤回成功')
+        getTableDataAll()
+    }
 }
 
 //左右拖动,改变树形结构宽度

+ 0 - 1225
src/views/data-fill/wbs_bak.vue

@@ -1,1225 +0,0 @@
-<template>
-    <n-divider dashed title-placement="left">{{wbsTypeTabKey === 'tree'?'树形结构填报':'导图结构填报'}}</n-divider>
-    <div class="hc-layout-box">
-        <div class="hc-layout-left-box" :style="'width:' + leftWidth + 'px;'" v-if="wbsTypeTabKey === 'tree'">
-            <div class="hc-project-box">
-                <div class="text-xl text-cut project-alias-box">
-                    <i class="hcicon-xiangmu"/>
-                    <span class="ml-2">{{projectInfo['projectAlias']}}</span>
-                </div>
-                <div class="text-xs text-cut project-name">{{projectInfo['name']}}</div>
-            </div>
-            <div class="hc-el-tree-box">
-                <HcTree ref="HcTreeRef" type="data-fill-wbs" :params="treeParams" :props="wbsElTreeProps" :menus="ElTreeMenu" :menuMark="TreeMark" lazy :autoExpandKeys="TreeAutoExpandKeys" isColor @node-click="wbsElTreeClick" @menuTap="ElTreeMenuClick"/>
-            </div>
-            <div class="hc-tree-foot-tip-box">
-                <div class="dot-view green">已审批</div>
-                <div class="dot-view black">未填报</div>
-                <div class="dot-view orange">已填报-待审批</div>
-                <div class="dot-view blue">已填报-未上报</div>
-            </div>
-            <!--左右拖动-->
-            <div class="horizontal-drag-line" @mousedown="onmousedown"/>
-        </div>
-        <div class="hc-layout-content-box">
-            <n-card class="hc-card-overflow-box" :segmented="{content: true}">
-                <template #header>
-                    <div class="hc-card-header flex items-center" v-show="wbsTypeTabKey === 'tree' || isDrawer">
-                        <n-popover trigger="hover" :disabled="!bubbleVal || !btn_drawings?.textInfo" v-if="btn_drawings">
-                            <template #trigger>
-                                <n-button type="primary" strong secondary class="px-3" @click="viewsDrawings" v-if="nodeDataInfo.fileUrl">
-                                    <i class="hcicon-Frame"/>
-                                    <span class="ml-2">查看图纸</span>
-                                </n-button>
-                                <n-button color="#EEEEEE" text-color="#999999" class="px-3" @click="viewsDrawingsTip" v-else>
-                                    <i class="hcicon-Frame"/>
-                                    <span class="ml-2">查看图纸</span>
-                                </n-button>
-                            </template>
-                            <span>{{btn_drawings?.textInfo}}</span>
-                        </n-popover>
-                        <BtnTab class="ml-8" :datas="authBtnTabData" :cur="authBtnTabKey" :disabled="!nodeDataInfo?.primaryKeyId" @tabClick="authBtnTabClick"/>
-                    </div>
-                </template>
-                <template #header-extra>
-                    <HcTabs :datas="wbsTypeTab" :keys="wbsTypeTabKey" @change="wbsTypeTabChange"/>
-                </template>
-                <div class="data-fill-wbs-content" id="data-fill-wbs-content-target">
-                    <div class="hc-card-max-h-box" id="hc-card-list-item" v-if="wbsTypeTabKey === 'tree'">
-                        <ListItem :datas="ListItemDatas" :projectId="projectId" :contractId="contractId" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop"/>
-                    </div>
-                    <div class="hc-card-max-h-box node-tree" v-if="wbsTypeTabKey === 'map'">
-                        <NodeTree ref="NodeTreeRef" :data="NodeTreeData" :format="NodeTreeFormat" :autoExpandKeys="TreeAutoExpandKeys" :menus="ElTreeMenu" :isMark="TreeMark" isColor
-                                  :accordion='NodeTreeAccordion' @nodeClick="NodeTreeClick" @expand="expandClick" @nodeDblClick="NodeTreeDblClick" @menuClick="NodeTreeMenuClick"/>
-                        <div class="hc-tree-foot-tip-box bg-svg-xml">
-                            <div class="dot-view green">已审批</div>
-                            <div class="dot-view black">未填报</div>
-                            <div class="dot-view orange">已填报-待审批</div>
-                            <div class="dot-view blue">已填报-未上报</div>
-                        </div>
-                    </div>
-                </div>
-                <!--填报弹窗-->
-                <n-drawer v-model:show="isDrawer" :width="200" :height="200" placement="top" :trap-focus="false" :block-scroll="false" to="#data-fill-wbs-content-target">
-                    <div class="drawer-data-fill-content-box">
-                        <n-card :segmented="{content: true}">
-                            <div class="data-fill-content" id="hc-drawer-list-item">
-                                <ListItem :datas="ListItemDatas" :projectId="projectId" :contractId="contractId" :classify="authBtnTabKey" @offsetTop="ListItemOffsetTop"/>
-                            </div>
-                            <template #action>
-                                <div class="data-fill-foot">
-                                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_save?.textInfo" v-if="btn_save">
-                                        <template #trigger>
-                                            <n-button type="primary" size="large" class="px-8">保存</n-button>
-                                        </template>
-                                        <span>{{btn_save?.textInfo}}</span>
-                                    </n-popover>
-                                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_preview?.textInfo" v-if="btn_preview">
-                                        <template #trigger>
-                                            <n-button type="primary" strong secondary class="px-8 ml-6" size="large">预览</n-button>
-                                        </template>
-                                        <span>{{btn_preview?.textInfo}}</span>
-                                    </n-popover>
-                                    <n-popover trigger="hover" :disabled="!bubbleVal || !btn_report?.textInfo" v-if="btn_report">
-                                        <template #trigger>
-                                            <n-button type="primary" strong secondary class="px-8 ml-6" size="large" @click="reportModalClick">上报</n-button>
-                                        </template>
-                                        <span>{{btn_report?.textInfo}}</span>
-                                    </n-popover>
-                                    <n-button type="primary" strong secondary class="px-8 ml-6" size="large" @click="isDrawer = false">关闭填报页面</n-button>
-                                </div>
-                            </template>
-                        </n-card>
-                    </div>
-                </n-drawer>
-            </n-card>
-            <div class="bg-white data-fill-foot-box" v-if="wbsTypeTabKey === 'tree'">
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_save?.textInfo" v-if="btn_save">
-                    <template #trigger>
-                        <n-button type="primary" size="large" class="px-8">保存</n-button>
-                    </template>
-                    <span>{{btn_save?.textInfo}}</span>
-                </n-popover>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_preview?.textInfo" v-if="btn_preview">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-8 ml-6" size="large">预览</n-button>
-                    </template>
-                    <span>{{btn_preview?.textInfo}}</span>
-                </n-popover>
-                <n-popover trigger="hover" :disabled="!bubbleVal || !btn_report?.textInfo" v-if="btn_report">
-                    <template #trigger>
-                        <n-button type="primary" strong secondary class="px-8 ml-6" size="large" @click="reportModalClick">上报</n-button>
-                    </template>
-                    <span>{{btn_report?.textInfo}}</span>
-                </n-popover>
-            </div>
-        </div>
-    </div>
-    <DragModal title="查看图纸" :isShow="drawingsShow" closeIcon tops="125" widths="380px" bg="bg-dark-3" @close="drawingsClose">
-        <div class="img-preview-box">
-            <ImgPreview :src="nodeDataInfo.fileUrl" isDom toolsSm/>
-        </div>
-    </DragModal>
-
-    <!--标记首件-->
-    <n-modal v-model:show="firstItemModal" class="hc-custom-card" title="标记首件制" preset="card" style="width: 600px;" size="huge" :bordered="false" :segmented="{content: 'soft', footer: 'soft'}">
-        <div class="text-center text-base font-bold">
-            <span>请确认将</span>
-            <span class="text-main">【{{nodeDataInfo.title}}】</span>
-            <span>{{nodeDataInfo.isFirst?'取消':''}}标记为首件</span>
-        </div>
-        <template #footer>
-            <div class="text-center">
-                <n-button class="px-4" @click="firstItemModal = false">取消</n-button>
-                <n-button type="primary" class="px-4 ml-6" :loading="firstItemLoading" @click="firstItemClick">确认</n-button>
-            </div>
-        </template>
-    </n-modal>
-
-    <!--编辑节点-->
-    <n-modal v-model:show="editNodeModal" class="hc-custom-card" title="编辑节点" preset="card" style="width: 600px;" :segmented="{content: 'soft', footer: 'soft'}">
-        <n-form ref="formEditNodeRef" :model="formEditNodeModel" :rules="formEditNodeRules" label-placement="left" label-width="auto" size="large">
-            <n-form-item label="节点名称" path="title">
-                <n-input v-model:value="formEditNodeModel.title" placeholder="请输入节点名称"/>
-            </n-form-item>
-            <n-form-item label="上级节点">
-                <n-input v-model:value="formEditNodeModel.parent.title" disabled/>
-            </n-form-item>
-            <n-form-item label="节点类型">
-                <n-select v-model:value="formEditNodeModel.type" :options="nodeTypeData" disabled/>
-            </n-form-item>
-            <n-form-item label="划分编号" path="partitionCode">
-                <n-input v-model:value="formEditNodeModel.partitionCode" placeholder="请输入划分编号"/>
-            </n-form-item>
-        </n-form>
-        <template #footer>
-            <div class="text-center">
-                <n-button class="px-4" @click="editNodeModal = false">取消</n-button>
-                <n-button type="primary" class="px-4 ml-6" :loading="editNodeLoading" @click="editNodeClick">确认</n-button>
-            </div>
-        </template>
-    </n-modal>
-
-    <!--复制节点-->
-    <n-modal v-model:show="copyNodeModal" title="复制节点" preset="card" class="hc-custom-card copy" :class="copyNodeTabKey==='1'?'one':'many'" :segmented="{content: 'soft', footer: 'soft'}">
-        <template #header-extra>
-            <HcTabs :datas="copyNodeTab" :keys="copyNodeTabKey" @change="copyNodeTabChange"/>
-        </template>
-        <n-form ref="formCopyNodeModelRef" :model="formCopyNodeModel" :rules="formCopyNodeModelRules" label-placement="left" label-width="auto" size="large">
-            <n-form-item label="节点名称" path="title">
-                <n-input v-model:value="formCopyNodeModel.title" placeholder="请输入节点名称"/>
-            </n-form-item>
-        </n-form>
-        <div class="copy-node-many-box" v-if="copyNodeTabKey === '2'">
-            <div class="copy-node-many-tree">
-                <HcTree type="data-fill-query" :params="treeParams" :props="wbsElTreeProps" lazy idPrefix="tree-node-copy-" :isAutoRes="false" :autoExpandKeys="treeExpandKeys" @node-click="copyNodeElTreeClick"/>
-            </div>
-            <div class="copy-node-many-table">
-                <div class="copy-node-many-table-data">
-                    <el-table :data="copyNodeTable" border stripe>
-                        <el-table-column prop="title" label="复制到的位置"/>
-                        <el-table-column prop="nodeName" label="节点名称">
-                            <template #default="{row}">
-                                <n-form ref="copyNodeTableRef" :model="row" :rules="copyNodeTableRules">
-                                    <n-form-item path="nodeName">
-                                        <n-input v-model:value="row.nodeName"/>
-                                    </n-form-item>
-                                </n-form>
-                            </template>
-                        </el-table-column>
-                        <el-table-column prop="action" label="操作" width="120" align="center">
-                            <template #default="{_,$index}">
-                                <n-button type="primary" color="#e54d42" size="small" secondary @click="copyNodeTableDel($index)">删除</n-button>
-                            </template>
-                        </el-table-column>
-                    </el-table>
-                </div>
-                <div class="copy-node-many-foot-center">
-                    <n-button class="px-4" @click="copyNodeModal = false">取消</n-button>
-                    <n-button type="primary" class="px-4 ml-6" :loading="copyNodeLoading" @click="copyNodeClick">确认</n-button>
-                </div>
-            </div>
-        </div>
-        <template #footer v-if="copyNodeTabKey === '1'">
-            <div class="text-center">
-                <n-button class="px-4" @click="copyNodeModal = false">取消</n-button>
-                <n-button type="primary" class="px-4 ml-6" :loading="copyNodeLoading" @click="copyNodeClick">确认</n-button>
-            </div>
-        </template>
-    </n-modal>
-
-    <!--新增子节点-->
-    <n-modal v-model:show="addNodeModal" class="hc-custom-card" title="新增子节点" preset="card" style="width: 720px;" :segmented="{content: 'soft', footer: 'soft'}">
-        <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" @check-change="addTreeNodeCheckChange"/>
-        <template #footer>
-            <div class="hc-add-node-modal-foot-box">
-                <div class="left-box">
-                    <div class="font-bold mr-4">选中方式:</div>
-                    <el-radio-group v-model="addTreeNodeType">
-                        <el-radio label="1" border>当前及子节点</el-radio>
-                        <el-radio label="2" border>仅当前节点</el-radio>
-                    </el-radio-group>
-                </div>
-                <div class="right-box">
-                    <n-button class="px-4" @click="addNodeModal = false">取消</n-button>
-                    <n-button type="primary" class="px-4 ml-6" :loading="addNodeLoading" @click="addNodeClick">确认</n-button>
-                </div>
-            </div>
-        </template>
-    </n-modal>
-
-    <!--上报审批-->
-    <HcReportModal :show="showReportModal" title="上报审批" @hide="showReportModal= false"/>
-
-    <!--上传图纸-->
-    <div class="upload-drawing" id="upload-drawing">
-        <n-upload :action="action" :headers="getTokenHeader()" :accept="accept" with-credentials @before-upload="beforeUpload" @finish="uploadFinish"/>
-    </div>
-
-    <!--调整排序-->
-    <n-modal v-model:show="sortNodeModal" class="hc-custom-card" title="调整排序" preset="card" style="width: 720px;" :segmented="{content: 'soft', footer: 'soft'}">
-        <Draggable class="sort-node-body-box list-group" ghost-class="ghost" :list="sortNodeData" item-key="id" @start="sortNodeDrag = true" @end="sortNodeDrag = false">
-            <template #item="{element, index}">
-                <div class="list-group-item">
-                    <div class="index-box">{{index + 1}}</div>
-                    <div class="title-box">{{element.title}}</div>
-                    <div class="icon-box">
-                        <i class="hcicon-wind-descending" @click="downSortClick(index)"/>
-                        <i class="hcicon-wind-ascending" @click="upSortClick(index)"/>
-                    </div>
-                </div>
-            </template>
-        </Draggable>
-        <template #footer>
-            <div class="text-center">
-                <n-button class="px-4" @click="sortNodeModal = false">取消</n-button>
-                <n-button type="primary" class="px-4 ml-6" :loading="sortNodeLoading" @click="sortNodeClick">确认</n-button>
-            </div>
-        </template>
-    </n-modal>
-
-</template>
-
-<script setup>
-import {ref,watch,nextTick,onMounted} from "vue";
-import {useRoute} from 'vue-router'
-import router from '~src/router/index';
-import {useAppStore} from "~src/store/index";
-import {HcIcon} from "~src/plugins/renderele";
-import HcTabs from "~com/plugins/naive/HcTabs.vue"
-import HcTree from "~com/plugins/element/HcTree.vue"
-import BtnTab from "~com/btnTab/index.vue"
-import ListItem from "~com/data-fill/ListItem.vue"
-import NodeTree from "~com/data-fill/nodeTree/index.vue"
-import DragModal from "~com/dragModal/index.vue"
-import ImgPreview from "~com/imgPreview/index.vue"
-import HcReportModal from "~com/reportModal/index.vue"
-import HcTreeNode from "./components/HcTreeNode.vue"
-import wbsApi from "~api/data-fill/wbs"
-import {deepClone} from "~src/utils/lib/util";
-import {getTokenHeader} from '~src/api/request/header';
-import {isArray,isObjNull} from "~src/utils/lib/isApp";
-import {setStore,getStore} from "~src/utils/lib/storage";
-import Draggable from "vuedraggable";
-
-//变量
-const useRoutes = useRoute()
-const useAppState = useAppStore()
-const projectId = ref(useAppState.getProjectId);
-const contractId = ref(useAppState.getContractId);
-const projectInfo = ref(useAppState.getProjectInfo);
-const contractInfo = ref(useAppState.getContractInfo);
-
-//路由参数
-const routerQuery = useRoutes?.query;
-const MenuBarKey = routerQuery?.MenuBarKey || '';
-const typeName = routerQuery?.type || 'map'
-
-const TreeAutoExpandKeys = ref(getStore({name: 'wbsTreeExpandKeys'}) || [])
-
-//按钮气泡开关
-const bubbleVal = ref(useAppState.getBubble);
-
-//监听
-watch(() => [
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectInfo,
-    useAppState.getContractInfo,
-    useAppState.getBubble,
-], ([UserProjectId, UserContractId, UserProjectInfo,UserContractInfo,Bubble]) => {
-    //项目合同数据
-    projectId.value = UserProjectId
-    contractId.value = UserContractId
-    projectInfo.value = UserProjectInfo
-    contractInfo.value = UserContractInfo
-    //按钮气泡开关
-    bubbleVal.value = Bubble
-    setContractType(UserContractInfo?.contractType)
-})
-//获取气泡数据
-const getButtonsVal = (value) => {
-    return useAppState.getButtonsVal(value)
-}
-//气泡数据
-const btn_drawings = ref(getButtonsVal('wbs_views_drawings'))   //查看图纸
-const btn_save = ref(getButtonsVal('wbs_save'))                 //保存
-const btn_preview = ref(getButtonsVal('wbs_preview'))           //预览
-const btn_report = ref(getButtonsVal('wbs_report'))             //上报
-
-//树菜单
-const tree_menu_edit = ref(getButtonsVal('wbs_tree_edit'))  //编辑节点
-const tree_menu_mark = ref(getButtonsVal('wbs_tree_mark'))  //标记为首件
-const tree_menu_copy = ref(getButtonsVal('wbs_tree_copy'))  //复制节点
-const tree_menu_add = ref(getButtonsVal('wbs_tree_add'))    //新增节点
-const tree_menu_up = ref(getButtonsVal('wbs_tree_upload'))  //上传图纸
-const tree_menu_del = ref(getButtonsVal('wbs_tree_del'))    //删除节点
-const tree_menu_sort = ref(getButtonsVal('wbs_tree_sort'))  //调整排序
-
-
-//上传文件的
-const action = ref("/api/blade-resource/oss/endpoint/put-file")
-const accept = ref("image/png,image/jpg,image/jpeg")
-
-//身份按钮切换数据
-const authBtnTabKey = ref('1')
-const authBtnTabData = [
-    {key: "1", label: "施工质检", icon: 'hcicon-a-Frame1'},
-    {key: "2", label: "监理抽检", icon: 'hcicon-a-Frame2'}
-]
-const authBtnTabClick = (val) => {
-    authBtnTabKey.value = val
-    searchNodeAllTable()
-}
-
-//结构类型tab数据和相关处理
-const wbsTypeTabKey = ref(typeName)
-const wbsTypeTab = ref([
-    {key:'map',  name: '导图结构填报'},
-    {key:'tree', name: '树形结构填报'}
-]);
-
-//渲染完成
-onMounted(()=> {
-    const contractType = contractInfo.value?.contractType
-    setContractType(contractType)
-    setElTreeMenu()
-    if (wbsTypeTabKey.value === 'map') {
-        queryMappingStructureTree()
-    }
-})
-
-const setContractType = (contractType) => {
-    //contractType,  1施工,2监理
-    if (contractType <= 0) {
-        authBtnTabKey.value = '1'
-    } else {
-        authBtnTabKey.value = contractType + ''
-    }
-}
-
-const wbsTypeTabChange = async (value) => {
-    wbsTypeTabKey.value = value;
-    isDrawer.value = false;
-    const keys = await NodeExpandKeys(true)
-    router.push({
-        path: useRoutes.path,
-        query: {
-            MenuBarKey: MenuBarKey,
-            type: value
-        }
-    })
-    nextTick(() => {
-        TreeAutoExpandKeys.value = keys
-        if (value === 'map') {
-            queryMappingStructureTree()
-        }
-    })
-}
-
-const NodeTreeAccordion = ref(true)
-
-//设置树菜单数据
-const ElTreeMenu = ref([])
-const TreeMark = ref(false)
-const setElTreeMenu = () => {
-    let newArr = [];
-    if (tree_menu_edit.value) {
-        newArr.push({icon: HcIcon('hcicon-bianji'), label: '编辑节点', key: "edit"})
-    }
-    if (tree_menu_mark.value) {
-        newArr.push({icon: HcIcon('cicon-star-o'), label: '标记为首件', key: "mark"})
-        TreeMark.value = true
-    }
-    if (tree_menu_copy.value) {
-        newArr.push({icon: HcIcon('cicon-file-copy-o'), label: '复制节点', key: "copy"})
-    }
-    if (tree_menu_add.value) {
-        newArr.push({icon: HcIcon('cicon-add-round-o'), label: '新增节点', key: "add"})
-    }
-    if (tree_menu_up.value) {
-        newArr.push({icon: HcIcon('hcicon-shangchuan'), label: '上传图纸', key: "upload"})
-    }
-    if (tree_menu_del.value) {
-        newArr.push({icon: HcIcon('cicon-delete-line-o'), label: '删除节点', key: "del"})
-    }
-    if (tree_menu_sort.value) {
-        newArr.push({icon: HcIcon('cicon-sort-order'), label: '调整排序', key: "sort"})
-    }
-    ElTreeMenu.value = newArr
-}
-
-//树的配置
-const HcTreeRef = ref(null)
-const wbsElTreeProps = {label: 'title', children: 'children', isLeaf: 'exsitChild'}
-const treeParams = ref({contractId: contractId.value})
-
-//树被点击
-const wbsElTreeClick = ({node,data}) => {
-    nodeItemInfo.value = node
-    nodeDataInfo.value = data
-    searchNodeAllTable()
-}
-
-//导图结构数据
-const NodeTreeRef = ref(null)
-const NodeTreeFormat = ref({key: "primaryKeyId", label: "title", children: "children"})
-const NodeTreeData = ref({})
-
-//导图结构树节点查询
-const queryMappingStructureTree = () => {
-    wbsApi.queryMappingStructureTree({
-        contractId: contractId.value,
-        contractIdRelation: '',
-        parentId: '0',
-        wbsType: 1
-    }).then(({data}) => {
-        NodeTreeData.value = data?.data[0] || {}
-    })
-}
-
-//导图结构展开和收缩被点击
-const expandClick = ({node,data}) => {
-    if (!node.children) {
-        node.expanded = false;
-    }
-    node.isExpand = !node.isExpand;
-}
-
-//鼠标左键单击事件
-const NodeTreeClick = ({node,data}) => {
-    let ifChildren = !!(node.childNodes && node.childNodes.length > 0);
-    if (!ifChildren) {
-        node.loading = true
-        const cid = data?.contractIdRelation
-        const key = data?.primaryKeyId
-        const id = data?.id
-        wbsApi.queryMappingStructureTree({
-            contractId: contractId.value,
-            contractIdRelation: cid,
-            parentId: cid?key:id,
-            wbsType: 1
-        }).then((res) => {
-            const resData = res?.data?.data || []
-            node.childNodes = resData
-            nextTick(() => {
-                if (resData.length > 0) {
-                    node.expanded = true;
-                    node.isExpand = true;
-                } else {
-                    node.expanded = false;
-                    node.expanded = false;
-                }
-                node.loading = false
-            })
-        })
-    } else {
-        node.expanded = true;
-        node.isExpand = true;
-        node.loading = false
-    }
-}
-
-//双击事件
-const isDrawer = ref(false)
-const NodeTreeDblClick = ({node,data}) => {
-    nodeItemInfo.value = node
-    nodeDataInfo.value = data
-    isDrawer.value = true;
-    searchNodeAllTable()
-}
-
-//菜单被点击
-const firstItemModal = ref(false)
-const editNodeModal = ref(false)
-const nodeItemInfo = ref({})
-const nodeDataInfo = ref({})
-const treeExpandKeys = ref([])
-const ElTreeMenuClick = async ({key,node,data}) => {
-    nodeItemInfo.value = node
-    nodeDataInfo.value = data
-    if (key === 'mark' || key === 'cancel_mark') {
-        firstItemModal.value = true
-    } else if (key === 'edit') {
-        const parent = deepClone(node?.parent?.data || {})
-        formEditNodeModel.value = {...deepClone(data), parent: parent}
-        editNodeModal.value = true
-    } else if (key === 'copy') {
-        const parent = deepClone(node?.parent?.data || {})
-        formCopyNodeModel.value = {...deepClone(data), parent: parent}
-        copyNodeTable.value = []
-        copyNodeLoading.value = false
-        treeExpandKeys.value = await NodeExpandKeys()
-        copyNodeModal.value = true
-    } else if (key === 'add') {
-        addTreeNodeId.value = data?.id
-        addTreeNodeOldId.value = data?.oldId
-        addNodeLoading.value = false
-        addNodeModal.value = true
-    } else if (key === 'upload') {
-        const uploadDom = document.getElementById('upload-drawing');
-        let inputDom = uploadDom?.getElementsByTagName('input')[0];
-        inputDom.click()
-    } else if (key === 'del') {
-        delModalClick()
-    } else if (key === 'sort') {
-        let nodes = []
-        const childNodes = node?.parent?.childNodes || []
-        for (let i = 0; i < childNodes.length; i++) {
-            const res = childNodes[i]?.data
-            nodes.push({
-                id: res?.primaryKeyId,
-                title: res?.title
-            })
-        }
-        sortNodeData.value = nodes
-        sortNodeModal.value = true
-    }
-}
-
-const NodeExpandKeys = async (wbsTab = false) => {
-    let newKeysArr = [], node = nodeItemInfo.value || {}
-    await getNodeExpandKeys(node,newKeysArr,wbsTab)
-    const treeKeys = newKeysArr.reverse()
-    await setStore({name: 'wbsTreeExpandKeys', content: treeKeys})
-    return treeKeys
-}
-
-//处理自动展开的节点KEY
-const getNodeExpandKeys = async (node, newKeys, wbsTab = false) => {
-    const tabType = wbsTypeTabKey.value || ''
-    const primaryKeyId = node?.data?.primaryKeyId || ''
-    if (primaryKeyId) {
-        const nodes = node?.parentNodes || []
-        const parent = node?.parent || []
-        newKeys.push(primaryKeyId)
-        if (tabType === 'map' && !wbsTab) {
-            await getNodeExpandKeys(nodes, newKeys,wbsTab)
-        } else if (tabType === 'tree' && !wbsTab) {
-            await getNodeExpandKeys(parent, newKeys,wbsTab)
-        } else if (tabType === 'map' && wbsTab) {
-            await getNodeExpandKeys(parent, newKeys,wbsTab)
-        } else if (tabType === 'tree' && wbsTab) {
-            await getNodeExpandKeys(nodes, newKeys,wbsTab)
-        }
-    }
-}
-
-const NodeTreeMenuClick = async ({key,node,data}) => {
-    nodeItemInfo.value = node
-    nodeDataInfo.value = data
-    if (key === 'mark' || key === 'cancel_mark') {
-        firstItemModal.value = true
-    } else if (key === 'edit') {
-        const parent = deepClone(node?.parentNodes?.data || {})
-        formEditNodeModel.value = {...deepClone(data), parent: parent}
-        editNodeModal.value = true
-    } else if (key === 'copy') {
-        const parent = deepClone(node?.parentNodes?.data || {})
-        formCopyNodeModel.value = {...deepClone(data), parent: parent}
-        copyNodeTable.value = []
-        copyNodeLoading.value = false
-        treeExpandKeys.value = await NodeExpandKeys()
-        copyNodeModal.value = true
-    } else if (key === 'add') {
-        addTreeNodeId.value = data?.id
-        addTreeNodeOldId.value = data?.oldId
-        addNodeLoading.value = false
-        addNodeModal.value = true
-    } else if (key === 'upload') {
-        const uploadDom = document.getElementById('upload-drawing');
-        let inputDom = uploadDom?.getElementsByTagName('input')[0];
-        inputDom.click()
-    } else if (key === 'del') {
-        delModalClick()
-    } else if (key === 'sort') {
-        let nodes = []
-        const childNodes = node?.parentNodes?.childrenNodes || []
-        for (let i = 0; i < childNodes.length; i++) {
-            const res = childNodes[i]?.data
-            nodes.push({
-                id: res?.primaryKeyId,
-                title: res?.title
-            })
-        }
-        sortNodeData.value = nodes
-        sortNodeModal.value = true
-    }
-}
-
-//上传前
-const loadingReactive = ref(null)
-const beforeUpload = () => {
-    loadingReactive.value = window?.$message?.loading('上传中...', {
-        duration: 0
-    })
-    return true
-}
-
-//上传完成
-const uploadFinish = ({event}) => {
-    const res = JSON.parse(event?.target?.response);
-    const info = nodeDataInfo.value;
-    let link = res?.data?.link;
-    wbsApi.saveContractTreeDrawings({
-        fileUrl: link,
-        id: info['drawingsId'],
-        primaryKeyId: info['primaryKeyId']
-    }).then(({data}) => {
-        loadingReactive.value.destroy()
-        loadingReactive.value = null
-        if (data.code === 200) {
-            nodeDataInfo.value['drawingsId'] = data.data
-            nodeDataInfo.value['fileUrl'] = link
-            window?.$message?.success('上传成功')
-        } else {
-            window?.$message?.error(data.msg || '上传失败')
-        }
-    }).catch(erro => {
-        loadingReactive.value.destroy()
-        loadingReactive.value = null
-        window?.$message?.error('请求异常')
-    })
-}
-
-//确认标记为首件
-const firstItemLoading = ref(false)
-const firstItemClick = () => {
-    const info = nodeDataInfo.value;
-    const TabKey = wbsTypeTabKey.value;
-    wbsApi.wbsTreeFirstSave({
-        primaryKeyId: info['primaryKeyId'],
-        saveOrDeleted: !!info['isFirst']?1:0,
-    }).then(({data}) => {
-        if (data.code === 200) {
-            const isFirst = !info['isFirst'];
-            firstItemModal.value = false
-            nodeDataInfo.value['isFirst'] = isFirst
-            //处理菜单状态
-            if (TabKey === 'tree') {
-                HcTreeRef.value.setElTreeMenuMark(data?.data || [], isFirst)
-            } else {
-                setNodeTreeMenuMark(info['primaryKeyId'],data?.data || [], isFirst)
-            }
-            window?.$message?.success('操作成功')
-        } else {
-            window?.$message?.error(data.msg || '操作失败')
-        }
-    })
-}
-
-//设置树菜单的标记数据
-const setNodeTreeMenuMark = (KeyId,keys,isFirst) => {
-    const info = nodeItemInfo.value;
-    setNodeTreeParentNodes(info['parentNodes'],keys,isFirst)
-    setNodeTreeChildNodes(info['childrenNodes'],keys,isFirst)
-}
-
-//设置父级
-const setNodeTreeParentNodes = (parent,keys,isFirst) => {
-    if (keys.indexOf(parent['key']) !== -1) {
-        parent['data']['isFirst'] = isFirst
-    }
-    if (!isObjNull(parent['parentNodes'])) {
-        setNodeTreeParentNodes(parent['parentNodes'],keys,isFirst)
-    }
-}
-
-//设置子级
-const setNodeTreeChildNodes = (child,keys,isFirst) => {
-    if (child.length > 0) {
-        child.forEach(item => {
-            if (keys.indexOf(item['key']) !== -1) {
-                item['data']['isFirst'] = isFirst
-            }
-            if (item['childrenNodes'].length > 0) {
-                setNodeTreeChildNodes(item['childrenNodes'],keys,isFirst)
-            }
-        })
-    }
-}
-
-//编辑节点
-const nodeTypeData = ref([{label: "分项工程", value: 1}, {label: "分部工程", value: 2}])
-const editNodeLoading = ref(false)
-const formEditNodeRef = ref(null)
-const formEditNodeModel = ref({})
-const formEditNodeRules = {
-    title: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入节点名称"
-    },
-}
-const editNodeClick = () => {
-    editNodeLoading.value = true
-    const {primaryKeyId,title,partitionCode} = formEditNodeModel.value
-    wbsApi.wbsTreeUpdateNode({
-        deptName: title,
-        pKeyId: primaryKeyId,
-        partitionCode: partitionCode||''
-    }).then(({data}) => {
-        editNodeLoading.value = false
-        if (data.code === 200) {
-            window?.$message?.success('修改成功')
-            nodeDataInfo.value['title'] = title || ''
-            nodeDataInfo.value['partitionCode'] = partitionCode || ''
-            editNodeModal.value = false
-        } else {
-            window?.$message?.error(data.msg || '修改失败')
-        }
-    }).catch(erro => {
-        editNodeLoading.value = false
-        window?.$message?.error('请求异常')
-    })
-}
-
-//复制节点
-const copyNodeModal = ref(false)
-
-//复制节点类型tab数据和相关处理
-const copyNodeTabKey = ref('2')
-const copyNodeTab = ref([
-    {key:'1',  name: '单份复制'},
-    {key:'2', name: '多份复制'}
-]);
-const copyNodeTabChange = (value) => {
-    copyNodeTabKey.value = value;
-    copyNodeLoading.value = false
-}
-const copyNodeLoading = ref(false)
-const formCopyNodeModel = ref({})
-const copyNodeTable = ref([])
-
-//树被点击
-const copyNodeElTreeClick = ({data}) => {
-    const {title} = formCopyNodeModel.value;
-    if (!data?.exsitChild) {
-        copyNodeTable.value.push({
-            title: data?.title || '',
-            nodeName: title || '',
-            primaryKeyId: data?.primaryKeyId || ''
-        })
-    }
-}
-
-const formCopyNodeModelRef = ref(null)
-const formCopyNodeModelRules = {
-    title: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入节点名称"
-    }
-}
-
-//删除选中的节点
-const copyNodeTableDel = (index) => {
-    copyNodeTable.value.splice(index,1)
-}
-const copyNodeTableRef = ref(null)
-const copyNodeTableRules = {
-    nodeName: {
-        required: true,
-        trigger: ["blur", "input"],
-        message: "请输入节点名称"
-    }
-}
-
-const copyNodeClick = async () => {
-    const type = copyNodeTabKey.value
-    const form = formCopyNodeModel.value
-    const table = copyNodeTable.value
-    //效验数据
-    let validate = false
-    if (type === '1') {
-        const errors = await formCopyNodeModelRef.value?.validate()
-        validate = !errors
-    } else if (type === '2') {
-        if (table.length > 0) {
-            const errors = await copyNodeTableRef.value?.validate()
-            validate = !errors
-        } else {
-            validate = false
-            window?.$message?.warning('请先在左侧选择要复制到的节点')
-        }
-    }
-    //发起请求
-    if (validate) {
-        copyNodeLoading.value = true
-        const {data} = await wbsApi.copyContractTreeNode({
-            copyType: type,
-            needCopyNodeName: form?.title || '',
-            needCopyPrimaryKeyId: form?.primaryKeyId || '',
-            parentPrimaryKeyId: form?.parent?.primaryKeyId || '',
-            copyBatchToPaths: table
-        })
-        //判断状态
-        if (data.code === 200) {
-            window?.$message?.success('复制成功')
-            copyNodeLoading.value = false
-            copyNodeModal.value = false
-            await NodeExpandKeys()
-            window?.location?.reload()  //刷新页面
-        } else {
-            copyNodeLoading.value = false
-            window?.$message?.error(data.msg || '复制失败')
-        }
-    } else {
-        window?.$message?.warning('请先检查相关表单是否正确填写或节点是否选择')
-    }
-}
-
-//新增节点
-const addNodeModal = ref(false)
-const addTreeNodeId = ref('')
-const addTreeNodeOldId = ref('')
-const addTreeNodeType = ref('1')
-
-//选中的节点
-const allSelectedList = ref([])
-const halfSelectedList = ref([])
-const addTreeNodeCheckChange = (nodes) => {
-    let NodesArr = [], halfArr = []
-    //全选数据
-    const keys = nodes.checkedNodes || []
-    for (let i = 0; i < keys.length; i++) {
-        NodesArr.push({
-            nodeName: keys[i].title,
-            primaryKeyId: keys[i].primaryKeyId
-        })
-    }
-    allSelectedList.value = NodesArr
-    //半选数据
-    const halfNodes = nodes.halfCheckedNodes || []
-    for (let i = 0; i < halfNodes.length; i++) {
-        halfArr.push({
-            nodeName: halfNodes[i].title,
-            primaryKeyId: halfNodes[i].primaryKeyId
-        })
-    }
-    halfSelectedList.value = halfArr
-}
-
-//新增节点
-const addNodeLoading = ref(false)
-const addNodeClick = async () => {
-    const keys = allSelectedList.value || []
-    if (keys.length <= 0) {
-        window?.$message?.warning('请先选择节点')
-    } else {
-        //发起请求
-        addNodeLoading.value = true
-        const {data} = await wbsApi.saveContractTreeNode({
-            projectId: projectId.value,
-            contractId: contractId.value,
-            saveType: addTreeNodeType.value,
-            allSelectedList: allSelectedList.value,
-            halfSelectedList: halfSelectedList.value,
-            currentNodePrimaryKeyId: nodeDataInfo.value?.primaryKeyId
-        })
-        //判断状态
-        if (data.code === 200) {
-            window?.$message?.success('新增成功')
-            await NodeExpandKeys()
-            addNodeLoading.value = false
-            addNodeModal.value = false
-            window?.location?.reload()  //刷新页面
-        } else {
-            addNodeLoading.value = false
-            window?.$message?.error(data.msg || '新增失败')
-        }
-    }
-}
-
-//删除确认弹窗
-const delModalClick  = () => {
-    window?.$dialog?.error({
-        title: "确认此操作?",
-        content: "请谨慎考虑后,确认是否需要删除",
-        positiveText: "确认删除",
-        negativeText: "取消",
-        onPositiveClick: () => {
-            const info = nodeDataInfo.value;
-            const TabKey = wbsTypeTabKey.value;
-            wbsApi.removeContractTreeNode({
-                ids: info['primaryKeyId']
-            }).then(({data}) => {
-                if (data.code === 200) {
-                    window?.$message?.success('删除成功')
-                    //处理菜单状态
-                    if (TabKey === 'tree') {
-                        HcTreeRef.value.removeElTreeNode(info['primaryKeyId'])
-                    } else {
-                        removeNodeTreeNode()
-                    }
-                } else {
-                    window?.$message?.error(data.msg || '删除失败')
-                }
-            }).catch(erro => {
-                window?.$message?.error('请求异常')
-            })
-        }
-    });
-}
-const removeNodeTreeNode = () => {
-    const info = nodeItemInfo.value;
-    const parent = info['parentNodes']
-    const childNodes = parent['childNodes'] || []
-    const childrenNodes = parent['childrenNodes'] || []
-    //删除
-    for (let i = 0; i < childNodes.length; i++) {
-        if (info['key'] === childNodes[i]['primaryKeyId']) {
-            childNodes.splice(i, 1);
-        }
-    }
-    //删除
-    for (let i = 0; i < childrenNodes.length; i++) {
-        if (info['key'] === childrenNodes[i]['key']) {
-            childrenNodes.splice(i, 1);
-        }
-    }
-}
-
-//调整排序
-const sortNodeModal = ref(false)
-const sortNodeLoading = ref(false)
-const sortNodeData = ref([])
-const sortNodeDrag = ref(false)
-//向下
-const downSortClick = (index) => {
-    const indexs = index + 1
-    const data = sortNodeData.value || []
-    if(indexs !== data.length) {
-        const tmp = data.splice(indexs,1);
-        sortNodeData.value.splice(index,0,tmp[0]);
-    } else {
-        window?.$message?.warning('已经处于置底,无法下移')
-    }
-}
-//向上
-const upSortClick = (index) => {
-    const data = sortNodeData.value || []
-    if(index !== 0) {
-        const tmp = data.splice(index - 1,1);
-        sortNodeData.value.splice(index,0,tmp[0]);
-    } else {
-        window?.$message?.warning('已经处于置顶,无法上移')
-    }
-}
-//确认排序
-const sortNodeClick = async () => {
-    const sortList = [];
-    const nodes = sortNodeData.value || []
-    nodes.forEach(item => {
-        sortList.push(item?.id)
-    })
-    //发起请求
-    sortNodeLoading.value = true
-    const { data } = await wbsApi.diySortTreeNode({sortList})
-    //判断状态
-    if (data.code === 200) {
-        window?.$message?.success('保存成功')
-        await NodeExpandKeys()
-        sortNodeLoading.value = false
-        sortNodeModal.value = false
-        window?.location?.reload()  //刷新页面
-    } else {
-        sortNodeLoading.value = false
-        window?.$message?.error(data.msg || '保存失败')
-    }
-}
-
-
-//查看图纸
-const drawingsShow = ref(false);
-const viewsDrawings = () => {
-    drawingsShow.value = true
-}
-const drawingsClose = (res) => {
-    drawingsShow.value = res
-}
-const viewsDrawingsTip = () => {
-    const {primaryKeyId,fileUrl} = nodeDataInfo.value
-    if (!primaryKeyId) {
-        window?.$message?.warning('请先选择树节点')
-    } else if (!fileUrl) {
-        window?.$message?.warning('该节点暂未上传图纸')
-    }
-}
-
-//数据列表
-const ListItemDatas = ref([]);
-
-//获取数据列表
-const searchNodeAllTable = () => {
-    const info = nodeDataInfo.value;
-    const cid = info?.contractIdRelation || ''
-    const key = info?.primaryKeyId || ''
-    const id = info?.id || ''
-    wbsApi.searchNodeAllTable({
-        primaryKeyId: cid?id:key,
-        type: authBtnTabKey.value
-    }).then(({data}) => {
-        if (data.code === 200) {
-            let tableData = isArray(data?.data)?data['data']:[]
-            if (tableData.length > 0) {
-                tableData.forEach(item => {
-                    item.name = item.deptName
-                })
-            }
-            ListItemDatas.value = tableData
-        } else {
-            ListItemDatas.value = []
-        }
-    }).catch(erro => {
-        ListItemDatas.value = []
-    })
-}
-
-//批量上报
-const showReportModal = ref(false)
-const reportModalClick = () => {
-    showReportModal.value = true
-}
-
-//被展开
-const ListItemOffsetTop = (offsetTop) => {
-    if (offsetTop > 0) {
-        const type = wbsTypeTabKey.value || 'map'
-        setTimeout(() => {
-            if (type === 'map') {
-                document.getElementById('hc-drawer-list-item').scrollTop = offsetTop
-            } else if (type === 'tree') {
-                document.getElementById('hc-card-list-item').scrollTop = offsetTop
-            }
-        }, 200)
-    }
-}
-
-//左右拖动,改变树形结构宽度
-const leftWidth = ref(382);
-const onmousedown = () => {
-    document.onmousemove = (ve) => {
-        let diffVal = ve.clientX + 2;
-        if(diffVal >= 310 && diffVal <= 900) {
-            leftWidth.value = diffVal;
-        }
-    }
-    document.onmouseup = () => {
-        document.onmousemove = null;
-        document.onmouseup = null;
-    }
-}
-</script>
-
-<style lang="scss" scoped>
-@import "../../styles/data-fill/wbs.scss";
-.hc-add-node-modal-foot-box {
-    position: relative;
-    display: flex;
-    align-items: center;
-    .left-box {
-        position: relative;
-        flex: 1;
-        display: flex;
-        align-items: center;
-    }
-    .right-box {
-        position: relative;
-    }
-}
-
-html.theme-dark {
-    .bg-svg-xml {
-        background-color: initial;
-        background-image: initial;
-    }
-    .hc-layout-box .hc-layout-content-box .hc-card-max-h-box.node-tree .hc-tree-foot-tip-box {
-        border-top: 1px solid #303030;
-    }
-}
-</style>
-
-<style lang="scss">
-.data-fill-wbs-content {
-    position: relative;
-    height: 100%;
-    .n-drawer-container {
-        margin: -20px -24px;
-    }
-    .n-drawer.n-drawer--top-placement {
-        height: auto !important;
-        background-color: initial;
-        pointer-events: none;
-        bottom: 0;
-    }
-    .drawer-data-fill-content-box {
-        position: relative;
-        height: 100%;
-        padding: 24px;
-        .n-card {
-            pointer-events: auto;
-            height: 100%;
-            overflow: auto;
-        }
-        .data-fill-content {
-            position: relative;
-            height: 100%;
-            overflow-y: auto;
-            scroll-behavior: smooth;
-            .data-fill-list-box .data-fill-list-item-content {
-                height: calc(100vh - 470px);
-                .data-fill-table-form-box {
-                    height: 100%;
-                }
-            }
-        }
-        .data-fill-foot {
-            position: relative;
-            text-align: center;
-        }
-    }
-}
-.n-card.hc-card-overflow-box .n-card__content {
-    padding: 24px;
-}
-.n-card.hc-custom-card > .n-card-header {
-    padding: 15px 24px;
-}
-.n-card.hc-custom-card.copy {
-    width: 1200px;
-    max-height: 90vh;
-    overflow: auto;
-    .n-card-header .n-card-header__close {
-        display: none;
-    }
-    &.one {
-        width: 600px;
-    }
-    &.many {
-        width: 1200px;
-        .copy-node-many-box {
-            position: relative;
-            height: 60vh;
-            display: flex;
-            .copy-node-many-tree {
-                position: relative;
-                flex: 1;
-                height: 100%;
-                overflow: auto;
-                padding-right: 20px;
-                border-right: 1px solid #efeff5;
-            }
-            .copy-node-many-table {
-                position: relative;
-                flex: 1;
-                height: 100%;
-                margin-left: 20px;
-                .copy-node-many-table-data {
-                    position: relative;
-                    height: calc(100% - 74px);
-                    margin-bottom: 20px;
-                    overflow: auto;
-                }
-                .copy-node-many-foot-center {
-                    position: relative;
-                    text-align: center;
-                    padding-top: 20px;
-                    border-top: 1px solid #efeff5;
-                }
-            }
-        }
-    }
-}
-.img-preview-box {
-    position: relative;
-    height: 100%;
-    width: 100%;
-    .cu-img-preview.cu-img-preview-dom .cu-img-preview-box {
-        height: calc(100% - 60px);
-    }
-    .cu-img-preview.cu-img-preview-dom .cu-img-preview-tools-box{
-        position: absolute;
-    }
-}
-</style>

+ 37 - 28
src/views/data-fill/wbs_new.vue

@@ -245,7 +245,7 @@
 
     <!--新增子节点-->
     <n-modal v-model:show="addNodeModal" class="hc-custom-card" title="新增子节点" preset="card" style="width: 720px;" :segmented="{content: 'soft', footer: 'soft'}">
-        <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" @check-change="addTreeNodeCheckChange"/>
+        <HcTreeNode :projectId="projectId" :nodeId="addTreeNodeId" :oldId="addTreeNodeOldId" :strictly="addTreeNodeType == 2" @check-change="addTreeNodeCheckChange"/>
         <template #footer>
             <div class="hc-add-node-modal-foot-box">
                 <div class="left-box">
@@ -446,28 +446,37 @@ const NodeTreeAccordion = ref(true)
 const ElTreeMenu = ref([])
 const TreeMark = ref(false)
 const setElTreeMenu = () => {
-    let newArr = [];
-    if (tree_menu_edit.value) {
-        newArr.push({icon: HcIcon('hcicon-bianji'), label: '编辑节点', key: "edit"})
-    }
-    if (tree_menu_mark.value) {
-        newArr.push({icon: HcIcon('cicon-star-o'), label: '标记为首件', key: "mark"})
-        TreeMark.value = true
-    }
-    if (tree_menu_copy.value) {
-        newArr.push({icon: HcIcon('cicon-file-copy-o'), label: '复制节点', key: "copy"})
-    }
-    if (tree_menu_add.value) {
-        newArr.push({icon: HcIcon('cicon-add-round-o'), label: '新增节点', key: "add"})
-    }
-    if (tree_menu_up.value) {
-        newArr.push({icon: HcIcon('hcicon-shangchuan'), label: '上传图纸', key: "upload"})
-    }
-    if (tree_menu_del.value) {
-        newArr.push({icon: HcIcon('cicon-delete-line-o'), label: '删除节点', key: "del"})
-    }
-    if (tree_menu_sort.value) {
-        newArr.push({icon: HcIcon('cicon-sort-order'), label: '调整排序', key: "sort"})
+    let newArr = [], contractType = contractInfo.value?.contractType;
+    if (contractType === 1) {
+        if (tree_menu_edit.value) {
+            newArr.push({icon: HcIcon('hcicon-bianji'), label: '编辑节点', key: "edit"})
+        }
+        if (tree_menu_mark.value) {
+            newArr.push({icon: HcIcon('cicon-star-o'), label: '标记为首件', key: "mark"})
+            TreeMark.value = true
+        }
+        if (tree_menu_copy.value) {
+            newArr.push({icon: HcIcon('cicon-file-copy-o'), label: '复制节点', key: "copy"})
+        }
+        if (tree_menu_add.value) {
+            newArr.push({icon: HcIcon('cicon-add-round-o'), label: '新增节点', key: "add"})
+        }
+        if (tree_menu_up.value) {
+            newArr.push({icon: HcIcon('hcicon-shangchuan'), label: '上传图纸', key: "upload"})
+        }
+        if (tree_menu_del.value) {
+            newArr.push({icon: HcIcon('cicon-delete-line-o'), label: '删除节点', key: "del"})
+        }
+        if (tree_menu_sort.value) {
+            newArr.push({icon: HcIcon('cicon-sort-order'), label: '调整排序', key: "sort"})
+        }
+    } else if (contractType === 2) {
+        if (tree_menu_copy.value) {
+            newArr.push({icon: HcIcon('cicon-file-copy-o'), label: '复制节点', key: "copy"})
+        }
+        if (tree_menu_add.value) {
+            newArr.push({icon: HcIcon('cicon-add-round-o'), label: '新增节点', key: "add"})
+        }
     }
     ElTreeMenu.value = newArr
 }
@@ -947,6 +956,7 @@ const addTreeNodeType = ref('1')
 const allSelectedList = ref([])
 const halfSelectedList = ref([])
 const addTreeNodeCheckChange = (nodes) => {
+    console.log(nodes)
     let NodesArr = [], halfArr = []
     //全选数据
     const keys = nodes.checkedNodes || []
@@ -1023,8 +1033,6 @@ const delModalClick  = () => {
                 } else {
                     window?.$message?.error(data.msg || '删除失败')
                 }
-            }).catch(erro => {
-                window?.$message?.error('请求异常')
             })
         }
     });
@@ -1154,11 +1162,12 @@ const showReportModal = ref(false)
 const reportModalClick = () => {
     const info = nodeDataInfo.value;
     const rows = ListItemDatas.value;
-    reportIds.value = info?.primaryKeyId || ''
+    reportIds.value = info['contractIdRelation'] ? info['id'] : info['primaryKeyId']
     if (rows.length > 0) {
         reportTaskName.value = rows.length > 1?`${rows[0].name}等${rows.length}个文件`:rows[0].name
         reportAddition.value = {
-            classify: authBtnTabKey.value
+            classify: authBtnTabKey.value,
+            contractIdRelation: info['contractIdRelation'],
         }
         showReportModal.value = true
     } else {
@@ -1192,7 +1201,7 @@ const NodeStatus = ref('1')
 const queryNodeStatus = () => {
     const info = nodeDataInfo.value;
     wbsApi.queryNodeStatus({
-        primaryKeyId:  info?.primaryKeyId || '',
+        primaryKeyId: info?.contractIdRelation ? info?.id : info?.primaryKeyId,
         classify: authBtnTabKey.value
     }).then(({data}) => {
         //1 未填报,2待上报,3已上报

+ 5 - 22
src/views/home/config.vue

@@ -94,7 +94,7 @@
 </template>
 
 <script setup>
-import {ref,watch,nextTick} from "vue";
+import {ref,nextTick} from "vue";
 import {useRouter, useRoute} from 'vue-router'
 import {useAppStore} from "~src/store/index";
 import themeData from '~src/config/theme';
@@ -117,23 +117,6 @@ const webRtcVal = ref(useAppState.getShotWebRtc)
 const fullScreenVal = ref(useAppState.getFullScreen)
 const UserColorNmae = ref(UserColor.value?.name || 'green')
 
-//监听
-watch(() => [
-    useAppState.getTheme,
-    useAppState.getColor,
-    useAppState.getHomeTheme,
-    useAppState.getShotWebRtc,
-    useAppState.getFullScreen,
-], ([Theme,ColorVal,homeTheme,WebRtc,FullScreen]) => {
-    UserTheme.value = Theme
-    UserColor.value = ColorVal
-    HomeTheme.value = homeTheme
-    webRtcVal.value = WebRtc
-    fullScreenVal.value = FullScreen
-    UserColorNmae.value = ColorVal?.name || 'green'
-})
-
-
 //颜色
 const ColorConfigData = ref(themeData.color)
 
@@ -194,7 +177,7 @@ const saveLoading = ref(false)
 const SaveConfigClick = async () => {
     //发起请求
     saveLoading.value = true
-    const { data } = await userConfigSave({
+    const { error, code } = await userConfigSave({
         theme: UserTheme.value,
         color: UserColorNmae.value,
         homeTheme: HomeTheme.value?.name,
@@ -203,11 +186,11 @@ const SaveConfigClick = async () => {
     })
     //判断状态
     saveLoading.value = false
-    if (data && data.code === 200) {
-        window?.$ElMessage?.success('保存成功')
+    if (!error && code === 200) {
+        window?.$message?.success('保存成功')
         router.back()
     } else {
-        window?.$ElMessage?.error('保存失败,请稍后再试')
+        window?.$message?.error('保存失败,请稍后再试')
     }
 }
 </script>

+ 2 - 2
src/views/login/index.vue

@@ -137,7 +137,7 @@ const formValidateClick = () => {
             loading.value = true;
             useAppLogin(formValue.value).then(({data}) => {
                 loading.value = false;
-                window?.$ElMessage?.success('登录成功');
+                window?.$message?.success('登录成功');
                 router.push({path: '/home/index'});
             }).catch(() => {
                 loading.value = false;
@@ -167,7 +167,7 @@ const touristsValidateClick = async () => {
 //忘记密码
 const clickableClick = () => {
     const val = '<div style="font-size: 16px;">忘记密码请不要紧张,联系您项目上的专属客服人员电话 <span style="color:#1ECC95;">18423665354</span> ,提供身份证明信息即可初始化密码,建议初始化之后由您单独去更改密码</div>'
-    window?.$ElMessageBox?.alert(val, '联系项目客服', {
+    window?.$messageBox?.alert(val, '联系项目客服', {
         confirmButtonText: '确定',
         dangerouslyUseHTMLString: true
     })

+ 107 - 101
src/views/other/order-service.vue

@@ -176,10 +176,11 @@ import {getTokenHeader} from '~src/api/request/header';
 import avatarPng from '~src/assets/images/avatar.png';
 import Web515Png from '~src/assets/images/Web515.png';
 import {userConfigSave} from "~api/other";
-import {isArray, isSize, base64ToFile, getIndex} from "vue-utils-plus"
+import {isType, isSize, base64ToFile, getIndex} from "vue-utils-plus"
 import oss from "~api/oss";
 
 //初始变量
+const { getArrValue, getObjValue, getObjNullValue } = isType()
 const useAppState = useAppStore()
 const projectId = ref(useAppState.getProjectId);
 const contractId = ref(useAppState.getContractId);
@@ -221,28 +222,33 @@ onMounted(() => {
 })
 
 //获取列表数据
-const queryUserOpinionPage = () => {
-    orderServe.queryUserOpinionPage(searchForm.value).then(res => {
-        const {records} = res?.data?.data;
-        orderDataList.value = records
-    })
+const queryUserOpinionPage = async () => {
+    const { error, code, data } = await orderServe.queryUserOpinionPage(searchForm.value)
+    if (!error && code === 200) {
+        orderDataList.value = getArrValue(data['records'])
+    } else {
+        orderDataList.value = []
+    }
 }
 
 //获取工单服务下拉列表
-const queryCurrentUserOpinionList = () => {
-    orderServe.queryCurrentUserOpinionList({
+const queryCurrentUserOpinionList = async () => {
+    const { error, code, data } = await orderServe.queryCurrentUserOpinionList({
         projectId: projectId.value
-    }).then(({data}) => {
-        const res = isArray(data?.data) ? data?.data : [];
+    })
+    if (!error && code === 200) {
+        const res = getArrValue(data)
         nameSelectData.value = res
         if (res.length > 0) {
             nameSelectKey.value = res[0].id
-            //获取当前工单的最新流程
-            queryUserFlowOpinion().then()
+            queryUserFlowOpinion()
         } else {
             nameSelectKey.value = null
         }
-    })
+    } else {
+        nameSelectData.value = []
+        nameSelectKey.value = null
+    }
 }
 
 //获取当前工单的最新流程
@@ -250,14 +256,18 @@ const isCurrentBol = ref(false)
 const orderFlowList = ref([])
 const queryUserFlowOpinion = async () => {
     let id = nameSelectKey.value || null;
-    orderServe.queryUserFlowOpinion({userOpinionId: id}).then(res => {
-        let data = res?.data?.data || [];
-        orderFlowList.value = data
-        if (data.length > 0) {
-            const {currentBol, evaluation} = data[data.length-1];
+    const { error, code, data } = await orderServe.queryUserFlowOpinion({userOpinionId: id})
+    if (!error && code === 200) {
+        const res = getArrValue(data)
+        orderFlowList.value = res
+        if (res.length > 0) {
+            const {currentBol, evaluation} = res[res.length-1];
             isCurrentBol.value = !!(currentBol && parseInt(evaluation) === -1);
         }
-    })
+    } else {
+        orderFlowList.value = []
+        isCurrentBol.value = false
+    }
 }
 
 //我的工单被切换
@@ -278,53 +288,55 @@ const commentExpanded = (item) => {
 }
 
 //获取评论列表
-const queryCommentsList = (item) => {
-    orderServe.queryCommentsList({
+const queryCommentsList = async (item) => {
+    const { error, code, data } = await orderServe.queryCommentsList({
         userOpinionId: item.id
-    }).then(res => {
-        item['expandedCommentList'] = res?.data?.data || [];
     })
+    if (!error && code === 200) {
+        item['expandedCommentList'] = getArrValue(data)
+    } else {
+        item['expandedCommentList'] = []
+    }
 }
 
 //提交评论
-const saveCommentClick = (item) => {
+const saveCommentClick = async (item) => {
     if (!item['replyContent']) {
         window.$message?.warning('请先填写评论内容');
     } else {
-        orderServe.saveUserComments({
+        const { error, code } = await orderServe.saveUserComments({
             userOpinionId: item.id,
             replyContent: item['replyContent'],
             projectId: projectId.value,
             contractId: contractId.value,
-        }).then(res => {
+        })
+        if (!error && code === 200) {
             window.$message?.success('评论成功');
             item['replyContent'] = ''
             queryCommentsList(item)
-        })
+        }
     }
 }
 
 //点赞
-const likeClick = (item) => {
+const likeClick = async (item) => {
     if (item['currentUserGood']) {
-        orderServe.cancelGood({
+        const { error, code } = await orderServe.cancelGood({
             userOpinionId: item.id
-        }).then(({data}) => {
-            if (data.code === 200) {
-                item['currentUserGood'] = false
-                item['goodNumber'] --
-            }
         })
+        if (!error && code === 200) {
+            item['currentUserGood'] = false
+            item['goodNumber'] --
+        }
     } else {
-        orderServe.addGoodNumber({
+        const { error, code } = await orderServe.addGoodNumber({
             userOpinionId: item.id,
             good: 1
-        }).then(({data}) => {
-            if (data.code === 200) {
-                item['currentUserGood'] = true
-                item['goodNumber'] ++
-            }
         })
+        if (!error && code === 200) {
+            item['currentUserGood'] = true
+            item['goodNumber'] ++
+        }
     }
 }
 
@@ -355,15 +367,18 @@ const handleModalClose = () => {
 }
 
 //获取字典信息
-const queryDictBizList = () => {
-    orderServe.queryDictBizList().then(({data}) => {
-        const records = isArray(data?.data) ? data?.data : [];
-        typeTab.value = records
-        if (records.length > 0) {
+const queryDictBizList = async () => {
+    const { error, code, data } = await orderServe.queryDictBizList()
+    if (!error && code === 200) {
+        const res = getArrValue(data)
+        typeTab.value = res
+        if (res.length > 0) {
             typeTabIndex.value = 0
-            typeTabKey.value = records[0]?.dictValue
+            typeTabKey.value = res[0]?.dictValue
         }
-    })
+    } else {
+        typeTab.value = []
+    }
 }
 
 //建议内容
@@ -379,7 +394,7 @@ const beforeUpload = (res) => {
     if (isSize(res?.size,30)) {
         return true;
     } else {
-        window?.$ElMessage?.warning('文件大小,不能过30M!');
+        window?.$message?.warning('文件大小,不能过30M!');
         return false;
     }
 }
@@ -392,7 +407,7 @@ const uploadChange = (_, uploadFiles) => {
 
 //超出限制时
 const uploadExceed = () => {
-    window?.$ElMessage?.warning('请上传JPG、PNG格式的图片文件,最多上传 3 张图片,文件大小不超过30M');
+    window?.$message?.warning('请上传JPG、PNG格式的图片文件,最多上传 3 张图片,文件大小不超过30M');
 }
 
 //预览
@@ -418,54 +433,49 @@ const getUploadFileUrl = () => {
 }
 
 //删除文件
-const removeUpload = (file) => {
+const removeUpload = async (file) => {
     const fileName = file?.response?.data?.name
-    oss.removeFile({
+    const { error, code } = await oss.removeFile({
         fileName: fileName
-    }).then(({data}) => {
-        if (data.code === 200) {
-            return true
-        } else {
-            window.$message?.error(data.msg || '删除异常')
-            return false
-        }
-    }).catch(() => {
-        return false
     })
+    if (!error && code === 200) {
+        return true
+    } else {
+        return false
+    }
 }
 
 //上传截图文件
 const spinShow = ref(false)
-const uploadImgFile = (base64) => {
+const uploadImgFile = async (base64) => {
     let fileOfBlob = base64ToFile(base64);
     let formData = new FormData();
     formData.append("file", fileOfBlob);
     //上传文件
     spinShow.value = true
     newOrderServiceClick()
-    oss.putFile(formData).then(({data}) => {
-        let res = data?.data ?? {}
+    const { error, code, data } = await oss.putFile(formData, false)
+    spinShow.value = false
+    if (!error && code === 200) {
+        let res = getObjValue(data)
         if (res?.link) {
             uploadFileList.value.push({
                 url: res?.link,
                 name: res?.name,
-                response: {
-                    data: res
-                }
+                response: {data: res}
             })
         }
         window.sessionStorage.removeItem('screenShort-base64');
-        window.$ElMessage?.success('文件上传成功');
-        spinShow.value = false
-    }).catch(()=> {
+        window.$message?.success('文件上传成功');
         spinShow.value = false
+    } else {
         window.sessionStorage.removeItem('screenShort-base64');
-        window.$ElMessage?.warning('文件上传失败');
-    })
+        window.$message?.warning('文件上传失败');
+    }
 }
 
 //提交工单反馈
-const saveClick = () => {
+const saveClick = async () => {
     //拼接问题类型
     let problemType = typeTabKey.value, index = typeTabIndex.value, problemVal = '';
     const checkBoxVal = typeCheckBox.value[index] || [];
@@ -473,29 +483,28 @@ const saveClick = () => {
     let filesUrl = getUploadFileUrl()
     //判断数据
     if (!problemVal) {
-        window.$ElMessage?.warning('请先选择问题类型');
+        window.$message?.warning('请先选择问题类型');
     } else {
         //请求接口
-        orderServe.saveUserOpinion({
+        const { error, code } = await orderServe.saveUserOpinion({
             projectId: projectId.value,
             contractId: contractId.value,
             problemType: problemType + problemVal,
             opinionContent: opinionContent.value,
             returnFiles: filesUrl
-        }).then(({data}) => {
-            if (data.code === 200) {
-                window.$ElMessage?.success('提交成功');
-                showModal.value = false;
-                //重置表单
-                typeCheckBox.value[index] = []
-                opinionContent.value = ''
-                uploadFileList.value = []
-                previewFileList.value = []
-                //更新数据
-                queryUserOpinionPage()
-                queryCurrentUserOpinionList()
-            }
         })
+        if (!error && code === 200) {
+            window.$message?.success('提交成功');
+            showModal.value = false;
+            //重置表单
+            typeCheckBox.value[index] = []
+            opinionContent.value = ''
+            uploadFileList.value = []
+            previewFileList.value = []
+            //更新数据
+            queryUserOpinionPage()
+            queryCurrentUserOpinionList()
+        }
     }
 }
 
@@ -507,29 +516,26 @@ const evaluationData = [
     {value: "2", label: "不满意并再次提交解决"},
     {value: "3", label: "不满意且投诉"}
 ]
-const disposeUserFeedback = () => {
+const disposeUserFeedback = async () => {
     let oldEndFlow = orderFlowList.value[3]?.id || ''
-    //请求接口
-    orderServe.disposeUserFeedback({
+    const { error, code } = await orderServe.disposeUserFeedback({
         oldEndFlow: oldEndFlow,
         type: evaluationKey.value || '',
         userOpinionId: nameSelectKey.value || ''
-    }).then(() => {
-        window.$ElMessage?.success('提交成功');
+    })
+    if (!error && code === 200) {
+        window.$message?.success('提交成功');
         showTipModal.value = parseInt(opinionView.value) === 1
         queryCurrentUserOpinionList()
-    })
+    }
 }
 
 //提示框
-const tipModalClick = () => {
-    userConfigSave({
-        opinionView: 0
-    }).then(({data}) => {
-        showTipModal.value = false
-        useAppState.setOrderServiceTipModal(0)
-        opinionView.value = 0
-    })
+const tipModalClick = async () => {
+    await userConfigSave({opinionView: 0})
+    showTipModal.value = false
+    useAppState.setOrderServiceTipModal(0)
+    opinionView.value = 0
 }
 
 const handleTipModalClose = () => {

+ 116 - 166
src/views/user/index.vue

@@ -188,13 +188,13 @@
 </template>
 
 <script setup>
-import {ref, watch, onMounted} from "vue";
+import {ref, onMounted} from "vue";
 import {useRouter, useRoute} from 'vue-router'
 import {useAppStore} from "~src/store/index";
 import avatarPng from '~src/assets/images/avatar.png';
 import {getTokenHeader} from '~src/api/request/header';
 import userApi from "~api/userInfo/index"
-import {getIndex} from "vue-utils-plus"
+import {getIndex,formValidate,getArrValue} from "vue-utils-plus"
 import md5 from 'js-md5';
 
 //初始变量
@@ -212,20 +212,6 @@ const projectContractArr = ref(useAppState.getProjectContract);
 const routerQuery = useRoutes?.query;
 let MenuType = routerQuery?.MenuType || 'basic'
 
-//监听
-watch(() => [
-    useAppState.getUserInfo,
-    useAppState.getProjectId,
-    useAppState.getContractId,
-    useAppState.getProjectContract,
-], ([user,pid,cid,projectContract]) => {
-    userInfo.value = user
-    projectId.value = pid
-    contractId.value = cid
-    projectContractArr.value = projectContract
-})
-
-
 //上传组件参数
 const action = '/api/blade-resource/oss/endpoint/put-file';
 const accept = 'image/png,image/jpg,image/jpeg';
@@ -237,32 +223,28 @@ const beforeUpload = () => {
     return true
 }
 //上传完成
-const uploadFinish = (res) => {
+const uploadFinish = async (res) => {
     const link = res?.data?.link ?? '';
     const user_id = userInfo.value?.user_id ?? '';
     if (link) {
-        userApi.updateUserInfo({
-            avatar: link,
-            id: user_id
-        }).then(({data}) => {
+        const { error, code } = await userApi.updateUserInfo({avatar: link, id: user_id})
+        if (!error && code === 200) {
             avatarLoading.value = false
-            if (data.code === 200) {
-                window?.$ElMessage?.success('更换头像成功')
-                userInfo.value.avatar = link
-                useAppState.setUserInfo(userInfo.value)
-            }
-        }).catch(() => {
+            userInfo.value.avatar = link
+            window?.$message?.success('更换头像成功')
+            useAppState.setUserInfo(userInfo.value)
+        } else {
             avatarLoading.value = false
-        })
+        }
     } else {
-        window?.$ElMessage?.warning('上传头像异常,请稍后再试')
+        window?.$message?.warning('上传头像异常,请稍后再试')
         avatarLoading.value = false
     }
 }
 //上传失败
 const uploadError = () => {
     avatarLoading.value = false
-    window?.$ElMessage?.warning('上传头像失败')
+    window?.$message?.warning('上传头像失败')
 }
 
 
@@ -339,15 +321,14 @@ const formUserRules = {
     },
 }
 //获取用户信息
-const queryCurrentUserData = () => {
-    userApi.queryCurrentUserData().then(({data}) => {
-        if (data.code === 200) {
-            formUserModel.value.deptId = data.data?.deptId || ''
-            formUserModel.value.idNumber = data.data?.idNumber || ''
-            formUserModel.value.roleName = data.data?.roleName || ''
-            formUserModel.value.signatureUrl = data.data?.signatureUrl || ''
-        }
-    })
+const queryCurrentUserData = async () => {
+    const { error, code, data } = await userApi.queryCurrentUserData()
+    if (!error && code === 200) {
+        formUserModel.value.deptId = data?.deptId || ''
+        formUserModel.value.idNumber = data?.idNumber || ''
+        formUserModel.value.roleName = data?.roleName || ''
+        formUserModel.value.signatureUrl = data?.signatureUrl || ''
+    }
 }
 
 //切换编辑模式
@@ -379,28 +360,21 @@ const cancelUserClick = () => {
 }
 
 //保存用户信息
-const saveUserInfoData = () => {
-    formUserRef.value.validate((valid) => {
-        if (valid) {
-            const form = formUserModel.value
-            saveUserLoading.value = true
-            userApi.updateUserInfo({
-                realName: form?.real_name,
-                id: form?.user_id
-            }).then(({data}) => {
-                saveUserLoading.value = false
-                if (data.code === 200) {
-                    window?.$ElMessage?.success('保存成功')
-                    userInfo.value.real_name = form?.real_name
-                    useAppState.setUserInfo(userInfo.value)
-                }
-            }).catch(() => {
-                saveUserLoading.value = false
-            })
+const saveUserInfoData = async () => {
+    const res = await formValidate(formUserRef.value)
+    if (res) {
+        const form = formUserModel.value
+        saveUserLoading.value = true
+        const { error, code } = await userApi.updateUserInfo({realName: form?.real_name, id: form?.user_id})
+        if (!error && code === 200) {
+            saveUserLoading.value = false
+            window?.$message?.success('保存成功')
+            userInfo.value.real_name = form?.real_name
+            useAppState.setUserInfo(userInfo.value)
         } else {
-            return false
+            saveUserLoading.value = false
         }
-    })
+    }
 }
 
 //密码设置表单
@@ -441,44 +415,38 @@ const formUserPassRules = {
 }
 
 //更新密码
-const saveUpdatePassword = () => {
-    formUserPassRef.value.validate((valid) => {
-        if (valid) {
-            const form = formUserPassModel.value;
-            saveUserLoading.value = true
-            userApi.updatePassword({
-                oldPassword: md5(form?.oldPassword),
-                newPassword: md5(form?.newPassword),
-                newPassword1: md5(form?.newPassword1),
-                plaintextPassword: form?.newPassword
-            }).then(({data}) => {
-                saveUserLoading.value = false
-                if (data.code === 200) {
-                    window?.$ElMessage?.success('密码修改成功')
-                    formUserPassModel.value = {oldPassword: '', newPassword: '', newPassword1: ''}
-                } else {
-                    window?.$ElMessage?.warning(data.msg || '密码修改失败')
-                }
-            }).catch(() => {
-                saveUserLoading.value = false
-            })
+const saveUpdatePassword = async () => {
+    const res = await formValidate(formUserPassRef.value)
+    if (res) {
+        const form = formUserPassModel.value;
+        saveUserLoading.value = true
+        const { error, code } = await userApi.updatePassword({
+            oldPassword: md5(form?.oldPassword),
+            newPassword: md5(form?.newPassword),
+            newPassword1: md5(form?.newPassword1),
+            plaintextPassword: form?.newPassword
+        })
+        if (!error && code === 200) {
+            saveUserLoading.value = false
+            window?.$message?.success('密码修改成功')
+            formUserPassModel.value = {
+                oldPassword: '',
+                newPassword: '',
+                newPassword1: ''
+            }
         } else {
-            return false
+            saveUserLoading.value = false
         }
-    })
+    }
 }
 
 //获取默认项目
 const projectKey = ref(null)
-const getDefaultProject = () => {
-    userApi.getDefaultProject().then(({data}) => {
-        if (data.code === 200) {
-            let res = data['data'] || {}
-            projectKey.value = res['contractId']
-        } else {
-            window?.$ElMessage?.error(data.msg || '设置出错')
-        }
-    })
+const getDefaultProject = async () => {
+    const { error, code, data } = await userApi.getDefaultProject()
+    if (!error && code === 200) {
+        projectKey.value = data['contractId']
+    }
 }
 
 //项目被选择
@@ -491,22 +459,18 @@ const projectMenuValue = (item,items) => {
 }
 
 //设置为默认项目
-const setDefaultProjectClick = () => {
+const setDefaultProjectClick = async () => {
     const pid = menuProjectId.value, cid = menuContractId.value
     if (pid && cid) {
-        //发起请求
-        userApi.setDefaultProject({
+        const { error, code } = await userApi.setDefaultProject({
             projectId: pid,
             contractId: cid
-        }).then(({data}) => {
-            if (data.code === 200) {
-                window?.$ElMessage?.success('设置成功')
-            } else {
-                window?.$ElMessage?.error(data.msg || '设置出错')
-            }
         })
+        if (!error && code === 200) {
+            window?.$message?.success('设置成功')
+        }
     } else {
-        window?.$ElMessage?.warning('请先在下方选择一个项目合同段')
+        window?.$message?.warning('请先在下方选择一个项目合同段')
     }
 }
 
@@ -519,14 +483,13 @@ const searchLogForm = ref({
 
 //业务模块
 const operationModuleData = ref([])
-const queryBusinessModule = () => {
-    userApi.queryBusinessModule().then(({data}) => {
-        if (data.code === 200) {
-            operationModuleData.value = data['data']
-        } else {
-            operationModuleData.value = []
-        }
-    })
+const queryBusinessModule = async () => {
+    const { error, code, data } = await userApi.queryBusinessModule()
+    if (!error && code === 200) {
+        operationModuleData.value = data
+    } else {
+        operationModuleData.value = []
+    }
 }
 const BusinessModuleValue = () => {
     searchLogForm.value.operationView = null
@@ -537,16 +500,15 @@ const BusinessModuleValue = () => {
 
 //页面
 const operationViewData = ref([])
-const queryOperationView = () => {
-    userApi.queryOperationView({
+const queryOperationView = async () => {
+    const { error, code, data } = await userApi.queryOperationView({
         businessModule: searchLogForm.value?.operationModule || ''
-    }).then(({data}) => {
-        if (data.code === 200) {
-            operationViewData.value = data['data']
-        } else {
-            operationViewData.value = []
-        }
     })
+    if (!error && code === 200) {
+        operationViewData.value = data
+    } else {
+        operationViewData.value = []
+    }
 }
 const OperationViewValue = () => {
     searchLogForm.value.operationType = null
@@ -555,17 +517,16 @@ const OperationViewValue = () => {
 
 //操作类型
 const operationTypeData = ref([])
-const operationTypeStatus = () => {
-    userApi.queryOperationTypeList({
+const operationTypeStatus = async () => {
+    const { error, code, data } = await userApi.queryOperationTypeList({
         businessModule: searchLogForm.value?.operationModule || '',
         operationView: searchLogForm.value?.operationView || ''
-    }).then(({data}) => {
-        if (data.code === 200) {
-            operationTypeData.value = data['data']
-        } else {
-            operationTypeData.value = []
-        }
     })
+    if (!error && code === 200) {
+        operationTypeData.value = data
+    } else {
+        operationTypeData.value = []
+    }
 }
 
 //设备
@@ -604,25 +565,21 @@ const pageLogChange = ({current, size}) => {
 
 //获取数据
 const logTableLoading = ref(false)
-const getLogTableData = () => {
+const getLogTableData = async () => {
     logTableLoading.value = true
-    userApi.getOperationLog({
+    const { error, code, data } = await userApi.getOperationLog({
         projectId: projectId.value,
         contractId: contractId.value,
         ...searchLogForm.value
-    }).then(({data}) => {
-        logTableLoading.value = false
-        if (data.code === 200) {
-            let res = data['data'] || {}
-            logTableData.value = res['records'] || []
-            searchLogForm.value.total = res.total || 0
-        } else {
-            logTableData.value = []
-            searchLogForm.value.total = 0
-        }
-    }).catch(() => {
-        logTableLoading.value = false
     })
+    logTableLoading.value = false
+    if (!error && code === 200) {
+        logTableData.value = getArrValue(data['records'])
+        searchLogForm.value.total = data.total || 0
+    } else {
+        logTableData.value = []
+        searchLogForm.value.total = 0
+    }
 }
 
 //结构类型tab数据和相关处理
@@ -657,22 +614,20 @@ const pageRecycleChange = ({current, size}) => {
 }
 
 //获取数据
-const getRecycleTableData = () => {
-    userApi.queryRecycleBinList({
+const getRecycleTableData = async () => {
+    const { error, code, data } = await userApi.queryRecycleBinList({
         projectId: projectId.value,
         contractId: contractId.value,
         delType: tabTypeKey.value,
         ...searchRecycleForm.value
-    }).then(({data}) => {
-        if (data.code === 200) {
-            let res = data['data'] || {}
-            recycleTableData.value = res['records'] || []
-            searchRecycleForm.value.total = res.total || 0
-        } else {
-            recycleTableData.value = []
-            searchRecycleForm.value.total = 0
-        }
     })
+    if (!error && code === 200) {
+        recycleTableData.value = getArrValue(data['records'])
+        searchRecycleForm.value.total = data.total || 0
+    } else {
+        recycleTableData.value = []
+        searchRecycleForm.value.total = 0
+    }
 }
 
 //多选
@@ -683,26 +638,23 @@ const recycleTableSelectionChange = (val) => {
 
 //恢复
 const recycleBtnLoading = ref(false)
-const recycleBtnClick = () => {
+const recycleBtnClick = async () => {
     const rows = RecycleCheckedKeys.value
     if (rows.length > 0) {
         //请求数据
         recycleBtnLoading.value = true
-        userApi.recycleBinRegain({
+        const { error, code } = await userApi.recycleBinRegain({
             projectId: projectId.value,
             contractId: contractId.value,
             delType: tabTypeKey.value,
             regainIds: rows
-        }).then(({data}) => {
-            recycleBtnLoading.value = false
-            if (data.code === 200) {
-                window?.$message?.success('操作成功')
-                searchRecycleForm.value.current = 1
-                getRecycleTableData()
-            }
-        }).catch(() => {
-            recycleBtnLoading.value = false
         })
+        recycleBtnLoading.value = false
+        if (!error && code === 200) {
+            window?.$message?.success('操作成功')
+            searchRecycleForm.value.current = 1
+            getRecycleTableData()
+        }
     } else {
         window.$message?.warning('请先勾选要恢复的数据')
     }
@@ -714,10 +666,8 @@ const recycleBtnClick = () => {
 </style>
 
 <style lang="scss">
-.user-avatar-upload {
-    .upload-dom, .upload-dom .el-upload {
-        height: 100%;
-        width: 100%;
-    }
+.user-avatar-upload .upload-dom, .upload-dom .el-upload {
+    height: 100%;
+    width: 100%;
 }
 </style>

+ 8 - 8
yarn.lock

@@ -1324,10 +1324,10 @@ vfonts@^0.0.3:
   resolved "https://registry.yarnpkg.com/vfonts/-/vfonts-0.0.3.tgz#999d66fecea18efee3f2b966c81101ae8ce01a29"
   integrity sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ==
 
-vite@^3.0.7:
-  version "3.0.7"
-  resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.7.tgz#f1e379857e9c5d652126f8b20d371e1365eb700f"
-  integrity sha512-dILhvKba1mbP1wCezVQx/qhEK7/+jVn9ciadEcyKMMhZpsuAi/eWZfJRMkmYlkSFG7Qq9NvJbgFq4XOBxugJsA==
+vite@^3.0.8:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.8.tgz#aa095ad8e3e5da46d9ec7e878f262678965d6531"
+  integrity sha512-AOZ4eN7mrkJiOLuw8IA7piS4IdOQyQCA81GxGsAQvAZzMRi9ZwGB3TOaYsj4uLAWK46T5L4AfQ6InNGlxX30IQ==
   dependencies:
     esbuild "^0.14.47"
     postcss "^8.4.16"
@@ -1355,10 +1355,10 @@ vue-router@^4.1.3:
   dependencies:
     "@vue/devtools-api" "^6.1.4"
 
-vue-utils-plus@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/vue-utils-plus/-/vue-utils-plus-1.0.0.tgz#4fd9a678e608c9ed67b18a8b04409e56be94de5a"
-  integrity sha512-n7gBvB+UBv4wanX/Mtizb3zXIg/mzxC2AFzL+xv/TSC2msU2Z+QOahLChV3ljZiZ3yqmd4zgh9cAnr8sovwjjg==
+vue-utils-plus@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/vue-utils-plus/-/vue-utils-plus-1.0.1.tgz#bc43c72232145d258e53a7096623775a97a9efc9"
+  integrity sha512-BKTSZhUFfefSB9sEN/HtuBW5/wDbVRigV55ZBMBXXN6m8iVZQjNX4mcDX/4ykalSDE3O3A3Lq/cdfhUl9t6HeA==
 
 vue@^3.2.37:
   version "3.2.37"