沈丘营商办后台前端项目
王恒
2025-08-29 d96ac2eaf4129698c49d31050009b524c7a0e38d
'新增综合查一次'
1个文件已添加
2个文件已修改
737 ■■■■■ 已修改文件
src/api/system/comprehensive.ts 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/arrayUtil.ts 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/comprehensive/index.vue 669 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/comprehensive.ts
@@ -9,7 +9,7 @@
  });
}
// 查询综合查一次详细
// 查询综合查一次详细d
export function getOrder(id: any) {
  return request({
    url: "/comprehensive/enforce/order/" + id,
@@ -20,7 +20,7 @@
// 新增综合查一次
export function addOrder(data: any) {
  return request({
    url: "/system/order",
    url: "/comprehensive/enforce/order/batchAdd",
    method: "post",
    data: data,
  });
@@ -29,8 +29,8 @@
// 修改综合查一次
export function updateOrder(data: any) {
  return request({
    url: "/system/order",
    method: "put",
    url: "/comprehensive/enforce/order/upd",
    method: "post",
    data: data,
  });
}
@@ -38,7 +38,7 @@
// 删除综合查一次
export function delOrder(id: any) {
  return request({
    url: "/system/order/" + id,
    url: "/comprehensive/enforce/order/" + id,
    method: "delete",
  });
}
src/utils/arrayUtil.ts
New file
@@ -0,0 +1,58 @@
/**
 * 根据对象内两个数组的笛卡尔积生成新数组
 * @param form 原始对象
 * @param array1Key 第一个数组的键名
 * @param array2Key 第二个数组的键名
 * @param keysFromArray2 需要从第二个数组元素中获取值的键名数组
 * @returns 生成的新数组
 */
export function generateCartesianArray(form: any, array1Key: string, array2Key: string, keysFromArray2: string[]): any[] {
  const result: any[] = [];
  const array1 = form[array1Key] || [];
  const array2 = form[array2Key] || [];
  // 遍历第一个数组
  for (const item1 of array1) {
    // 遍历第二个数组
    for (const item2 of array2) {
      // 创建一个包含原对象所有属性的新对象
      const newObj = { ...form };
      // 设置第一个数组对应的属性
      newObj[array1Key] = item1;
      // 设置第二个数组对应的属性
      newObj[array2Key] = item2;
      // 设置需要从第二个数组元素中获取值的属性
      if (typeof item2 === 'object') {
        keysFromArray2.forEach(key => {
          if (key in item2) {
            newObj[key] = item2[key];
          }
        });
      }
      result.push(newObj);
    }
  }
  return result;
}
/**
 * 处理检查计划数据,根据planMonth和checkdIds生成笛卡尔积数组
 * @param form 检查计划表单数据
 * @returns 生成的新数组
 */
export function processCheckPlanForm(form: any): any[] {
  // 确保form对象存在并且两个数组有效
  if (!form || !Array.isArray(form.planMonth) || !Array.isArray(form.checkdIds)) {
    return [];
  }
  // 需要从checkdIds数组元素中获取值的属性
  const keysFromCheckdIds = ['checkdIds', 'companyName', 'companyCode', 'applyDeptNames'];
  return generateCartesianArray(form, 'planMonth', 'checkdIds', keysFromCheckdIds);
}
src/views/system/comprehensive/index.vue
@@ -18,17 +18,6 @@
          @keyup.enter="handleQuery"
        />
      </el-form-item>
      <el-form-item label="制定机构">
        <el-tree-select
          v-model="queryParams.applyOrgId"
          :data="deptOptions"
          :props="{ value: 'id', label: 'label', children: 'children' }"
          value-key="id"
          placeholder="请选择制定计划的机构"
          check-strictly
          style="width: 200px"
        />
      </el-form-item>
      <el-form-item label="执法时间" style="width: 290px">
        <el-date-picker
          v-model="dateRange"
@@ -111,21 +100,6 @@
        label="统一社会信用代码"
        width="180"
      ></el-table-column>
       <el-table-column
        prop="enforceContent"
        label="检查内容"
        width="180"
      ></el-table-column>
      <el-table-column
        prop="applyDeptNames"
        label="执行科室"
        width="180"
      ></el-table-column>
      <el-table-column prop="enforceType" label="检查方式" width="180">
        <template #default="scope">{{
          methodToText(scope.row.enforceType)
        }}</template>
      </el-table-column>
      <el-table-column prop="planFrequency" label="计划频次" width="180">
        <template #default="scope">{{ frequencyToText(scope.row) }} </template>
      </el-table-column>
@@ -135,9 +109,9 @@
        width="180"
      ></el-table-column>
      <el-table-column prop="orderStatus" label="状态" width="180">
        <!-- <template #default="scope">{{
          statusToText(scope.row.checkStatus)
        }}</template> -->
        <template #default="scope">{{
          statusToText(scope.row.status)
        }}</template>
      </el-table-column>
      <el-table-column
        label="操作"
