index.tsx 13 KB

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