set.vue 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. <template>
  2. <hc-card scrollbar class="hc-system-set-box">
  3. <div class="hc-system-set-title hc-flex">
  4. <div class="title flex-1">
  5. <hc-icon class="font-bold" name="alarm-warning" />
  6. <span class="ml-1 text-[18px] font-bold">项目异常设置</span>
  7. </div>
  8. <div class="extra">
  9. <el-button :loading="saveProjectWarningLoad" class="ml-8 text-white" color="#20C98B" @click="saveProjectWarning">保存项目异常设置</el-button>
  10. </div>
  11. </div>
  12. <div class="warn-box-items flex">
  13. <el-row :gutter="14">
  14. <el-col :span="12" class="h-full">
  15. <div class="warn-item h-full">
  16. <div class="warn-item-tilte">投资进展缓慢</div>
  17. <div class="warn-item-inner">
  18. <el-row :gutter="4" class="h-full">
  19. <el-col :span="12">
  20. <div class="warn-item-inner-box">
  21. <div class="text-center text-14px">第一季度</div>
  22. <div class="warn-item-inner-title mt-2 text-right text-14px">该季度投资计划完成比例</div>
  23. <div class="warn-item-inner-box-detail">
  24. <div class="arrow w-60px text-14px">三级</div>
  25. <div class="container">
  26. <div class="triangle" />
  27. </div>
  28. <div class="hc-flex">
  29. <span class="mr-1"> < </span>
  30. <HcInputNumber v-model="projectWarning[0].oneThree" />
  31. <span class="ml-1">%</span>
  32. </div>
  33. </div>
  34. <div class="warn-item-inner-box-detail">
  35. <div class="arrow arrow-oringe w-60px text-14px">二级</div>
  36. <div class="container">
  37. <div class="triangle" />
  38. </div>
  39. <div class="hc-flex">
  40. <span class="mr-1"> < </span>
  41. <HcInputNumber v-model="projectWarning[0].oneTwo" />
  42. <span class="ml-1">%</span>
  43. </div>
  44. </div>
  45. <div class="warn-item-inner-box-detail">
  46. <div class="arrow arrow-red w-60px text-14px"> 一级</div>
  47. <div class="container">
  48. <div class="triangle" />
  49. </div>
  50. <div class="hc-flex">
  51. <span class="mr-1"> < </span>
  52. <HcInputNumber v-model="projectWarning[0].oneOne" />
  53. <span class="ml-1">%</span>
  54. </div>
  55. </div>
  56. </div>
  57. </el-col>
  58. <el-col :span="12">
  59. <div class="warn-item-inner-box">
  60. <div class="text-center text-14px">第二季度</div>
  61. <div class="warn-item-inner-box-title mt-2 text-14px">
  62. <div class="flex-1" />
  63. <div class="warn-item-inner-title flex-1 text-center">该季度投资计划完成比例</div>
  64. <div class="warn-item-inner-title ml-2 flex-1 text-center">前两季度累计投资计化完成比例</div>
  65. </div>
  66. <div class="warn-item-inner-box-detail">
  67. <div>
  68. <div class="arrow"> 三级</div>
  69. <div class="container">
  70. <div class="triangle" />
  71. </div>
  72. </div>
  73. <div class="hc-flex">
  74. <span class="mr-1"> < </span>
  75. <HcInputNumber v-model="projectWarning[0].twoThree" />
  76. <span class="ml-1">%</span>
  77. </div>
  78. <div class="hc-flex">
  79. <span class="mr-1"><</span>
  80. <HcInputNumber v-model="projectWarning[0].twoThreeAll" />
  81. <span class="ml-1">%</span>
  82. </div>
  83. </div>
  84. <div class="warn-item-inner-box-detail">
  85. <div>
  86. <div class="arrow arrow-oringe"> 二级</div>
  87. <div class="container">
  88. <div class="triangle" />
  89. </div>
  90. </div>
  91. <div class="hc-flex">
  92. <span class="mr-1"><</span>
  93. <HcInputNumber v-model="projectWarning[0].twoTwo" />
  94. <span class="ml-1">%</span>
  95. </div>
  96. <div class="hc-flex">
  97. <span class="mr-1"><</span>
  98. <HcInputNumber v-model="projectWarning[0].twoTwoAll" />
  99. <span class="ml-1">%</span>
  100. </div>
  101. </div>
  102. <div class="warn-item-inner-box-detail">
  103. <div>
  104. <div class="arrow arrow-red"> 一级</div>
  105. <div class="container">
  106. <div class="triangle" />
  107. </div>
  108. </div>
  109. <div class="hc-flex">
  110. <span class="mr-1"><</span>
  111. <HcInputNumber v-model="projectWarning[0].twoOne" />
  112. <span class="ml-1">%</span>
  113. </div>
  114. <div class="hc-flex">
  115. <span class="mr-1"><</span>
  116. <HcInputNumber v-model="projectWarning[0].twoOneAll" />
  117. <span class="ml-1">%</span>
  118. </div>
  119. </div>
  120. </div>
  121. </el-col>
  122. <el-col :span="12">
  123. <div class="warn-item-inner-box">
  124. <div class="text-center text-14px">第三季度</div>
  125. <div class="warn-item-inner-box-title mt-2 text-14px">
  126. <div class="flex-1" />
  127. <div class="warn-item-inner-title flex-1 text-center">
  128. 该季度投资计划完成比例
  129. </div>
  130. <div class="warn-item-inner-title ml-2 flex-1 text-center">
  131. 前三季度累计投资计化完成比例
  132. </div>
  133. </div>
  134. <div class="warn-item-inner-box-detail">
  135. <div>
  136. <div class="arrow"> 三级</div>
  137. <div class="container">
  138. <div class="triangle" />
  139. </div>
  140. </div>
  141. <div class="hc-flex">
  142. <span class="mr-1"> < </span>
  143. <HcInputNumber v-model="projectWarning[0].threeThree" />
  144. <span class="ml-1">%</span>
  145. </div>
  146. <div class="hc-flex">
  147. <span class="mr-1"> < </span>
  148. <HcInputNumber v-model="projectWarning[0].threeThreeAll" />
  149. <span class="ml-1">%</span>
  150. </div>
  151. </div>
  152. <div class="warn-item-inner-box-detail">
  153. <div>
  154. <div class="arrow arrow-oringe"> 二级</div>
  155. <div class="container">
  156. <div class="triangle" />
  157. </div>
  158. </div>
  159. <div class="hc-flex">
  160. <span class="mr-1"><</span>
  161. <HcInputNumber v-model="projectWarning[0].threeTwo" />
  162. <span class="ml-1">%</span>
  163. </div>
  164. <div class="hc-flex">
  165. <span class="mr-1"><</span>
  166. <HcInputNumber v-model="projectWarning[0].threeTwoAll" />
  167. <span class="ml-1">%</span>
  168. </div>
  169. </div>
  170. <div class="warn-item-inner-box-detail">
  171. <div>
  172. <div class="arrow arrow-red"> 一级</div>
  173. <div class="container">
  174. <div class="triangle" />
  175. </div>
  176. </div>
  177. <div class="hc-flex">
  178. <span class="mr-1"><</span>
  179. <HcInputNumber v-model="projectWarning[0].threeOne" />
  180. <span class="ml-1">%</span>
  181. </div>
  182. <div class="hc-flex">
  183. <span class="mr-1"><</span>
  184. <HcInputNumber v-model="projectWarning[0].threeOneAll" />
  185. <span class="ml-1">%</span>
  186. </div>
  187. </div>
  188. </div>
  189. </el-col>
  190. <el-col :span="12">
  191. <div class="warn-item-inner-box">
  192. <div class="text-center text-14px">第四季度</div>
  193. <div class="warn-item-inner-box-title mt-2 text-14px">
  194. <div class="flex-1" />
  195. <div class="warn-item-inner-title flex-1 text-center">
  196. 该季度投资计划完成比例
  197. </div>
  198. <div class="warn-item-inner-title ml-2 flex-1 text-center">
  199. 当年度累计投资计化完成比例
  200. </div>
  201. </div>
  202. <div class="warn-item-inner-box-detail">
  203. <div>
  204. <div class="arrow"> 三级</div>
  205. <div class="container">
  206. <div class="triangle" />
  207. </div>
  208. </div>
  209. <div class="hc-flex">
  210. <span class="mr-1"> < </span>
  211. <HcInputNumber v-model="projectWarning[0].fourThree" />
  212. <span class="ml-1">%</span>
  213. </div>
  214. <div class="hc-flex">
  215. <span class="mr-1"><</span>
  216. <HcInputNumber v-model="projectWarning[0].fourThreeAll" />
  217. <span class="ml-1">%</span>
  218. </div>
  219. </div>
  220. <div class="warn-item-inner-box-detail">
  221. <div>
  222. <div class="arrow arrow-oringe"> 二级</div>
  223. <div class="container">
  224. <div class="triangle" />
  225. </div>
  226. </div>
  227. <div class="hc-flex">
  228. <span class="mr-1"><</span>
  229. <HcInputNumber v-model="projectWarning[0].fourTwo" />
  230. <span class="ml-1">%</span>
  231. </div>
  232. <div class="hc-flex">
  233. <span class="mr-1"><</span>
  234. <HcInputNumber v-model="projectWarning[0].fourTwoAll" />
  235. <span class="ml-1">%</span>
  236. </div>
  237. </div>
  238. <div class="warn-item-inner-box-detail">
  239. <div>
  240. <div class="arrow arrow-red"> 一级</div>
  241. <div class="container">
  242. <div class="triangle" />
  243. </div>
  244. </div>
  245. <div class="hc-flex">
  246. <span class="mr-1"><</span>
  247. <HcInputNumber v-model="projectWarning[0].fourOne" />
  248. <span class="ml-1">%</span>
  249. </div>
  250. <div class="hc-flex">
  251. <span class="mr-1"><</span>
  252. <HcInputNumber v-model="projectWarning[0].fourOneAll" />
  253. <span class="ml-1">%</span>
  254. </div>
  255. </div>
  256. </div>
  257. </el-col>
  258. </el-row>
  259. </div>
  260. </div>
  261. </el-col>
  262. <el-col :span="12" class="h-full">
  263. <div class="warn-item h-full">
  264. <div class="warn-item-tilte">建设进展缓慢</div>
  265. <div class="warn-item-inner">
  266. <el-row :gutter="4" class="h-full">
  267. <el-col :span="12">
  268. <div class="warn-item-inner-box">
  269. <div class="text-center text-14px">第一季度</div>
  270. <div class="warn-item-inner-title mt-2 text-right text-14px">该季度工作计划完成比例</div>
  271. <div class="warn-item-inner-box-detail">
  272. <div class="arrow w-60px text-14px">三级</div>
  273. <div class="container">
  274. <div class="triangle" />
  275. </div>
  276. <div class="hc-flex">
  277. <span class="mr-1"> < </span>
  278. <HcInputNumber v-model="projectWarning[1].oneThree" />
  279. <span class="ml-1">%</span>
  280. </div>
  281. </div>
  282. <div class="warn-item-inner-box-detail">
  283. <div class="arrow arrow-oringe w-60px text-14px">二级</div>
  284. <div class="container">
  285. <div class="triangle" />
  286. </div>
  287. <div class="hc-flex">
  288. <span class="mr-1"> < </span>
  289. <HcInputNumber v-model="projectWarning[1].oneTwo" />
  290. <span class="ml-1">%</span>
  291. </div>
  292. </div>
  293. <div class="warn-item-inner-box-detail">
  294. <div class="arrow arrow-red w-60px text-14px"> 一级</div>
  295. <div class="container">
  296. <div class="triangle" />
  297. </div>
  298. <div class="hc-flex">
  299. <span class="mr-1"> < </span>
  300. <HcInputNumber v-model="projectWarning[1].oneOne" />
  301. <span class="ml-1">%</span>
  302. </div>
  303. </div>
  304. </div>
  305. </el-col>
  306. <el-col :span="12">
  307. <div class="warn-item-inner-box">
  308. <div class="text-center text-14px">第二季度</div>
  309. <div class="warn-item-inner-title mt-2 text-right text-14px">
  310. 该季度工作计划完成比例
  311. </div>
  312. <div class="warn-item-inner-box-detail">
  313. <div class="arrow w-60px text-14px">三级</div>
  314. <div class="container">
  315. <div class="triangle" />
  316. </div>
  317. <div class="hc-flex">
  318. <span class="mr-1"> < </span>
  319. <HcInputNumber v-model="projectWarning[1].twoThree" />
  320. <span class="ml-1">%</span>
  321. </div>
  322. </div>
  323. <div class="warn-item-inner-box-detail">
  324. <div class="arrow arrow-oringe w-60px text-14px">二级</div>
  325. <div class="container">
  326. <div class="triangle" />
  327. </div>
  328. <div class="hc-flex">
  329. <span class="mr-1"> < </span>
  330. <HcInputNumber v-model="projectWarning[1].twoTwo" />
  331. <span class="ml-1">%</span>
  332. </div>
  333. </div>
  334. <div class="warn-item-inner-box-detail">
  335. <div class="arrow arrow-red w-60px text-14px"> 一级</div>
  336. <div class="container">
  337. <div class="triangle" />
  338. </div>
  339. <div class="hc-flex">
  340. <span class="mr-1"> < </span>
  341. <HcInputNumber v-model="projectWarning[1].twoOne" />
  342. <span class="ml-1">%</span>
  343. </div>
  344. </div>
  345. </div>
  346. </el-col>
  347. <el-col :span="12">
  348. <div class="warn-item-inner-box">
  349. <div class="text-center text-14px">第三季度</div>
  350. <div class="warn-item-inner-title mt-2 text-right text-14px">
  351. 该季度工作计划完成比例
  352. </div>
  353. <div class="warn-item-inner-box-detail">
  354. <div class="arrow w-60px text-14px">三级</div>
  355. <div class="container">
  356. <div class="triangle" />
  357. </div>
  358. <div class="hc-flex">
  359. <span class="mr-1"> < </span>
  360. <HcInputNumber v-model="projectWarning[1].threeThree" />
  361. <span class="ml-1">%</span>
  362. </div>
  363. </div>
  364. <div class="warn-item-inner-box-detail">
  365. <div class="arrow arrow-oringe w-60px text-14px">二级</div>
  366. <div class="container">
  367. <div class="triangle" />
  368. </div>
  369. <div class="hc-flex">
  370. <span class="mr-1"> < </span>
  371. <HcInputNumber v-model="projectWarning[1].threeTwo" />
  372. <span class="ml-1">%</span>
  373. </div>
  374. </div>
  375. <div class="warn-item-inner-box-detail">
  376. <div class="arrow arrow-red w-60px text-14px"> 一级</div>
  377. <div class="container">
  378. <div class="triangle" />
  379. </div>
  380. <div class="hc-flex">
  381. <span class="mr-1"> < </span>
  382. <HcInputNumber v-model="projectWarning[1].threeOne" />
  383. <span class="ml-1">%</span>
  384. </div>
  385. </div>
  386. </div>
  387. </el-col>
  388. <el-col :span="12">
  389. <div class="warn-item-inner-box">
  390. <div class="text-center text-14px">第四季度</div>
  391. <div class="warn-item-inner-title mt-2 text-right text-14px">
  392. 该季度工作计划完成比例
  393. </div>
  394. <div class="warn-item-inner-box-detail">
  395. <div class="arrow w-60px text-14px">三级</div>
  396. <div class="container">
  397. <div class="triangle" />
  398. </div>
  399. <div class="hc-flex">
  400. <span class="mr-1"> < </span>
  401. <HcInputNumber v-model="projectWarning[1].fourThree" />
  402. <span class="ml-1">%</span>
  403. </div>
  404. </div>
  405. <div class="warn-item-inner-box-detail">
  406. <div class="arrow arrow-oringe w-60px text-14px">二级</div>
  407. <div class="container">
  408. <div class="triangle" />
  409. </div>
  410. <div class="hc-flex">
  411. <span class="mr-1"> < </span>
  412. <HcInputNumber v-model="projectWarning[1].fourTwo" />
  413. <span class="ml-1">%</span>
  414. </div>
  415. </div>
  416. <div class="warn-item-inner-box-detail">
  417. <div class="arrow arrow-red w-60px text-14px"> 一级</div>
  418. <div class="container">
  419. <div class="triangle" />
  420. </div>
  421. <div class="hc-flex">
  422. <span class="mr-1"> < </span>
  423. <HcInputNumber v-model="projectWarning[1].fourOne" />
  424. <span class="ml-1">%</span>
  425. </div>
  426. </div>
  427. </div>
  428. </el-col>
  429. </el-row>
  430. </div>
  431. </div>
  432. </el-col>
  433. </el-row>
  434. </div>
  435. <div class="hc-system-set-title hc-flex mt-5">
  436. <hc-icon class="font-bold" name="projector" />
  437. <span class="ml-1 text-[18px] font-bold">项目相关设置</span>
  438. </div>
  439. <div class="hc-system-set-project">
  440. <div class="set-project-row">
  441. <el-row :gutter="24">
  442. <el-col :span="8">
  443. <div class="set-project-row-col">
  444. <div class="set-project-row-col-title hc-flex">
  445. <div class="title flex-1">
  446. <span class="mr-2">项目阶段</span>
  447. <span class="text-14px">(重点项目推进计划)</span>
  448. </div>
  449. <div class="extra">
  450. <el-button :loading="saveProStationLoad" class="text-white" color="#20C98B" @click="saveProStation">保存项目阶段</el-button>
  451. </div>
  452. </div>
  453. <div class="set-project-row-col-content max-h-300px">
  454. <div v-for="(item, index) in proStation" :key="index" class="hc-flex mt-1">
  455. <el-input v-model="item.dictValue" placeholder="阶段名称" class="flex-1" />
  456. <el-link :underline="false" type="primary" class="ml-2">
  457. <hc-icon class="text-20px font-bold" name="add" @click="addClick(item, index)" />
  458. </el-link>
  459. <el-link :underline="false" type="danger" class="ml-1">
  460. <hc-icon class="text-20px font-bold" name="close" @click="delClick(item, index)" />
  461. </el-link>
  462. </div>
  463. </div>
  464. </div>
  465. </el-col>
  466. <el-col :span="8">
  467. <div class="set-project-row-col">
  468. <div class="set-project-row-col-title hc-flex">
  469. <div class="title flex-1">项目类型</div>
  470. <div class="extra">
  471. <el-button :loading="saveProTypenLoad" class="text-white" color="#20C98B" @click="saveProType">保存项目类型</el-button>
  472. </div>
  473. </div>
  474. <div class="set-project-row-col-content max-h-300px">
  475. <div v-for="(item, index) in proType" :key="index" class="hc-flex mt-1">
  476. <el-input v-model="item.dictValue" placeholder="类型名称" class="flex-1" />
  477. <el-link :underline="false" type="primary" class="ml-2">
  478. <hc-icon class="text-20px font-bold" name="add" @click="addClickType(item, index)" />
  479. </el-link>
  480. <el-link :underline="false" type="danger" class="ml-1">
  481. <hc-icon class="text-20px font-bold" name="close" @click="delClickType(item, index)" />
  482. </el-link>
  483. </div>
  484. </div>
  485. </div>
  486. </el-col>
  487. <el-col :span="8">
  488. <div class="set-project-row-col">
  489. <div class="set-project-row-col-title hc-flex">
  490. <div class="title flex-1">
  491. <span class="mr-2">项目阶段</span>
  492. <span class="text-14px">(工作要点任务分工)</span>
  493. </div>
  494. <div class="extra">
  495. <el-button :loading="savProStationTipLoad" class="text-white" color="#20C98B" @click="saveProStationTip">保存项目阶段</el-button>
  496. </div>
  497. </div>
  498. <div class="set-project-row-col-content max-h-300px">
  499. <div v-for="(item, index) in proStationTip" :key="index" class="hc-flex mt-1">
  500. <el-input v-model="item.dictValue" placeholder="阶段名称" class="flex-1" />
  501. <el-link :underline="false" type="primary" class="ml-2">
  502. <hc-icon class="text-20px font-bold" name="add" @click="addClickTip(item, index)" />
  503. </el-link>
  504. <el-link :underline="false" type="danger" class="ml-1">
  505. <hc-icon class="text-20px font-bold" name="close" @click="delClickTip(item, index)" />
  506. </el-link>
  507. </div>
  508. </div>
  509. </div>
  510. </el-col>
  511. </el-row>
  512. </div>
  513. </div>
  514. </hc-card>
  515. </template>
  516. <script setup>
  517. import { onMounted, ref } from 'vue'
  518. import { getDictionary, saveDict } from '~api/dictbiz'
  519. import { projectDetailWarning, projectSaveWarning } from '~api/other'
  520. import { arrToKey, getArrValue, isArrItem } from 'js-fast-way'
  521. import HcInputNumber from './modules/input-number.vue'
  522. onMounted(() => {
  523. projectWarningDetail()
  524. getProStation()
  525. getProType()
  526. getProStationTip()
  527. })
  528. //项目预警详情
  529. const projectWarning = ref([{ warningType: 1 }, { warningType: 2 }])
  530. const projectWarningDetail = async () => {
  531. const { data } = await projectDetailWarning()
  532. const res = getArrValue(data?.list)
  533. if (res.length <= 0 ) {
  534. projectWarning.value = [{ warningType: 1 }, { warningType: 2 }]
  535. } else {
  536. projectWarning.value = res
  537. }
  538. }
  539. //保存项目预警
  540. const saveProjectWarningLoad = ref(false)
  541. const saveProjectWarning = async () => {
  542. saveProjectWarningLoad.value = true
  543. const list = projectWarning.value
  544. const { error, code, msg } = await projectSaveWarning(list)
  545. saveProjectWarningLoad.value = false
  546. if (!error && code === 200) {
  547. window?.$message?.success(msg)
  548. projectWarningDetail().then()
  549. } else {
  550. window.$message.error(msg ?? '操作失败')
  551. }
  552. }
  553. //相关相关设置
  554. const proStation = ref([{ dictValue: '' }])
  555. const getProStation = async () => {
  556. const { error, code, data } = await getDictionary({ code: 'projectStage' })
  557. if (!error && code === 200) {
  558. proStation.value = getArrValue(data)
  559. if (proStation.value.length === 0) {
  560. proStation.value = [
  561. { dictValue: '' },
  562. ]
  563. }
  564. } else {
  565. proStation.value = []
  566. }
  567. }
  568. const addClick = (item, index) => {
  569. proStation.value.splice(index + 1, 0, { dictValue: '' })
  570. }
  571. const delClick = (item, index) => {
  572. if (proStation.value.length === 1) {
  573. window.$message.warning('请至少保留一条数据')
  574. return
  575. }
  576. proStation.value.splice(index, 1)
  577. }
  578. const saveProStationLoad = ref(false)
  579. const saveProStation = async () => {
  580. const list = arrToKey(proStation.value, 'dictValue', ',').split(',')
  581. const isIn = isArrItem(list, '') // true
  582. if (isIn) {
  583. window.$message.warning('请输入阶段名称')
  584. return
  585. }
  586. saveProStationLoad.value = true
  587. const { error, code, msg } = await saveDict({ type: 'projectStage', list })
  588. saveProStationLoad.value = false
  589. if (!error && code === 200) {
  590. window?.$message?.success(msg)
  591. getProStation()
  592. } else {
  593. window.$message.error(msg ?? '操作失败')
  594. }
  595. }
  596. const proType = ref([
  597. { name: '铁路' },
  598. { name: '建成项目' },
  599. ])
  600. const getProType = async () => {
  601. const { error, code, data } = await getDictionary({ code: 'projectType' })
  602. if (!error && code === 200) {
  603. proType.value = getArrValue(data)
  604. if (proType.value.length === 0) {
  605. proType.value = [
  606. { dictValue: '' },
  607. ]
  608. }
  609. } else {
  610. proType.value = []
  611. }
  612. }
  613. const addClickType = (item, index) => {
  614. proType.value.splice(index + 1, 0, { dictValue: '' })
  615. }
  616. const delClickType = (item, index) => {
  617. if (proType.value.length === 1) {
  618. window.$message.warning('请至少保留一条数据')
  619. return
  620. }
  621. proType.value.splice(index, 1)
  622. }
  623. const saveProTypenLoad = ref(false)
  624. const saveProType = async () => {
  625. const list = arrToKey(proType.value, 'dictValue', ',').split(',')
  626. const isIn = isArrItem(list, '') // true
  627. if (isIn) {
  628. window.$message.warning('请输入类型名称')
  629. return
  630. }
  631. saveProTypenLoad.value = true
  632. const { error, code, msg } = await saveDict({ type: 'projectType', list })
  633. saveProTypenLoad.value = false
  634. if (!error && code === 200) {
  635. window?.$message?.success(msg)
  636. getProType()
  637. } else {
  638. window.$message.error(msg ?? '操作失败')
  639. }
  640. }
  641. const proStationTip = ref([])
  642. const getProStationTip = async () => {
  643. const { error, code, data } = await getDictionary({ code: 'workFocusStage' })
  644. if (!error && code === 200) {
  645. proStationTip.value = getArrValue(data)
  646. if (proStationTip.value.length === 0) {
  647. proStationTip.value = [
  648. { dictValue: '' },
  649. ]
  650. }
  651. } else {
  652. proStationTip.value = []
  653. }
  654. }
  655. const addClickTip = (item, index) => {
  656. proStationTip.value.splice(index + 1, 0, { dictValue: '' })
  657. }
  658. const delClickTip = (item, index) => {
  659. if (proStationTip.value.length === 1) {
  660. window.$message.warning('请至少保留一条数据')
  661. return
  662. }
  663. proStationTip.value.splice(index, 1)
  664. }
  665. const savProStationTipLoad = ref(false)
  666. const saveProStationTip = async () => {
  667. const list = arrToKey(proStationTip.value, 'dictValue', ',').split(',')
  668. const isIn = isArrItem(list, '') // true
  669. if (isIn) {
  670. window.$message.warning('请输入阶段名称')
  671. return
  672. }
  673. savProStationTipLoad.value = true
  674. const { error, code, msg } = await saveDict({ type: 'workFocusStage', list })
  675. savProStationTipLoad.value = false
  676. if (!error && code === 200) {
  677. window?.$message?.success(msg)
  678. getProStationTip()
  679. } else {
  680. window.$message.error(msg ?? '操作失败')
  681. }
  682. }
  683. </script>
  684. <style lang='scss'>
  685. @import "~src/styles/view/set";
  686. </style>