subject-list.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. import SaveForm from '@/components/save-form'
  2. import {DataTableColumn, NButton, NDataTable, NDatePicker, NFormItem, NImage, NInput, NModal, NSelect, NSpace, NTag, useDialog, useMessage} from 'naive-ui'
  3. import {defineComponent, onMounted, reactive, ref} from 'vue'
  4. import styles from '../index.module.less'
  5. import {musicalInstrumentPage, subjectCategoryPage, subjectPage, subjectUpdateStatus} from "@views/system-manage/subject-manage/api";
  6. import {filterTimes} from "@/utils/dateUtil";
  7. import SubjectSave from "@views/system-manage/subject-manage/subject/modal/subject-save";
  8. import Pagination from "@components/pagination";
  9. import deepClone from "@/utils/deep.clone";
  10. import axios from "axios";
  11. import cleanDeep from "clean-deep";
  12. export default defineComponent({
  13. name: 'subject-list',
  14. setup() {
  15. const dialog = useDialog()
  16. const message = useMessage()
  17. const state = reactive({
  18. loading: false,
  19. pagination: {
  20. page: 1,
  21. rows: 10,
  22. pageTotal: 0
  23. },
  24. dataList: [] as any,
  25. saveMode: 'add',
  26. showSaveDialog: false,
  27. rowData: {},
  28. categorizeList: [] as any,
  29. instrumentList: [] as any,
  30. })
  31. const searchForm = reactive({
  32. keyword: null,
  33. times: null as any,
  34. operatorKeyword: null, //创建人
  35. categoryId: null,//声部分类
  36. musicalInstrumentId: null,//关联乐器
  37. })
  38. const columns = (): DataTableColumn[] => {
  39. return [
  40. {
  41. title: '编号',
  42. key: 'id'
  43. },
  44. {
  45. title: '声部名称',
  46. key: 'name',
  47. },
  48. {
  49. title: '声部分类',
  50. key: 'categoryName'
  51. },
  52. {
  53. title: '声部编码',
  54. key: 'code'
  55. },
  56. {
  57. title: '图片',
  58. key: 'img',
  59. render(row: any) {
  60. return <NImage width={70} src={row.img}/>
  61. }
  62. },
  63. {
  64. title: '关联乐器',
  65. key: 'musicalInstrumentName'
  66. },
  67. {
  68. title: '操作人',
  69. key: 'operator',
  70. render(row: any) {
  71. return (
  72. <div>
  73. <div>{row.operatorName}</div>
  74. <div>{row.updateTime}</div>
  75. </div>
  76. )
  77. }
  78. },
  79. {
  80. title: '状态',
  81. key: 'enableFlag',
  82. render(row: any) {
  83. return (
  84. <NTag type={row.enableFlag ? 'primary' : 'default'}>{row.enableFlag ? '启用' : '停用'}</NTag>
  85. )
  86. }
  87. },
  88. {
  89. title: '操作',
  90. key: 'operation',
  91. fixed: 'right',
  92. width: 180,
  93. render(row: any) {
  94. return (
  95. <NSpace>
  96. <NButton
  97. type="primary"
  98. text
  99. //v-auth="materialCategory/update1599962354053140482"
  100. onClick={() => {
  101. state.saveMode = 'edit'
  102. state.showSaveDialog = true
  103. state.rowData = row
  104. }}
  105. >
  106. 修改
  107. </NButton>
  108. <NButton
  109. type="primary"
  110. size="small"
  111. text
  112. //v-auth="sysNotice/status1599959101026455553"
  113. onClick={() => onChangeStatus(row)}
  114. >
  115. {row.enableFlag ? '停用' : '启用'}
  116. </NButton>
  117. </NSpace>
  118. )
  119. }
  120. }
  121. ]
  122. }
  123. const saveForm = ref()
  124. const onSubmit = () => {
  125. state.pagination.page = 1
  126. getList()
  127. }
  128. const onSearch = () => {
  129. saveForm.value?.submit()
  130. }
  131. const onBtnReset = () => {
  132. saveForm.value?.reset()
  133. }
  134. const initCategoryList = async () => {
  135. try {
  136. state.loading = true
  137. const body = {
  138. page: 1,
  139. rows: 9999
  140. }
  141. const {data} = await subjectCategoryPage(body)
  142. state.loading = false
  143. data.rows.forEach((next: any) => {
  144. state.categorizeList.push({
  145. label: next.name,
  146. value: next.id,
  147. enableFlag: next.enableFlag,
  148. })
  149. })
  150. console.log(state.categorizeList)
  151. } catch (e) {
  152. console.log("err", e);
  153. }
  154. }
  155. const initInstrumentList = async () => {
  156. try {
  157. state.loading = true
  158. const body = {
  159. page: 1,
  160. rows: 9999
  161. }
  162. const {data} = await musicalInstrumentPage(body)
  163. state.loading = false
  164. data.rows.forEach((next: any) => {
  165. state.instrumentList.push({
  166. label: next.name,
  167. value: next.id + '',
  168. enableFlag: next.enableFlag,
  169. })
  170. })
  171. } catch (e) {
  172. }
  173. }
  174. const getList = async () => {
  175. try {
  176. state.loading = true
  177. const {times, ...reset} = searchForm
  178. const body = {
  179. ...reset,
  180. ...filterTimes(times, ['startTime', 'endTime']),
  181. page: state.pagination.page,
  182. rows: state.pagination.rows,
  183. }
  184. const {data} = await subjectPage(body)
  185. state.loading = false
  186. state.pagination.pageTotal = Number(data.total)
  187. state.dataList = data.rows || []
  188. } catch {
  189. state.loading = false
  190. }
  191. }
  192. const onChangeStatus = (row: any) => {
  193. const statusStr = row.enableFlag ? '停用' : '启用'
  194. dialog.warning({
  195. title: '警告',
  196. content: `是否${statusStr}?`,
  197. positiveText: '确定',
  198. negativeText: '取消',
  199. onPositiveClick: async () => {
  200. try {
  201. const res = await subjectUpdateStatus({
  202. id: row.id
  203. }) as any
  204. if (res.code == '999') {
  205. dialog.warning({
  206. title: '提示',
  207. content: res.message,
  208. type: 'warning',
  209. positiveText: '确定',
  210. negativeText: '取消',
  211. onPositiveClick: async () => {
  212. await subjectUpdateStatus({
  213. id: row.id,
  214. confirm: true
  215. })
  216. }
  217. })
  218. }
  219. getList()
  220. message.success(`${statusStr}成功`)
  221. } catch {
  222. }
  223. }
  224. })
  225. }
  226. onMounted(() => {
  227. getList()
  228. initCategoryList()
  229. initInstrumentList()
  230. })
  231. return () => (
  232. <div class="system-menu-container">
  233. <SaveForm
  234. ref={saveForm}
  235. model={searchForm}
  236. onSubmit={onSubmit}
  237. onSetModel={(val: any) => Object.assign(searchForm, val)}
  238. saveKey="subject-list"
  239. >
  240. <NFormItem path="keyword" label="关键字">
  241. <NInput
  242. placeholder="请输入编号/名称"
  243. v-model:value={searchForm.keyword}
  244. clearable
  245. />
  246. </NFormItem>
  247. <NFormItem path="categoryId" label="声部分类">
  248. <NSelect
  249. placeholder="请选择声部分类"
  250. v-model:value={searchForm.categoryId}
  251. filterable
  252. options={state.categorizeList}
  253. clearable
  254. />
  255. </NFormItem>
  256. <NFormItem path="musicalInstrumentId" label="关联乐器">
  257. <NSelect
  258. v-model:value={searchForm.musicalInstrumentId}
  259. placeholder="请选择关联乐器"
  260. filterable
  261. options={state.instrumentList}
  262. clearable
  263. />
  264. </NFormItem>
  265. <NFormItem path="operatorKeyword" label="操作人">
  266. <NInput
  267. placeholder="请输入操作人"
  268. v-model:value={searchForm.operatorKeyword}
  269. clearable
  270. />
  271. </NFormItem>
  272. <NFormItem path="times" label="操作时间">
  273. <NDatePicker
  274. class={styles.datepicker}
  275. value-format="yyyy.MM.dd"
  276. v-model:value={searchForm.times}
  277. type="daterange"
  278. clearable
  279. />
  280. </NFormItem>
  281. <NFormItem>
  282. <NSpace>
  283. <NButton type="primary" onClick={onSearch}>
  284. 查询
  285. </NButton>
  286. <NButton type="default" onClick={onBtnReset}>
  287. 重置
  288. </NButton>
  289. </NSpace>
  290. </NFormItem>
  291. </SaveForm>
  292. <NSpace style={{paddingBottom: '12px'}}>
  293. <NButton
  294. type="primary"
  295. //v-auth="materialCategory/save1599962104022290433"
  296. onClick={() => {
  297. state.saveMode = 'add'
  298. state.showSaveDialog = true
  299. }}
  300. disabled={state.loading}
  301. >
  302. 添加
  303. </NButton>
  304. </NSpace>
  305. <NDataTable
  306. scroll-x="1300"
  307. loading={state.loading}
  308. columns={columns()}
  309. data={state.dataList}
  310. children-key="subMaterialCategoryList"
  311. default-expand-all={false}
  312. row-key={(row: any) => row.id}
  313. ></NDataTable>
  314. <Pagination
  315. v-model:page={state.pagination.page}
  316. v-model:pageSize={state.pagination.rows}
  317. v-model:pageTotal={state.pagination.pageTotal}
  318. onList={getList}
  319. sync
  320. saveKey="login-device"
  321. ></Pagination>
  322. <NModal
  323. v-model:show={state.showSaveDialog}
  324. preset="dialog"
  325. showIcon={false}
  326. title={state.saveMode === 'add' ? '添加声部' : '修改声部'}
  327. style={{width: '400px'}}
  328. >
  329. <SubjectSave
  330. type={state.saveMode}
  331. data={state.rowData}
  332. categoryList={deepClone(state.categorizeList)}
  333. instrumentList={deepClone(state.instrumentList)}
  334. onClose={() => (state.showSaveDialog = false)}
  335. onGetList={getList}
  336. />
  337. </NModal>
  338. </div>
  339. )
  340. }
  341. })