index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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. import { user } from "~/store/user";
  10. // #region (constant)
  11. const TABLE_KEY = 'xkj_id'
  12. const URL_CUT = '/xdjx/kbgl_jskb'
  13. const URL_CUT_REF = ref(URL_CUT)
  14. const URL_SUBMIT_KEY = URL_CUT.split('/').join('_').slice(1)
  15. const instance = getCurrentInstance()
  16. const router = useRouter()
  17. // #endregion
  18. // #region (variable)
  19. const loading_table = ref(true)
  20. let whichDialogSubmit: 'add' | 'edit'
  21. // #endregion
  22. // #region (type)
  23. type TYPE_TABLE_FIELD = {
  24. [TABLE_KEY]: string;
  25. 'xkj_jsmc': string; // 教师名称
  26. 'xkj_kbmc': string; // 课表名称
  27. 'team_id': string; // 学期编号
  28. 'team_name': string; // 学期名称
  29. 'xkj_scr': string; // 上传人
  30. 'xkj_kbxq_json': string; // 课表详情JSON
  31. 'xxk_kblx': string; // 课表类型
  32. 'xkj_xls': string; // 课表文件
  33. 'xkj_jsbh': string; // 教师编号
  34. 'xkj_img': string; // 课表图片
  35. 'xjj_zgbh':string // 职工编号
  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. dialogVisible_addOrEdit.value = true
  70. }
  71. const handleTableRowBtn_delete = async () => {
  72. 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('删除成功');
  73. queryApi()
  74. }
  75. // #endregion
  76. // #region (table body)
  77. const tableData = ref<TYPE_TABLE_FIELD[]>([])
  78. const DetailName = '-KBGL-JSKB-DETAIL'
  79. const DetailParam = 'aid'
  80. const handleTableColBtn_edit = async (scope: { row: TYPE_TABLE_FIELD }) => {
  81. whichDialogSubmit = 'edit'
  82. const res = await detailApi(scope.row[TABLE_KEY])
  83. dialogForm_Data.value = (res.data.one_info)
  84. dialogVisible_addOrEdit.value = true
  85. }
  86. const handleTableColBtn_delete = async (scope: { row: TYPE_TABLE_FIELD }) => {
  87. const resp = await deleteApi(scope.row[TABLE_KEY]);if(resp.code!=='1')return;ElMessage.success('删除成功');
  88. queryApi()
  89. }
  90. const handleTableColBtn_detail = (scope: { row: TYPE_TABLE_FIELD }) => {
  91. router.push({ name: DetailName, params: { [DetailParam]: scope.row[TABLE_KEY] } })
  92. }
  93. // #endregion
  94. // #region (pagination)
  95. const total = ref(0)
  96. const limit = ref(10)
  97. const currentPage = ref(1)
  98. function handleCurrentChange() {
  99. queryApi()
  100. }
  101. // #endregion
  102. // #region (dialog base)
  103. const dialogForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  104. const handleDialogFormBtn_submit = async (formRefKey: string, extendData?: Partial<TYPE_TABLE_FIELD>) => {
  105. const isValid = await (instance?.refs[formRefKey] as FormInstance).validate((valid: boolean) => valid)
  106. if (isValid) {
  107. const resp = await API_MAP[whichDialogSubmit](<TYPE_TABLE_FIELD>({ ...dialogForm_Data.value, ...extendData }))
  108. if(resp.code!=='1')return;ElMessage.success('操作成功');handleDialogFormBtn_cancel()
  109. queryApi()
  110. }
  111. }
  112. const handleDialogFormBtn_cancel = (formRefKey?: string) => {
  113. dialogVisible_addOrEdit.value = false
  114. // dialogVisible_audit.value = false
  115. }
  116. // #endregion
  117. // #region (dialog add/edit)
  118. const dialogVisible_addOrEdit = ref<boolean>(false)
  119. const dialogForm_Ref_addOrEdit = ref<FormInstance>()
  120. const dialogForm_Rules_addOrEdit = reactive({
  121. 'xkj_jsmc': { required: true, message: '教师名称不能为空', trigger: 'submit' },
  122. 'xkj_kbmc': { required: true, message: '课表名称不能为空', trigger: 'submit' },
  123. 'team_id': { required: true, message: '学期编号不能为空', trigger: 'submit' },
  124. 'team_name': { required: true, message: '学期名称不能为空', trigger: 'submit' },
  125. 'xkj_scr': { required: true, message: '上传人不能为空', trigger: 'submit' },
  126. 'xkj_kbxq_json': { required: true, message: '课表详情JSON不能为空', trigger: 'submit' },
  127. 'xxk_kblx': { required: true, message: '课表类型不能为空', trigger: 'submit' },
  128. 'xkj_xls': { required: true, message: '课表文件不能为空', trigger: 'submit' },
  129. 'xkj_jsbh': { required: true, message: '教师编号不能为空', trigger: 'submit' },
  130. 'xkj_img': { required: false, message: '课表图片不能为空', trigger: 'submit' },
  131. })
  132. // #endregion
  133. // #region (request api):
  134. function queryApi() {
  135. loading_table.value = true
  136. return request({
  137. url: URL_CUT + '/index',
  138. data: {
  139. ...queryForm_Data.value,
  140. limit: limit.value,
  141. page: currentPage.value
  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, ['xkj_jsmc', 'xkj_kbmc', 'team_id', 'team_name', 'xkj_scr', 'xkj_kbxq_json', 'xxk_kblx', 'xkj_xls', 'xkj_jsbh', 'xkj_img','xjj_zgbh']),
  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})
  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. <el-form inline :model="queryForm_Data">
  215. <el-form-item label="关键字">
  216. <el-input v-model="queryForm_Data.keyword"></el-input>
  217. </el-form-item>
  218. <!-- <el-form-item label="教师名称"><el-input v-model="queryForm_Data.xkj_jsmc" clearable /></el-form-item>
  219. <el-form-item label="课表名称"><el-input v-model="queryForm_Data.xkj_kbmc" clearable /></el-form-item>
  220. <el-form-item label="学期编号"><el-input v-model="queryForm_Data.team_id" clearable /></el-form-item>
  221. <el-form-item label="学期名称"><el-input v-model="queryForm_Data.team_name" clearable /></el-form-item>
  222. <el-form-item label="上传人"><el-input v-model="queryForm_Data.xkj_scr" clearable /></el-form-item>
  223. <el-form-item label="课表详情JSON"><el-input v-model="queryForm_Data.xkj_kbxq_json" clearable /></el-form-item>
  224. <el-form-item label="课表类型"><el-select v-model="queryForm_Data.xxk_kblx" clearable filterable ><el-option label="学校总课表" value="1" /><el-option label="年级课表" value="2" /><el-option label="班级课表" value="3" /><el-option label="教师课表" value="4" /><el-option label="学生课表" value="5" /></el-select></el-form-item>
  225. <el-form-item label="课表文件"><file-upload v-model:part="queryForm_Data.xkj_xls" /></el-form-item>
  226. <el-form-item label="教师编号"><el-input v-model="queryForm_Data.xkj_jsbh" clearable /></el-form-item>
  227. <el-form-item label="课表图片"><file-upload v-model:part="queryForm_Data.xkj_img" /></el-form-item> -->
  228. <el-form-item>
  229. <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
  230. <el-button @click="handleQueryFormBtn_clear" type="warning">清空</el-button>
  231. </el-form-item>
  232. </el-form>
  233. <div class="divider"></div>
  234. <div>
  235. <import-button @success="queryApi" :url="URL_CUT_REF"></import-button>
  236. <!-- <el-button @click="handleTableRowBtn_export" type="success">导出</el-button> -->
  237. <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
  238. <!-- <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button> -->
  239. </div>
  240. <div class="divider"></div>
  241. <div class="flex-auto">
  242. <el-table :data="tableData" @selection-change="handleSelectionChange" v-loading="loading_table"
  243. element-loading-background="#ffffff70">
  244. <el-table-column type="selection"></el-table-column>
  245. <el-table-column type="index" label="序号" width="60" :index="(i: number) => (currentPage - 1) * limit + i + 1" />
  246. <el-table-column prop="xkj_jsmc" label="教师名称" width="auto" show-overflow-tooltip></el-table-column>
  247. <el-table-column prop="xkj_kbmc" label="课表名称" width="auto" show-overflow-tooltip></el-table-column>
  248. <!-- <el-table-column prop="team_id" label="学期编号" width="auto" show-overflow-tooltip></el-table-column> -->
  249. <el-table-column prop="team_name" label="学期名称" width="auto" show-overflow-tooltip></el-table-column>
  250. <!-- <el-table-column prop="xkj_scr" label="上传人" width="auto" show-overflow-tooltip></el-table-column> -->
  251. <!-- <el-table-column prop="xkj_kbxq_json" label="课表详情JSON" width="auto" show-overflow-tooltip></el-table-column> -->
  252. <el-table-column prop="xxk_kblx" label="课表类型" width="auto" show-overflow-tooltip></el-table-column>
  253. <!-- <el-table-column prop="xkj_xls" label="课表文件" width="auto" show-overflow-tooltip></el-table-column> -->
  254. <!-- <el-table-column prop="xkj_jsbh" label="教师编号" width="auto" show-overflow-tooltip></el-table-column> -->
  255. <!-- <el-table-column prop="xkj_img" label="课表图片" width="auto" show-overflow-tooltip></el-table-column> -->
  256. <el-table-column label="操作" fixed="right">
  257. <template #default="scope">
  258. <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="primary" >编辑</el-button> -->
  259. <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="primary">查看课表
  260. </el-button>
  261. <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="primary">删除
  262. </el-button>
  263. </template>
  264. </el-table-column>
  265. </el-table>
  266. </div>
  267. <div class="flex justify-end mt-10 py-4">
  268. <el-pagination :page-size="limit" v-model:current-page="currentPage" @current-change="handleCurrentChange"
  269. background layout="total, prev, pager, next" :total="total" />
  270. </div>
  271. </div>
  272. <el-dialog v-model="dialogVisible_addOrEdit" append-to-body destroy-on-close>
  273. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
  274. label-width="120px">
  275. <!-- <el-form-item label="教师编号" prop="xkj_jsbh">
  276. <el-input v-model="dialogForm_Data.xkj_jsbh" clearable />
  277. </el-form-item> -->
  278. <el-form-item label="教师名称" prop="xkj_jsmc">
  279. <!-- <el-input v-model="dialogForm_Data.xkj_jsmc" clearable /> -->
  280. <remote-select url="/user/main/index" :fields="['user_no','user_realname']" :d="{user_role_id:'7' ,dept_id:user.dept_id}" v-model="dialogForm_Data.xjj_zgbh" v-model:model-name="dialogForm_Data.xkj_jsmc" ></remote-select>
  281. </el-form-item>
  282. <el-form-item label="课表名称" prop="xkj_kbmc">
  283. <el-input v-model="dialogForm_Data.xkj_kbmc" clearable />
  284. </el-form-item>
  285. <!-- <el-form-item label="学期编号" prop="team_id">
  286. <el-input v-model="dialogForm_Data.team_id" clearable />
  287. </el-form-item> -->
  288. <el-form-item label="学期名称" prop="team_name">
  289. <!-- <el-input v-model="dialogForm_Data.team_name" clearable /> -->
  290. <remote-select to="team" v-model="dialogForm_Data.team_id" v-model:modelName="dialogForm_Data.team_name">
  291. </remote-select>
  292. </el-form-item>
  293. <el-form-item label="上传人" prop="xkj_scr">
  294. <el-input v-model="dialogForm_Data.xkj_scr" clearable />
  295. </el-form-item>
  296. <!-- <el-form-item label="课表详情JSON" prop="xkj_kbxq_json">
  297. <el-input v-model="dialogForm_Data.xkj_kbxq_json" clearable />
  298. </el-form-item> -->
  299. <!-- <el-form-item label="课表类型" prop="xxk_kblx">
  300. <el-select v-model="dialogForm_Data.xxk_kblx" clearable filterable>
  301. <el-option label="学校总课表" value="1" />
  302. <el-option label="年级课表" value="2" />
  303. <el-option label="班级课表" value="3" />
  304. <el-option label="教师课表" value="4" />
  305. <el-option label="学生课表" value="5" />
  306. </el-select>
  307. </el-form-item> -->
  308. <el-form-item label="课表文件" prop="xkj_xls">
  309. <file-upload accept=".xlsx,.xls" v-model:part="dialogForm_Data.xkj_xls" >
  310. <template #tip>
  311. <div>支持.xlsx,.xls类型文件</div>
  312. </template>
  313. </file-upload>
  314. </el-form-item>
  315. <el-form-item label="课表图片" prop="xkj_img">
  316. <file-upload v-model:part="dialogForm_Data.xkj_img" />
  317. </el-form-item>
  318. <div class="flex justify-center">
  319. <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit', { xxk_kblx: '4' })" type="primary">提交
  320. </el-button>
  321. <el-button @click="handleDialogFormBtn_cancel('dialogForm_Ref_addOrEdit')" type="default">取消</el-button>
  322. </div>
  323. </el-form>
  324. </el-dialog>
  325. </template>