|  | @@ -6,23 +6,36 @@
 | 
	
		
			
				|  |  |                <el-option :label="item.dictLabel" :value="item.dictValue" v-for="item in state.getDictByKey('inspectionType')"></el-option>
 | 
	
		
			
				|  |  |            </el-select>
 | 
	
		
			
				|  |  |        </el-form-item>
 | 
	
		
			
				|  |  | -          <el-form-item label="开始日期" prop="startDate">
 | 
	
		
			
				|  |  | -            <el-date-picker
 | 
	
		
			
				|  |  | -            v-model="dataForm.startDate"
 | 
	
		
			
				|  |  | -            type="datetime"        
 | 
	
		
			
				|  |  | -            placeholder="选择开始日期"
 | 
	
		
			
				|  |  | -            value-format="YYYY-MM-DD HH:mm:ss" 
 | 
	
		
			
				|  |  | -            style="width: 100%;"
 | 
	
		
			
				|  |  | -          ></el-date-picker>
 | 
	
		
			
				|  |  | +      <el-form-item label="日巡检-巡检日期" prop="startDate">
 | 
	
		
			
				|  |  | +        <el-date-picker
 | 
	
		
			
				|  |  | +          v-model="dataForm.startDate"
 | 
	
		
			
				|  |  | +          type="date"
 | 
	
		
			
				|  |  | +          placeholder="选择日期(日巡检)"
 | 
	
		
			
				|  |  | +          value-format="YYYY-MM-DD"
 | 
	
		
			
				|  |  | +          style="width: 100%;"
 | 
	
		
			
				|  |  | +        />
 | 
	
		
			
				|  |  |        </el-form-item>
 | 
	
		
			
				|  |  | -          <el-form-item label="结束日期" prop="endDate">
 | 
	
		
			
				|  |  | -            <el-date-picker
 | 
	
		
			
				|  |  | -            v-model="dataForm.endDate"
 | 
	
		
			
				|  |  | -            type="datetime"        
 | 
	
		
			
				|  |  | -            placeholder="选择结束日期"
 | 
	
		
			
				|  |  | -            value-format="YYYY-MM-DD HH:mm:ss" 
 | 
	
		
			
				|  |  | -            style="width: 100%;"
 | 
	
		
			
				|  |  | -          ></el-date-picker>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      <!-- 月+周 -->
 | 
	
		
			
				|  |  | +      <el-form-item label="周巡检-选择月份">
 | 
	
		
			
				|  |  | +        <el-date-picker
 | 
	
		
			
				|  |  | +          v-model="selectedMonth"
 | 
	
		
			
				|  |  | +          type="month"
 | 
	
		
			
				|  |  | +          placeholder="选择月份(周巡检)"
 | 
	
		
			
				|  |  | +          value-format="YYYY-MM"
 | 
	
		
			
				|  |  | +          @change="updateWeekOptions"
 | 
	
		
			
				|  |  | +          style="width: 100%;"
 | 
	
		
			
				|  |  | +        />
 | 
	
		
			
				|  |  | +      </el-form-item>
 | 
	
		
			
				|  |  | +      <el-form-item label="周巡检-选择周次">
 | 
	
		
			
				|  |  | +        <el-select v-model="selectedWeek" placeholder="选择周次(周巡检)" clearable>
 | 
	
		
			
				|  |  | +          <el-option
 | 
	
		
			
				|  |  | +            v-for="(week, index) in weekOptions"
 | 
	
		
			
				|  |  | +            :key="index"
 | 
	
		
			
				|  |  | +            :label="week.label"
 | 
	
		
			
				|  |  | +            :value="week.value"
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </el-select>
 | 
	
		
			
				|  |  |        </el-form-item>
 | 
	
		
			
				|  |  |            <el-form-item label="巡检照片" prop="filePath">
 | 
	
		
			
				|  |  |              <el-upload
 | 
	
	
		
			
				|  | @@ -57,7 +70,7 @@
 | 
	
		
			
				|  |  |  import app from "@/constants/app";
 | 
	
		
			
				|  |  |  import { getToken } from "@/utils/cache";
 | 
	
		
			
				|  |  |  import { parseTime } from '@/utils/ruoyi'
 | 
	
		
			
				|  |  | -import { reactive, ref } from "vue";
 | 
	
		
			
				|  |  | +import { reactive, ref, watch } from "vue";
 | 
	
		
			
				|  |  |  import baseService from "@/service/baseService";
 | 
	
		
			
				|  |  |  import { ElMessage } from "element-plus";
 | 
	
		
			
				|  |  |  import { Plus } from '@element-plus/icons-vue'
 | 
	
	
		
			
				|  | @@ -66,6 +79,13 @@ const emit = defineEmits(["refreshDataList"]);
 | 
	
		
			
				|  |  |  import useView from "@/hooks/useView";
 | 
	
		
			
				|  |  |  const state = reactive({ ...useView({}) });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import dayjs from 'dayjs'
 | 
	
		
			
				|  |  | +import isoWeek from 'dayjs/plugin/isoWeek'
 | 
	
		
			
				|  |  | +dayjs.extend(isoWeek)
 | 
	
		
			
				|  |  | +const selectedMonth = ref('');
 | 
	
		
			
				|  |  | +const selectedWeek = ref('');
 | 
	
		
			
				|  |  | +const weekOptions = ref<{ label: string; value: string }[]>([]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  const action = `${app.api}/sys/oss/upload`;
 | 
	
		
			
				|  |  |  const headers = {token:  getToken() }
 | 
	
		
			
				|  |  |  const imageUrl = ref('');
 | 
	
	
		
			
				|  | @@ -75,15 +95,10 @@ const dataFormRef = ref();
 | 
	
		
			
				|  |  |  const dataForm = reactive({
 | 
	
		
			
				|  |  |    id: '',  inspectionType: '',  startDate: '',  endDate: '',  filePath: '',  status: '',  creator: '',  createDate: '',  updater: '',  updateDate: '',  remark: ''});
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  |  const rules = ref({
 | 
	
		
			
				|  |  |            inspectionType: [
 | 
	
		
			
				|  |  |        { required: true, message: '必填项不能为空', trigger: 'blur' }
 | 
	
		
			
				|  |  | -    ],
 | 
	
		
			
				|  |  | -          startDate: [
 | 
	
		
			
				|  |  | -      { required: true, message: '必填项不能为空', trigger: 'blur' }
 | 
	
		
			
				|  |  | -    ],
 | 
	
		
			
				|  |  | -          endDate: [
 | 
	
		
			
				|  |  | -      { required: true, message: '必填项不能为空', trigger: 'blur' }
 | 
	
		
			
				|  |  |      ],
 | 
	
		
			
				|  |  |            status: [
 | 
	
		
			
				|  |  |        { required: true, message: '必填项不能为空', trigger: 'blur' }
 | 
	
	
		
			
				|  | @@ -97,6 +112,9 @@ const init = (id?: number) => {
 | 
	
		
			
				|  |  |    // 重置表单数据
 | 
	
		
			
				|  |  |    if (dataFormRef.value) {
 | 
	
		
			
				|  |  |      dataFormRef.value.resetFields();
 | 
	
		
			
				|  |  | +    selectedMonth.value = '';
 | 
	
		
			
				|  |  | +    selectedWeek.value = '';
 | 
	
		
			
				|  |  | +    weekOptions.value = [];
 | 
	
		
			
				|  |  |      imageUrl.value = '';
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -131,6 +149,15 @@ const getInfo = (id: number) => {
 | 
	
		
			
				|  |  |      dataForm.inspectionType = dataForm.inspectionType + '';
 | 
	
		
			
				|  |  |      dataForm.status = dataForm.status + '';
 | 
	
		
			
				|  |  |      imageUrl.value = dataForm.filePath;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // if (dataForm.inspectionType === 'weekly' && dataForm.endDate) {
 | 
	
		
			
				|  |  | +    // const match = dataForm.endDate.match(/^(\d{4}-\d{2}) 第(\d+)周/);
 | 
	
		
			
				|  |  | +    // if (match) {
 | 
	
		
			
				|  |  | +    //   selectedMonth.value = match[1];
 | 
	
		
			
				|  |  | +    //   updateWeekOptions(match[1]);
 | 
	
		
			
				|  |  | +    //   selectedWeek.value = weekOptions.value[Number(match[2]) - 1]?.value || '';
 | 
	
		
			
				|  |  | +    // }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -140,10 +167,32 @@ const dataFormSubmitHandle = () => {
 | 
	
		
			
				|  |  |      if (!valid) {
 | 
	
		
			
				|  |  |        return false;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    // 判断巡检类型
 | 
	
		
			
				|  |  | +    if (dataForm.inspectionType === 'daily') {
 | 
	
		
			
				|  |  | +      if (!dataForm.startDate) {
 | 
	
		
			
				|  |  | +        return ElMessage.error('日巡检需要选择日期');
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      // 日巡检只需要 startDate
 | 
	
		
			
				|  |  | +      dataForm.startDate = dataForm.startDate ? parseTime(new Date(dataForm.startDate), '{yy}-{mm}-{dd}') : null;
 | 
	
		
			
				|  |  | +      dataForm.endDate = '';
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (dataForm.inspectionType === 'weekly') {
 | 
	
		
			
				|  |  | +      if (!selectedMonth.value || !selectedWeek.value) {
 | 
	
		
			
				|  |  | +        return ElMessage.error('周巡检需要选择月份和周次');
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // 组装格式字符串,例如 "2025-08 第5周"
 | 
	
		
			
				|  |  | +      const monthLabel = dayjs(selectedMonth.value).format('YYYY-MM');
 | 
	
		
			
				|  |  | +      const weekIndex = weekOptions.value.findIndex(item => item.value === selectedWeek.value);
 | 
	
		
			
				|  |  | +      const label = `${monthLabel} 第${weekIndex + 1}周`;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      dataForm.endDate = label;
 | 
	
		
			
				|  |  | +      dataForm.startDate = ''; 
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      if(!imageUrl.value) return ElMessage.error('请上传图片');
 | 
	
		
			
				|  |  | -    dataForm.startDate = dataForm.startDate ? parseTime(new Date(dataForm.startDate), '{yy}-{mm}-{dd} {hh}:{ii}:{ss}') : null;
 | 
	
		
			
				|  |  | -    dataForm.endDate = dataForm.endDate ? parseTime(new Date(dataForm.endDate), '{yy}-{mm}-{dd} {hh}:{ii}:{ss}') : null;
 | 
	
		
			
				|  |  |      dataForm.filePath = imageUrl.value;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      (!dataForm.id ? baseService.post : baseService.put)("/emergency/inspection", dataForm).then((res) => {
 | 
	
		
			
				|  |  |        ElMessage.success({
 | 
	
		
			
				|  |  |          message: '成功',
 | 
	
	
		
			
				|  | @@ -157,6 +206,31 @@ const dataFormSubmitHandle = () => {
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const updateWeekOptions = (val: string) => {
 | 
	
		
			
				|  |  | +  if (!val) return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const firstDay = dayjs(val + '-01');
 | 
	
		
			
				|  |  | +  const totalDays = firstDay.daysInMonth();
 | 
	
		
			
				|  |  | +  const weeks: { label: string; value: string }[] = [];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  for (let d = 1; d <= totalDays; d++) {
 | 
	
		
			
				|  |  | +    const current = dayjs(`${val}-${String(d).padStart(2, '0')}`);
 | 
	
		
			
				|  |  | +    const week = current.isoWeek();
 | 
	
		
			
				|  |  | +    const startOfWeek = current.startOf('week').format('YYYY-MM-DD');
 | 
	
		
			
				|  |  | +    const endOfWeek = current.endOf('week').format('YYYY-MM-DD');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (!weeks.some(w => w.value === String(week))) {
 | 
	
		
			
				|  |  | +      weeks.push({
 | 
	
		
			
				|  |  | +        label: `第 ${week - dayjs(`${val}-01`).startOf('month').isoWeek() + 1} 周(${startOfWeek} ~ ${endOfWeek})`,
 | 
	
		
			
				|  |  | +        value: week.toString(),
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  weekOptions.value = weeks;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  defineExpose({
 | 
	
		
			
				|  |  |    init
 | 
	
		
			
				|  |  |  });
 |