tab-other.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <!-- -->
  2. <template>
  3. <HcCard>
  4. <template #header>
  5. <div class="w-48">
  6. <el-input v-model="searchForm.dictName" clearable placeholder="请输入字典名称进行查询" size="large"/>
  7. </div>
  8. <div class="w-48 ml-2">
  9. <el-input v-model="searchForm.code" clearable placeholder="请输入字典编号进行查询" size="large"/>
  10. </div>
  11. <div class="ml-4">
  12. <el-button type="primary" @click="searchClick" size="large">
  13. <HcIcon name="search-2"/>
  14. <span>搜索</span>
  15. </el-button>
  16. </div>
  17. <div class="ml-2">
  18. <el-button size="large" @click="resetClick">
  19. <HcIcon name="close-circle"/>
  20. <span>重置</span>
  21. </el-button>
  22. </div>
  23. </template>
  24. <template #extra>
  25. <div>
  26. <el-button type="primary" @click="addClick" size="large">
  27. <HcIcon name="add-circle"/>
  28. <span>新增</span>
  29. </el-button>
  30. </div>
  31. <div class="ml-2">
  32. <el-button type="primary" @click="delModal" size="large" :disabled="tableCheckedKeys.length<1">
  33. <HcIcon name="delete-bin-2"/>
  34. <span>删除</span>
  35. </el-button>
  36. </div>
  37. </template>
  38. <HcTable :column="tableColumn" :datas="tableData" isCheck @selection-change="tableSelectionChange" :loading="tableLoaing">
  39. <template #action="{row, index}">
  40. <el-button size="small" type="primary" @click="eidtModal(row)">编辑</el-button>
  41. <el-button size="small" type="primary" @click="delModal(row)">删除</el-button>
  42. <el-button size="small" type="primary" @click="configModalclick(row)">字典配置</el-button>
  43. </template>
  44. </HcTable>
  45. <!-- 新增编辑一级字典 -->
  46. <HcDialog bgColor="#ffffff" isToBody :show="codeModal" :title="codeModalTitle" @close="codeModalClose" widths="62rem" @save="saveparentClick">
  47. <el-form label-position="left" label-width="auto" :model="formcode" :rules="formUserRules" size="large">
  48. <el-row :gutter="20">
  49. <el-col :span="12">
  50. <el-form-item label="字典编号:" prop="code">
  51. <el-input v-model="formcode.code"/>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="12">
  55. <el-form-item label="字典名称:" prop="dictName">
  56. <el-input v-model="formcode.dictName"/>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="12">
  60. <el-form-item label="字典值:" prop="dictValue">
  61. <el-input v-model="formcode.dictValue"/>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form-item label="字典排序:" prop="sort">
  66. <el-input-number
  67. v-model="formcode.sort"
  68. controls-position="right"
  69. size="large"
  70. @change="handleSortChange"
  71. style="width: 100%;"
  72. />
  73. </el-form-item>
  74. </el-col>
  75. <!-- <el-col :span="12">
  76. <el-form-item label="封存:" prop="isstorage">
  77. <el-switch
  78. v-model="formcode.isstorage"
  79. size="large"
  80. active-text="是"
  81. inactive-text="否"
  82. />
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="12">
  86. <el-form-item label="字典备注:">
  87. <el-input v-model="formcode.price"/>
  88. </el-form-item>
  89. </el-col> -->
  90. </el-row>
  91. </el-form>
  92. </HcDialog>
  93. <!-- 新增编辑二级 -->
  94. <HcDialog bgColor="#ffffff" isToBody :show="configcodeModal" @close="configcodeModalClose" widths="62rem" @save="savechilidClick" :title="configcodeModalTitle">
  95. <el-form label-position="left" label-width="auto" :model="configForm" :rules="formUserRules" size="large">
  96. <el-row :gutter="20">
  97. <el-col :span="12">
  98. <el-form-item label="字典编号:" prop="code">
  99. <el-input v-model="configForm.code" disabled/>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="12">
  103. <el-form-item label="字典名称:" prop="dictName">
  104. <el-input v-model="configForm.dictName"/>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="12">
  108. <el-form-item label="字典值:" prop="dictValue">
  109. <el-input v-model="configForm.dictValue"/>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="12" v-if="isConfigedit">
  113. <el-form-item label="上级字典:" prop="parentId">
  114. <el-select v-model="configForm.parentId" class="m-2" placeholder="请选择" size="large" style="width: 100%;" disabled>
  115. <el-option
  116. v-for="item in tableData"
  117. :key="item.id"
  118. :label="item.dictName"
  119. :value="item.id"
  120. />
  121. </el-select>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="12">
  125. <el-form-item label="字典排序:" prop="sort">
  126. <el-input-number
  127. v-model="configForm.sort"
  128. controls-position="right"
  129. size="large"
  130. @change="handleSortChange"
  131. style="width: 100%;"
  132. />
  133. </el-form-item>
  134. </el-col>
  135. <!-- <el-col :span="12">
  136. <el-form-item label="封存:" prop="isstorage">
  137. <el-switch
  138. v-model="formcode.isstorage"
  139. size="large"
  140. active-text="是"
  141. inactive-text="否"
  142. />
  143. </el-form-item>
  144. </el-col>
  145. <el-col :span="12">
  146. <el-form-item label="字典备注:">
  147. <el-input v-model="formcode.price"/>
  148. </el-form-item>
  149. </el-col> -->
  150. </el-row>
  151. </el-form>
  152. </HcDialog>
  153. <!-- 字典配置 -->
  154. <HcDialog bgColor="#ffffff" isTable isRowFooter :loading="configModalLoading" :show="configModal" title="字典配置" widths="62rem" @close="closeConfigClick">
  155. <template #header>
  156. <div class="w-30">
  157. [{{ configItem?.dictName }}] 字典配置
  158. </div>
  159. <div class="header-box mt-2">
  160. <div class="w-48 ">
  161. <el-input v-model="configsearchForm.dictName" clearable placeholder="请输入字典名称进行查询" size="large"/>
  162. </div>
  163. <div class="w-48 ml-2">
  164. <el-input v-model="configsearchForm.code" clearable placeholder="请输入字典编号进行查询" size="large"/>
  165. </div>
  166. <div class="ml-4">
  167. <el-button type="primary" @click="configsearchClick" size="large">
  168. <HcIcon name="search-2"/>
  169. <span>搜索</span>
  170. </el-button>
  171. </div>
  172. <div class="ml-2">
  173. <el-button size="large" @click="configresetClick">
  174. <HcIcon name="close-circle"/>
  175. <span>重置</span>
  176. </el-button>
  177. </div>
  178. <div class="ml-32">
  179. <el-button type="primary" @click="addchildClick" size="large">
  180. <HcIcon name="add-circle"/>
  181. <span>新增</span>
  182. </el-button>
  183. </div>
  184. <div class="ml-2">
  185. <el-button type="primary" @click="configdelClick" size="large" :loading="configdelbtnloading" :disabled="configtableCheckedKeys.length<1">
  186. <HcIcon name="delete-bin-2"/>
  187. <span>删除</span>
  188. </el-button>
  189. </div>
  190. </div>
  191. </template>
  192. <HcTable :column="configtableColumn" :datas="configtableData" isCheck @selection-change="configtableSelectionChange" :loading="configTableloaing">
  193. <template #action="{row, index}">
  194. <el-button size="small" type="primary" @click="configeidtModal(row)">编辑</el-button>
  195. <el-button size="small" type="primary" @click="configdelClick(row)" :loading="configdelbtnloading">删除</el-button>
  196. </template>
  197. </HcTable>
  198. </HcDialog>
  199. </HcCard>
  200. </template>
  201. <script setup>
  202. import {onMounted, ref, watch} from "vue";
  203. import {submitDictionary,removeDictionary,getParentList,getChildList} from '~api/system/parameter.js';
  204. import {getArrValue,arrToId} from "js-fast-way"
  205. const props = defineProps({
  206. cur: {
  207. type: [String,Number],
  208. default: ''
  209. },
  210. type:{
  211. type: [String,Number],
  212. default: ''
  213. }
  214. })
  215. const tabsKey = ref(props.cur)
  216. const tabsType = ref(props.type)
  217. //监听
  218. watch(() => [
  219. props.cur,
  220. props.type,
  221. ], ([key,type]) => {
  222. tabsKey.value = key
  223. tabsType.value = type
  224. })
  225. onMounted(() => {
  226. getTableData()
  227. })
  228. //搜索表单
  229. const searchForm = ref({
  230. })
  231. const tableLoaing=ref(false)
  232. const getTableData=async()=>{
  233. tableLoaing.value=true
  234. const { error, code, data,msg } = await getParentList({
  235. type:tabsType.value,
  236. code:searchForm.value?.code||'',
  237. dictName:searchForm.value?.dictName||'',
  238. })
  239. tableLoaing.value=false
  240. if (!error && code === 200) {
  241. tableData.value = getArrValue(data['records'])
  242. }
  243. else {
  244. tableData.value =[]
  245. window.$message?.warning(msg)
  246. }
  247. }
  248. //搜索
  249. const searchClick = () => {
  250. getTableData()
  251. }
  252. //重置搜索表单
  253. const resetClick = () => {
  254. searchForm.value = {}
  255. getTableData()
  256. }
  257. const addClick=()=>{
  258. formcode.value={}
  259. codeModalTitle.value='新增'
  260. codeModal.value=true
  261. }
  262. //新增一级科目
  263. const saveparentClick=async()=>{
  264. const { error, code, data,msg } = await submitDictionary({
  265. type:tabsType.value,
  266. dictName:formcode.value?.dictName,
  267. dictValue:formcode.value?.dictValue,
  268. code:formcode.value?.code,
  269. id:formcode.value?.id||null,
  270. sort:formcode.value?.sort||null,
  271. })
  272. if (!error && code === 200) {
  273. window.$message?.success(msg)
  274. codeModal.value=false
  275. getTableData()
  276. }
  277. else {
  278. window.$message?.warning(msg)
  279. }
  280. }
  281. //新增二级科目
  282. const configForm=ref({})
  283. const savechilidClick=async()=>{
  284. const { error, code, data,msg } = await submitDictionary({
  285. type:configItem.value?.type,
  286. dictName:configForm.value?.dictName,
  287. dictValue:configForm.value?.dictValue,
  288. id:configForm.value?.id||null,
  289. code:configForm.value?.code,
  290. parentId:configItem.value.id,
  291. sort:configForm.value?.sort||null,
  292. })
  293. configcodeModal.value=false
  294. if (!error && code === 200) {
  295. window.$message?.success(msg)
  296. getChildListData()
  297. }
  298. else {
  299. window.$message?.warning(msg)
  300. }
  301. }
  302. const batcheditClick=()=>{
  303. }
  304. const tableColumn = [
  305. {key: 'code', name: '字典编号'},
  306. {key: 'dictName', name: '字典名称'},
  307. {key: 'dictValue', name: '字典值'},
  308. {key: 'action', name: '操作', width:250}
  309. ]
  310. const tableData = ref([])
  311. const tableCheckedKeys = ref([]);
  312. const tableSelectionChange = (rows) => {
  313. tableCheckedKeys.value = rows
  314. }
  315. const eidtModal=(row)=>{
  316. formcode.value=row
  317. codeModal.value=true
  318. codeModalTitle.value='编辑'
  319. }
  320. const delbtnloading=ref(false)
  321. const delModal=(item)=>{
  322. const rows = tableCheckedKeys.value;
  323. const ids = arrToId(rows)
  324. delbtnloading.value=true
  325. window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
  326. showCancelButton: true,
  327. confirmButtonText: '确认注销',
  328. cancelButtonText: '取消',
  329. type: 'warning',
  330. callback: async(action) => {
  331. if (action === 'confirm') {
  332. const {error, code, msg} = await removeDictionary({
  333. ids: ids||item.id,
  334. })
  335. delbtnloading.value=false
  336. if (!error && code === 200) {
  337. window?.$message?.success('删除成功')
  338. getTableData()
  339. } else {
  340. window?.$message?.warning(msg)
  341. }
  342. }
  343. }
  344. })
  345. }
  346. const codeModal=ref(false)
  347. const configcodeModal=ref(false)
  348. const codeModalTitle=ref('新增')
  349. const configcodeModalTitle=ref('新增')
  350. const codeModalClose=()=>{
  351. codeModal.value=false
  352. }
  353. const configcodeModalClose=()=>{
  354. configcodeModal.value=false
  355. }
  356. const formcode=ref({})
  357. const formUserRules = {
  358. code: {
  359. required: true,
  360. trigger: "blur",
  361. message: "请输入字典编号"
  362. },
  363. dictName: {
  364. required: true,
  365. trigger: "blur",
  366. message: "请输入字典名称"
  367. },
  368. dictValue:{
  369. required: true,
  370. trigger: "blur",
  371. message: "请输入字典值"
  372. },
  373. sort: {
  374. required: true,
  375. trigger: "blur",
  376. message: "请输入字典排序"
  377. },
  378. }
  379. const handleSortChange=(value)=>{
  380. console.log(value)
  381. }
  382. //字典配置
  383. const isConfigedit=ref(false)
  384. const configModalLoading=ref(false)
  385. const configModal=ref(false)
  386. const configItem=ref({})
  387. const configModalclick=(row)=>{
  388. configItem.value=row
  389. getChildListData()
  390. configModal.value=true
  391. isConfigedit.value=true
  392. }
  393. //获取二级科目
  394. const configTableloaing=ref(false)
  395. const getChildListData=async()=>{
  396. configTableloaing.value=true
  397. const { error, code, data,msg } = await getChildList({
  398. parentId: configItem.value.id,
  399. type:configItem.value.type,
  400. dictName:configsearchForm.value?.dictName,
  401. code:configsearchForm.value?.code
  402. })
  403. configTableloaing.value=false
  404. if (!error && code === 200) {
  405. configtableData.value=getArrValue(data)
  406. // tab.value = getArrValue(data['records'])
  407. }
  408. else {
  409. configtableData.value=[]
  410. window.$message?.warning(msg)
  411. }
  412. }
  413. const closeConfigClick=()=>{
  414. configModal.value=false
  415. isConfigedit.value=false
  416. }
  417. //新增二级字典
  418. const addchildClick=()=>{
  419. configcodeModal.value=true;
  420. configForm.value={}
  421. configForm.value.parentId=configItem.value.id
  422. configForm.value.code=configItem.value.code
  423. configcodeModalTitle.value='新增'
  424. }
  425. //搜索表单
  426. const configsearchForm = ref({
  427. projectType: null, user: null, project: null,
  428. current: 1, size: 20, total: 0
  429. })
  430. //搜索
  431. const configsearchClick = () => {
  432. getChildListData()
  433. }
  434. //重置搜索表单
  435. const configresetClick = () => {
  436. configsearchForm.value = {}
  437. getChildListData()
  438. }
  439. const configtableColumn = [
  440. {key: 'code', name: '字典编号'},
  441. {key: 'dictName', name: '字典名称'},
  442. {key: 'dictValue', name: '字典值'},
  443. {key: 'action', name: '操作', width:250}
  444. ]
  445. const configtableData = ref([])
  446. const configtableCheckedKeys = ref([]);
  447. const configtableSelectionChange = (rows) => {
  448. configtableCheckedKeys.value = rows
  449. if (configtableCheckedKeys.value.length > 1) {
  450. window.$message.warning('只能选择一条数据')
  451. }
  452. }
  453. const configeidtModal=(row)=>{
  454. configForm.value=row;
  455. configcodeModalTitle.value='编辑'
  456. configcodeModal.value=true
  457. }
  458. const configdelbtnloading=ref(false)
  459. const configdelClick=(item)=>{
  460. const rows = configtableCheckedKeys.value;
  461. const ids = arrToId(rows)
  462. configdelbtnloading.value=true
  463. window?.$messageBox?.alert('您确定要删除该信息吗? 一旦注销数据将彻底清除,请谨慎操作?', '删除提醒', {
  464. showCancelButton: true,
  465. confirmButtonText: '确认注销',
  466. cancelButtonText: '取消',
  467. type: 'warning',
  468. callback: async(action) => {
  469. if (action === 'confirm') {
  470. const {error, code, msg} = await removeDictionary({
  471. ids: ids||item.id,
  472. })
  473. configdelbtnloading.value=false
  474. if (!error && code === 200) {
  475. window?.$message?.success('删除成功')
  476. getChildListData()
  477. } else {
  478. window?.$message?.warning(msg)
  479. }
  480. }
  481. }
  482. })
  483. }
  484. </script>
  485. <style lang='scss' scoped>
  486. .header-box{
  487. display: flex;
  488. }
  489. </style>