@@ -147,11 +121,11 @@
        width="180"
      >
        <template #default="scope">
          <el-link type="info" @click="handleView(scope.row)">查看</el-link>
          <el-link type="info" @click="handleView(scope.row.id)">查看</el-link>
          <el-divider direction="vertical" />
          <el-link type="primary" @click="handleAdd(scope.row)">编辑</el-link>
          <el-divider direction="vertical" />
          <el-link type="error" @click="handleDelete(scope.row)">删除</el-link>
          <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
        </template>
      </el-table-column>
    </el-table>
@@ -172,57 +146,37 @@
      append-to-body
    >
      <el-form ref="deptRef" :model="form" :rules="rules" label-width="140px">
        <div class="sub-title">基本信息</div>
        <el-row :gutter="20">
          <el-col :span="24">
          <el-col :span="12">
            <el-form-item label="计划名称" prop="enforceReason">
              <el-input
                :disabled="form.id"
                v-model="form.enforceReason"
                placeholder="请输入计划名称"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="制定计划的机构" prop="applyOrgId">
            <el-form-item label="牵头单位" prop="leadUnitId">
              <el-tree-select
                v-model="form.applyOrgId"
                :disabled="form.id"
                v-model="form.leadUnitId"
                :data="deptOptions"
                :props="{ value: 'id', label: 'label', children: 'children' }"
                value-key="id"
                placeholder="请选择制定计划的机构"
                placeholder="请选择牵头单位"
                check-strictly
                :default-expanded-keys="[form.applyOrgId]"
                :default-checked-keys="[form.applyOrgId]"
                :default-expanded-keys="[form.leadUnitId]"
                :default-checked-keys="[form.leadUnitId]"
                @node-click="changeTreeHandler"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="执行科室" prop="applyDeptIds">
              <el-select
                v-model="selectOffices"
                multiple
                collapse-tags
                collapse-tags-tooltip
                :max-collapse-tags="1"
                placeholder="请选择执行科室"
                style="width: 100%"
                @change="handleSelectOffices"
              >
                <el-option
                  v-for="(obj, index) in officeList"
                  :key="index"
                  :label="obj.deptName"
                  :value="obj.deptId"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20" v-if="!form.orderId">
        <el-row :gutter="20" v-if="!form.id">
          <el-col :span="24">
            <el-form-item label="被检查的对象" prop="checkdIds">
            <el-form-item label="被检对象" prop="checkdIds">
              <el-button type="primary" @click="openFirmSelect"
                >选择企业</el-button
              >
@@ -253,10 +207,10 @@
        </el-row>
        <el-row :gutter="20" v-if="form.checkdIds">
          <el-col :span="24">
            <el-form-item label="被检查对象信息">
            <el-form-item label="被检对象信息">
              <el-table
                :data="checkedList"
                max-height="200px"
                max-height="100px"
                style="width: 100%"
              >
                <el-table-column prop="companyName" label="企业名称" />
@@ -267,10 +221,50 @@
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="检查方式" prop="enforceType">
            <el-form-item label="检查频次" prop="planFrequency">
              <el-input
                v-model="form.planFrequency"
                :disabled="form.id"
                placeholder="请输入频次"
              >
                <template #append>
                  <el-select
                    :disabled="form.id"
                    v-model="form.planFrequencyUnit"
                    placeholder="单位"
                    style="width: 80px"
                  >
                    <el-option
                      v-for="(obj, index) in frequency"
                      :key="index"
                      :label="obj.label"
                      :value="obj.value"
                    />
                  </el-select> </template
              ></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划时间" prop="planMonth">
              <el-date-picker
                :disabled="form.id"
                v-model="selectMonth"
                type="months"
                format="YYYY-MM"
                value-format="YYYY-MM"
                placeholder="请选择计划时间"
                @change="changeMonth"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="检查类型" prop="enforceType">
              <el-select
                :disabled="form.id"
                v-model="form.enforceType"
                placeholder="请选择检查方式"
                placeholder="请选择检查类型"
                style="width: 100%"
              >
                <el-option
