tab-other.vue 19 KB

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