Blame view

pages-sub/problem/work-order-manage/add-order.vue 8.19 KB
d433e7f6   刘淇   工单
1
  <template>
c7df828a   刘淇   快速工单 样式优化
2
    <view class="page-container">
5822009a   刘淇   工单管理--新增工单
3
4
5
6
7
      <view class="work-order-form-content commonPageLRpadding">
        <up-form
            label-position="left"
            :model="workOrderForm"
            ref="workOrderFormRef"
ff65dc6c   刘淇   快速工单 样式优化
8
            labelWidth="190rpx"
5822009a   刘淇   工单管理--新增工单
9
        >
2764b83e   刘淇   分配养护员
10
          <!-- 1. 工单编号(从URL获取展示) -->
5822009a   刘淇   工单管理--新增工单
11
          <up-form-item
2764b83e   刘淇   分配养护员
12
              label="工单编号"
5822009a   刘淇   工单管理--新增工单
13
              border-bottom
d433e7f6   刘淇   工单
14
          >
5822009a   刘淇   工单管理--新增工单
15
            <up-input
2764b83e   刘淇   分配养护员
16
                v-model="workOrderForm.orderNo"
5822009a   刘淇   工单管理--新增工单
17
18
                border="none"
                readonly
2764b83e   刘淇   分配养护员
19
                placeholder="暂无工单编号"
5822009a   刘淇   工单管理--新增工单
20
            ></up-input>
5822009a   刘淇   工单管理--新增工单
21
22
          </up-form-item>
  
2764b83e   刘淇   分配养护员
23
          <!-- 2. 养护员选择(必选,下拉框) -->
5822009a   刘淇   工单管理--新增工单
24
          <up-form-item
2764b83e   刘淇   分配养护员
25
26
              label="养护员"
              prop="assigneeName"
5822009a   刘淇   工单管理--新增工单
27
28
              border-bottom
              required
2764b83e   刘淇   分配养护员
29
              @click="handleActionSheetOpen('assignee'); hideKeyboard()"
5822009a   刘淇   工单管理--新增工单
30
31
          >
            <up-input
2764b83e   刘淇   分配养护员
32
                v-model="workOrderForm.assigneeName"
5822009a   刘淇   工单管理--新增工单
33
34
                disabled
                disabled-color="#ffffff"
2764b83e   刘淇   分配养护员
35
                placeholder="请选择养护员"
5822009a   刘淇   工单管理--新增工单
36
37
38
39
40
41
                border="none"
            ></up-input>
            <template #right>
              <up-icon name="arrow-right" size="16"></up-icon>
            </template>
          </up-form-item>
d433e7f6   刘淇   工单
42
  
2764b83e   刘淇   分配养护员
43
          <!-- 3. 处理意见(非必填,文本域) -->
5822009a   刘淇   工单管理--新增工单
44
          <up-form-item
2764b83e   刘淇   分配养护员
45
46
              label="处理意见"
              prop="reason"
5822009a   刘淇   工单管理--新增工单
47
48
          >
            <up-textarea
2764b83e   刘淇   分配养护员
49
50
                placeholder="请输入处理意见(可选,最多200字)"
                v-model.trim="workOrderForm.reason"
5822009a   刘淇   工单管理--新增工单
51
52
53
                count
                maxlength="200"
                rows="4"
5822009a   刘淇   工单管理--新增工单
54
55
            ></up-textarea>
          </up-form-item>
5822009a   刘淇   工单管理--新增工单
56
57
        </up-form>
      </view>
d433e7f6   刘淇   工单
58
  
5822009a   刘淇   工单管理--新增工单
59
60
61
62
      <!-- 底部提交按钮 -->
      <view class="fixed-bottom-btn-wrap">
        <up-button
            type="primary"
2764b83e   刘淇   分配养护员
63
            text="提交"
5822009a   刘淇   工单管理--新增工单
64
65
66
            @click="submitWorkOrder"
        ></up-button>
      </view>
d433e7f6   刘淇   工单
67
  
2764b83e   刘淇   分配养护员
68
      <!-- 养护员下拉弹窗 -->