@@ -282,66 +276,114 @@
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="所属行业" prop="industry">
              <el-select
                v-model="form.industry"
                placeholder="请选择所属行业"
                style="width: 100%"
              >
                <el-option
                  v-for="(obj, index) in industry_type"
                  :key="index"
                  :label="obj.label"
                  :value="obj.key"
        </el-row>
        <div class="sub-title">
          <div class="title-word">主体信息</div>
          <div class="add-btn">
            <el-button type="primary" @click="addMainList">新增</el-button>
          </div>
        </div>
        <el-row :gutter="20">
          <el-table :data="mainList" max-height="200px" style="width: 100%">
            <el-table-column prop="applyOrgId" align="center" label="检查单位">
              <template #default="scope">
                <div v-if="!scope.row.isEdit">{{ scope.row.applyOrgName }}</div>
                <el-tree-select
                  v-else
                  v-model="scope.row.applyOrgId"
                  :data="deptOptions"
                  :props="{ value: 'id', label: 'label', children: 'children' }"
                  value-key="id"
                  placeholder="请选择制定计划的机构"
                  check-strictly
                  :default-expanded-keys="[scope.row.applyOrgId]"
                  :default-checked-keys="[scope.row.applyOrgId]"
                  @node-click="
                    (data, node, item) =>
                      changeMainTreeHandler(data, node, item, scope.$index)
                  "
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="检查内容" prop="enforceContent">
              <el-input
                v-model="form.enforceContent"
                type="textarea"
                placeholder="请输入检查内容"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="计划频次" prop="planFrequency">
              <el-input v-model="form.planFrequency" placeholder="请输入频次">
                <template #append>
                  <el-select
                    v-model="form.planFrequencyUnit"
                    placeholder="单位"
                    style="width: 80px"
                  >
                    <el-option
                      v-for="(obj, index) in frequency"
                      :key="index"
                      :label="obj.label"
                      :value="obj.key"
                    />
                  </el-select> </template
              ></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划月份" prop="planMonth">
              <el-date-picker
                v-model="selectMonth"
                type="months"
                format="YYYY-MM"
                value-format="YYYY-MM"
                placeholder="请选择计划月份"
                @change="changeMonth"
              />
            </el-form-item>
          </el-col>
              </template>
            </el-table-column>
            <el-table-column
              prop="applyDeptNames"
              align="center"
              label="执行科室"
            >
              <template #default="scope">
                <div v-if="!scope.row.isEdit">
                  {{ scope.row.applyDeptNames }}
                </div>
                <el-select
                  v-else
                  v-model="scope.row.selectList"
                  multiple
                  collapse-tags
                  collapse-tags-tooltip
                  :max-collapse-tags="1"
                  placeholder="请选择执行科室"
                  style="width: 100%"
                  @change="
                    (value) => {
                      handleSelectOffices(value, scope.$index);
                    }
                  "
                >
                  <el-option
                    v-for="(obj, index) in scope.row.officeList"
                    :key="index"
                    :label="obj.deptName"
                    :value="obj.deptId"
                  />
                </el-select>
              </template>
            </el-table-column>
            <el-table-column
              prop="enforceContent"
              show-overflow-tooltip
              label="检查内容"
              align="center"
            >
              <template #default="scope">
                <div v-if="!scope.row.isEdit">
                  {{ scope.row.enforceContent }}
                </div>
                <el-input
                  v-else
                  type="textarea"
                  :rows="1"
                  v-model="scope.row.enforceContent"
                  placeholder="请输入检查内容"
                />
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="100">
              <template #default="scope">
                <el-link
                  style="margin-right: 10px"
                  type="primary"
                  v-if="scope.row.isEdit"
                  @click="saveRowInfo(scope.row, scope.$index)"
                  >保存</el-link
                >
                <el-link
                  style="margin-right: 10px"
                  type="primary"
                  v-else
                  @click="editMainList(scope.row, scope.$index)"
                  >编辑</el-link
                >
                <el-link
                  style="margin-right: 10px"
                  type="danger"
                  @click="delRowInfo(scope.$index)"
                  >删除</el-link
                >
              </template>
            </el-table-column>
          </el-table>
        </el-row>
      </el-form>
      <template #footer>
