You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

list.vue 11 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. <template>
  2. <view class="page">
  3. <!-- 主列表页 -->
  4. <view
  5. :class="sideOpen ? 'show' : ''"
  6. class="mainpage"
  7. style="padding-top: 80rpx"
  8. >
  9. <!-- 顶部条目/分页信息栏 -->
  10. <l-customlist-banner @buttonClick="sideOpen = true">{{
  11. tips
  12. }}</l-customlist-banner>
  13. <!-- 滚动列表,跨端支持上拉/下拉 -->
  14. <l-scroll-list
  15. v-if="ready"
  16. @pullDown="pullDown"
  17. @toBottom="fetchList()"
  18. ref="list"
  19. >
  20. <l-customlist :tips="loadState" showTips>
  21. <!-- 单条记录 -->
  22. <view class="customlist-item" v-for="item of list" :key="item.Id">
  23. <view class="customlist-item-field">
  24. <text class="customlist-item-field-title">会议主题:</text>
  25. {{ displayListItem(item, "MeetingTitle") }}
  26. </view>
  27. <view class="customlist-item-field">
  28. <text class="customlist-item-field-title">会议地点:</text>
  29. {{ displayListItem(item, "MeetingPlace") }}
  30. </view>
  31. <view class="customlist-item-field">
  32. <text class="customlist-item-field-title">开始时间:</text>
  33. {{ displayListItem(item, "BeginTime") }}
  34. </view>
  35. <view class="customlist-item-field">
  36. <text class="customlist-item-field-title">结束时间:</text>
  37. {{ displayListItem(item, "EndTime") }}
  38. </view>
  39. <view class="customlist-item-field">
  40. <text class="customlist-item-field-title">申请人:</text>
  41. {{ displayListItem(item, "CreateUser") }}
  42. </view>
  43. <view class="customlist-item-field">
  44. <text class="customlist-item-field-title">会议记录者:</text>
  45. {{ displayListItem(item, "RecordPerson") }}
  46. </view>
  47. <view class="customlist-item-field">
  48. <text class="customlist-item-field-title">会议内容:</text>
  49. {{ displayListItem(item, "Content") }}
  50. </view>
  51. <view class="customlist-item-field">
  52. <text class="customlist-item-field-title">附件上传:</text>
  53. {{ displayListItem(item, "Files") }}
  54. </view>
  55. <l-customlist-action
  56. showButton
  57. buttonText="会议纪要"
  58. @join="action('join', item.Id)"
  59. showEdit
  60. @edit="action('edit', item.Id)"
  61. showDelete
  62. @delete="action('delete', item.Id)"
  63. @view="action('view', item.Id)"
  64. />
  65. </view>
  66. </l-customlist>
  67. </l-scroll-list>
  68. </view>
  69. <!-- 关闭侧边抽屉按钮 -->
  70. <view
  71. @click="sideOpen = false"
  72. :class="sideOpen ? 'show' : ''"
  73. class="sideclose"
  74. >
  75. <l-icon type="pullright" color="blue" />
  76. </view>
  77. <!-- 侧边栏,用于设置查询条件 -->
  78. <scroll-view :class="sideOpen ? 'show' : ''" class="sidepage" scroll-y>
  79. <view v-if="ready" class="padding">
  80. <l-input
  81. v-model="queryData.MeetingTitle"
  82. @change="searchChange"
  83. title="会议主题"
  84. placeholder="按会议主题查询"
  85. />
  86. <l-select
  87. v-model="queryData.MeetingPlace"
  88. @change="searchChange"
  89. :range="dataSource.MeetingPlace"
  90. title="会议地点"
  91. placeholder="按会议地点查询"
  92. />
  93. <l-organize-picker
  94. v-model="queryData.CreateUser"
  95. @change="searchChange"
  96. type="user"
  97. title="申请人"
  98. placeholder="按申请人查询"
  99. />
  100. <!-- 重置查询条件按钮 -->
  101. <view class="padding-tb">
  102. <l-button @click="reset" line="orange" class="block" block
  103. >重置查询条件</l-button
  104. >
  105. </view>
  106. </view>
  107. </scroll-view>
  108. <l-customlist-add v-if="!sideOpen" @click="action('add')" />
  109. </view>
  110. </template>
  111. <script>
  112. /*
  113. * 版 本 Learun-ADMS V7.0.3 力软敏捷开发框架(http://www.learun.cn)
  114. * Copyright (c) 2013-2021 上海力软信息技术有限公司
  115. * 创建人:超级管理员
  116. * 日 期:2021-02-21 10:07
  117. * 描 述:会议管理
  118. */
  119. /**
  120. * 本段代码由移动端代码生成器输出,移动端须 2.2.0 版本及以上可以使用
  121. * 请在移动端 /pages.json 中的 pages 字段中添加一条记录:
  122. * { "path": "pages/PersonnelManagement/MeetingManagement/list", "style": { "navigationBarTitleText": "表单列表页" } }
  123. *
  124. * (navigationBarTitleText 字段为本页面的标题文本,可以修改)
  125. * (必须自行操作该步骤,力软代码生成器不会自动帮您修改 /pages.json 文件)
  126. */
  127. import moment from "moment";
  128. import get from "lodash/get";
  129. import set from "lodash/set";
  130. import pickBy from "lodash/pickBy";
  131. import mapValues from "lodash/mapValues";
  132. export default {
  133. data() {
  134. return {
  135. // 数据项的数据类型、结构
  136. scheme: {
  137. MeetingTitle: { type: "text" },
  138. MeetingPlace: { type: "select", dataSource: "0" },
  139. BeginTime: { type: "datetime", dateformat: "0" },
  140. EndTime: { type: "datetime", dateformat: "0" },
  141. RecordPerson: { type: "organize", dataType: "user" },
  142. Content: { type: "texteditor" },
  143. Files: { type: "upload" },
  144. CreateUser: { type: "organize", dataType: "user" },
  145. },
  146. // 查询条件
  147. searchData: {},
  148. defaultQueryData: {},
  149. queryData: {
  150. MeetingTitle: "",
  151. MeetingPlace: "",
  152. CreateUser: "",
  153. },
  154. // 数据源
  155. dataSource: {
  156. MeetingPlace: [],
  157. },
  158. // 页面相关参数
  159. ready: false,
  160. tips: "加载中...",
  161. loadState: "向下翻以加载更多",
  162. sideOpen: false,
  163. // 列表与分页信息
  164. page: 1,
  165. total: 2,
  166. list: [],
  167. };
  168. },
  169. async onLoad() {
  170. await this.init();
  171. },
  172. onUnload() {
  173. this.OFF("PersonnelManagementMeetingManagement-list-change");
  174. },
  175. methods: {
  176. // 页面初始化
  177. async init() {
  178. this.ON(
  179. "PersonnelManagementMeetingManagement-list-change",
  180. this.refreshList
  181. );
  182. // 拉取加载列表和数据源
  183. await Promise.all([() => {}]);
  184. await this.fetchList();
  185. // 初始化查询条件
  186. this.defaultQueryData = this.COPY(this.queryData);
  187. this.ready = true;
  188. },
  189. // 拉取列表
  190. async fetchList() {
  191. if (this.page > this.total) {
  192. return;
  193. }
  194. const result = await this.HTTP_GET(
  195. "learun/adms/PersonnelManagement/MeetingManagement/pagelist",
  196. {
  197. // 这里 sidx 表示排序字段,sord 表示排序方式(DESC=降序,ASC=升序)
  198. // 代码生成器生成时默认按照主键排序,您可以修改成按创建时间的字段降序
  199. pagination: { rows: 10, page: this.page, sidx: "Id", sord: "DESC" },
  200. queryJson: JSON.stringify(this.searchData),
  201. },
  202. "加载数据时出错"
  203. );
  204. if (!result) {
  205. return;
  206. }
  207. this.total = result.total;
  208. this.page = result.page + 1;
  209. this.list = this.list.concat(result.rows);
  210. this.tips = `已加载 ${Math.min(result.page, result.total)} / ${
  211. result.total
  212. } 页,共 ${result.records} 项`;
  213. this.loadState =
  214. result.page >= result.total ? "已加载所有项目" : "向下翻以加载更多";
  215. },
  216. // 刷新清空列表
  217. async refreshList() {
  218. this.page = 1;
  219. this.total = 2;
  220. this.list = [];
  221. await this.fetchList();
  222. },
  223. // 列表下拉
  224. pullDown() {
  225. this.refreshList().then(() => {
  226. this.$refs.list.stopPullDown();
  227. });
  228. },
  229. // 设置搜索条件
  230. async searchChange() {
  231. const result = {};
  232. // 将其他查询项添加到查询 JSON 中
  233. const queryObj = pickBy(this.queryData, (t) =>
  234. Array.isArray(t) ? t.length > 0 : t
  235. );
  236. Object.assign(
  237. result,
  238. mapValues(queryObj, (t) => (Array.isArray(t) ? t.join(",") : t))
  239. );
  240. this.searchData = result;
  241. await this.refreshList();
  242. },
  243. // 点击「清空查询条件」按钮
  244. reset() {
  245. this.queryData = this.COPY(this.defaultQueryData);
  246. this.searchChange();
  247. },
  248. // 点击「编辑」、「查看」、「添加」、「删除」按钮
  249. async action(type, id = "") {
  250. switch (type) {
  251. case "view":
  252. this.NAV_TO(`./single?type=view&id=${id}`);
  253. return;
  254. case "add":
  255. this.NAV_TO("./single?type=create");
  256. return;
  257. case "edit":
  258. this.NAV_TO(`./single?type=edit&id=${id}`);
  259. return;
  260. case "join":
  261. console.log(123);
  262. this.NAV_TO(`/pages/PersonnelManagement/MeetingMinutes/list?meetId=${id}`);
  263. return;
  264. case "delete":
  265. if (!(await this.CONFIRM("删除项目", "确定要删除该项吗?", true))) {
  266. return;
  267. }
  268. this.HTTP_POST(
  269. "learun/adms/PersonnelManagement/MeetingManagement/delete",
  270. id,
  271. "删除失败"
  272. ).then((success) => {
  273. if (!success) {
  274. return;
  275. }
  276. this.TOAST("删除成功", "success");
  277. this.refreshList();
  278. });
  279. return;
  280. default:
  281. return;
  282. }
  283. },
  284. // 显示列表中的标题项
  285. displayListItem(item, field) {
  286. const fieldItem = this.scheme[field];
  287. const value = item[field];
  288. switch (fieldItem.type) {
  289. case "currentInfo":
  290. case "organize":
  291. return fieldItem.dataType === "time"
  292. ? value
  293. : get(this.GET_GLOBAL(fieldItem.dataType), `${value}.name`, "");
  294. case "radio":
  295. case "select":
  296. const selectItem = this.dataSource[field].find(
  297. (t) => t.value === String(value)
  298. );
  299. return get(selectItem, "text", "");
  300. case "checkbox":
  301. if (!value || value.split(",").length <= 0) {
  302. return "";
  303. }
  304. const checkboxItems = value.split(",");
  305. return this.dataSource[field]
  306. .filter((t) => checkboxItems.includes(t.value))
  307. .map((t) => t.text)
  308. .join(",");
  309. case "datetime":
  310. if (!value) {
  311. return "";
  312. }
  313. return moment(value).format(
  314. Number(fieldItem.dateformat) === 0
  315. ? "YYYY年 M月 D日"
  316. : "YYYY-MM-DD HH:mm"
  317. );
  318. default:
  319. return value === null || value === undefined ? "" : value;
  320. }
  321. },
  322. },
  323. };
  324. </script>
  325. <style lang="less" scoped>
  326. @import "~@/common/css/sidepage.less";
  327. @import "~@/common/css/customlist.less";
  328. </style>