5822009a   刘淇   工单管理--新增工单
69
      <up-action-sheet
8d0834be   刘淇   工单管理--新增工单 优化
70
71
72
73
74
          :show="showActionSheet"
          :actions="currentActionSheetData.list"
          :title="currentActionSheetData.title"
          @close="handleActionSheetClose"
          @select="handleActionSheetSelect"
5822009a   刘淇   工单管理--新增工单
75
      ></up-action-sheet>
5822009a   刘淇   工单管理--新增工单
76
77
    </view>
  </template>
d433e7f6   刘淇   工单
78
  
c7df828a   刘淇   快速工单 样式优化
79
  <script setup>
2764b83e   刘淇   分配养护员
80
81
82
83
84
  import { ref, reactive } from 'vue'
  import { onLoad, onReady, onShow } from '@dcloudio/uni-app';
  import { getYlWorkersPage, ylTeamLeaderAssignWOrder } from '@/api/work-order-manage/work-order-manage'
  import { useUserStore } from '@/pinia/user';
  const userStore = useUserStore();
c7df828a   刘淇   快速工单 样式优化
85
86
  // ========== 表单Ref ==========
  const workOrderFormRef = ref(null)
c7df828a   刘淇   快速工单 样式优化
87
  // ========== 页面状态 ==========
c7df828a   刘淇   快速工单 样式优化
88
  const showActionSheet = ref(false)
c7df828a   刘淇   快速工单 样式优化
89
90
91
92
93
  const currentActionSheetData = reactive({
    type: '',
    list: [],
    title: ''
  })
c7df828a   刘淇   快速工单 样式优化
94
  // ========== 下拉列表数据 ==========
2764b83e   刘淇   分配养护员
95
96
  const assigneeList = ref([]) // 养护员列表
  // ========== 工单表单数据(仅保留所需字段) ==========
c7df828a   刘淇   快速工单 样式优化
97
  const workOrderForm = reactive({
2764b83e   刘淇   分配养护员
98
99
100
101
102
    taskId:'',
    orderNo: '',        // 工单编号(对应接口参数id)
    assigneeId: '',     // 养护员ID(对应接口参数nextAssignee)
    assigneeName: '',   // 养护员名称(显示用)
    reason: ''          // 处理意见(对应接口参数reason)
c7df828a   刘淇   快速工单 样式优化
103
  })
2764b83e   刘淇   分配养护员
104
  // ========== 表单校验规则(仅保留养护员必选校验) ==========
c7df828a   刘淇   快速工单 样式优化
105
  const workOrderFormRules = reactive({
2764b83e   刘淇   分配养护员
106
107
    assigneeName: [
      {type: 'string', required: true, message: '请选择养护员', trigger: ['change']}
c7df828a   刘淇   快速工单 样式优化
108
    ],
2764b83e   刘淇   分配养护员
109
110
111
    reason: [
      {type: 'string', max: 200, message: '处理意见最多200字', trigger: ['change', 'blur']}
    ]
c7df828a   刘淇   快速工单 样式优化
112
  })
c7df828a   刘淇   快速工单 样式优化
113
  // ========== 生命周期 ==========
2764b83e   刘淇   分配养护员
114
115
116
117
118
119
120
121
122
123
  // onLoad - 获取URL中的工单编号
  onLoad((options) => {
    // 从URL参数中获取工单编号(参数名orderNo可根据实际修改)
    if (options && options.orderNo) {
      workOrderForm.orderNo = options.orderNo
      workOrderForm.taskId = options.taskId
  
    }
    console.log('从URL获取工单编号:', workOrderForm.orderNo)
  })
c7df828a   刘淇   快速工单 样式优化
124
125
126
127
128
  onReady(() => {
    // 设置表单校验规则
    if (workOrderFormRef.value) {
      workOrderFormRef.value.setRules(workOrderFormRules)
    }
c7df828a   刘淇   快速工单 样式优化
129
  })
c7df828a   刘淇   快速工单 样式优化
130
  onShow(() => {
2764b83e   刘淇   分配养护员
131
132
    // 加载养护员列表
    loadAssigneeList()
c7df828a   刘淇   快速工单 样式优化
133
  })