@@ -402,20 +444,21 @@
    <!-- 计划详细 -->
    <el-dialog title="计划详情" v-model="planOpen" width="700px" append-to-body>
      <el-form label-width="140px">
        <div class="sub-title">基本信息</div>
        <el-row>
          <el-col :span="12">
            <el-form-item label="计划编号:">{{
              planDetail.orderNo
              planDetail.planNo
            }}</el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划名称:">{{
            <el-form-item label="检查计划名称:">{{
              planDetail.enforceReason
            }}</el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="制定计划的机构:">{{
              planDetail.applyOrgName
            <el-form-item label="牵头单位:">{{
              planDetail.leadUnitName
            }}</el-form-item>
          </el-col>
          <el-col :span="12">
@@ -429,19 +472,9 @@
            }}</el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="检查方式:">{{
              methodToText(planDetail.enforceType)
            }}</el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="执行科室:">{{
              planDetail.applyDeptNames
            }}</el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="检查内容:">{{
              planDetail.enforceContent
            }}</el-form-item>
            <el-form-item label="计划频次:">
              {{ frequencyToText(planDetail) }}
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划月份:">{{
@@ -449,15 +482,40 @@
            }}</el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="计划频次:">
              {{ frequencyToText(planDetail) }}
            <el-form-item label="检查类型:">
              {{ methodToText(planDetail.enforceType) }}
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <!-- <el-form-item label="状态:">{{
              statusToText(planDetail.checkStatus)
            }}</el-form-item> -->
            <el-form-item label="状态:">
              {{ statusToText(planDetail.status) }}
            </el-form-item>
          </el-col>
        </el-row>
        <div class="sub-title">主体信息</div>
        <el-row>
          <el-table
            :data="planDetailList"
            max-height="200px"
            style="width: 100%"
          >
            <el-table-column
              prop="applyOrgName"
              align="center"
              label="检查单位"
            />
            <el-table-column
              prop="applyDeptNames"
              align="center"
              label="执行科室"
            />
            <el-table-column
              align="center"
              prop="enforceContent"
              show-overflow-tooltip
              label="检查内容"
            />
          </el-table>
        </el-row>
      </el-form>
      <template #footer>
@@ -466,6 +524,7 @@
            @click="
              planOpen = false;
              planDetail = {};
              planDetailList = [];
            "
            >关 闭</el-button
          >
