batch-adjust.tsx 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import OHeader from '@/components/o-header'
  2. import OPopup from '@/components/o-popup'
  3. import OSticky from '@/components/o-sticky'
  4. import { postMessage } from '@/helpers/native-message'
  5. import request from '@/helpers/request'
  6. import { browser } from '@/helpers/utils'
  7. import router from '@/router'
  8. import { state } from '@/state'
  9. import dayjs from 'dayjs'
  10. import {
  11. Button,
  12. Cell,
  13. CellGroup,
  14. DatePicker,
  15. Field,
  16. Picker,
  17. Popup,
  18. Radio,
  19. RadioGroup,
  20. Tag
  21. } from 'vant'
  22. import { defineComponent, onMounted, reactive } from 'vue'
  23. import { useRouter } from 'vue-router'
  24. import PracticeClass from '../train-planning/modal/practice-class'
  25. import { forms } from './batch'
  26. import styles from './batch-adjust.module.less'
  27. export default defineComponent({
  28. name: 'batch-adjust',
  29. setup() {
  30. const router = useRouter()
  31. // 获取乐团列表
  32. const getOrchestra = async () => {
  33. try {
  34. const { data } = await request.post('/api-school/orchestra/page', {
  35. data: {
  36. page: 1,
  37. rows: 100,
  38. schoolId: state.user.data.school.id
  39. }
  40. })
  41. forms.orchestraList = data.rows || []
  42. // 初始化显示选中第一个乐团
  43. if (forms.orchestraList.length > 0) {
  44. const temp = forms.orchestraList[0]
  45. forms.orchestraId = temp.id
  46. forms.orchestraName = temp.name
  47. }
  48. } catch {
  49. //
  50. }
  51. }
  52. const onSubmit = async () => {
  53. try {
  54. const { data } = await request.post('/api-school/courseSchedule/batchAdjust', {
  55. data: {
  56. adjustDay: forms.changeType ? '-' + forms.adjustDay : forms.adjustDay,
  57. classGroupIdList: forms.classGroupIdList,
  58. startTime: forms.startTime.join('-'),
  59. endTime: forms.endTime.join('-')
  60. }
  61. })
  62. router.push({
  63. path: '/course-preview',
  64. query: {
  65. cacheId: data
  66. }
  67. })
  68. } catch {
  69. //
  70. }
  71. }
  72. onMounted(() => {
  73. getOrchestra()
  74. })
  75. return () => (
  76. <div class={styles.batchAdjust}>
  77. <OHeader />
  78. <CellGroup inset>
  79. <Cell isLink onClick={() => (forms.orchestraStatus = true)}>
  80. {{ title: () => '乐团名称', value: () => forms.orchestraName }}
  81. </Cell>
  82. <Cell
  83. isLink
  84. onClick={() => {
  85. forms.classStatus = true
  86. }}
  87. >
  88. {{
  89. title: () => '班级',
  90. value: () => (
  91. <div class={styles.value}>
  92. {forms.classGroupIdList.length <= 0 ? (
  93. <div class={styles.tips}>请选择班级</div>
  94. ) : (
  95. <div>
  96. 已选<span style={{ padding: '0 4px' }}>{forms.classGroupIdList.length}</span>
  97. 个班级
  98. </div>
  99. )}
  100. </div>
  101. )
  102. }}
  103. </Cell>
  104. <Field
  105. isLink
  106. label="课程开始日期"
  107. placeholder="请选择课程开始日期"
  108. readonly
  109. inputAlign="right"
  110. modelValue={forms.startTime.join('-')}
  111. onClick={() => {
  112. forms.startTimeStatus = true
  113. }}
  114. />
  115. <Field
  116. isLink
  117. label="课程结束日期"
  118. placeholder="请选择课程结束日期"
  119. readonly
  120. inputAlign="right"
  121. modelValue={forms.endTime.join('-')}
  122. onClick={() => {
  123. forms.endTimeStatus = true
  124. }}
  125. />
  126. <Cell title="调整方式">
  127. {{
  128. value: () => (
  129. <RadioGroup
  130. checked-color="#FF8057"
  131. v-model={forms.changeType}
  132. direction="horizontal"
  133. >
  134. <Tag
  135. size="large"
  136. type="primary"
  137. color={!(forms.changeType === 1) ? '#EAEAEA' : '#FF8057'}
  138. textColor={!(forms.changeType === 1) ? '#AAA' : '#FFF'}
  139. class={styles.radioSection}
  140. round
  141. >
  142. <Radio class={styles.radioItem} name={1}></Radio>提前
  143. </Tag>
  144. <Tag
  145. size="large"
  146. type="primary"
  147. color={!(forms.changeType === 0) ? '#EAEAEA' : '#FF8057'}
  148. textColor={!(forms.changeType === 0) ? '#AAA' : '#FFF'}
  149. class={styles.radioSection}
  150. round
  151. >
  152. <Radio class={styles.radioItem} name={0}></Radio>延后
  153. </Tag>
  154. </RadioGroup>
  155. )
  156. }}
  157. </Cell>
  158. <Field
  159. class={styles.adjustDay}
  160. label="调整天数"
  161. inputAlign="right"
  162. type="number"
  163. v-model={forms.adjustDay}
  164. placeholder="请输入调整天数"
  165. v-slots={{ extra: () => <span style={{ paddingLeft: '6px' }}>天</span> }}
  166. />
  167. </CellGroup>
  168. <OSticky position="bottom">
  169. <div class={['btnGroup btnMore']} style={{ marginTop: '20px' }}>
  170. <Button
  171. color="#ccc"
  172. round
  173. onClick={() => {
  174. if (browser().isApp) {
  175. postMessage({ api: 'back' })
  176. } else {
  177. router.back()
  178. }
  179. }}
  180. >
  181. 取消
  182. </Button>
  183. <Button color="#FF8057" round onClick={onSubmit}>
  184. 下一步
  185. </Button>
  186. </div>
  187. </OSticky>
  188. {/* 乐团列表 */}
  189. <Popup v-model:show={forms.orchestraStatus} position="bottom" round>
  190. <Picker
  191. columns={forms.orchestraList}
  192. columnsFieldNames={{ text: 'name', value: 'id' }}
  193. onCancel={() => (forms.orchestraStatus = false)}
  194. onConfirm={(val: any) => {
  195. const selectedOption = val.selectedOptions[0]
  196. if (forms.orchestraId !== selectedOption.id) {
  197. forms.orchestraId = selectedOption.id
  198. forms.orchestraName = selectedOption.name
  199. forms.classGroupIdList = []
  200. }
  201. forms.orchestraStatus = false
  202. }}
  203. />
  204. </Popup>
  205. {/* 班级 */}
  206. <OPopup
  207. v-model:modelValue={forms.classStatus}
  208. position="bottom"
  209. style={{ background: '#f6f6f6' }}
  210. destroy
  211. >
  212. <PracticeClass
  213. onClose={() => (forms.classStatus = false)}
  214. orchestraId={forms.orchestraId}
  215. selectItem={forms.classGroupIdList}
  216. onConfirm={(val: any) => {
  217. forms.classGroupIdList = val
  218. }}
  219. />
  220. </OPopup>
  221. {/* 开始日期 */}
  222. <Popup v-model:show={forms.startTimeStatus} position="bottom" round>
  223. <DatePicker
  224. // v-model={forms.startTime}
  225. minDate={new Date()}
  226. onCancel={() => (forms.startTimeStatus = false)}
  227. onConfirm={(val: any) => {
  228. forms.startTime = val.selectedValues
  229. forms.startTimeStatus = false
  230. forms.endTime = []
  231. forms.endTimeMinDate = dayjs(forms.startTime.join('-') || new Date()).toDate()
  232. }}
  233. />
  234. </Popup>
  235. {/* 结束日期 */}
  236. <Popup v-model:show={forms.endTimeStatus} position="bottom" round>
  237. <DatePicker
  238. // v-model={forms.endTime}
  239. minDate={forms.endTimeMinDate}
  240. onCancel={() => (forms.endTimeStatus = false)}
  241. onConfirm={(val: any) => {
  242. forms.endTime = val.selectedValues
  243. forms.endTimeStatus = false
  244. }}
  245. />
  246. </Popup>
  247. </div>
  248. )
  249. }
  250. })