合伙人运营小程序
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. const api = require('../../api/index.js');
  2. Page({
  3. data: {
  4. // 筛选状态
  5. activeType: 0, // all/car/station/user
  6. activeStatus: 1, // pending/processing/completed/rejected
  7. // 工单数量统计(待处理工单)
  8. orderCount: {
  9. all: 0,
  10. car: 0,
  11. station: 0,
  12. user: 0
  13. },
  14. // 原始工单数据(实际项目从接口获取)
  15. orderData: [],
  16. // 筛选后的工单列表
  17. filteredOrders: [],
  18. // 分页相关配置
  19. pageNum: 1, // 当前页码
  20. pageSize: 10, // 每页条数
  21. hasMore: true, // 是否有更多数据
  22. isLoading: false // 是否正在加载数据
  23. },
  24. onLoad(options) {
  25. wx.$on('wsMessage', this.handleWsMessage);
  26. // 初始化工单数据
  27. this.initOrderData();
  28. },
  29. onHide(){
  30. // 页面卸载时,取消订阅,这是至关重要的一步!
  31. wx.$off('wsMessage', this.handleWsMessage);
  32. },
  33. /**
  34. * 处理接收到的 WebSocket 消息
  35. * @param {Object} message 从 app.js 广播过来的消息对象
  36. */
  37. handleWsMessage(message) {
  38. console.log('Other Page 收到 WebSocket 消息:', message);
  39. // 根据消息类型进行不同的处理
  40. switch (message.api) {
  41. case '/sysworkorder/selectpartnerworkorder':
  42. // 在这里可以更新地图、刷新UI等
  43. this.initOrderData()
  44. break;
  45. }
  46. },
  47. /**
  48. * 下拉刷新:重新加载工单数据(重置分页)
  49. */
  50. onPullDownRefresh() {
  51. // 重置分页参数,重新加载第一页
  52. this.setData({
  53. pageNum: 1,
  54. hasMore: true,
  55. filteredOrders: []
  56. }, () => {
  57. this.initOrderData(() => {
  58. wx.stopPullDownRefresh();
  59. });
  60. });
  61. },
  62. /**
  63. * 触底加载更多
  64. */
  65. onReachBottom() {
  66. // 有更多数据且不在加载中时,加载下一页
  67. if (this.data.hasMore && !this.data.isLoading) {
  68. this.setData({ pageNum: this.data.pageNum + 1 }, () => {
  69. this.filterOrders(); // 筛选模式下加载更多用filterOrders,否则用initOrderData
  70. });
  71. }
  72. },
  73. /**
  74. * 初始化工单数据(模拟储能车运维场景数据)
  75. * @param {Function} callback 加载完成后的回调
  76. */
  77. initOrderData(callback) {
  78. // 防止重复加载
  79. if (this.data.isLoading) return;
  80. this.setData({ isLoading: true });
  81. const { pageNum, pageSize } = this.data;
  82. const data = {
  83. workorderType: "",
  84. chargedischargeType: "",
  85. settlementType: 0,
  86. pageNum,
  87. pageSize
  88. };
  89. api.request(`/sysworkorder/selectpartnerworkorder`, 'post', data, { isPublic: false })
  90. .then((res) => {
  91. console.log('工单列表数据:', res.data);
  92. if (res.code === 200) {
  93. const newData = res.data.data;
  94. // 下拉刷新重置数据,加载更多拼接数据
  95. const orderData = pageNum === 1 ? newData : [...this.data.orderData, ...newData];
  96. // 判断是否还有更多数据(返回数据条数小于每页条数则无更多)
  97. const hasMore = newData.length >= pageSize;
  98. this.setData({
  99. orderData,
  100. filteredOrders: orderData, // 初始加载时筛选列表等于原始数据
  101. hasMore,
  102. isLoading: false
  103. }, () => {
  104. // 统计各类型待处理工单数量(待派单+处理中)
  105. callback && callback();
  106. });
  107. } else {
  108. this.setData({ isLoading: false });
  109. wx.showToast({ title: '数据加载失败', icon: 'none' });
  110. callback && callback();
  111. }
  112. })
  113. .catch((err) => {
  114. console.error('请求失败:', err);
  115. this.setData({ isLoading: false });
  116. wx.showToast({ title: '网络异常', icon: 'none' });
  117. callback && callback();
  118. });
  119. },
  120. /**
  121. * 筛选工单列表(根据类型+状态,支持分页)
  122. */
  123. filterOrders() {
  124. // 防止重复加载
  125. if (this.data.isLoading) return;
  126. this.setData({ isLoading: true });
  127. const { activeType, activeStatus, pageNum, pageSize, filteredOrders } = this.data;
  128. const data = {
  129. workorderType: activeStatus,
  130. chargedischargeType: activeType,
  131. settlementType: 0,
  132. pageNum,
  133. pageSize
  134. };
  135. api.request(`/sysworkorder/selectpartnerworkorder`, 'post', data, { isPublic: false })
  136. .then((res) => {
  137. console.log('筛选后工单数据:', res.data);
  138. if (res.code === 200) {
  139. const newData = res.data.data;
  140. // 第一页重置数据,后续页拼接数据
  141. const newFilteredOrders = pageNum === 1 ? newData : [...filteredOrders, ...newData];
  142. const hasMore = newData.length >= pageSize;
  143. this.setData({
  144. filteredOrders: newFilteredOrders,
  145. hasMore,
  146. isLoading: false
  147. });
  148. } else {
  149. this.setData({ isLoading: false });
  150. wx.showToast({ title: '筛选失败', icon: 'none' });
  151. }
  152. })
  153. .catch((err) => {
  154. console.error('筛选请求失败:', err);
  155. this.setData({ isLoading: false });
  156. wx.showToast({ title: '网络异常', icon: 'none' });
  157. });
  158. },
  159. /**
  160. * 切换工单类型筛选(重置分页)
  161. */
  162. switchType(e) {
  163. const type = e.currentTarget.dataset.type;
  164. this.setData({
  165. activeType: type,
  166. pageNum: 1, // 切换筛选条件时重置页码
  167. hasMore: true, // 重置是否有更多数据
  168. filteredOrders: [] // 清空现有筛选数据
  169. }, () => {
  170. this.filterOrders();
  171. });
  172. },
  173. /**
  174. * 切换工单状态筛选(重置分页)
  175. */
  176. switchStatus(e) {
  177. const status = e.currentTarget.dataset.status;
  178. this.setData({
  179. activeStatus: status,
  180. pageNum: 1, // 切换筛选条件时重置页码
  181. hasMore: true, // 重置是否有更多数据
  182. filteredOrders: [] // 清空现有筛选数据
  183. }, () => {
  184. this.filterOrders();
  185. });
  186. },
  187. /**
  188. * 派单操作
  189. */
  190. dispatchOrder(e) {
  191. const orderId = e.currentTarget.dataset.id;
  192. wx.showModal({
  193. title: '派单确认',
  194. content: '请输入派单人员姓名',
  195. editable: true,
  196. placeholderText: '例如:李师傅',
  197. success: (res) => {
  198. if (res.confirm && res.content) {
  199. this.updateOrderStatus(orderId, 'processing', res.content);
  200. }
  201. }
  202. });
  203. },
  204. /**
  205. * 完成工单
  206. */
  207. completeOrder(e) {
  208. const orderId = e.currentTarget.dataset.id;
  209. wx.showModal({
  210. title: '完成确认',
  211. content: '是否确认该工单已完成?',
  212. success: (res) => {
  213. if (res.confirm) {
  214. this.updateOrderStatus(orderId, 'completed', wx.getStorageSync('userName') || '管理员');
  215. }
  216. }
  217. });
  218. },
  219. /**
  220. * 驳回工单
  221. */
  222. rejectOrder(e) {
  223. const orderId = e.currentTarget.dataset.id;
  224. wx.showModal({
  225. title: '驳回工单',
  226. content: '请输入驳回原因',
  227. editable: true,
  228. placeholderText: '例如:配件缺货、现场条件不满足等',
  229. success: (res) => {
  230. if (res.confirm && res.content) {
  231. // 更新工单状态为驳回,并记录驳回原因
  232. const { orderData } = this.data;
  233. const newOrders = orderData.map(item => {
  234. if (item.id === orderId) {
  235. return {
  236. ...item,
  237. status: 'rejected',
  238. operatorName: wx.getStorageSync('userName') || '管理员',
  239. rejectReason: res.content
  240. };
  241. }
  242. return item;
  243. });
  244. this.setData({ orderData: newOrders }, () => {
  245. this.filterOrders();
  246. wx.showToast({
  247. title: '工单已驳回',
  248. icon: 'success',
  249. duration: 1000
  250. });
  251. });
  252. // 实际项目中调用接口更新工单状态
  253. // this.updateOrderApi(orderId, 'rejected', res.content);
  254. }
  255. }
  256. });
  257. },
  258. /**
  259. * 更新工单状态(派单/完成)
  260. */
  261. updateOrderStatus(orderId, status, operatorName) {
  262. const { orderData } = this.data;
  263. const newOrders = orderData.map(item => {
  264. if (item.id === orderId) {
  265. return {
  266. ...item,
  267. status: status,
  268. operatorName: operatorName
  269. };
  270. }
  271. return item;
  272. });
  273. this.setData({ orderData: newOrders }, () => {
  274. this.filterOrders();
  275. wx.showToast({
  276. title: status === 'processing' ? '派单成功' : '工单已完成',
  277. icon: 'success',
  278. duration: 1000
  279. });
  280. });
  281. // 实际项目中调用接口更新工单状态
  282. // this.updateOrderApi(orderId, status, operatorName);
  283. },
  284. /**
  285. * 跳转工单详情页
  286. */
  287. toOrderDetail(e) {
  288. console.log(e);
  289. const order = e.currentTarget.dataset.order;
  290. if (!order.workorderId) return;
  291. // 跳转工单详情页(替换为你的详情页路径)
  292. wx.navigateTo({
  293. url: `/pages/orderdetails/index?id=${order.workorderId}`
  294. });
  295. },
  296. /**
  297. * 新建工单
  298. */
  299. createOrder() {
  300. // 跳转到新建工单页面
  301. wx.navigateTo({
  302. url: '/pages/create-order/create-order'
  303. });
  304. },
  305. /**
  306. * 实际项目中:调用接口更新工单状态
  307. */
  308. updateOrderApi(orderId, status, operatorName, rejectReason = '') {
  309. wx.showLoading({ title: '处理中...' });
  310. wx.request({
  311. url: `https://你的接口地址/work-order/${orderId}/status`,
  312. method: 'POST',
  313. data: {
  314. status,
  315. operatorName,
  316. rejectReason
  317. },
  318. success: (res) => {
  319. if (res.data.code === 200) {
  320. wx.showToast({ title: '操作成功', icon: 'success' });
  321. } else {
  322. wx.showToast({ title: res.data.msg || '操作失败', icon: 'none' });
  323. }
  324. },
  325. fail: () => {
  326. wx.showToast({ title: '网络错误', icon: 'none' });
  327. },
  328. complete: () => {
  329. wx.hideLoading();
  330. }
  331. });
  332. }
  333. });