kcgl.vue 16 KB

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