workbench.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. <template>
  2. <div class="w-full h-full workbench">
  3. <!-- 日历 -->
  4. <div class="w-full p16 backgroundThemeColor rounded-b-lg setCaleStrle">
  5. <van-calendar ref="calendarRef" :default-date="(new Date(dateConditions))" switch-mode="year-month"
  6. :show-title="false" :show-mark="false" :poppable="false" :show-confirm="false" :row-height="'3rem'"
  7. :min-date="minDate"
  8. :style="{ borderRadius: '0.3rem', height: expandAndCollapse ? (calendarHeight ? calendarHeight + 'px' : 'auto') : usePxToVwView(140) }"
  9. :formatter="formatter" @select="calendarSelect" @panel-change="calendarPanelChangeSet">
  10. <template #month-title></template>
  11. <template #bottom-info="day">
  12. <div class="flex justify-items-center">
  13. <div class="doT" v-if="day?.bottomInfo"></div>
  14. <!-- <div class="taskDot" v-if="day?.taskInfo"></div> -->
  15. </div>
  16. </template>
  17. </van-calendar>
  18. <div class="flex justify-center" @click="expandAndCollapseClick">
  19. <van-icon name="arrow-double-left" color="#fff" :size="usePxToVwView(20)" class="mt-3 expandAndCollapseIcon"
  20. :style="expandAndCollapse ? 'transform: rotate(90deg);' : 'transform: rotate(-90deg);'" />
  21. </div>
  22. </div>
  23. <!-- 日程安排 -->
  24. <div class="min-h-52 overflow-y-auto mt-5">
  25. <!-- 有数据的情况 -->
  26. <div class="w-full h-full flex flex-col items-center" v-if="visitorProgramList.length">
  27. <div class="w-full overflow-y-auto max-h-72 px-5 mb-5">
  28. <template v-for="item in visitorProgramList">
  29. <van-swipe-cell>
  30. <!-- 拜访计划 -->
  31. <template v-if="item.calendarType == 1">
  32. <div class="bg-[#0859d6] ra6 p-4 mb-4 text-[#fff]" @click="jumpToVisitorDetails(item)">
  33. <div class="w-full flex items-center justify-between">
  34. <div class="text-size-in font-bold text-[#fff]">{{ item.planName }}</div>
  35. <div :class="`labelTag ${item.finishState == 0 ? 'toBeCompleted' : 'completed'}`">{{ ['未完成',
  36. '已完成'][item.finishState] }}</div>
  37. </div>
  38. <div class="w-full flex items-center justify-between mt-4">
  39. <div class="text-[#fff]" style="width: 62%;">拜访目的: {{ item.visitGoalName }}</div>
  40. <div class="w-1/3 text-[#fff] flex items-center" style="width: 38%;">
  41. <van-icon name="user-circle-o" class="text-size-in mr-2" />
  42. {{ item.customName }}
  43. </div>
  44. </div>
  45. <div class="w-full flex items-center justify-between mt-4">
  46. <div class="w-2/3 text-[#fff]" style="width: 62%;">拜访时间: {{ item.visitTime }}</div>
  47. <div class="w-1/3 text-[#fff] flex items-center" style="width: 38%;">
  48. <van-icon name="phone-o" class="text-size-in mr-2" />
  49. {{ item?.companyPhone }}
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <!-- 任务 -->
  55. <template v-if="item.calendarType == 2 && false">
  56. <div class="bg-[#FFA35919] ra6 p-4 mb-4" @click="toEditTask(item)">
  57. <div class="w-full flex items-center justify-between">
  58. <div class="text-size-in font-bold text-[#474A56]">{{ item.taskName }}</div>
  59. <div :class="`labelTag ${taskStatus[item.status]?.type}`">
  60. {{ taskStatus[item.status]?.label }}
  61. </div>
  62. </div>
  63. <div class="w-full flex items-center justify-between mt-4" v-if="user.company.isSimple != 1">
  64. <div class="text-[#505050]" style="width: 100%;">优先级: {{ ['低','中','高'][item.priority] }}</div>
  65. </div>
  66. <div class="w-full flex items-center justify-between mt-4">
  67. <div class="text-[#505050]" style="width: 100%;">任务开始时间: {{ item.startDate }}</div>
  68. </div>
  69. <div class="w-full flex items-center justify-between mt-4">
  70. <div class="text-[#505050]" style="width: 100%;">任务截至时间: {{ item.endDate }}</div>
  71. </div>
  72. </div>
  73. </template>
  74. <template #right>
  75. <div class="flex items-center flex-col justify-around h-full bg-[#F9F0E9] ra-l6 py-4">
  76. <div class="buttonCircle text-white" @click.stop="jumpToAddNewVisitors(item)" v-if="item.calendarType == 1">
  77. <img src="/src/assets/image/edit.png" class="w-full h-full">
  78. </div>
  79. <div class="buttonCircle text-white" @click.stop="toEditTask(item)" v-if="item.calendarType == 2">
  80. <img src="/src/assets/image/edit.png" class="w-full h-full">
  81. </div>
  82. <div class="buttonCircle text-white" @click.stop="deleteVisitor(item)">
  83. <img src="/src/assets/image/delete.png" class="w-full h-full">
  84. </div>
  85. </div>
  86. </template>
  87. </van-swipe-cell>
  88. </template>
  89. </div>
  90. <!-- <van-button type="primary" icon="add-o" class="m-auto w-3/5" @click="addTaskPlanPopup = true">新增</van-button> -->
  91. <van-button type="primary" icon="add-o" class="m-auto w-3/5" @click="jumpToAddNewVisitors()">新增</van-button>
  92. </div>
  93. <!-- 没有数据的情况下 -->
  94. <div class="w-full h-full flex flex-col items-center justify-center" v-if="!visitorProgramList.length">
  95. <div class="schedulePicture mb-5">
  96. <img class="w-full h-full" src="/src/assets/image/schedule.png">
  97. </div>
  98. <div class="text-center text-[#C4C4C4] mb-5">您今天还没安排日程哦!</div>
  99. <van-button type="primary" class="m-auto w-3/5" @click="addTaskPlanPopup = true">马上安排</van-button>
  100. </div>
  101. </div>
  102. <!-- 拜访计划和任务的添加按钮 -->
  103. <van-popup v-model:show="addTaskPlanPopup" closeable destroy-on-close position="bottom">
  104. <div class="flex w-full flex-col p-12">
  105. <van-button type="primary" class="m-auto" @click="addTaskClick()">新增任务</van-button>
  106. <div class="h-6"></div>
  107. <van-button type="primary" class="m-auto" @click="jumpToAddNewVisitors()">新增计划</van-button>
  108. </div>
  109. </van-popup>
  110. <!-- 常用表单 -->
  111. <div class="mt-5" v-if="false">
  112. <div class="text-size-large text-[#000] pl16">常用表单</div>
  113. <div class="p16 pt-0 pb-0 flex justify-between overflow-x-auto">
  114. <div class="flex">
  115. <template v-for="item in commonModulesList">
  116. <div class="w80 bg-[#FFA359] h-28 rounded-md flex flex-col items-center justify-center"
  117. @click="jumpToAdd(item)">
  118. <div class="formImage">
  119. <img class="w-full h-full" src="/src/assets/image/form.png">
  120. </div>
  121. <div class="text-white">{{ item.moduleName }}</div>
  122. </div>
  123. </template>
  124. <div class="w80 bg-[#0859d6] h-28 rounded-md flex flex-col items-center justify-center"
  125. @click="showCommonForms = true">
  126. <div class="formImage">
  127. <img class="w-full h-full" src="/src/assets/image/more.png">
  128. </div>
  129. <div class="text-white">更多</div>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. <!-- 常用联系人 -->
  135. <div class="mt-3" v-if="false">
  136. <div class="text-size-large text-[#000] pl16">常用联系人</div>
  137. <div class="p16 pt-0 pb-0">
  138. <template v-if="topContactsList && topContactsList.length > 0">
  139. <template v-for="item in topContactsList">
  140. <div class="flex flex-row items-center rounded-md p-4 bg-white mb-5" @click="toContactDetails(item)">
  141. <div class="contactImage">
  142. <img class="w-full h-full" src="/src/assets/image/topContacts.png">
  143. </div>
  144. <div class="flex-1">{{ item.name }}</div>
  145. <div class="rightArrow">
  146. <van-icon name="arrow" />
  147. </div>
  148. </div>
  149. </template>
  150. </template>
  151. <template v-else>
  152. <van-empty description="暂无常用联系人" />
  153. </template>
  154. </div>
  155. </div>
  156. <!-- 添加常用表单 -->
  157. <van-popup v-model:show="showCommonForms" closeable destroy-on-close position="bottom" :style="{ height: '80%' }">
  158. <div class="px-5 flex flex-col h-full py-8">
  159. <div class="flex-1 overflow-y-auto">
  160. <div class="text-size-large mb-5">已添加表单</div>
  161. <div class="flex flex-wrap mb-2">
  162. <template v-for="(item) in commonExpressionsHaveBeenAdded" :key="item.id">
  163. <div class="w-1/4 flex flex-col items-center mb-4 relative">
  164. <div class="newModuleImage">
  165. <img class="w-full h-full" :src="returnImageAddress(item)" alt="">
  166. </div>
  167. <div class="mt-3 text-[#474A56]">{{ item.name }}</div>
  168. <div class="absolute -top-2 right-3" @click="operationForm('delete', item)">
  169. <van-icon name="clear" color="#EE0A24" :size="`${usePxToVwView(20)}`" />
  170. </div>
  171. </div>
  172. </template>
  173. </div>
  174. <div class="text-size-large mb-5">未添加表单</div>
  175. <div class="flex flex-wrap mb-2">
  176. <template v-for="(item) in commonExpressionsHaveBeenNodded" :key="item.id">
  177. <div class="w-1/4 flex flex-col items-center mb-4 relative">
  178. <div class="newModuleImage">
  179. <img class="w-full h-full" :src="returnImageAddress(item)" alt="">
  180. </div>
  181. <div class="mt-3 text-[#474A56]">{{ item.name }}</div>
  182. <div class="absolute -top-2 right-3" @click="operationForm('add', item)">
  183. <van-icon name="add" color="#07C160" :size="`${usePxToVwView(20)}`" />
  184. </div>
  185. </div>
  186. </template>
  187. </div>
  188. </div>
  189. <van-button type="primary" @click="saveCommonlyUsedForms()">保存</van-button>
  190. </div>
  191. </van-popup>
  192. </div>
  193. </template>
  194. <script setup>
  195. import { ref, onActivated, nextTick } from 'vue';
  196. import { showConfirmDialog } from 'vant';
  197. import { useLifecycle } from '@hooks/useCommon.js';
  198. import { DELETE_VISITOR_PLAN, GET_VISITOR_PLAN, GET_FREQUENTLY_USED_CONTACTS, GET_COMMONLY_USED_MODULES, SAVE_COMMONLY_USED_FORMS, GET_PLAN_CALENDAR, DELETE_TASK } from "@hooks/useApi";
  199. import { routingInfos } from "@utility/generalVariables.js";
  200. import usePxToVwView from "@hooks/usePxTransform.js";
  201. import useToast from "@hooks/useToast"
  202. import dayjs from 'dayjs';
  203. import requests from "@common/requests";
  204. import useRouterStore from "@store/useRouterStore.js";
  205. import useInfoStore from "@store/useInfoStore.js";
  206. const taskStatus = [
  207. { label: '未开始', type: 'infos' },
  208. { label: '进行中', type: 'primarys' },
  209. { label: '已完成', type: 'completed' },
  210. { label: '已超时', type: 'dangers' },
  211. ]
  212. const router = useRouterStore()
  213. const useInfo = useInfoStore()
  214. const user = useInfo.userInfo
  215. const { toastText, toastSuccess, toastFail, toastLoading } = useToast()
  216. const expandAndCollapse = ref(true)
  217. const calendarHeight = ref(0)
  218. const calendarRef = ref()
  219. const dateConditions = ref(dayjs().format('YYYY-MM-DD'))
  220. const minDate = ref(new Date('2024-01-01'))
  221. const visitorProgramList = ref([])
  222. const topContactsList = ref([])
  223. const commonModulesList = ref([])
  224. const planCalendarList = ref([])
  225. const showCommonForms = ref(false)
  226. const commonExpressionsHaveBeenAdded = ref([])
  227. const commonExpressionsHaveBeenNodded = ref([])
  228. const areYouRequesting = ref(false)
  229. const displayFrequentlyUsedContacts = ref(false)
  230. const addTaskPlanPopup = ref(false)
  231. function addTaskClick() {
  232. addTaskPlanPopup.value = false
  233. const jumpTo = routingInfos['tasks']
  234. router.navigateTo({
  235. pathName: 'addEditor',
  236. success: () => {
  237. router.emit('addEditorParameter', {
  238. routerInfo: JSON.stringify(jumpTo)
  239. })
  240. }
  241. })
  242. }
  243. function toEditTask(row) {
  244. const jumpTo = routingInfos['tasks']
  245. let newRow = row
  246. delete newRow.taskLogs
  247. delete newRow.createDate
  248. router.navigateTo({
  249. pathName: 'addEditor',
  250. success: () => {
  251. router.emit('addEditorParameter', {
  252. routerInfo: JSON.stringify(jumpTo),
  253. filedValue: JSON.stringify(row),
  254. })
  255. }
  256. })
  257. }
  258. function calendarPanelChangeSet(data) {
  259. dateConditions.value = dayjs(data.date).format('YYYY-MM-DD')
  260. getVisitorPlan()
  261. setTimeout(() => {
  262. getPlanCalendarList()
  263. }, 1)
  264. }
  265. function jumpToAdd(rows) {
  266. const jumpTo = routingInfos[rows.path.replace('/', '')]
  267. router.navigateTo({
  268. pathName: 'addEditor',
  269. success: () => {
  270. router.emit('addEditorParameter', {
  271. routerInfo: JSON.stringify(jumpTo)
  272. })
  273. }
  274. })
  275. }
  276. function toContactDetails(item) {
  277. router.navigateTo({
  278. pathName: 'details',
  279. success: () => {
  280. router.emit('detailParameter', {
  281. routerInfo: JSON.stringify(routingInfos['contacts']),
  282. parameter: JSON.stringify(item)
  283. })
  284. }
  285. })
  286. }
  287. function saveCommonlyUsedForms() {
  288. if(commonExpressionsHaveBeenAdded.value.map(item => item.id).length <= 0) {
  289. toastText(`最少请选择一个常用表单!`)
  290. return
  291. }
  292. const moduleIds = commonExpressionsHaveBeenAdded.value.map(item => item.id).join(',')
  293. requests.post(SAVE_COMMONLY_USED_FORMS, { moduleIds }).then((res) => {
  294. toastSuccess('保存成功')
  295. getCommonlyUsedModules()
  296. showCommonForms.value = false
  297. })
  298. }
  299. function operationForm(type, row) {
  300. const itemIndex = commonExpressionsHaveBeenNodded.value.findIndex(item => item.path === row.path);
  301. if (type === 'add' && itemIndex !== -1) {
  302. const item = commonExpressionsHaveBeenNodded.value.splice(itemIndex, 1)[0];
  303. commonExpressionsHaveBeenAdded.value.push(item);
  304. }
  305. if (type === 'delete') {
  306. const itemIndex = commonExpressionsHaveBeenAdded.value.findIndex(item => item.path === row.path);
  307. if (itemIndex !== -1) {
  308. const item = commonExpressionsHaveBeenAdded.value.splice(itemIndex, 1)[0];
  309. commonExpressionsHaveBeenNodded.value.push(item);
  310. }
  311. }
  312. }
  313. function deleteVisitor(row) {
  314. const { id, planName, calendarType, taskName } = row
  315. const text = calendarType == 1 ? '访客' : '任务'
  316. const textMessage = calendarType == 1 ? '访客计划' : '任务'
  317. let formVal = {}
  318. calendarType == 1 ? formVal.planId = id : formVal.taskIds = id
  319. showConfirmDialog({
  320. title: `删除${text}`,
  321. message: `确定删除【${calendarType == 1 ? planName : taskName}】${textMessage}计划吗?`,
  322. }).then(() => {
  323. requests.post(calendarType == 1 ? DELETE_VISITOR_PLAN : DELETE_TASK, { ...formVal }).then((res) => {
  324. toastSuccess('删除成功')
  325. getVisitorPlan()
  326. }).catch((err) => {
  327. toastFail(err.msg ? err.msg : '删除失败')
  328. })
  329. })
  330. }
  331. function formatter(day) {
  332. const { date, bottomInfo } = day
  333. const currentDate = dayjs(date).format("YYYY-MM-DD");
  334. const rqiList = planCalendarList.value.filter(item => item.ymd === currentDate)
  335. day.bottomInfo = (rqiList.length > 0 ? true : false)
  336. day.taskInfo = (planCalendarList.value.find(item => item.currentDate === currentDate)?.taskDtoList.length > 0 ? true : false)
  337. return day
  338. }
  339. function calendarSelect(data) {
  340. dateConditions.value = dayjs(data).format("YYYY-MM-DD");
  341. getVisitorPlan()
  342. }
  343. function jumpToVisitorDetails(row) {
  344. router.navigateTo({
  345. pathName: 'visitorDetails',
  346. success: () => {
  347. router.emit('visitorDetailsParameter', {
  348. row: JSON.stringify(row || {})
  349. })
  350. }
  351. })
  352. }
  353. function jumpToAddNewVisitors(row) {
  354. addTaskPlanPopup.value = false
  355. router.navigateTo({
  356. pathName: 'addEditorVisitor',
  357. success: () => {
  358. router.emit('addEditorVisitorParameter', {
  359. row: JSON.stringify(row || {}),
  360. date: JSON.stringify(dateConditions.value || {})
  361. })
  362. }
  363. })
  364. }
  365. function returnImageAddress(rows) {
  366. const row = routingInfos[rows.path.replace('/', '')]
  367. return row && row.homeImage
  368. }
  369. function expandAndCollapseClick() {
  370. expandAndCollapse.value = !expandAndCollapse.value
  371. const dates = calendarRef.value.getSelectedDate()
  372. calendarRef.value.scrollToDate(new Date(dates))
  373. }
  374. function processForms() {
  375. const selectedForm = commonModulesList.value
  376. const allFormList = useInfo.modularList || []
  377. commonExpressionsHaveBeenAdded.value = allFormList.filter(item =>
  378. selectedForm.some(arrItem => arrItem.path === item.path)
  379. )
  380. commonExpressionsHaveBeenNodded.value = allFormList.filter(item =>
  381. !selectedForm.some(arrItem => arrItem.path === item.path)
  382. ).filter(item => item.path !== '/biReport')
  383. }
  384. function getVisitorPlan() {
  385. requests.post(GET_VISITOR_PLAN, {
  386. calenderDate: dayjs(dateConditions.value).format('YYYY-MM-DD')
  387. }).then((res) => {
  388. // visitorProgramList.value = res.data || []
  389. visitorProgramList.value = [
  390. ...(res.data.planList || []).map(item => {
  391. return {
  392. ...item,
  393. calendarType: 1,
  394. }
  395. }),
  396. ...(res.data.taskList || []).map(item => {
  397. return {
  398. ...item,
  399. calendarType: 2,
  400. }
  401. }),
  402. ]
  403. })
  404. }
  405. function getFrequentlyUsedContacts() {
  406. requests.post(GET_FREQUENTLY_USED_CONTACTS, {}).then((res) => {
  407. topContactsList.value = res.data
  408. })
  409. }
  410. function getCommonlyUsedModules() {
  411. requests.post(GET_COMMONLY_USED_MODULES, {}).then((res) => {
  412. commonModulesList.value = res.data
  413. processForms()
  414. })
  415. }
  416. function getPlanCalendarList() {
  417. const months = calendarRef.value.getSelectedDate()
  418. requests.post(GET_PLAN_CALENDAR, { ym: dayjs(months).format('YYYY-MM') }).then(({ data }) => {
  419. // planCalendarList.value = data.planList || []
  420. const newData = [
  421. ...(data.planList || []).map(item => {
  422. return {
  423. ...item,
  424. calendarType: 1,
  425. }
  426. }),
  427. ...(data.taskList || []).map(item => {
  428. return {
  429. ...item,
  430. calendarType: 2,
  431. }
  432. }),
  433. ]
  434. planCalendarList.value = newData
  435. })
  436. }
  437. function getAllData() {
  438. if (areYouRequesting.value) {
  439. return
  440. }
  441. displayFrequentlyUsedContacts.value = useInfo.modularList.filter(item => item.path === '/contacts').length
  442. areYouRequesting.value = true
  443. Promise.all([
  444. getPlanCalendarList(),
  445. getVisitorPlan(),
  446. getCommonlyUsedModules(),
  447. getFrequentlyUsedContacts(),
  448. ]).finally(() => {
  449. areYouRequesting.value = false
  450. })
  451. }
  452. useLifecycle({
  453. load: () => {
  454. getAllData()
  455. },
  456. init: () => {
  457. getAllData()
  458. setTimeout(() => {
  459. if (expandAndCollapse.value) {
  460. calendarHeight.value = calendarRef.value.$el.offsetHeight
  461. }
  462. }, 500)
  463. }
  464. });
  465. onActivated(() => {
  466. })
  467. </script>
  468. <style lang='scss' scoped>
  469. .p16 {
  470. padding: 16px;
  471. }
  472. .pl16 {
  473. padding-left: 16px;
  474. }
  475. .ra-l6 {
  476. border-top-left-radius: 6px;
  477. border-top-right-radius: 6px;
  478. }
  479. .w80 {
  480. width: 80px;
  481. margin-right: 12px;
  482. }
  483. .doT {
  484. width: 10px;
  485. height: 10px;
  486. border-radius: 50%;
  487. background-color: $themeColor;
  488. margin: auto;
  489. position: relative;
  490. top: 6px;
  491. }
  492. .taskDot {
  493. width: 10px;
  494. height: 10px;
  495. border-radius: 50%;
  496. background-color: #ff7300;
  497. margin: auto;
  498. position: relative;
  499. top: 6px;
  500. }
  501. .toBeCompleted {
  502. background: rgba($color: #F38B3C, $alpha: .1);
  503. border-color: #F38B3C;
  504. color: #F38B3C;
  505. }
  506. .completed {
  507. background: rgba($color: #07C160, $alpha: .1);
  508. border-color: #07C160;
  509. color: #07C160;
  510. }
  511. .infos {
  512. background: rgba($color: #909399, $alpha: .1);
  513. border-color: #909399;
  514. color: #909399;
  515. }
  516. .primarys {
  517. background: rgba($color: #0859d6, $alpha: .1);
  518. border-color: #0859d6;
  519. color: #0859d6;
  520. }
  521. .dangers {
  522. background: rgba($color: #F56C6C, $alpha: .1);
  523. border-color: #F56C6C;
  524. color: #F56C6C;
  525. }
  526. .labelTag {
  527. font-size: 10px;
  528. padding: 3px 8px;
  529. border-radius: 4px;
  530. border: 1px solid;
  531. }
  532. .formImage {
  533. width: 24px;
  534. height: 24px;
  535. margin-bottom: 12px;
  536. }
  537. .contactImage {
  538. width: 29px;
  539. height: 29px;
  540. border-radius: 50%;
  541. margin-right: 12px;
  542. }
  543. .rightArrow {
  544. font-size: 16px;
  545. }
  546. .schedulePicture {
  547. width: 48px;
  548. height: 51px;
  549. }
  550. .buttonCircle {
  551. width: 37px;
  552. height: 37px;
  553. margin: 0 14px;
  554. }
  555. .newModuleImage {
  556. width: 50px;
  557. height: 50px;
  558. border-radius: 10px;
  559. }
  560. .expandAndCollapseIcon {
  561. transition: 0.5s ease-in-out;
  562. }
  563. .setCaleStrle :deep(.van-calendar__month-title) {
  564. display: none;
  565. }
  566. .setCaleStrle :deep(.van-calendar__month) {
  567. padding: 0.8rem 0 0.5rem 0;
  568. }
  569. .setCaleStrle :deep(.van-calendar) {
  570. transition: 0.5s ease-in-out;
  571. }
  572. </style>