diff --git a/src/apis/modules/workOrder.js b/src/apis/modules/workOrder.js
index 9720ecf..8f23497 100644
--- a/src/apis/modules/workOrder.js
+++ b/src/apis/modules/workOrder.js
@@ -21,5 +21,19 @@ export const getBackWorkOrderList = (params) => request.basic.get(`/api/v1/order
export const getWorkOrderDetail = (id) => request.basic.get(`/api/v1/orders/${id}`)
// 派单
-export const sendWorkOrder = (id, params) => request.basic.put(`/api/v1/orders${id}`, params)
+export const sendWorkOrder = (id, params) => request.basic.put(`/api/v1/orders/${id}`, params)
+
+//作废工单
+export const invalidWorkOrder = (id,params) => request.basic.delete(`/api/v1/orders/remove/${id}`,params)
+
+
+// 工单签入
+export const workOrderCheckIn = (params) => request.basic.post('/api/v1/orders/order_check_in',params)
+
+// 工单签中
+export const workOrderCheckDoing = (params) => request.basic.post('/api/v1/orders/order_check_doing',params)
+
+// 工单签出
+export const workOrderCheckOut = (params) => request.basic.post('/api/v1/orders/order_check_out',params)
+
diff --git a/src/views/serverObj/serverList/index.vue b/src/views/serverObj/serverList/index.vue
index a49a0aa..fb45fa1 100644
--- a/src/views/serverObj/serverList/index.vue
+++ b/src/views/serverObj/serverList/index.vue
@@ -308,6 +308,16 @@
}}
+
+ {{ dicsStore.getDictLabel('DISABILITY_TYPES', record.disabilityType) }}
+
+
+
+ {{ dicsStore.getDictLabel('Disability_Level', record.disabilityLevel) }}
+
+
+
+
编辑
diff --git a/src/views/workorderMenu/serviceWorkOrder/components/CheckDialog.vue b/src/views/workorderMenu/serviceWorkOrder/components/CheckDialog.vue
index 02a1830..8ba88f1 100644
--- a/src/views/workorderMenu/serviceWorkOrder/components/CheckDialog.vue
+++ b/src/views/workorderMenu/serviceWorkOrder/components/CheckDialog.vue
@@ -12,7 +12,7 @@
>
-
-
+ -->
@@ -45,19 +45,8 @@
label="代签入图片"
name="images"
>
-
-
-
+
@@ -70,6 +59,8 @@ import { useForm } from '@/hooks'
import { useModal } from '@/hooks'
import { message } from 'ant-design-vue'
import dayjs from 'dayjs'
+import apis from '@/apis'
+import GxUpload from '@/components/GxUpload/index.vue'
const emit = defineEmits(['ok'])
@@ -81,16 +72,16 @@ const fileList = ref([])
// 表单数据初始化
formData.value = reactive({
- signTime: null,
+ // signTime: null,
reason: '',
images: [] // 存储 File 对象或 URL
})
// 表单校验规则
formRules.value = {
- signTime: [
- { required: true, message: '请选择签入时间' }
- ],
+ // signTime: [
+ // { required: true, message: '请选择签入时间' }
+ // ],
reason: [
{ required: true, message: '请填写代签入原因' },
{ max: 100, message: '原因不能超过100字' }
@@ -111,7 +102,7 @@ function showCheckModal(record) {
type: 'cancel',
title: '代签入工单'
})
- formData.value.signTime = null
+ // formData.value.signTime = null
formData.value.reason = ''
fileList.value = []
}
@@ -143,32 +134,62 @@ function dummyRequest(options) {
// 确定提交
async function handleOk() {
try {
- const values = await formRef.value.validateFields()
- showLoading()
+ await formRef.value?.validateFields();
+ showLoading();
- // 收集文件(如果需要传给父组件)
- const files = fileList.value
- .filter(f => f.status === 'done')
- .map(f => f.originFileObj || f)
+ const { id, status } = currentRecord.value || {};
+ const reason = formData.value.reason;
- // 此处可调用 API 提交:签入时间、原因、图片
- // await apis.workOrder.proxySignIn({
- // id: currentRecord.value?.id,
- // signTime: dayjs(formData.value.signTime).format('YYYY-MM-DD HH:mm:ss'),
- // reason: formData.value.reason,
- // images: files
- // })
+ if (!id) {
+ message.error('工单ID不存在');
+ return;
+ }
+
+ let result;
+
+ if (status === 'Pending_Check-in') {
+ // 签入
+ result = await apis.workOrder.workOrderCheckIn({
+ orderID: id,
+ inProxyRemark: reason,
+ inImages: formData.inImages
+ });
+ } else if (status === 'Pending_Check-doing') {
+ result = await apis.workOrder.workOrderCheckDoing({
+ orderID: id,
+ outProxyRemark: reason,
+ outImages: formData.inImages
+ });
+
+ } else if (status === 'Pending_Check-out') {
+ result = await apis.workOrder.workOrderCheckOut({
+ orderID: id,
+ outProxyRemark: reason,
+ outImages: formData.inImages,
+ });
+
+ } else {
+ message.warning(`不支持的状态: ${status}`);
+ return;
+ }
+
+ if (result?.success) {
+ let msg = '操作成功';
+ if (status === 'Pending_Check-in') msg = '代签入成功';
+ else if (status === 'Pending_Check-doing') msg = '作业签出成功';
+ else if (status === 'Pending_Check-out') msg = '最终签出成功';
+
+ message.success(msg);
+ hideModal();
+ emit('ok', { reason, images: files });
+ } else {
+ message.error(result?.message || '操作失败');
+ }
- hideLoading()
- hideModal()
- emit('ok', {
- signTime: formData.value.signTime,
- reason: formData.value.reason,
- images: files
- })
} catch (error) {
- hideLoading()
- console.error('表单验证失败:', error)
+ console.error('请求异常:', error);
+ } finally {
+ hideLoading();
}
}
diff --git a/src/views/workorderMenu/serviceWorkOrder/components/EditDialog.vue b/src/views/workorderMenu/serviceWorkOrder/components/EditDialog.vue
index 28860db..fc4c6b5 100644
--- a/src/views/workorderMenu/serviceWorkOrder/components/EditDialog.vue
+++ b/src/views/workorderMenu/serviceWorkOrder/components/EditDialog.vue
@@ -1,139 +1,146 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
-
-
+
+
+
+ {{ item.introduction }}
+
+
-
+
-
-
+
+
-
+
+
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
分钟
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分钟
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
+
@@ -145,38 +152,53 @@ import { useForm } from '@/hooks'
import { useModal } from '@/hooks'
import { message } from 'ant-design-vue'
import dayjs from 'dayjs'
+import apis from '@/apis'
+import { useDicsStore } from '@/store'
+import { config } from '@/config'
+import AreaCascader from '@/components/AreaCascader/index.vue'
+
+const dicsStore = useDicsStore()
// 模拟下拉选项(实际从接口获取)
-const staffOptions = [
- { value: '邢光平', label: '邢光平' },
- { value: '张三', label: '张三' },
- { value: '李四', label: '李四' }
+const staffOptions = ref([])
+
+const serviceItemOptions = ref([])
+
+const orderTypeOptions = [
+ { value: '1', label: '类型1' },
+ { value: '2', label: '类型2' }
]
-const serviceItemOptions = [
- { value: '兴趣活动', label: '兴趣活动' },
- { value: '生活照料', label: '生活照料' },
- { value: '康复训练', label: '康复训练' }
-]
+const TZ = '+08:00'
+
+const buildISODateTime = (dateMoment, timeStr = '00:00:00') => {
+ if (!dateMoment) return ''
+ return `${dateMoment.format('YYYY-MM-DD')}T${timeStr}${TZ}`
+}
+
+// const categoryTypeOptions = [
+// { value: '1', label: '分类1' },
+// { value: '2', label: '分类2' }
+// ]
const areaOptions = [
{
- value: '江苏省',
+ value: '320000000000',
label: '江苏省',
children: [
{
- value: '南通市',
+ value: '320600000000',
label: '南通市',
children: [
{
- value: '通州区',
+ value: '320612000000',
label: '通州区',
children: [
{
- value: '金新街道',
+ value: '320612001000',
label: '金新街道',
children: [
- { value: '大石桥村委会', label: '大石桥村委会' }
+ { value: '320612001203', label: '大石桥村委会' }
]
}
]
@@ -192,33 +214,76 @@ const emit = defineEmits(['ok'])
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formData, formRef, formRules, resetForm } = useForm()
-// 初始化表单数据(与图片展示内容一致)
-formData.value = reactive({
- serviceTarget: '袁正芬', // 服务对象(只读)
- serviceStaff: '邢光平', // 服务人员
- serviceItems: '兴趣活动', // 服务项目(单选)
- serviceFee: '40', // 服务费用
- planDateRange: [dayjs('2025-10-17'), dayjs('2025-10-31')], // 计划日期范围
- planStartTime: dayjs('00:03:00', 'HH:mm:ss'), // 计划开始时间
- requiredDuration: 90, // 要求工单时长(分钟)
- serviceArea: ['江苏省', '南通市', '通州区', '金新街道', '大石桥村委会'], // 服务地址(级联)
- detailAddress: '南通市通州区川姜镇大石桥村九组131号', // 详细地址
- mapAddress: '', // 地图定位地址(暂空)
- remark: '' // 备注
+// 当前编辑的工单原始数据
+const originalRecord = ref({})
+
+// 初始化表单数据 - 完全按照后台字段
+const initFormData = () => ({
+ // 基本信息
+ id: '',
+ customerName: '',
+ customerIdCard: '',
+ customerId: '',
+ orderNum: '',
+ orderType: '',
+ orderingMethod: '',
+ status: '',
+ stationId: '',
+
+ // 服务人员
+ servicePersonId: '',
+
+ // 项目信息
+ projectName: '',
+ // categoryType: '',
+ categoryMethod: '',
+ price: '',
+ duration: 0,
+ workDuration: 0,
+
+ // 时间信息
+ plannedStartDate: null,
+ plannedEndDate: null,
+ plannedServiceStartDate: null,
+
+ // 地址信息
+ areaCodes: [],
+ areaLabels: [],
+ detailAddress: '',
+ lat: 0,
+ lng: 0,
+
+ // 内容信息
+ content: '',
+ // serviceSummary: '',
+ // userDemandFeedback: '',
+
+ // 其他
+ orderAddId: '',
+ signInAt: '',
+ signOutAt: '',
+ actualServiceDuration: 0
})
+// 初始化表单
+formData.value = initFormData()
+
// 表单验证规则
formRules.value = {
- serviceStaff: [{ required: true, message: '请选择服务人员' }],
- serviceItems: [{ required: true, message: '请选择服务项目' }],
- serviceFee: [
+ servicePersonId: [{ required: true, message: '请选择服务人员' }],
+ orderType: [{ required: true, message: '请选择工单类型' }],
+ projectName: [{ required: true, message: '请选择服务项目' }],
+ // categoryType: [{ required: true, message: '请选择项目分类' }],
+ price: [
{ required: true, message: '请填写服务费用' },
{ pattern: /^\d+$/, message: '请输入有效数字' }
],
- planDateRange: [{ required: true, message: '请选择计划日期范围' }],
- planStartTime: [{ required: true, message: '请选择计划开始时间' }],
- requiredDuration: [{ required: true, message: '请填写要求工单时长' }],
- serviceArea: [{ required: true, message: '请选择服务地址' }],
+ duration: [{ required: true, message: '请填写服务时长' }],
+ workDuration: [{ required: true, message: '请填写工单时长' }],
+ plannedStartDate: [{ required: true, message: '请选择计划开始日期' }],
+ plannedEndDate: [{ required: true, message: '请选择计划结束日期' }],
+ plannedServiceStartDate: [{ required: true, message: '请选择计划开始时间' }],
+ areaCodes: [{ required: true, message: '请选择服务地址' }],
detailAddress: [{ required: true, message: '请填写详细地址' }]
}
@@ -226,35 +291,150 @@ formRules.value = {
const cancelText = ref('取消')
const okText = ref('保存')
-// 打开地图(示例方法,可扩展真实逻辑)
-function openMap() {
- message.info('地图定位功能待实现')
+
+async function getPageList() {
+ console.log('获取服务人员列表:')
+ try {
+ const res = await apis.serviceStaffList
+ .getProjectList({
+ // companyId: storage.local.getItem('companyId'),
+ // stationId: storage.local.getItem('stationId'),
+ pageSize: 999,
+ current: 1,
+ })
+ .catch(() => {
+ throw new Error()
+ })
+
+ console.log('获取服务人员列表:', res)
+
+ if (res && res.success) {
+ staffOptions.value = res.data.map(item => ({
+ value: item.id,
+ label: item.name
+ }))
+ }
+ } catch (error) {
+ console.error('API 请求失败:', error)
+ throw error // 或者 return null 等
+ }
}
+
+
+async function getCategoriesAll() {
+ try {
+ console.log(111)
+ const { success, data, total } = await apis.projectType
+ .getProjectListAll({
+ pageSize:100, current:1,
+ })
+ .catch(() => {
+ throw new Error()
+ })
+ if (config('http.code.success') === success) {
+ serviceItemOptions.value = data.map(item=>({value:item.id,label:item.name}))
+
+ }
+ } catch (error) {
+
+ }
+
+}
// 确定保存
async function handleOk() {
try {
const values = await formRef.value.validateFields()
showLoading()
- // 构造提交数据(根据后端需求调整格式,如日期转字符串)
- const payload = {
- ...values,
- planStartDate: values.planDateRange?.[0]?.format('YYYY-MM-DD') || '',
- planEndDate: values.planDateRange?.[1]?.format('YYYY-MM-DD') || '',
- planStartTime: values.planStartTime?.format('HH:mm:ss') || ''
+ // 构建完整的时间格式,处理空值情况
+ const buildFullDateTime = (dateMoment, timeMoment) => {
+ if (!dateMoment) return null // 返回 null 而不是空字符串
+ const dateStr = dateMoment.format('YYYY-MM-DD')
+ const timeStr = timeMoment ? timeMoment.format('HH:mm:ss') : '00:00:00'
+ return `${dateStr}T${timeStr}${TZ}`
}
- // 模拟接口请求:await apis.workOrder.save(payload)
- setTimeout(() => {
+ // 单独处理服务开始时间(需要日期+时间)
+ const buildServiceStartTime = (dateMoment, timeMoment) => {
+ if (!dateMoment || !timeMoment) return null
+ const dateStr = dateMoment.format('YYYY-MM-DD')
+ const timeStr = timeMoment.format('HH:mm:ss')
+ return `${dateStr}T${timeStr}${TZ}`
+ }
+
+ // 构造提交数据 - 完全按照后台格式
+ const payload = {
+ // 基本信息
+ id: originalRecord.value.id,
+ customerId: originalRecord.value.customerId || '',
+ orderNum: originalRecord.value.orderNum || '',
+ orderType: values.orderType,
+ orderingMethod: originalRecord.value.orderingMethod || '',
+ status: originalRecord.value.status || '',
+ stationId: originalRecord.value.stationId || '',
+
+ // 服务人员
+ servicePersonId: values.servicePersonId,
+
+ // 项目信息
+ projects: [{
+ name: values.projectName,
+ categoryMethod: originalRecord.value.projects?.[0]?.categoryMethod || '',
+ price: Number(values.price),
+ duration: Number(values.duration),
+ num: originalRecord.value.projects?.[0]?.num || 0
+ }],
+ price: Number(values.price),
+ workDuration: Number(values.workDuration),
+
+ // 时间信息 - 修正时间格式,处理空值
+ plannedStartDate: buildFullDateTime(values.plannedStartDate, values.plannedServiceStartDate),
+ plannedEndDate: buildFullDateTime(values.plannedEndDate, null),
+ plannedServiceStartDate: buildServiceStartTime(values.plannedStartDate, values.plannedServiceStartDate),
+
+ // 地址信息
+ areaCodes: values.areaCodes,
+ areaLabels: originalRecord.value.areaLabels || [],
+ detailAddress: values.detailAddress,
+ lat: originalRecord.value.lat || 0,
+ lng: originalRecord.value.lng || 0,
+
+ // 内容信息
+ content: values.content || '',
+
+ // 其他信息
+ orderAddId: originalRecord.value.orderAddId || '',
+ signInAt: originalRecord.value.signInAt || '',
+ signOutAt: originalRecord.value.signOutAt || '',
+ actualServiceDuration: originalRecord.value.actualServiceDuration || 0
+ }
+
+ // 清理空值字段(可选,根据后端要求)
+ Object.keys(payload).forEach(key => {
+ if (payload[key] === null || payload[key] === '') {
+ delete payload[key]
+ }
+ })
+
+ console.log('提交的数据:', JSON.stringify(payload, null, 2))
+
+ // 调用编辑接口
+ const res = await apis.workOrder.sendWorkOrder(originalRecord.value.id, payload)
+
+ if (res && res.success) {
+ message.success('保存成功')
hideLoading()
hideModal()
- emit('ok', payload)
- message.success('保存成功')
- }, 500)
+ emit('ok')
+ } else {
+ message.error(res?.message || '保存失败')
+ hideLoading()
+ }
} catch (error) {
console.error('表单验证失败:', error)
hideLoading()
+ message.error('保存失败,请检查表单数据')
}
}
@@ -266,34 +446,76 @@ function handleCancel() {
// 关闭后重置表单
function onAfterClose() {
resetForm()
+ originalRecord.value = {}
}
-// 暴露“显示编辑弹窗”方法(若需外部调用)
-defineExpose({
- showEditModal(record) {
- // 若为“编辑”场景,需将 record 数据映射到 formData(示例逻辑)
- formData.value = reactive({
- serviceTarget: record?.serviceTarget || '袁正芬',
- serviceStaff: record?.serviceStaff || '邢光平',
- serviceItems: record?.serviceItems || '兴趣活动',
- serviceFee: record?.serviceFee || '40',
- planDateRange: record?.planDateRange
- ? [dayjs(record.planStartDate), dayjs(record.planEndDate)]
- : [dayjs('2025-10-17'), dayjs('2025-10-31')],
- planStartTime: record?.planStartTime
- ? dayjs(record.planStartTime, 'HH:mm:ss')
- : dayjs('00:03:00', 'HH:mm:ss'),
- requiredDuration: record?.requiredDuration || 90,
- serviceArea: record?.serviceArea || ['江苏省', '南通市', '通州区', '金新街道', '大石桥村委会'],
- detailAddress: record?.detailAddress || '南通市通州区川姜镇大石桥村九组131号',
- mapAddress: record?.mapAddress || '',
- remark: record?.remark || ''
- })
+// 暴露"显示编辑弹窗"方法
+function showEditModal(record) {
+ getPageList()
+ getCategoriesAll()
+ if (!record) return
- showModal({
- type: 'edit',
- title: '编辑工单'
- })
+ console.log('编辑工单数据:', record)
+
+ // 保存原始数据
+ originalRecord.value = { ...record }
+
+ // 映射数据到表单 - 完全按照后台字段
+ formData.value = {
+ // 基本信息
+ id: record.id,
+ customerName: record.customerName || '',
+ customerIdCard: record.customerIdCard || '',
+ customerId: record.customerId || '',
+ orderNum: record.orderNum || '',
+ orderType: record.orderType || '',
+ orderingMethod: record.orderingMethod || '',
+ status: record.status || '',
+ stationId: record.stationId || '',
+
+ // 服务人员
+ servicePersonId: record.servicePersonId || '',
+
+ // 项目信息
+ projectName: record.projects?.[0]?.name || '',
+ // categoryType: record.projects?.[0]?.categoryType || '',
+ categoryMethod: record.projects?.[0]?.categoryMethod || '',
+ price: record.projects?.[0]?.price?.toString() || '',
+ duration: record.projects?.[0]?.duration || 0,
+ workDuration: record.workDuration || 0,
+
+ // 时间信息
+ plannedStartDate: record.plannedStartDate ? dayjs(record.plannedStartDate) : null,
+ plannedEndDate: record.plannedEndDate ? dayjs(record.plannedEndDate) : null,
+ plannedServiceStartDate: record.plannedServiceStartDate ? dayjs(record.plannedServiceStartDate, 'HH:mm:ss') : null,
+
+ // 地址信息
+ areaCodes: record.areaCodes || [],
+ areaLabels: record.areaLabels || [],
+ detailAddress: record.detailAddress || '',
+ lat: record.lat || 0,
+ lng: record.lng || 0,
+
+ // 内容信息
+ content: record.content || '',
+ // serviceSummary: record.serviceSummary || '',
+ // userDemandFeedback: record.userDemandFeedback || '',
+
+ // 其他
+ orderAddId: record.orderAddId || '',
+ signInAt: record.signInAt || '',
+ signOutAt: record.signOutAt || '',
+ actualServiceDuration: record.actualServiceDuration || 0
}
+
+ showModal({
+ type: 'edit',
+ title: '编辑工单'
+ })
+}
+
+// 暴露方法给父组件
+defineExpose({
+ showEditModal
})
\ No newline at end of file
diff --git a/src/views/workorderMenu/serviceWorkOrder/components/InvalidatedDialog.vue b/src/views/workorderMenu/serviceWorkOrder/components/InvalidatedDialog.vue
index 6a329a7..a5b7966 100644
--- a/src/views/workorderMenu/serviceWorkOrder/components/InvalidatedDialog.vue
+++ b/src/views/workorderMenu/serviceWorkOrder/components/InvalidatedDialog.vue
@@ -9,8 +9,9 @@
:ok-text="okText"
@ok="handleOk"
@cancel="handleCancel"
+ :ok-button-props="{ htmlType: 'submit' }"
>
-
+