list.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <template>
  2. <ion-page class="list-page log-list-page">
  3. <ion-header class="header-theme2">
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>工作日志</ion-title>
  9. <ion-buttons slot="end">
  10. <ion-icon :icon="addCircleOutline" @click="onAdd"></ion-icon>
  11. </ion-buttons>
  12. </ion-toolbar>
  13. </ion-header>
  14. <ion-content>
  15. <ion-item style="font-size: 10px;--border-style: none;">
  16. <ion-datetime-button datetime="reportDateBegin"></ion-datetime-button>
  17. <span style="margin:0 5px">至</span>
  18. <ion-modal :keep-contents-mounted="true">
  19. <ion-datetime id="reportDateBegin" placeholder="日期"
  20. v-model="searchParamsState.workStartDate"
  21. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  22. @ionChange="onSearch"
  23. :show-default-buttons="true">
  24. </ion-datetime>
  25. </ion-modal>
  26. <ion-datetime-button datetime="reportDateEnd"></ion-datetime-button>
  27. <ion-modal :keep-contents-mounted="true">
  28. <ion-datetime id="reportDateEnd" placeholder="日期"
  29. v-model="searchParamsState.workEndDate"
  30. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  31. @ionChange="onSearch"
  32. :show-default-buttons="true">
  33. </ion-datetime>
  34. </ion-modal>
  35. <ion-button slot="end" style="height: 33px;width:70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;" @click="onSearch">搜索</ion-button>
  36. </ion-item>
  37. <!-- 滑动数据列表 -->
  38. <div class="bw-vue-list">
  39. <div class="list-content">
  40. <ion-list>
  41. <div v-for="(record,key) in dataList" :key="key">
  42. <ion-item-sliding>
  43. <ion-item detail @click="onDetail(record.doWorkID)">
  44. <ion-grid @click="onDetail(record.doWorkID)">
  45. <ion-row>
  46. <ion-col>
  47. <ion-label style="display: flex;justify-content: space-between;">
  48. <ion-text>
  49. {{ record.workTime }}工作日志
  50. </ion-text>
  51. </ion-label>
  52. </ion-col>
  53. </ion-row>
  54. <ion-row>
  55. <ion-col>
  56. <ion-label>
  57. <p>
  58. 日志类型:{{ record.logTypeName }}
  59. </p>
  60. </ion-label>
  61. </ion-col>
  62. </ion-row>
  63. </ion-grid>
  64. </ion-item>
  65. <ion-item-options>
  66. <ion-item-option @click="onEdit(record.doWorkID)">
  67. <ion-icon :icon="buildOutline"></ion-icon>
  68. </ion-item-option>
  69. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.doWorkID)">
  70. <ion-icon :icon="trashOutline"></ion-icon>
  71. </ion-item-option>
  72. </ion-item-options>
  73. </ion-item-sliding>
  74. </div>
  75. </ion-list>
  76. </div>
  77. </div>
  78. <b-empty v-if="dataList.length<=0" :loading="loading"/>
  79. <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
  80. <ion-infinite-scroll-content
  81. :loadingText="searchParamsState.total>searchParamsState.pageIndex*searchParamsState.pageSize?'正在加载...':'暂无更多'"
  82. loadingSpinner="bubbles">
  83. </ion-infinite-scroll-content>
  84. </ion-infinite-scroll>
  85. </ion-content>
  86. <ion-alert
  87. :is-open="delAlertOpen"
  88. header="删除确认"
  89. message="确定要删除该工作日志吗?"
  90. :buttons="delAlertButtons"
  91. @didDismiss="setDelAlertOpen(false, null)"
  92. ></ion-alert>
  93. <ion-alert
  94. :is-open="infoAlertOpen"
  95. :header="infoAlterData.title"
  96. :message="infoAlterData.message"
  97. :buttons="infoAlertButtons"
  98. @didDismiss="setInfoAlertOpen(false)"
  99. ></ion-alert>
  100. <ion-loading
  101. :is-open="delLoading"
  102. message="删除中..."
  103. @didDismiss="setDelLoadingOpen(false)" >
  104. </ion-loading>
  105. </ion-page>
  106. </template>
  107. <script lang="ts">
  108. import {useRouter} from "vue-router";
  109. import {defineComponent, onMounted, reactive, ref} from 'vue';
  110. import {arrowBackOutline, addCircleOutline} from 'ionicons/icons';
  111. import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
  112. import {deleteWorkLog, getWorkLogList} from '@/api/workLog';
  113. import BEmpty from "@/components/empty.vue";
  114. import dayjs from "dayjs";
  115. import {chevronForwardOutline,buildOutline,trashOutline} from 'ionicons/icons';
  116. export default defineComponent({
  117. name: 'WorkLogList',
  118. components: {IonIcon, BEmpty},
  119. setup() {
  120. const searchParamsState = reactive({
  121. pageIndex: 1,
  122. pageSize: 10,
  123. total:0,
  124. workStartDate: '',
  125. workEndDate: ''
  126. })
  127. const loading = ref(true);
  128. const dataList = ref<any>([]);
  129. const router = useRouter();
  130. const colors = ref(["secondary", "tertiary", "success", "warning"]);
  131. // 删除警告弹窗按钮定义
  132. const delAlertButtons = [
  133. {
  134. text: '取消',
  135. role: 'cancel',
  136. handler: () => {
  137. console.log('Alert canceled');
  138. },
  139. },
  140. {
  141. text: '确定',
  142. role: 'confirm',
  143. handler: () => {
  144. delLoading.value = true
  145. deleteWorkLog(delWorkIds.value).then((res) => {
  146. infoAlterData.title = "提示";
  147. infoAlterData.message = "删除成功";
  148. setInfoAlertOpen(true);
  149. }).finally(()=>{
  150. delLoading.value = false
  151. })
  152. },
  153. },
  154. ];
  155. // 删除警告弹窗开关
  156. const delAlertOpen = ref(false);
  157. // 删除数据
  158. const delWorkIds = ref<Array<any>>([])
  159. // 删除加载
  160. const delLoading = ref(false);
  161. // 信息弹窗开关
  162. const infoAlertOpen = ref(false);
  163. // 信息弹窗内容
  164. const infoAlterData = reactive({
  165. title:"",
  166. message:""
  167. })
  168. // 删除警告弹窗按钮定义
  169. const infoAlertButtons = [
  170. {
  171. text: '确定',
  172. role: 'confirm',
  173. handler: () => {
  174. loading.value = true;
  175. getWorkLogList(searchParamsState).then(res=>{
  176. dataList.value = res.list;
  177. searchParamsState.total = res.total;
  178. }).finally(() => {
  179. loading.value = false;
  180. })
  181. },
  182. },
  183. ];
  184. const loadData = async function () {
  185. loading.value = true;
  186. const result: any = await getWorkLogList(searchParamsState);
  187. dataList.value = dataList.value.concat(result.list);
  188. console.log("dataList",dataList.value);
  189. searchParamsState.total = result.total;
  190. loading.value = false;
  191. }
  192. const onScroll = (e: any) => {
  193. setTimeout(() => {
  194. e.target.complete();
  195. if (searchParamsState.total > searchParamsState.pageIndex * searchParamsState.pageSize) {
  196. searchParamsState.pageSize += 10;
  197. loadData();
  198. }
  199. }, 500);
  200. }
  201. const onAdd = (item: any) => {
  202. router.push({path: './edit', query: {reload: 1, doWorkID: null}});
  203. }
  204. const onEdit = (doWorkID: string) => {
  205. router.push({path: './edit', query: {reload: 1, doWorkID: doWorkID}});
  206. }
  207. const onBack =()=>{
  208. router.push('../');
  209. }
  210. const onDetail = (doWorkID:string) =>{
  211. router.push({path: './detail', query: {reload:1, doWorkID: doWorkID}});
  212. }
  213. const reload = () => {
  214. // 设置查询初始截止日期为当天
  215. const firstDay = new Date();
  216. // 设置查询初始开始时间为当天的一个月前
  217. const lastDay = new Date();
  218. lastDay.setDate(firstDay.getDate() - 30);
  219. dataList.value = [];
  220. searchParamsState.pageIndex = 1;
  221. searchParamsState.workStartDate=dayjs(lastDay.toLocaleDateString()).format('YYYY-MM-DD');
  222. searchParamsState.workEndDate = dayjs(firstDay.toLocaleDateString()).format('YYYY-MM-DD');
  223. loadData();
  224. }
  225. const onSearch =()=>{
  226. dataList.value = [];
  227. searchParamsState.pageIndex = 1;
  228. loadData();
  229. }
  230. // 设置要删除的日志
  231. function setDelAlertOpen(value: boolean, doWorkId: any) {
  232. delAlertOpen.value = value;
  233. if(doWorkId != null) {
  234. delWorkIds.value = new Array(doWorkId);
  235. }
  236. }
  237. // 设置删除弹窗开启关闭
  238. function setDelLoadingOpen(value: boolean) {
  239. delLoading.value = value
  240. }
  241. // 设置信息提示弹窗开关
  242. function setInfoAlertOpen(value: boolean) {
  243. infoAlertOpen.value = value;
  244. }
  245. // onIonViewDidEnter(() => {
  246. // reload();
  247. // });
  248. onMounted(() => {
  249. reload();
  250. })
  251. return {
  252. router,
  253. colors,
  254. dataList,
  255. loading,
  256. searchParamsState,
  257. onScroll,
  258. onAdd,
  259. onBack,
  260. onSearch,
  261. onDetail,
  262. loadData,
  263. reload,
  264. arrowBackOutline,
  265. addCircleOutline,
  266. chevronForwardOutline,
  267. buildOutline,
  268. trashOutline,
  269. onEdit,
  270. delAlertButtons,
  271. delAlertOpen,
  272. setDelAlertOpen,
  273. delLoading,
  274. setDelLoadingOpen,
  275. infoAlertOpen,
  276. infoAlterData,
  277. setInfoAlertOpen,
  278. infoAlertButtons
  279. }
  280. }
  281. });
  282. </script>
  283. <style lang="less">
  284. .search-item{
  285. margin: 10px 0;
  286. font-size: 14px;
  287. ion-input{
  288. border: 1px solid #f2f2f5;border-radius: 4px;--padding-start: 10px;
  289. width: 100px;
  290. }
  291. input{
  292. padding: 6px !important;
  293. }
  294. }
  295. .log-list-page {
  296. .list-content {
  297. margin: 0px 15px !important;
  298. background-color: white !important;
  299. border-radius: 0 !important;
  300. ion-item {
  301. font-size: 14px;
  302. p {
  303. font-size: 12px;
  304. }
  305. }
  306. }
  307. }
  308. </style>