2764b83e   刘淇   分配养护员
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  // ========== 加载养护员列表 ==========
  const loadAssigneeList = async () => {
    try {
      uni.showLoading({title: '获取养护员中...'})
      // 调用getYlWorkersPage接口(可根据接口要求传递参数,此处默认空对象)
      console.log(userStore.userInfo.user.busiLine)
      let queryData = {
        // roleCode:userStore.userInfo.roles,
        roleCode: 'yl_worker',
        busiLine: userStore.userInfo.user.busiLine,
        pageNo: 1,
        pageSize: 100
      }
      const res = await getYlWorkersPage(queryData)
      uni.hideLoading()
      if (res.list.length > 0) {
        assigneeList.value = res.list.map(item => ({
          name: item.nickname,
          value: item.id,
          id: item.id
        }))
        console.log(currentActionSheetData.list)
      } else {
        uni.showToast({title: '所在班组暂无养护员,请先配置养护员', icon: 'none'})
      }
      console.log(currentActionSheetData.list)
    } catch (err) {
      uni.hideLoading()
      console.error('获取养护员列表失败:', err)
      uni.showToast({title: '获取养护员失败,请重试', icon: 'none'})
      assigneeList.value = []
    }
  }
c7df828a   刘淇   快速工单 样式优化
167
168
  // ========== 方法定义 ==========
  /**
2764b83e   刘淇   分配养护员
169
   * 打开养护员下拉弹窗
c7df828a   刘淇   快速工单 样式优化
170
171
   */
  const handleActionSheetOpen = (type) => {
2764b83e   刘淇   分配养护员
172
173
174
    // 判断养护员列表是否为空
    if (type === 'assignee' && assigneeList.value.length === 0) {
      uni.showToast({title: '暂无养护员数据可选', icon: 'none'})
c7df828a   刘淇   快速工单 样式优化
175
176
      return
    }
2764b83e   刘淇   分配养护员
177
    // 配置弹窗参数
c7df828a   刘淇   快速工单 样式优化
178
    const configMap = {
2764b83e   刘淇   分配养护员
179
180
181
      assignee: {
        title: '请选择养护员',
        list: assigneeList.value
d433e7f6   刘淇   工单
182
      }
c7df828a   刘淇   快速工单 样式优化
183
    }
c7df828a   刘淇   快速工单 样式优化
184
185
186
187
188
    currentActionSheetData.type = type
    currentActionSheetData.title = configMap[type].title
    currentActionSheetData.list = configMap[type].list
    showActionSheet.value = true
  }
c7df828a   刘淇   快速工单 样式优化
189
  /**
2764b83e   刘淇   分配养护员
190
   * 关闭下拉弹窗
c7df828a   刘淇   快速工单 样式优化
191
192
193
   */
  const handleActionSheetClose = () => {
    showActionSheet.value = false
c7df828a   刘淇   快速工单 样式优化
194
195
196
197
    currentActionSheetData.type = ''
    currentActionSheetData.list = []
    currentActionSheetData.title = ''
  }
c7df828a   刘淇   快速工单 样式优化
198
  /**
2764b83e   刘淇   分配养护员
199
   * 养护员选择事件
c7df828a   刘淇   快速工单 样式优化
200
201
   */
  const handleActionSheetSelect = (e) => {
2764b83e   刘淇   分配养护员
202
203
204
205
206
    const {type} = currentActionSheetData
    if (type === 'assignee') {
      workOrderForm.assigneeName = e.name
      workOrderForm.assigneeId = e.value // 绑定养护员ID
      workOrderFormRef.value?.validateField('assigneeName')
c7df828a   刘淇   快速工单 样式优化
207
    }
c7df828a   刘淇   快速工单 样式优化
208
209
    showActionSheet.value = false
  }
c7df828a   刘淇   快速工单 样式优化
210
211
212
213
214
215
  /**
   * 隐藏键盘
   */
  const hideKeyboard = () => {
    uni.hideKeyboard()
  }
