EditNodeDialog.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. <template>
  2. <hc-new-dialog v-model="addNodeModal" :title="title" widths="50rem" @save="confirmClick" @close="cancelClick">
  3. <el-form ref="ruleFormRef" :model="addform" :rules="rules" label-width="110px">
  4. <el-form-item label="节点名称" prop="nodeName">
  5. <el-input v-model="addform.nodeName" size="large" />
  6. </el-form-item>
  7. <!-- <el-form-item label="岗位类型" prop="postType">
  8. <el-select v-model="addform.postType" placeholder="请选择岗位" size="large" style="width:100%">
  9. <el-option v-for="item in JobTypeList" :key="item.id" :label="item.title" :value="item.id"></el-option>
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="节点类型" prop="nodeType">
  13. <el-select :disabled='addform.id' v-model="addform.nodeType" placeholder="请选择节点类型" size="large" style="width:100%">
  14. <el-option v-for="item in nodeTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item label="工程类型" prop="projectType">
  18. <el-select v-model="addform.projectType" placeholder="工程类型" size="large" style="width:100%">
  19. <el-option v-for="item in projectTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  20. </el-select>
  21. </el-form-item> -->
  22. <!-- <el-form-item label="储存类型" prop="storageType" v-if="addform.nodeType==1">
  23. <el-select v-model="addform.storageType" placeholder="请选择" size="large" style="width:100%">
  24. <el-option v-for="item in storageTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  25. </el-select>
  26. </el-form-item> -->
  27. <template v-if="true">
  28. <el-form-item label="是否存储节点" prop="isStorageNode">
  29. <el-select v-model="addform.isStorageNode" placeholder="请选择" size="large" style="width:100%">
  30. <el-option v-for="item in storageNodeList" :key="item.value" :label="item.label" :value="item.value" />
  31. </el-select>
  32. </el-form-item>
  33. <template v-if="addform.isStorageNode == 1">
  34. <el-form-item label="储存类型" prop="storageType">
  35. <el-select v-model="addform.storageType" placeholder="请选择" size="large" style="width:100%">
  36. <el-option v-for="item in storageTypeList" :key="item.value" :label="item.label" :value="item.value" />
  37. </el-select>
  38. </el-form-item>
  39. <!-- <el-form-item label="是否竣工图" prop="isBuiltDrawing">
  40. <el-select v-model="addform.isBuiltDrawing" placeholder="请选择" size="large" style="width:100%">
  41. <el-option v-for="item in builtDrawingList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="是否接口节点" prop="isInterfaceNode">
  45. <el-select v-model="addform.isInterfaceNode" placeholder="请选择" size="large" style="width:100%">
  46. <el-option v-for="item in interfaceNodeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  47. </el-select>
  48. </el-form-item>
  49. <template v-if="addform.isInterfaceNode==1">
  50. <el-form-item label="选择接口类型">
  51. <el-select v-model="addform.interfaceType" placeholder="请选择" size="large" style="width:100%">
  52. <el-option v-for="item in interfaceTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  53. </el-select>
  54. </el-form-item>
  55. </template> -->
  56. </template>
  57. </template>
  58. <!-- <template v-if="addform.nodeType==1">
  59. <el-form-item label="关联类型" prop="associationType">
  60. <el-select v-model="addform.associationType" placeholder="请选择" size="large" style="width:100%">
  61. <el-option v-for="item in associationTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
  62. </el-select>
  63. </el-form-item>
  64. <template v-if="addform.associationType==1">
  65. <el-form-item label="业内资料类型" prop="majorDataType">
  66. <el-checkbox-group v-model="addform.majorDataType">
  67. <el-checkbox v-for="item in majorDataTypeList" :key="item.dictKey" :label="item.dictKey" name="type">{{item.dictValue}}</el-checkbox>
  68. </el-checkbox-group>
  69. </el-form-item>
  70. <el-form-item label="显示层级" prop="displayHierarchy">
  71. <el-select v-model="addform.displayHierarchy" placeholder="请选择" size="large" style="width:100%">
  72. <el-option v-for="item in displayHierarchyList" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey"></el-option>
  73. </el-select>
  74. </el-form-item>
  75. </template>
  76. <template v-if="addform.associationType==2">
  77. <el-form-item label="文件类型" prop="expDataType">
  78. <el-checkbox-group v-model="addform.expDataType">
  79. <el-checkbox v-for="item in fileTypeList" :key="item.value" :label="item.label">{{item.label}}</el-checkbox>
  80. </el-checkbox-group>
  81. </el-form-item>
  82. </template>
  83. </template> -->
  84. <el-form-item label="组卷规则" prop="archiveAutoType">
  85. <el-select v-model="addform.archiveAutoType" placeholder="请选择" size="large" style="width:100%">
  86. <el-option v-for="item in archiveAutoTypeList" :key="item.value" :label="item.label" :value="item.value" />
  87. </el-select>
  88. </el-form-item>
  89. </el-form>
  90. </hc-new-dialog>
  91. </template>
  92. <script setup>
  93. import { useAppStore } from '~src/store'
  94. import { computed, nextTick, onMounted, ref, toRefs, watch } from 'vue'
  95. import { archiveTreeDetail, archiveTreeSave, archiveTreeUpdate, getDictionary, roletree } from '~api/other'
  96. import archiveFileApi from '~api/archiveFile/archiveFile'
  97. import { getArrValue, isArrItem } from 'js-fast-way'
  98. //参数
  99. const props = defineProps({
  100. projectId: {
  101. type: [String, Number],
  102. default: '',
  103. },
  104. node: {
  105. type: Object,
  106. default: () => ({}),
  107. },
  108. show:{
  109. type:Boolean,
  110. default:false,
  111. },
  112. type: {
  113. type: String,
  114. default: '',
  115. },
  116. })
  117. //事件
  118. const emit = defineEmits(['hide'])
  119. const useAppState = useAppStore()
  120. const contractId = ref(useAppState.getContractId)
  121. const projectId = ref(props.projectId)
  122. // 使用toRefs结构,使其具有响应式
  123. const { node } = toRefs(props)
  124. //监听
  125. watch(() => [
  126. props.projectId,
  127. ], ([UserProjectId]) => {
  128. projectId.value = UserProjectId
  129. })
  130. watch(() => [props.show, props.type], ([newShow, newType])=>{
  131. //console.log(newShow,newType)
  132. if (newShow) {
  133. if (newType == 'add') {
  134. addNode()
  135. } else if (newType == 'edit') {
  136. editNodeModal()
  137. }
  138. } else {
  139. cancelClick()
  140. addNodeModal.value = false
  141. }
  142. })
  143. //计算属性
  144. let title = computed(()=>{
  145. if (props.type == 'add') {
  146. return '新增'
  147. } else if (props.type == 'edit') {
  148. return '编辑'
  149. }
  150. })
  151. //渲染完成
  152. onMounted(() => {
  153. //数据初始化
  154. //getJobTypeList()
  155. //major_data_type()
  156. //display_hierarchy()
  157. })
  158. //新增弹窗
  159. let addform = ref({})
  160. let addNodeModal = ref(false)
  161. const addNode = async ()=>{
  162. //console.log(node.value.data)
  163. const { code, data } = await archiveTreeDetail({
  164. id:node.value.data.id,
  165. })
  166. if (code == 200) {
  167. delete data['id']
  168. delete data['nodeName']
  169. //新增的信息和父级一样
  170. //是否竣工图,是否接口节点。默认否
  171. data.isInterfaceNode = 2
  172. data.interfaceType = 2
  173. addform.value = data
  174. console.log(data, 'data')
  175. addNodeModal.value = true
  176. if (data.isStorageNode == 1) {
  177. emit('hide', {})
  178. window.$message.warning('存储节点下面不允许新增节点')
  179. }
  180. }
  181. }
  182. const cancelClick = () => {
  183. emit('hide', {})
  184. addNodeModal.value = false
  185. }
  186. // const confirmClick = async () => {
  187. // await ruleFormRef.value.validate(async (valid, fields) => {
  188. // if (valid) {
  189. // let form = {
  190. // id: addform.value.id,
  191. // projectId:projectId.value,
  192. // parentId: node.value.data.id, //上级节点id
  193. // nodeName: addform.value.nodeName, //节点名称
  194. // nodeType: addform.value.nodeType, // 节点类型
  195. // postType: addform.value.postType, //岗位类型
  196. // projectType:addform.value.projectType, //工程类型
  197. // storageType:addform.value.storageType, //储存类型
  198. // }
  199. // if(addform.value.nodeType == 2){
  200. // form.isStorageNode = addform.value.isStorageNode //是否为存储节点
  201. // if(addform.value.isStorageNode == 1){
  202. // form.isBuiltDrawing = addform.value.isBuiltDrawing //竣工图
  203. // form.isInterfaceNode = addform.value.isInterfaceNode //是否接口节点
  204. // if(addform.value.isInterfaceNode == 1){
  205. // form.interfaceType = addform.value.interfaceType //选择接口类型
  206. // }
  207. // }else{
  208. // delete form.storageType
  209. // }
  210. // }else if (addform.value.nodeType == 1){
  211. // form.associationType = addform.value.associationType //关联类型
  212. // if(addform.value.associationType == 1){
  213. // form.majorDataType = addform.value.majorDataType //内业资料类型
  214. // form.displayHierarchy = addform.value.displayHierarchy //显示层级
  215. // }else if(addform.value.associationType == 2){
  216. // // form.expDataType = addform.value.expDataType.join(',')//文件类型
  217. // form.expDataType = addform.value.expDataType//文件类型
  218. // }
  219. // }
  220. // await saveTreeNode(form)
  221. // addNodeModal.value = false
  222. // }
  223. // })
  224. // }
  225. const confirmClick = async () => {
  226. await ruleFormRef.value.validate(async (valid, fields) => {
  227. if (valid) {
  228. let form = {
  229. id: addform.value.id,
  230. projectId:projectId.value,
  231. parentId: node.value.data.id, //上级节点id
  232. nodeName: addform.value.nodeName, //节点名称
  233. nodeType: addform.value.nodeType, // 节点类型
  234. postType: addform.value.postType, //岗位类型
  235. archiveAutoType:addform.value.archiveAutoType, //组卷规则
  236. projectType:addform.value.projectType, //工程类型
  237. storageType:addform.value.storageType, //储存类型
  238. }
  239. form.isStorageNode = addform.value.isStorageNode //是否为存储节点
  240. if (addform.value.isStorageNode == 1) {
  241. form.isBuiltDrawing = addform.value.isBuiltDrawing //竣工图
  242. form.isInterfaceNode = addform.value.isInterfaceNode //是否接口节点
  243. if (addform.value.isInterfaceNode == 1) {
  244. form.interfaceType = addform.value.interfaceType //选择接口类型
  245. }
  246. } else {
  247. delete form.storageType
  248. }
  249. form.associationType = addform.value.associationType //关联类型
  250. if (addform.value.associationType == 1) {
  251. form.majorDataType = addform.value.majorDataType //内业资料类型
  252. form.displayHierarchy = addform.value.displayHierarchy //显示层级
  253. } else if (addform.value.associationType == 2) {
  254. // form.expDataType = addform.value.expDataType.join(',')//文件类型
  255. form.expDataType = addform.value.expDataType//文件类型
  256. }
  257. await saveTreeNode(form)
  258. cancelClick()
  259. }
  260. })
  261. }
  262. const saveTreeNode = async (form)=>{
  263. if (form?.majorDataType && isArrItem( form?.majorDataType)) {
  264. if (form.majorDataType.length > 0) {
  265. let das = ''
  266. form.majorDataType.forEach((val, key) => {
  267. das += val
  268. if (form.majorDataType.length - 1 != key) {
  269. das += ','
  270. }
  271. })
  272. form.majorDataType = das
  273. }
  274. }
  275. if (addform.value.id) {
  276. console.log(isEditsto.value, 'isEditsto.value')
  277. console.log(ishabvFile.value, 'ishabvFile.value')
  278. // await archiveTreeUpdateHandle(form)
  279. /*if (isEditsto.value === 1 && addform.value.isStorageNode === 2 && ishabvFile.value) {
  280. //是否存储类型由是改为否,要判断该节点下是否有存储文件
  281. window.$message.warning('当前节点下有存储文件,请迁移或删除后再变更')
  282. } else {
  283. await archiveTreeUpdateHandle(form)
  284. }*/
  285. await archiveTreeUpdateHandle(form)
  286. } else {
  287. await archiveTreeSaveHandle(form)
  288. }
  289. }
  290. const archiveTreeSaveHandle = async (form)=>{//新增
  291. //console.log(form);
  292. const { code, data } = await archiveTreeSave(form)
  293. //console.log(res);
  294. if (code == 200) {
  295. window.$message?.success('新增成功')
  296. window?.location?.reload() //刷新页面
  297. }
  298. }
  299. const archiveTreeUpdateHandle = async (form)=>{//编辑
  300. //console.log(form);
  301. const { code } = await archiveTreeUpdate(form)
  302. //console.log(res);
  303. if (code == 200) {
  304. window.$message?.success('修改成功')
  305. node.value.data.title = form.nodeName
  306. node.value.data.isStorageNode = form.isStorageNode
  307. node.value.data.storageType = form.storageType
  308. }
  309. }
  310. const ishabvFile = ref(false)
  311. //查询该节点下有没有文件
  312. const getTableData = async (nodeid) => {
  313. console.log(contractId.value, 'contractId.value')
  314. const { error, code, data } = await archiveFileApi.getarchiveFilePage({
  315. nodeIds: nodeid,
  316. current: 1,
  317. size: 20,
  318. total: 0,
  319. projectId: projectId.value,
  320. contractId:contractId.value,
  321. })
  322. if (!error && code === 200) {
  323. let dataarr = getArrValue(data['records'])
  324. if (dataarr.length > 0) {
  325. ishabvFile.value = true
  326. } else {
  327. ishabvFile.value = false
  328. }
  329. } else {
  330. ishabvFile.value = false
  331. }
  332. }
  333. const isEditsto = ref('')//原始为存储节点
  334. //编辑节点
  335. const editNodeModal = async ()=>{
  336. getTableData(node.value.data.id)
  337. const { code, data } = await archiveTreeDetail({
  338. id:node.value.data.id,
  339. })
  340. if (code == 200) {
  341. console.log(data, 'data')
  342. addform.value = data
  343. isEditsto.value = data.isStorageNode
  344. addNodeModal.value = true
  345. }
  346. //addform.value = node.data;
  347. }
  348. const ruleFormRef = ref(null)
  349. const rules = ref({
  350. nodeName: [{ required: true, message: '请输入节点名称', trigger: 'blur' }],
  351. postType: [{ required: true, message: '请选择岗位类型', trigger: 'change' }],
  352. nodeType: [{ required: true, message: '请选择节点类型', trigger: 'change' }],
  353. isStorageNode: [{ required: true, message: '请选择存储节点', trigger: 'change' }],
  354. isBuiltDrawing: [{ required: true, message: '请选择竣工图', trigger: 'change' }],
  355. isInterfaceNode: [{ required: true, message: '请选择接口节点', trigger: 'change' }],
  356. interfaceType: [{ required: true, message: '请选择接口类型', trigger: 'change' }],
  357. associationType: [{ required: true, message: '请选择关联类型', trigger: 'change' }],
  358. majorDataType: [{ required: true, message: '请选择业内资料类型', trigger: 'change' }],
  359. displayHierarchy: [{ required: true, message: '请选择显示层级', trigger: 'change' }],
  360. projectType: [{ required: true, message: '请选择工程类型', trigger: 'change' }],
  361. storageType: [{ required: true, message: '请选择储存类型', trigger: 'change' }],
  362. expDataType: [{ required: true, message: '请选择文件类型', trigger: 'change' }],
  363. })
  364. //类型枚举
  365. let JobTypeList = ref([])//岗位类型枚举
  366. const getJobTypeList = async () => {//岗位类型枚举
  367. const { data, code } = await roletree()
  368. //console.log(res);
  369. if (code == 200) {
  370. JobTypeList.value = data
  371. }
  372. }
  373. let majorDataTypeList = ref([])
  374. const major_data_type = async () => {//内业资料类型
  375. const { data, code } = await getDictionary({ code: 'major_data_type' })
  376. //console.log(res);
  377. if (code == 200) {
  378. majorDataTypeList.value = data
  379. }
  380. }
  381. let displayHierarchyList = ref([])
  382. const display_hierarchy = async () => {//显示层级
  383. const { data, code } = await getDictionary({ code: 'display_hierarchy' })
  384. //console.log(res);
  385. if (code == 200) {
  386. displayHierarchyList.value = data
  387. }
  388. }
  389. const nodeTypeList = [
  390. {
  391. label: '关联电子原生文件',
  392. value: 1,
  393. }, {
  394. label: '数字化上传文件',
  395. value: 2,
  396. },
  397. ]//节点类型枚举
  398. const projectTypeList = [
  399. {
  400. label: '水利水电工程',
  401. value: 1,
  402. }, {
  403. label: '公路工程',
  404. value: 2,
  405. }, {
  406. label: '全部',
  407. value: 3,
  408. },
  409. ]//工程类型枚举
  410. const storageTypeList = [
  411. {
  412. label: '普通',
  413. value: 1,
  414. }, {
  415. label: '竣工图',
  416. value: 2,
  417. }, {
  418. label: '计量',
  419. value: 3,
  420. }, {
  421. label: '质检',
  422. value: 4,
  423. }, {
  424. label: '声像',
  425. value: 5,
  426. }, {
  427. label: '隐蔽',
  428. value: 6,
  429. }, {
  430. label: '原材试验',
  431. value: 7,
  432. }, {
  433. label: '管理文件',
  434. value: 8,
  435. }, {
  436. label: '变更令',
  437. value: 9,
  438. },
  439. ]//储存类型枚举
  440. const storageNodeList = [
  441. {
  442. label: '是',
  443. value: 1,
  444. }, {
  445. label: '否',
  446. value: 2,
  447. },
  448. ]//存储节点枚举
  449. const builtDrawingList = [{
  450. label: '是',
  451. value: 1,
  452. }, {
  453. label: '否',
  454. value: 2,
  455. },
  456. ]//竣工图枚举
  457. const interfaceNodeList = [
  458. {
  459. label: '是',
  460. value: 1,
  461. }, {
  462. label: '否',
  463. value: 2,
  464. },
  465. ]//接口节点枚举
  466. const interfaceTypeList = [
  467. {
  468. label: '试验接口',
  469. value: 1,
  470. }, {
  471. label: '计量接口',
  472. value: 2,
  473. },
  474. ]//选择接口类型枚举
  475. const associationTypeList = [
  476. {
  477. label: '质检资料',
  478. value: 1,
  479. },
  480. {
  481. label: '试验资料',
  482. value: 2,
  483. },
  484. {
  485. label: '影像资料',
  486. value: 3,
  487. },
  488. {
  489. label: '台账资料',
  490. value: 4,
  491. }, {
  492. label: '首件资料',
  493. value: 5,
  494. }, {
  495. label: '日志文件',
  496. value: 6,
  497. },
  498. ]
  499. const fileTypeList = [
  500. {
  501. label: '配合比',
  502. value: 1,
  503. },
  504. {
  505. label: '原材',
  506. value: 2,
  507. }, {
  508. label: '汇总',
  509. value: 3,
  510. }, {
  511. label: '设备',
  512. value: 4,
  513. }, {
  514. label: '外委(第三方)',
  515. value: 5,
  516. },
  517. ]
  518. //组卷规则
  519. const archiveAutoTypeList = [
  520. {
  521. label: '最高组卷',
  522. value: 1,
  523. },
  524. {
  525. label: '分类并卷',
  526. value: 2,
  527. }, {
  528. label: '单独组卷',
  529. value: 3,
  530. },
  531. ]
  532. </script>