jylb.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  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 = 'xhj_id'
  11. const URL_CUT = '/xdhq/hqgl_jyly'
  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. 'xhj_zcmc': string; // 资产名称
  25. 'xhj_zcbh': string; // 资产编号
  26. 'xhj_ssbm': string; // 所属部门
  27. 'xhj_jlxz': string; // 借领性质
  28. 'xhj_jlr': string; // 借领人
  29. 'xhj_jlsj': string; // 借领时间
  30. 'xhj_pzr': string; // 批准人
  31. 'xhj_zt': string
  32. }
  33. // #endregion
  34. // #region (props)
  35. // #endregion
  36. // #region (query row)
  37. const queryForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  38. const handleQueryFormBtn_search = () => {
  39. queryApi()
  40. }
  41. const handleQueryFormBtn_clear = () => {
  42. queryForm_Data.value = {}
  43. }
  44. // #endregion
  45. // #region (table selection)
  46. const multipleSelection = ref<TYPE_TABLE_FIELD[]>([])
  47. const handleSelectionChange = (val: TYPE_TABLE_FIELD[]) => {
  48. multipleSelection.value = val
  49. }
  50. // #endregion
  51. // #region (table row)
  52. const handleTableRowBtn_import = async ({ file }: { file: File }) => {
  53. const res = await API_MAP['import']({ file })
  54. if (res.code === '1') {
  55. queryApi()
  56. ElMessage.success(res.msg)
  57. }
  58. }
  59. const handleTableRowBtn_export = () => {
  60. exportApi()
  61. }
  62. const handleTableRowBtn_add = () => {
  63. whichDialogSubmit = 'add'
  64. dialogForm_Data.value = {}
  65. dialogVisible_addOrEdit.value = true
  66. }
  67. const handleTableRowBtn_delete = async () => {
  68. await deleteApi(multipleSelection.value.map((item: TYPE_TABLE_FIELD) => item[TABLE_KEY]))
  69. queryApi()
  70. }
  71. // #endregion
  72. // #region (table body)
  73. const tableData = ref<TYPE_TABLE_FIELD[]>([])
  74. const DetailName = '-JYLY-JYLB'
  75. const DetailParam = 'aid'
  76. const handleTableColBtn_edit = async (scope: { row: TYPE_TABLE_FIELD }) => {
  77. whichDialogSubmit = 'edit'
  78. const res = await detailApi(scope.row[TABLE_KEY])
  79. dialogForm_Data.value = (res.data.one_info)
  80. dialogVisible_addOrEdit.value = true
  81. }
  82. const handleTableColBtn_audit = (scope: { row: TYPE_TABLE_FIELD }) => {
  83. whichDialogSubmit = 'edit'
  84. dialogForm_Data.value = pick(scope.row, [`${TABLE_KEY}`, ...Object.keys(dialogForm_Rules_audit)])
  85. dialogVisible_audit.value = true
  86. }
  87. const handleTableColBtn_detail = (scope: { row: TYPE_TABLE_FIELD }) => {
  88. router.push({ name: DetailName, params: { [DetailParam]: scope.row[TABLE_KEY] } })
  89. }
  90. const handleTableColBtn_delete = async (scope: { row: TYPE_TABLE_FIELD }) => {
  91. await deleteApi(scope.row[TABLE_KEY])
  92. queryApi()
  93. }
  94. // #endregion
  95. // #region (pagination)
  96. const total = ref(0)
  97. const limit = ref(10)
  98. const currentPage = ref(1)
  99. function handleCurrentChange() {
  100. queryApi()
  101. }
  102. // #endregion
  103. // #region (dialog base)
  104. const dialogForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  105. const handleDialogFormBtn_submit = async (formRefKey: string, extendData?: Partial<TYPE_TABLE_FIELD>) => {
  106. const isValid = await (instance?.refs[formRefKey] as FormInstance).validate((valid: boolean) => valid)
  107. if (isValid) {
  108. await API_MAP[whichDialogSubmit](<TYPE_TABLE_FIELD>({ ...dialogForm_Data.value, ...extendData }))
  109. handleDialogFormBtn_cancel()
  110. queryApi()
  111. }
  112. }
  113. const handleDialogFormBtn_cancel = (formRefKey?: string) => {
  114. dialogVisible_addOrEdit.value = false
  115. dialogVisible_audit.value = false
  116. }
  117. // #endregion
  118. // #region (dialog add/edit)
  119. const dialogVisible_addOrEdit = ref<boolean>(false)
  120. const dialogForm_Ref_addOrEdit = ref<FormInstance>()
  121. const dialogForm_Rules_addOrEdit = reactive({
  122. 'xhj_zcmc': { required: true, message: '资产名称不能为空', trigger: 'submit' },
  123. 'xhj_zcbh': { required: true, message: '资产编号不能为空', trigger: 'submit' },
  124. 'xhj_ssbm': { required: true, message: '所属部门不能为空', trigger: 'submit' },
  125. 'xhj_jlxz': { required: true, message: '借领性质不能为空', trigger: 'submit' },
  126. 'xhj_jlr': { required: true, message: '借领人不能为空', trigger: 'submit' },
  127. 'xhj_jlsj': { required: true, message: '借领时间不能为空', trigger: 'submit' },
  128. 'xhj_pzr': { required: true, message: '批准人不能为空', trigger: 'submit' },
  129. })
  130. // #endregion
  131. // #region (dialog audit)
  132. const dialogVisible_audit = ref<boolean>(false)
  133. const dialogForm_Field_audit = reactive<{
  134. FLAG: keyof TYPE_TABLE_FIELD,
  135. REASON?: keyof TYPE_TABLE_FIELD
  136. }>({
  137. FLAG: 'xhj_id',
  138. // REASON:'xhj_id'
  139. })
  140. const dialogForm_Ref_audit = ref<FormInstance>()
  141. const dialogForm_Rules_audit = reactive<FormRules>({
  142. 'xhj_zcmc': { required: true, message: '资产名称不能为空', trigger: 'submit' },
  143. 'xhj_zcbh': { required: true, message: '资产编号不能为空', trigger: 'submit' },
  144. 'xhj_ssbm': { required: true, message: '所属部门不能为空', trigger: 'submit' },
  145. 'xhj_jlxz': { required: true, message: '借领性质不能为空', trigger: 'submit' },
  146. 'xhj_jlr': { required: true, message: '借领人不能为空', trigger: 'submit' },
  147. 'xhj_jlsj': { required: true, message: '借领时间不能为空', trigger: 'submit' },
  148. 'xhj_pzr': { required: true, message: '批准人不能为空', trigger: 'submit' },
  149. })
  150. // #endregion
  151. // #region (request api):
  152. function queryApi() {
  153. loading_table.value = true
  154. return request({
  155. url: URL_CUT + '/index',
  156. data: {
  157. ...queryForm_Data.value,
  158. limit: limit.value,
  159. page: currentPage.value,
  160. xhj_jlxz: '1'
  161. }
  162. }).then((response: { data: { total_rows: string, page_data: TYPE_TABLE_FIELD[] } }) => {
  163. const { data } = response
  164. total.value = parseInt(data.total_rows)
  165. tableData.value = data.page_data
  166. return response
  167. }).then(() => {
  168. loading_table.value = false
  169. })
  170. }
  171. function addApi(data: TYPE_TABLE_FIELD) {
  172. return request({
  173. url: URL_CUT + '/add',
  174. data: {
  175. [URL_SUBMIT_KEY]: data,
  176. }
  177. })
  178. }
  179. function editApi(data: Partial<TYPE_TABLE_FIELD>) {
  180. return request({
  181. url: URL_CUT + '/edit',
  182. data: {
  183. [TABLE_KEY]: data[TABLE_KEY],
  184. [URL_SUBMIT_KEY]: pick(data, ['xhj_zcmc', 'xhj_zcbh', 'xhj_ssbm', 'xhj_jlxz', 'xhj_jlr', 'xhj_jlsj', 'xhj_pzr', 'xhj_zt']),
  185. }
  186. })
  187. }
  188. function deleteApi(id: string | string[]) {
  189. return request({
  190. url: URL_CUT + '/delete',
  191. data: {
  192. [TABLE_KEY]: id,
  193. }
  194. })
  195. }
  196. function detailApi(id: string) {
  197. return request({
  198. url: URL_CUT + '/detail',
  199. data: {
  200. [TABLE_KEY]: id,
  201. }
  202. })
  203. }
  204. function importApi(data: { file: File }) {
  205. return request({
  206. $type: 'import',
  207. url: URL_CUT + '/import',
  208. data
  209. } as AxiosRequestConfig)
  210. }
  211. function exportApi() {
  212. return download(URL_CUT + '/index', queryForm_Data.value)
  213. }
  214. const API_MAP = {
  215. query: queryApi,
  216. add: addApi,
  217. edit: editApi,
  218. delete: deleteApi,
  219. detail: detailApi,
  220. import: importApi,
  221. export: exportApi,
  222. }
  223. // #endregion
  224. // #region (page init)
  225. function init() {
  226. queryApi()
  227. }
  228. init()
  229. // #endregion
  230. const handleTableColBtn_return = async (scope: { row: TYPE_TABLE_FIELD }) => {
  231. await editApi({
  232. [TABLE_KEY]: scope.row[TABLE_KEY],
  233. xhj_zcbh: scope.row.xhj_zcbh,
  234. xhj_zt: '3'
  235. })
  236. queryApi()
  237. }
  238. </script>
  239. <template>
  240. <div class="card flex-grow flex flex-col">
  241. <el-form inline :model="queryForm_Data">
  242. <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
  243. <el-form-item label="资产名称">
  244. <el-input v-model="queryForm_Data.xhj_zcmc" clearable />
  245. </el-form-item>
  246. <el-form-item label="资产编号">
  247. <el-input v-model="queryForm_Data.xhj_zcbh" clearable />
  248. </el-form-item>
  249. <!-- <el-form-item label="所属部门"><el-input v-model="queryForm_Data.xhj_ssbm" clearable /></el-form-item>
  250. <el-form-item label="借领性质"><el-input v-model="queryForm_Data.xhj_jlxz" clearable /></el-form-item> -->
  251. <el-form-item label="借领人">
  252. <el-input v-model="queryForm_Data.xhj_jlr" clearable />
  253. </el-form-item>
  254. <!-- <el-form-item label="借领时间"><el-input v-model="queryForm_Data.xhj_jlsj" clearable /></el-form-item> -->
  255. <el-form-item label="批准人">
  256. <el-input v-model="queryForm_Data.xhj_pzr" clearable />
  257. </el-form-item>
  258. <el-form-item>
  259. <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
  260. <el-button @click="handleQueryFormBtn_clear" type="warning">清空</el-button>
  261. </el-form-item>
  262. </el-form>
  263. <div class="divider"></div>
  264. <div>
  265. <!-- <import-button :url="URL_CUT_REF"></import-button> -->
  266. <el-button @click="handleTableRowBtn_export" type="success">导出</el-button>
  267. <!-- <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
  268. <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button> -->
  269. </div>
  270. <div class="divider"></div>
  271. <div class="flex-auto">
  272. <el-table :data="tableData" @selection-change="handleSelectionChange" v-loading="loading_table"
  273. element-loading-background="#ffffff70">
  274. <el-table-column type="selection"></el-table-column>
  275. <el-table-column prop="xhj_zcmc" label="资产名称" width="auto" show-overflow-tooltip></el-table-column>
  276. <el-table-column prop="xhj_zcbh" label="资产编号" width="auto" show-overflow-tooltip></el-table-column>
  277. <el-table-column prop="xhj_ssbm" label="所属部门" width="auto" show-overflow-tooltip></el-table-column>
  278. <!-- <el-table-column prop="xhj_jlxz" label="借领性质" width="auto" show-overflow-tooltip></el-table-column> -->
  279. <el-table-column prop="xhj_jlr" label="借领人" width="auto" show-overflow-tooltip></el-table-column>
  280. <el-table-column prop="xhj_jlsj" label="借领时间" width="auto" show-overflow-tooltip></el-table-column>
  281. <el-table-column prop="xhj_pzr" label="批准人" width="auto" show-overflow-tooltip></el-table-column>
  282. <el-table-column label="操作" fixed="right">
  283. <template #default="scope">
  284. <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="primary" >编辑</el-button>
  285. <el-button link :auto-insert-space="false" @click="handleTableColBtn_audit(scope)" type="primary" >审核</el-button>
  286. <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="primary" >详情</el-button>
  287. <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="primary" >删除</el-button> -->
  288. <el-button link :auto-insert-space="false" @click="handleTableColBtn_return(scope)" type="primary"
  289. :disabled="scope.row.xhj_zt_option_k === '3'">{{ scope.row.xhj_zt_option_k === '3' ? '已归还' : '归还' }}
  290. </el-button>
  291. </template>
  292. </el-table-column>
  293. </el-table>
  294. </div>
  295. <div class="flex justify-end mt-10 py-4">
  296. <el-pagination :page-size="limit" v-model:current-page="currentPage" @current-change="handleCurrentChange"
  297. background layout="total, prev, pager, next" :total="total" />
  298. </div>
  299. </div>
  300. <el-dialog v-model="dialogVisible_addOrEdit" append-to-body destroy-on-close>
  301. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
  302. label-width="120px">
  303. <el-form-item label="资产名称" prop="xhj_zcmc">
  304. <el-input v-model="dialogForm_Data.xhj_zcmc" clearable />
  305. </el-form-item>
  306. <el-form-item label="资产编号" prop="xhj_zcbh">
  307. <el-input v-model="dialogForm_Data.xhj_zcbh" clearable />
  308. </el-form-item>
  309. <el-form-item label="所属部门" prop="xhj_ssbm">
  310. <el-input v-model="dialogForm_Data.xhj_ssbm" clearable />
  311. </el-form-item>
  312. <el-form-item label="借领性质" prop="xhj_jlxz">
  313. <el-input v-model="dialogForm_Data.xhj_jlxz" clearable />
  314. </el-form-item>
  315. <el-form-item label="借领人" prop="xhj_jlr">
  316. <el-input v-model="dialogForm_Data.xhj_jlr" clearable />
  317. </el-form-item>
  318. <el-form-item label="借领时间" prop="xhj_jlsj">
  319. <el-input v-model="dialogForm_Data.xhj_jlsj" clearable />
  320. </el-form-item>
  321. <el-form-item label="批准人" prop="xhj_pzr">
  322. <el-input v-model="dialogForm_Data.xhj_pzr" clearable />
  323. </el-form-item>
  324. <div class="flex justify-center">
  325. <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交</el-button>
  326. <el-button @click="handleDialogFormBtn_cancel('dialogForm_Ref_addOrEdit')" type="default">取消</el-button>
  327. </div>
  328. </el-form>
  329. </el-dialog>
  330. <el-dialog v-model="dialogVisible_audit" append-to-body destroy-on-close>
  331. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_audit" :rules="dialogForm_Rules_audit" label-width="120px">
  332. <el-form-item label="状态">
  333. <el-radio-group v-model="dialogForm_Data[dialogForm_Field_audit.FLAG]">
  334. <el-radio label="1">通过</el-radio>
  335. <el-radio label="2">未通过</el-radio>
  336. </el-radio-group>
  337. </el-form-item>
  338. <!-- <el-form-item label="原因" v-show="dialogForm_Data[dialogForm_Field_audit.FLAG] === '1'">
  339. <el-input type="textarea" v-model="dialogForm_Data[dialogForm_Field_audit.REASON]" :rows="5" />
  340. </el-form-item> -->
  341. <div class="flex justify-center">
  342. <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_audit')" type="primary">提交</el-button>
  343. <el-button @click="handleDialogFormBtn_cancel('dialogForm_Ref_audit')" type="default">取消</el-button>
  344. </div>
  345. </el-form>
  346. </el-dialog>
  347. </template>