c7df828a   刘淇   快速工单 样式优化
216
  /**
2764b83e   刘淇   分配养护员
217
   * 提交数据(使用ylTeamLeaderAssignWOrder接口,传递指定参数)
c7df828a   刘淇   快速工单 样式优化
218
219
220
   */
  const submitWorkOrder = async () => {
    try {
2764b83e   刘淇   分配养护员
221
      // 1. 表单校验(先校验养护员必选项)
c7df828a   刘淇   快速工单 样式优化
222
      await workOrderFormRef.value.validate()
2764b83e   刘淇   分配养护员
223
224
225
226
227
228
      // 2. 校验工单编号是否存在(避免无工单编号提交)
      if (!workOrderForm.orderNo) {
        uni.showToast({title: '工单编号不能为空', icon: 'none'})
        return
      }
      // 3. 构造接口所需参数
c7df828a   刘淇   快速工单 样式优化
229
      const submitData = {
2764b83e   刘淇   分配养护员
230
231
232
        id: workOrderForm.taskId,        // 工单编码(对应接口参数id)
        reason: workOrderForm.reason.trim(), // 处理建议(对应接口参数reason)
        nextAssignee: workOrderForm.assigneeId // 养护员ID(对应接口参数nextAssignee)
c7df828a   刘淇   快速工单 样式优化
233
      }
2764b83e   刘淇   分配养护员
234
235
236
237
238
239
      console.log('提交参数:', submitData)
      // 4. 显示加载提示
      uni.showLoading({title: '提交中...'})
      // 5. 调用指定接口 ylTeamLeaderAssignWOrder
      const res = await ylTeamLeaderAssignWOrder(submitData)
      // 6. 隐藏加载提示并给出成功反馈
c7df828a   刘淇   快速工单 样式优化
240
241
      uni.hideLoading()
      uni.showToast({
2764b83e   刘淇   分配养护员
242
        title: '提交成功',
c7df828a   刘淇   快速工单 样式优化
243
244
245
        icon: 'success',
        duration: 1000
      })
2764b83e   刘淇   分配养护员
246
      // 7. 提交成功后返回上一页
c7df828a   刘淇   快速工单 样式优化
247
      setTimeout(() => {
2764b83e   刘淇   分配养护员
248
249
        uni.navigateTo({
          url: `/pages-sub/problem/work-order-manage/index`
c7df828a   刘淇   快速工单 样式优化
250
251
252
        })
      }, 1000)
    } catch (error) {
2764b83e   刘淇   分配养护员
253
      // 隐藏加载提示
c7df828a   刘淇   快速工单 样式优化
254
      uni.hideLoading()
2764b83e   刘淇   分配养护员
255
      // 区分表单校验失败和接口调用失败
c7df828a   刘淇   快速工单 样式优化
256
      if (!Array.isArray(error)) {
2764b83e   刘淇   分配养护员
257
        console.error('提交失败:', error)
c7df828a   刘淇   快速工单 样式优化
258
259
260
261
262
        uni.showToast({
          title: '提交失败,请重试',
          icon: 'none',
          duration: 2000
        })
d433e7f6   刘淇   工单
263
264
      }
    }
d433e7f6   刘淇   工单
265
  }
5822009a   刘淇   工单管理--新增工单
266
  </script>
d433e7f6   刘淇   工单
267
  
5822009a   刘淇   工单管理--新增工单
268
269
  <style lang="scss" scoped>
  // 全局页面样式
c7df828a   刘淇   快速工单 样式优化
270
  .page-container {
2764b83e   刘淇   分配养护员
271
  
d433e7f6   刘淇   工单
272
273
  }
  
2764b83e   刘淇   分配养护员
274
  // 表单内容容器
5822009a   刘淇   工单管理--新增工单
275
276
  .work-order-form-content {
    background: #fff;
2764b83e   刘淇   分配养护员
277
    margin-top: 10rpx;
d433e7f6   刘淇   工单
278
279
  }
  
2764b83e   刘淇   分配养护员
280
  
d433e7f6   刘淇   工单
281
  </style>