index.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. import { Button, Cell, Dialog, Grid, GridItem, Icon, showConfirmDialog, Sticky } from 'vant'
  2. import { defineComponent, onMounted, reactive, ref } from 'vue'
  3. import styles from '../index.module.less'
  4. import iconA from '../images/icon-photo.png'
  5. import request from '@/helpers/request'
  6. import { state } from '@/state'
  7. import { useRoute, useRouter } from 'vue-router'
  8. import OFullRefresh from '@/components/o-full-refresh'
  9. import OHeader from '@/components/o-header'
  10. import OSticky from '@/components/o-sticky'
  11. import iconTeacher from '@/common/images/icon_teacher.png'
  12. import ODialog from '@/components/o-dialog'
  13. import { moneyFormat } from '@/helpers/utils'
  14. import questIcon from '@/school/images/quest-icon.png'
  15. export default defineComponent({
  16. name: 'approval-manage-subsidy',
  17. setup() {
  18. const route = useRoute()
  19. const router = useRouter()
  20. const dialog = ref(false)
  21. const refreshing = ref(false)
  22. const recordId = ref('')
  23. const data = reactive({
  24. startDate: '',
  25. endDate: '',
  26. manageSalary: '' as any,
  27. courseSalary: '' as any,
  28. trainingSalary: '',
  29. /**管理补助 */
  30. manageSalaryInfo: {} as any,
  31. /**训练补助 */
  32. courseSalaryInfo: {} as any,
  33. /**练习奖励 */
  34. practiceSalaryInfo: {} as any
  35. })
  36. const getData = async () => {
  37. try {
  38. const res: any = await request.post(
  39. `${state.platformApi}/schoolWeekSalaryRecord/manageConfirm/${route.query.salaryId}`,
  40. {
  41. // hideLoading: refreshing.value
  42. }
  43. )
  44. if (res?.data) {
  45. const {
  46. courseSalaryInfo,
  47. manageSalaryInfo,
  48. practiceSalaryInfo,
  49. startDate = '',
  50. endDate = '',
  51. manageSalary,
  52. courseSalary,
  53. trainingSalary,
  54. id
  55. } = res.data
  56. data.courseSalaryInfo = courseSalaryInfo
  57. data.manageSalaryInfo = manageSalaryInfo
  58. data.practiceSalaryInfo = practiceSalaryInfo
  59. data.startDate = startDate?.split(' ')[0] || ''
  60. data.endDate = endDate?.split(' ')[0] || ''
  61. data.manageSalary = manageSalary
  62. data.courseSalary = courseSalary
  63. data.trainingSalary = trainingSalary
  64. recordId.value = id
  65. }
  66. } catch (error) {}
  67. refreshing.value = false
  68. }
  69. onMounted(() => {
  70. getData()
  71. })
  72. /**确认补助 */
  73. const sendConfirm = () => {
  74. showConfirmDialog({
  75. message: '是否确认该周补助金额?'
  76. }).then(() => {
  77. request
  78. .post(
  79. `${state.platformApi}/schoolWeekSalaryRecord/manageConfirmed/${route.query.salaryId}`,
  80. {
  81. hideLoading: false
  82. }
  83. )
  84. .then((res: any) => {
  85. if (res?.code == 200) {
  86. router.back()
  87. }
  88. })
  89. })
  90. }
  91. return () => (
  92. <div>
  93. <OSticky
  94. onGetHeight={(height: number) => {
  95. document.documentElement.style.setProperty('--header-height', height + 'px')
  96. }}
  97. >
  98. <OHeader
  99. class={styles.rightTip}
  100. // rightText="?"
  101. v-slots={{
  102. right: () => <Icon name={questIcon} size={22} color="#333" />
  103. }}
  104. onClickRight={() => (dialog.value = true)}
  105. title={route.query.display ? '补助详情' : '补助确认'}
  106. ></OHeader>
  107. </OSticky>
  108. <OFullRefresh
  109. v-model:modelValue={refreshing.value}
  110. onRefresh={getData}
  111. style="min-height: calc(100vh - var(--header-height))"
  112. >
  113. <div class={styles.wrap}>
  114. {!!data.courseSalaryInfo && (
  115. <div class={styles.item}>
  116. <Cell center>
  117. {{
  118. title: () => (
  119. <div class={styles.itemTitle}>
  120. <span>
  121. {data.startDate} 至 {data.endDate}
  122. </span>
  123. <span class={styles.itemTag}>补助周期</span>
  124. </div>
  125. )
  126. }}
  127. </Cell>
  128. <Grid class={styles.grid} columnNum={2} border={false}>
  129. <GridItem>
  130. <div class={styles.gridItem}>
  131. <div class={styles.gridItemTop}>
  132. <span class={styles.topNum}>{moneyFormat(data.manageSalary || 0)}</span>元
  133. </div>
  134. <div>管理补助</div>
  135. </div>
  136. </GridItem>
  137. <GridItem>
  138. <div class={styles.gridItem}>
  139. <div class={styles.gridItemTop}>
  140. <span class={styles.topNum}>{moneyFormat(data.courseSalary || 0)}</span>元
  141. </div>
  142. <div>训练补助</div>
  143. </div>
  144. </GridItem>
  145. {/* <GridItem>
  146. <div class={styles.gridItem}>
  147. <div class={styles.gridItemTop}>
  148. <span class={styles.topNum}>{data.trainingSalary || 0}</span>元
  149. </div>
  150. <div>练习奖励</div>
  151. </div>
  152. </GridItem> */}
  153. </Grid>
  154. </div>
  155. )}
  156. {!!data.manageSalaryInfo && (
  157. <div class={styles.item}>
  158. <Cell
  159. style={{
  160. '--van-cell-value-color':
  161. (data.manageSalaryInfo.photoNum || 0) >=
  162. (data.manageSalaryInfo.expectPhotoNum || 0)
  163. ? '#333'
  164. : '#F44541'
  165. }}
  166. center
  167. value={`训练照片${data.manageSalaryInfo.photoNum || 0}/${
  168. data.manageSalaryInfo.expectPhotoNum || 0
  169. }`}
  170. isLink
  171. to={`/subsidy-grant-detail?id=${recordId.value}`}
  172. >
  173. {{
  174. title: () => (
  175. <div class={styles.itemTitle}>
  176. <div class={styles.titleLine}></div>
  177. <span>管理补助</span>
  178. </div>
  179. )
  180. }}
  181. </Cell>
  182. <Grid class={styles.grid} columnNum={3} border={false}>
  183. <GridItem>
  184. <div class={styles.gridItem}>
  185. <div class={styles.gridItemTop}>
  186. <span class={[styles.topNum, styles.small]} style={{ color: '#333' }}>
  187. {moneyFormat(data.manageSalaryInfo.standardSalary || 0)}
  188. </span>
  189. 元/周
  190. </div>
  191. <div>补助标准</div>
  192. </div>
  193. </GridItem>
  194. <GridItem>
  195. <div class={styles.gridItem}>
  196. <div class={styles.gridItemTop}>
  197. <span class={[styles.topNum, styles.small]} style={{ color: '#333' }}>
  198. {data.manageSalaryInfo.coursewareNum || 0}
  199. </span>
  200. 课时
  201. </div>
  202. <div>本周课时数</div>
  203. </div>
  204. </GridItem>
  205. <GridItem>
  206. <div class={styles.gridItem}>
  207. <div class={styles.gridItemTop}>
  208. <span class={[styles.topNum, styles.small]}>
  209. {moneyFormat(data.manageSalaryInfo.actualSalary || 0)}
  210. </span>
  211. </div>
  212. <div>实际补助</div>
  213. </div>
  214. </GridItem>
  215. </Grid>
  216. </div>
  217. )}
  218. {/* {!!data.practiceSalaryInfo && (
  219. <div class={styles.item}>
  220. <Cell center isLink to={`/subsidy-reward-detail?id=${recordId.value}`}>
  221. {{
  222. title: () => (
  223. <div class={styles.itemTitle}>
  224. <div class={styles.titleLine}></div>
  225. <span>练习奖励</span>
  226. </div>
  227. )
  228. }}
  229. </Cell>
  230. <Grid class={styles.grid} columnNum={3} border={false}>
  231. <GridItem>
  232. <div class={styles.gridItem}>
  233. <div class={styles.gridItemTop}>
  234. <span class={[styles.topNum, styles.small]}>
  235. {data.practiceSalaryInfo.standardSalary || 0}
  236. </span>
  237. 元/人
  238. </div>
  239. <div>补助标准</div>
  240. </div>
  241. </GridItem>
  242. <GridItem>
  243. <div class={styles.gridItem}>
  244. <div class={styles.gridItemTop}>
  245. <span class={[styles.topNum, styles.small]}>{data.practiceSalaryInfo.targetNum || 0}</span>
  246. </div>
  247. <div>练习达标人数</div>
  248. </div>
  249. </GridItem>
  250. <GridItem>
  251. <div class={styles.gridItem}>
  252. <div class={styles.gridItemTop}>
  253. <span class={[styles.topNum, styles.small]}>
  254. {data.practiceSalaryInfo.actualSalary || 0}
  255. </span>
  256. </div>
  257. <div>实际奖励</div>
  258. </div>
  259. </GridItem>
  260. </Grid>
  261. </div>
  262. )} */}
  263. <div class={styles.item}>
  264. <Cell center>
  265. {{
  266. title: () => (
  267. <div class={styles.itemTitle}>
  268. <div class={styles.titleLine}></div>
  269. <span>训练补助</span>
  270. </div>
  271. )
  272. }}
  273. </Cell>
  274. <Grid class={styles.grid} columnNum={3} border={false}>
  275. <GridItem>
  276. <div class={styles.gridItem}>
  277. <div class={styles.gridItemTop}>
  278. <span class={[styles.topNum, styles.small]} style={{ color: '#333' }}>
  279. {moneyFormat(data.courseSalaryInfo.singleSubsidyStandard || 0)}
  280. </span>
  281. 元/人
  282. </div>
  283. <div>单技补助标准</div>
  284. </div>
  285. </GridItem>
  286. <GridItem>
  287. <div class={styles.gridItem}>
  288. <div class={styles.gridItemTop}>
  289. <span class={[styles.topNum, styles.small]} style={{ color: '#333' }}>
  290. {moneyFormat(data.courseSalaryInfo.musicSubsidyStandard || 0)}
  291. </span>
  292. 元/天
  293. </div>
  294. <div>乐理补助标准</div>
  295. </div>
  296. </GridItem>
  297. <GridItem>
  298. <div class={styles.gridItem}>
  299. <div class={styles.gridItemTop}>
  300. <span class={[styles.topNum, styles.small]} style={{ color: '#333' }}>
  301. {moneyFormat(data.courseSalaryInfo.ensembleSubsidyStandard || 0)}
  302. </span>
  303. </div>
  304. <div>合奏补助标准</div>
  305. </div>
  306. </GridItem>
  307. </Grid>
  308. {Array.isArray(data.courseSalaryInfo.salaryRecordDetailItemList) &&
  309. data.courseSalaryInfo.salaryRecordDetailItemList.map((teacher: any) => {
  310. return (
  311. <Cell
  312. center
  313. title={teacher.userName}
  314. class={styles.teacherListCell}
  315. isLink
  316. to={`/subsidy-exercise-detail?id=${recordId.value}&userId=${teacher.userId}`}
  317. >
  318. {{
  319. icon: () => (
  320. <img class={styles.itemPicture} src={teacher.avatar || iconTeacher} />
  321. ),
  322. value: () => (
  323. <div class={styles.gridItem}>
  324. <div class={styles.gridItemTop}>
  325. <span class={[styles.topNum, styles.small]}>
  326. {moneyFormat(teacher.salary || 0)}
  327. </span>
  328. </div>
  329. <div class={styles.valeLabel}>实际补助</div>
  330. </div>
  331. )
  332. }}
  333. </Cell>
  334. )
  335. })}
  336. </div>
  337. <div class="van-safe-area-bottom">
  338. <div style={{ height: 'calc(var(--van-button-default-height) + 0.8rem)' }}></div>
  339. </div>
  340. </div>
  341. </OFullRefresh>
  342. {route.query.display && (
  343. <div class={styles.confirmBtn}>
  344. <div class="van-safe-area-bottom">
  345. <Button block type="primary" round onClick={sendConfirm}>
  346. 确认无误
  347. </Button>
  348. </div>
  349. </div>
  350. )}
  351. <ODialog
  352. title="补助发放规则"
  353. message="1、每周一凌晨生成上一周实际补助数据\n2、每周一24点前完成补助确认,则该补助将会在当周周五发放\n3、超过周一24点确认,则延后到下周周五发放\n4、如遇法定节假日,则统一延后到下一周五发放\n5、未绑定银行卡导致无法发放时,将在绑定银行卡后的下一周五,一次性将已确认且未发放的补助金额发放"
  354. v-model:show={dialog.value}
  355. dialogMarginTop="env(safe-area-inset-top)"
  356. messageAlign="left"
  357. confirmButtonText="我知道了"
  358. />
  359. </div>
  360. )
  361. }
  362. })