bxlb.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <script setup lang="ts">
  2. import { ref, getCurrentInstance, reactive } from "vue";
  3. import { useRouter } from "vue-router";
  4. import request, { download } from '~/utils/request';
  5. import { pick } from 'lodash-es';
  6. import { ElMessage } from 'element-plus'
  7. import type { FormInstance, FormRules } from 'element-plus'
  8. import type { AxiosRequestConfig } from 'axios'
  9. // #region (constant)
  10. const TABLE_KEY = 'cs_id'
  11. const URL_CUT = '/common/sjzd'
  12. const URL_CUT_REF = ref(URL_CUT)
  13. const URL_SUBMIT_KEY = URL_CUT.split('/').join('_').slice(1)
  14. const instance = getCurrentInstance()
  15. const router = useRouter()
  16. // #endregion
  17. // #region (variable)
  18. const loading_table = ref(true)
  19. let whichDialogSubmit: 'add' | 'edit'
  20. // #endregion
  21. // #region (type)
  22. type TYPE_TABLE_FIELD = {
  23. [TABLE_KEY]: string;
  24. 'cs_pid': string; // 上级编号
  25. 'cs_name': string; // 字典名称
  26. 'cs_code': string; // 字典编号
  27. 'cs_sort': string; // 排序编号
  28. 'cs_level': string; // 字典层级(备用)
  29. 'cs_path': string; // 字典路径(备用)
  30. 'cs_zdlx': string; // 字典类型
  31. 'cs_sfqy': string; // 是否启用
  32. 'cs_sjlx': string; // 数据类型
  33. 'cs_sjcd': string; // 数据长度
  34. 'cs_bz': string; // 备注
  35. 'cs_pcode': string; // 父级code
  36. }
  37. // #endregion
  38. // #region (props)
  39. // #endregion
  40. // #region (query row)
  41. const queryForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  42. const handleQueryFormBtn_search = () => {
  43. queryApi()
  44. }
  45. const handleQueryFormBtn_clear = () => {
  46. queryForm_Data.value = {}
  47. }
  48. // #endregion
  49. // #region (table selection)
  50. const multipleSelection = ref<TYPE_TABLE_FIELD[]>([])
  51. const handleSelectionChange = (val: TYPE_TABLE_FIELD[]) => {
  52. multipleSelection.value = val
  53. }
  54. // #endregion
  55. // #region (table row)
  56. const handleTableRowBtn_import = async ({ file }: { file: File }) => {
  57. const res = await API_MAP['import']({ file })
  58. if (res.code === '1') {
  59. queryApi()
  60. ElMessage.success(res.msg)
  61. }
  62. }
  63. const handleTableRowBtn_export = () => {
  64. if (multipleSelection.value.length === 0) return ElMessage.info('请先勾选导出文件'); exportApi({ [TABLE_KEY]: multipleSelection.value.map((item: TYPE_TABLE_FIELD) => item[TABLE_KEY])?.join() })
  65. }
  66. const handleTableRowBtn_add = () => {
  67. whichDialogSubmit = 'add'
  68. dialogForm_Data.value = {}
  69. dialogForm_Data.value.cs_pcode = 'BXLB'
  70. dialogVisible_addOrEdit.value = true
  71. }
  72. const handleTableRowBtn_delete = async () => {
  73. if (multipleSelection.value.length === 0) return ElMessage.info('请先勾选文件'); const resp = await deleteApi(multipleSelection.value.map((item: TYPE_TABLE_FIELD) => item[TABLE_KEY])); if (resp.code !== '1') return; ElMessage.success('删除成功');
  74. queryApi()
  75. }
  76. // #endregion
  77. // #region (table body)
  78. const tableData = ref<TYPE_TABLE_FIELD[]>([])
  79. const handleTableColBtn_edit = async (scope: { row: TYPE_TABLE_FIELD }) => {
  80. whichDialogSubmit = 'edit'
  81. const res = await detailApi(scope.row[TABLE_KEY])
  82. dialogForm_Data.value = (res.data?.one_info)
  83. dialogVisible_addOrEdit.value = true
  84. }
  85. const handleTableColBtn_delete = async (scope: { row: TYPE_TABLE_FIELD }) => {
  86. const resp = await deleteApi(scope.row[TABLE_KEY]); if (resp.code !== '1') return; ElMessage.success('删除成功');
  87. queryApi()
  88. }
  89. // #endregion
  90. // #region (pagination)
  91. const total = ref(0)
  92. const limit = ref(10)
  93. const currentPage = ref(1)
  94. function handleCurrentChange() {
  95. queryApi()
  96. }
  97. // #endregion
  98. // #region (dialog base)
  99. const dialogForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  100. const handleDialogFormBtn_submit = async (formRefKey: string, extendData?: Partial<TYPE_TABLE_FIELD>) => {
  101. const isValid = await (instance?.refs[formRefKey] as FormInstance).validate((valid: boolean) => valid)
  102. if (isValid) {
  103. const resp = await API_MAP[whichDialogSubmit](<TYPE_TABLE_FIELD>({ ...dialogForm_Data.value, ...extendData, cs_pid: '837' }))
  104. if (resp.code !== '1') return; ElMessage.success('操作成功'); handleDialogFormBtn_cancel()
  105. queryApi()
  106. }
  107. }
  108. const handleDialogFormBtn_cancel = (formRefKey?: string) => {
  109. dialogVisible_addOrEdit.value = false
  110. }
  111. // #endregion
  112. // #region (dialog add/edit)
  113. const dialogVisible_addOrEdit = ref<boolean>(false)
  114. const dialogForm_Ref_addOrEdit = ref<FormInstance>()
  115. const dialogForm_Rules_addOrEdit = reactive({
  116. 'cs_pid': { required: true, message: '上级编号不能为空', trigger: 'submit' },
  117. 'cs_name': { required: true, message: '报修类别名称不能为空', trigger: 'submit' },
  118. 'cs_code': { required: true, message: '字典编号不能为空', trigger: 'submit' },
  119. 'cs_sort': { required: true, message: '排序编号不能为空', trigger: 'submit' },
  120. 'cs_level': { required: true, message: '字典层级(备用)不能为空', trigger: 'submit' },
  121. 'cs_path': { required: true, message: '字典路径(备用)不能为空', trigger: 'submit' },
  122. 'cs_zdlx': { required: true, message: '字典类型不能为空', trigger: 'submit' },
  123. 'cs_sfqy': { required: true, message: '是否启用不能为空', trigger: 'submit' },
  124. 'cs_sjlx': { required: true, message: '数据类型不能为空', trigger: 'submit' },
  125. 'cs_sjcd': { required: true, message: '数据长度不能为空', trigger: 'submit' },
  126. 'cs_bz': { required: true, message: '备注不能为空', trigger: 'submit' },
  127. 'cs_pcode': { required: true, message: '父级code不能为空', trigger: 'submit' },
  128. })
  129. // #endregion
  130. // #region (request api):
  131. function queryApi() {
  132. loading_table.value = true
  133. return request({
  134. url: URL_CUT + '/index',
  135. data: {
  136. ...queryForm_Data.value,
  137. limit: limit.value,
  138. page: currentPage.value,
  139. cs_pid: 837,
  140. sort_field: 'cs_id',
  141. sort_type: 'DESC',
  142. }
  143. }).then((response: { data: { total_rows: string, page_data: TYPE_TABLE_FIELD[] } }) => {
  144. const { data } = response
  145. total.value = parseInt(data.total_rows)
  146. tableData.value = data.page_data
  147. return response
  148. }).then(() => {
  149. loading_table.value = false
  150. })
  151. }
  152. function addApi(data: TYPE_TABLE_FIELD) {
  153. return request({
  154. url: URL_CUT + '/add',
  155. data: {
  156. [URL_SUBMIT_KEY]: data,
  157. }
  158. })
  159. }
  160. function editApi(data: Partial<TYPE_TABLE_FIELD>) {
  161. return request({
  162. url: URL_CUT + '/edit',
  163. data: {
  164. [TABLE_KEY]: data[TABLE_KEY],
  165. [URL_SUBMIT_KEY]: pick(data, ['cs_pid', 'cs_name', 'cs_code', 'cs_sort', 'cs_level', 'cs_path', 'cs_zdlx', 'cs_sfqy', 'cs_sjlx', 'cs_sjcd', 'cs_bz', 'cs_pcode',]),
  166. }
  167. })
  168. }
  169. function deleteApi(id: string | string[]) {
  170. return request({
  171. url: URL_CUT + '/delete',
  172. data: {
  173. [TABLE_KEY]: id,
  174. }
  175. })
  176. }
  177. function detailApi(id: string) {
  178. return request({
  179. url: URL_CUT + '/detail',
  180. data: {
  181. [TABLE_KEY]: id,
  182. }
  183. })
  184. }
  185. function importApi(data: { file: File }) {
  186. return request({
  187. $type: 'import',
  188. url: URL_CUT + '/import',
  189. data
  190. } as AxiosRequestConfig)
  191. }
  192. function exportApi(d) {
  193. return download(URL_CUT + '/index', { ...queryForm_Data.value, ...d, excel_file_name: '报修类别' })
  194. }
  195. const API_MAP = {
  196. query: queryApi,
  197. add: addApi,
  198. edit: editApi,
  199. delete: deleteApi,
  200. detail: detailApi,
  201. import: importApi,
  202. export: exportApi,
  203. }
  204. // #endregion
  205. // #region (page init)
  206. function init() {
  207. queryApi()
  208. }
  209. init()
  210. // #endregion
  211. </script>
  212. <template>
  213. <div class="card flex-grow flex flex-col">
  214. <div class="flex justify-between">
  215. <div>
  216. <import-button @success="queryApi" :importKey="('cs_pid=837')" :url="URL_CUT_REF"
  217. :exportKey="('cs_pid=837')"></import-button>
  218. <el-button @click="handleTableRowBtn_export" type="primary">导出</el-button>
  219. <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
  220. <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
  221. </div>
  222. <el-form inline :model="queryForm_Data">
  223. <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
  224. <!-- <el-form-item label="上级编号">
  225. <el-input v-model="queryForm_Data.cs_pid" clearable />
  226. </el-form-item> -->
  227. <el-form-item label="类别名称">
  228. <el-input v-model="queryForm_Data.cs_name" clearable />
  229. </el-form-item>
  230. <!-- <el-form-item label="字典编号">
  231. <el-input v-model="queryForm_Data.cs_code" clearable />
  232. </el-form-item>
  233. <el-form-item label="排序编号">
  234. <el-input v-model="queryForm_Data.cs_sort" clearable />
  235. </el-form-item>
  236. <el-form-item label="字典层级(备用)">
  237. <el-input v-model="queryForm_Data.cs_level" clearable />
  238. </el-form-item>
  239. <el-form-item label="字典路径(备用)">
  240. <el-input v-model="queryForm_Data.cs_path" clearable />
  241. </el-form-item>
  242. <el-form-item label="字典类型">
  243. <el-select v-model="queryForm_Data.cs_zdlx" clearable filterable>
  244. <el-option label="自定义" value="1" />
  245. <el-option label="地方" value="2" />
  246. <el-option label="国标" value="3" />
  247. </el-select>
  248. </el-form-item>
  249. <el-form-item label="是否启用">
  250. <el-select v-model="queryForm_Data.cs_sfqy" clearable filterable>
  251. <el-option label="未启用" value="0" />
  252. <el-option label="已启用" value="1" />
  253. </el-select>
  254. </el-form-item>
  255. <el-form-item label="数据类型">
  256. <el-input v-model="queryForm_Data.cs_sjlx" clearable />
  257. </el-form-item>
  258. <el-form-item label="数据长度">
  259. <el-input v-model="queryForm_Data.cs_sjcd" clearable />
  260. </el-form-item>
  261. <el-form-item label="备注">
  262. <el-input v-model="queryForm_Data.cs_bz" clearable />
  263. </el-form-item>
  264. <el-form-item label="父级code">
  265. <el-input v-model="queryForm_Data.cs_pcode" clearable />
  266. </el-form-item> -->
  267. <el-form-item>
  268. <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
  269. <!-- <el-button @click="handleQueryFormBtn_clear" type="warning">清空</el-button> -->
  270. </el-form-item>
  271. </el-form>
  272. </div>
  273. <div class="divider"></div>
  274. <div class="flex-auto">
  275. <el-table :data="tableData" @selection-change="handleSelectionChange" v-loading="loading_table"
  276. element-loading-background="#ffffff70">
  277. <el-table-column type="selection"></el-table-column>
  278. <el-table-column prop="cs_id" label="编号" width="auto" show-overflow-tooltip></el-table-column>
  279. <!-- <el-table-column prop="cs_pid" label="上级编号" width="auto" show-overflow-tooltip></el-table-column> -->
  280. <el-table-column prop="cs_name" label="报修类别名称" width="auto" show-overflow-tooltip></el-table-column>
  281. <!-- <el-table-column prop="cs_code" label="字典编号" width="auto" show-overflow-tooltip></el-table-column>
  282. <el-table-column prop="cs_sort" label="排序编号" width="auto" show-overflow-tooltip></el-table-column>
  283. <el-table-column prop="cs_level" label="字典层级(备用)" width="auto" show-overflow-tooltip></el-table-column>
  284. <el-table-column prop="cs_path" label="字典路径(备用)" width="auto" show-overflow-tooltip></el-table-column>
  285. <el-table-column prop="cs_zdlx" label="字典类型" width="auto" show-overflow-tooltip></el-table-column>
  286. <el-table-column prop="cs_sfqy" label="是否启用" width="auto" show-overflow-tooltip></el-table-column>
  287. <el-table-column prop="cs_sjlx" label="数据类型" width="auto" show-overflow-tooltip></el-table-column>
  288. <el-table-column prop="cs_sjcd" label="数据长度" width="auto" show-overflow-tooltip></el-table-column>
  289. <el-table-column prop="cs_bz" label="备注" width="auto" show-overflow-tooltip></el-table-column>
  290. <el-table-column prop="cs_pcode" label="父级code" width="auto" show-overflow-tooltip></el-table-column> -->
  291. <el-table-column label="操作" fixed="right">
  292. <template #default="scope">
  293. <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="primary">编辑
  294. </el-button>
  295. <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="primary">删除
  296. </el-button>
  297. </template>
  298. </el-table-column>
  299. </el-table>
  300. </div>
  301. <div class="flex justify-end mt-10 py-4">
  302. <el-pagination :page-size="limit" v-model:current-page="currentPage" @current-change="handleCurrentChange"
  303. background layout="total, prev, pager, next" :total="total" />
  304. </div>
  305. </div>
  306. <el-dialog v-model="dialogVisible_addOrEdit" append-to-body destroy-on-close>
  307. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
  308. label-width="120px">
  309. <!-- <el-form-item label="上级编号" prop="cs_pid">
  310. <el-input v-model="dialogForm_Data.cs_pid" clearable />
  311. </el-form-item> -->
  312. <el-form-item label="报修类别名称" prop="cs_name">
  313. <el-input v-model="dialogForm_Data.cs_name" clearable />
  314. </el-form-item>
  315. <!-- <el-form-item label="字典编号" prop="cs_code">
  316. <el-input v-model="dialogForm_Data.cs_code" clearable />
  317. </el-form-item>
  318. <el-form-item label="排序编号" prop="cs_sort">
  319. <el-input v-model="dialogForm_Data.cs_sort" clearable />
  320. </el-form-item>
  321. <el-form-item label="字典层级(备用)" prop="cs_level">
  322. <el-input v-model="dialogForm_Data.cs_level" clearable />
  323. </el-form-item>
  324. <el-form-item label="字典路径(备用)" prop="cs_path">
  325. <el-input v-model="dialogForm_Data.cs_path" clearable />
  326. </el-form-item>
  327. <el-form-item label="字典类型" prop="cs_zdlx">
  328. <el-radio-group v-model="dialogForm_Data.cs_zdlx">
  329. <el-radio label="1">自定义</el-radio>
  330. <el-radio label="2">地方</el-radio>
  331. <el-radio label="3">国标</el-radio>
  332. </el-radio-group>
  333. </el-form-item>
  334. <el-form-item label="是否启用" prop="cs_sfqy">
  335. <el-radio-group v-model="dialogForm_Data.cs_sfqy">
  336. <el-radio label="0">未启用</el-radio>
  337. <el-radio label="1">已启用</el-radio>
  338. </el-radio-group>
  339. </el-form-item>
  340. <el-form-item label="数据类型" prop="cs_sjlx">
  341. <el-input v-model="dialogForm_Data.cs_sjlx" clearable />
  342. </el-form-item>
  343. <el-form-item label="数据长度" prop="cs_sjcd">
  344. <el-input v-model="dialogForm_Data.cs_sjcd" clearable />
  345. </el-form-item>
  346. <el-form-item label="备注" prop="cs_bz">
  347. <el-input v-model="dialogForm_Data.cs_bz" clearable />
  348. </el-form-item>
  349. <el-form-item label="父级code" prop="cs_pcode">
  350. <el-input v-model="dialogForm_Data.cs_pcode" clearable />
  351. </el-form-item> -->
  352. <div class="flex justify-center">
  353. <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交</el-button>
  354. <el-button @click="handleDialogFormBtn_cancel('dialogForm_Ref_addOrEdit')" type="default">取消</el-button>
  355. </div>
  356. </el-form>
  357. </el-dialog>
  358. </template>