@@ -543,24 +602,22 @@
import { getToken } from "@/utils/auth";
import {
  listOrder,
  // addManage,
  // getManage,
  // updateManage,
  // delManage,
  getOrder,
  delOrder,
  addOrder,
  updateOrder,
  exportTemplate,
  // exportManage,
  // getOrgId,
} from "@/api/system/comprehensive";
import { listCompany } from "@/api/system/company/company";
import { deptTreeSelect } from "@/api/system/user";
import { listDept } from "@/api/system/dept";
// import { download } from '@/utils/request'; // 下载文件
import { download as downloadHttp } from "@/utils/request";
import { generateCartesianArray } from "@/utils/arrayUtil";
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const { frequency, industry_type, enforce_type } = proxy.useDictPer(
const { frequency, enforce_type } = proxy.useDictPer(
  "frequency",
  "industry_type",
  "enforce_type"
);
@@ -581,6 +638,8 @@
const refreshTable = ref(true);
const planOpen = ref(false);
const planDetail = ref({});
const planDetailList = ref([]);
const mainList = ref([]);
const dateRange = ref([]);
const selectOpen = ref(false);
const firmList = ref([]);
@@ -592,36 +651,32 @@
const data = reactive({
  form: {
    enforceReason: "", // 计划名称
    applyOrgId: "", // 制定机构id
    applyOrgName: "", // 制定机构
    applyDeptIds: "", // 执行科室
    applyDeptNames: "", // 执行科室名称
    companyName: "", // 被检查对象
    companyId: "", // 被检查对象id
    leadUnitId: "", // 制定机构id
    leadUnitName: "", // 制定机构
    checkdIds: "", // 被检查对象id
    companyName: "", // 被检查对象名称
    companyCode: "", // 统一社会信用代码
    industry: "", // 所属行业
    enforceType: "", // 检查方式
    enforceContent: "", // 检查内容
    planFrequency: "", // 计划频次
    planFrequencyUnit: "1", // 计划频次单位
    planFrequencyUnit: 119, // 计划频次单位
    planMonth: "", // 计划月份
  },
  queryParams: {
    companyName: "",
    enforceReason: "",
    applyOrgId: "",
    leadUnitId: "",
    planMonthStart: "", // 计划开始月份
    planMonthEnd: "", // 计划结束月份
    pageNum: 1,
    pageSize: 10,
  },
  rules: {
    orderNo: [{ required: true, message: "计划编号不能为空", trigger: "blur" }],
    planNo: [{ required: true, message: "计划编号不能为空", trigger: "blur" }],
    enforceReason: [
      { required: true, message: "计划名称不能为空", trigger: "blur" },
    ],
    applyOrgId: [
      { required: true, message: "制定计划的机构不能为空", trigger: "blur" },
    leadUnitId: [
      { required: true, message: "牵头单位不能为空", trigger: "blur" },
    ],
    checkdIds: [
      { required: true, message: "被检查对象不能为空", trigger: "blur" },
@@ -631,15 +686,6 @@
    ],
    companyCode: [
      { required: true, message: "统一社会信用代码不能为空", trigger: "blur" },
    ],
    industry: [
      { required: true, message: "所属行业不能为空", trigger: "blur" },
    ],
    enforceContent: [
      { required: true, message: "检查内容不能为空", trigger: "blur" },
    ],
    applyDeptIds: [
      { required: true, message: "执行科室不能为空", trigger: "blur" },
    ],
    planFrequency: [
      { required: true, message: "计划频次不能为空", trigger: "blur" },
@@ -662,13 +708,13 @@
});
// 获取科室列表
const getOfficeList = () => {
const getOfficeList = (orgId, index) => {
  listDept({
    pageNum: 1,
    pageSize: 1000,
    parentId: form.value.applyOrgId,
    parentId: orgId,
  }).then((response) => {
    officeList.value = response.data;
    mainList.value[index].officeList = response.data;
  });
};
@@ -682,26 +728,35 @@
  form.value.planMonth = value.join(",");
};
// 机构选择
// 牵头单位选择
const changeTreeHandler = (e) => {
  form.value.applyOrgId = e.id;
  form.value.applyOrgName = e.label;
  form.value.leadUnitId = e.id;
  form.value.leadUnitName = e.label;
  selectOffices.value = [];
  form.value.applyDeptIds = "";
  form.value.applyDeptNames = "";
  if (e.id) {
    getOfficeList();
};
// 检查单位选择
const changeMainTreeHandler = (data, item, node, index) => {
  mainList.value[index].applyOrgId = data.id;
  mainList.value[index].applyOrgName = data.label;
  mainList.value[index].applyDeptIds = "";
  mainList.value[index].applyDeptNames = "";
  mainList.value[index].selectList = [];
  mainList.value[index].officeList = [];
  if (data.id) {
    getOfficeList(data.id, index);
  }
};
// 科室选择
const handleSelectOffices = (value) => {
  form.value.applyDeptNames = value
const handleSelectOffices = (value, index) => {
  mainList.value[index].applyDeptIds = value.join(",");
  mainList.value[index].applyDeptNames = value
    .map((item) => {
      return officeList.value.find((obj) => obj.deptId === item).deptName;
      return mainList.value[index].officeList.find((obj) => obj.deptId === item)
        .deptName;
    })
    .join(",");
  form.value.applyDeptIds = value.join(",");
};
/*** 计划导入参数 */
@@ -717,7 +772,9 @@
  // 设置上传的请求头部
  headers: { Authorization: "Bearer " + getToken() },
  // 上传的地址
  url: import.meta.env.VITE_APP_BASE_API + "/comprehensive/enforce/order/importData",
  url:
    import.meta.env.VITE_APP_BASE_API +
    "/comprehensive/enforce/order/importData",
});
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
@@ -773,21 +830,17 @@
function reset() {
  form.value = {
    enforceReason: "", // 计划名称
    applyOrgId: "", // 制定机构id
    applyOrgName: "", // 制定机构
    applyDeptIds: "", // 执行科室id
    applyDeptNames: "", // 执行科室名称
    leadUnitId: "", // 制定机构id
    leadUnitName: "", // 制定机构
    checkdIds: "", // 被检查对象id
    companyName: "", // 被检查对象名称
    companyCode: "", // 统一社会信用代码
    enforceType: "", // 检查方式
    industry: "", // 所属行业
    enforceContent: "", // 检查内容
    planFrequency: "", // 计划频次
    planFrequencyUnit: "1", // 计划频次单位
    planFrequencyUnit: 119, // 计划频次单位
    planMonth: "", // 计划月份
    orderType: 1,
  };
  mainList.value = [];
  selectOffices.value = [];
  selectMonth.value = [];
  checkedList.value = [];
@@ -813,7 +866,7 @@
    orderType: 1,
    companyName: "",
    enforceReason: "",
    applyOrgId: "",
    leadUnitId: "",
    planMonthStart: "", // 计划开始月份
    planMonthEnd: "", // 计划结束月份
    pageNum: 1,
@@ -823,66 +876,187 @@
  handleQuery();
}
function getDetails(id) {
  getManage(id).then((response) => {
    form.value = JSON.parse(JSON.stringify(response.data));
    form.value.planFrequencyUnit = form.value.planFrequencyUnit.toString();
  getOrder(id).then((response) => {
    form.value = JSON.parse(JSON.stringify(response.data.info));
    const list = JSON.parse(JSON.stringify(response.data.list));
    mainList.value = list.map((obj) => {
      return {
        ...obj,
        selectList: [],
        officeList: [],
        isEdit: false,
      };
    });
    form.value.planFrequencyUnit = Number(form.value.planFrequencyUnit);
    form.value.enforceType = Number(form.value.enforceType);
    form.value.leadUnitId = Number(form.value.leadUnitId);
    selectMonth.value = form.value.planMonth.split(",");
    selectOffices.value = form.value.applyDeptIds
      .split(",")
      .map((item) => Number(item));
    getOfficeList();
    open.value = true;
  });
}
/** 详细按钮操作 */
function handleView(row) {
  planOpen.value = true;
  planDetail.value = row;
  planOpen.value = true;
/** 详情按钮操作 */
function handleView(id) {
  getOrder(id).then((response) => {
    console.log(response);
    planDetail.value = response.data.info;
    planDetailList.value = response.data.list;
    planOpen.value = true;
  });
}
/** 新增按钮操作 */
function handleAdd(row) {
  if (row) {
    title.value = "编辑计划";
    getDetails(row.orderId);
    getDetails(row.id);
  } else {
    title.value = "添加计划";
    open.value = true;
    getUserOrgId();
    mainList.value = [
      {
        applyOrgId: "",
        applyOrgName: "",
        applyDeptIds: "",
        applyDeptNames: "",
        enforceContent: "",
        selectList: [],
        officeList: [],
        isEdit: true,
      },
    ];
    console.log(mainList.value);
  }
  getFirmList();
}
// 新增主体内容
function addMainList() {
  if (mainList.value.length) {
    const lastObj = JSON.parse(
      JSON.stringify(mainList.value[mainList.value.length - 1])
    );
    if (lastObj.isEdit) {
      return proxy.$modal.msgError("请先保存当前信息");
    } else {
      delete lastObj.isEdit;
      const checkList = [
        "applyOrgId",
        "applyOrgName",
        "applyDeptIds",
        "applyDeptNames",
        "enforceContent",
      ];
      console.log(lastObj);
      const check = checkList.every((key) => Boolean(lastObj[key]));
      if (!check) return proxy.$modal.msgError("请完善当前信息");
    }
  }
  mainList.value.push({
    applyOrgId: "",
    applyOrgName: "",
    applyDeptIds: "",
    applyDeptNames: "",
    enforceContent: "",
    selectList: [],
    officeList: [],
    isEdit: true,
  });
}
// 编辑行信息
function editMainList(row, index) {
  if (!form.value.id) {
    mainList.value[index].isEdit = true;
  } else {
    if (row.orderStatus > 2) return proxy.$modal.msgError("已执法不能编辑");
    mainList.value[index].selectList = row.applyDeptIds
      .split(",")
      .map((item) => Number(item));
    getOfficeList(row.applyOrgId, index);
    mainList.value[index].isEdit = true;
  }
}
// 保存行信息
function saveRowInfo(row, index) {
  const rowInfo = JSON.parse(JSON.stringify(row));
  console.log(rowInfo);
  delete rowInfo.isEdit;
  const checkList = [
    "applyOrgId",
    "applyOrgName",
    "applyDeptIds",
    "applyDeptNames",
    "enforceContent",
  ];
  const check = checkList.every((key) => Boolean(rowInfo[key]));
  if (!check) return proxy.$modal.msgError("请完善当前信息");
  mainList.value[index].isEdit = false;
}
// 删除行信息
function delRowInfo(index) {
  console.log(mainList.value, index);
  mainList.value.splice(index, 1);
}
/** 提交按钮 */
function submitForm() {
  proxy.$refs["deptRef"].validate((valid) => {
    if (valid) {
      if (form.value.orderId != undefined) {
        updateManage(form.value).then((response) => {
      if (form.value.id) {
        if (mainList.value.some((obj) => obj.isEdit)) {
          proxy.$modal.msgError("请完善主体信息");
          return;
        }
        updateOrder({
          info: form.value,
          list: mainList.value,
        }).then((response) => {
          proxy.$modal.msgSuccess("修改成功");
          open.value = false;
          getList();
          reset();
        });
      } else {
        checkedList.value.forEach((item, index) => {
          const submitForm = { ...form.value };
          submitForm.companyId = item.companyId;
          submitForm.companyName = item.companyName;
          submitForm.companyCode = item.companyCode;
          addManage(submitForm).then((response) => {
            if (index === checkedList.value.length - 1) {
              proxy.$modal.msgSuccess("新增成功");
              open.value = false;
              getList();
              reset();
            }
        if (mainList.value.some((obj) => obj.isEdit)) {
          proxy.$modal.msgError("请完善主体信息");
          return;
        }
        // 准备提交数据:根据checkdIds和planMonth生成笛卡尔积数组
        const submitDataArray = [];
        // 遍历每个选中的企业
        for (const company of checkedList.value) {
          // 遍历每个选中的月份
          for (const month of selectMonth.value) {
            // 创建包含当前企业和月份信息的表单数据
            const companyForm = {
              ...JSON.parse(JSON.stringify(form.value)),
              companyId: company.companyId,
              companyName: company.companyName,
              companyCode: company.companyCode,
              planMonth: month,
              checkdIds: company.companyId,
            };
            // 为每个企业-月份组合生成对应的mainList数据
            const formData = companyForm;
            submitDataArray.push(formData);
          }
        }
        addOrder({
          companyList: submitDataArray,
          orgList: mainList.value,
        })
          .then((response) => {
            proxy.$modal.msgSuccess("新增成功");
            open.value = false;
            getList();
            reset();
          })
          .catch(() => {
            proxy.$modal.msgError("新增失败");
          });
        });
      }
    }
  });
@@ -892,7 +1066,7 @@
  proxy.$modal
    .confirm("是否确认删除该数据?")
    .then(function () {
      return delManage(row.orderId);
      return delOrder(row.id);
    })
    .then(() => {
      getList();
@@ -966,7 +1140,6 @@
}
function frequencyToText(data) {
  console.log(data.planFrequencyUnit);
  if (!data.planFrequencyUnit) {
    return "";
  }
@@ -978,21 +1151,6 @@
function statusToText(status) {
  return statusOptions.value.find((item) => item.value == status).label;
}
function getUserOrgId() {
  getOrgId().then((response) => {
    form.value.applyOrgId = Number(response.data.orgId) || "";
    form.value.applyDeptIds = response.data.deptId || "";
    if (form.value.applyDeptIds) {
      selectOffices.value = form.value.applyDeptIds
        .split(",")
        .map((item) => Number(item));
    }
    if (form.value.applyOrgId) {
      getOfficeList();
    }
  });
}
getList();
@@ -1014,4 +1172,19 @@
    }
  }
}
.sub-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 10px;
  // height: 40px;
  // line-height: 40px;
  font-size: 16px;
  font-weight: 700;
  color: #999;
  background-color: #ebf5ff;
  box-sizing: border-box;
  margin-bottom: 10px;
}
</style>