-
zhangwei
2025-08-25 23a2fff92f73b9759849a8016601a6817d7470b1
-
13个文件已修改
1个文件已删除
409 ■■■■ 已修改文件
src/api/item/index.ts 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/util.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ReUploadZ/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/aboutItem/form.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/component/pdfPreview.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/component/四川招标投标交易服务平台用户操作手册(代理机构).pdf 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/detail.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/form.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/index.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/uploadform.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/utils/detail.tsx 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/utils/hook.tsx 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/utils/types.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite.config.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/item/index.ts
@@ -110,6 +110,21 @@
  });
};
// æ‹›æ ‡ä»£ç†åˆ†é¡µæŸ¥è¯¢éžæ”¿åºœè®¢å•处理
export const findWechatOpenId = (data?: object) => {
  return http.request<PageResult>("post", baseUrlApi(""), {
    data
  });
};
// é‡‡è´­ä»£ç†äººå¢žåŠ éžæ”¿åºœè®¢å•å¤„ç†èŽ·å–è”ç³»æ–¹å¼
export const addgetcontact = () => {
  return http.request<Result>(
    "post",
    baseUrlApi("/api/tenderOrder/addgetcontact")
  );
};
// é‡‡è´­ä»£ç†äººå¢žåŠ éžæ”¿åºœè®¢å•å¤„ç†
export const caigourenAdd = (data?: object) => {
  return http.request<Result>("post", baseUrlApi("/api/tenderOrder/add"), {
@@ -117,6 +132,17 @@
  });
};
// é‡‡è´­ä»£ç†äººå¢žåŠ éžæ”¿åºœè®¢å•å¤„ç†
export const updateTittle = (data?: object) => {
  return http.request<Result>(
    "post",
    baseUrlApi("/api/tenderOrder/updateTittle"),
    {
      data
    }
  );
};
// é‡‡è´­ä»£ç†äººæ›´æ–°éžæ”¿åºœè®¢å•处理
export const caigourenUpdate = (data?: object) => {
  return http.request<Result>("post", baseUrlApi("/api/tenderOrder/update"), {
src/api/util.ts
@@ -2,7 +2,8 @@
export const baseUrlApi = (url: string) =>
  process.env.NODE_ENV === "development"
    ? `/api${url}`
    : `192.168.18.52:5005${url}`;
    : `192.168.18.15:5005${url}`;
// : `192.168.18.52:5005${url}`;
export const uploadUrlApi = (url: string) =>
  process.env.NODE_ENV === "development"
    ? `/oss${url}`
src/components/ReUploadZ/index.vue
@@ -64,6 +64,7 @@
        newFormInline.value.biangengwenjian = path;
      } else {
        newFormInline.value.zhaobiaowenjian = path;
        newFormInline.value.ZhaobiaowenjianName = file.name;
      }
    });
  }
src/views/system/aboutItem/form.vue
@@ -21,7 +21,7 @@
    baomingfei: null, // æŠ¥åè´¹ï¼ˆå¯é€‰ï¼‰
    toubiaobaozhengjin: null, // æŠ•标保证金(可选)
    lianhetitoubiao: null, // è”合体投标(可选)
    kaibiaofangshi: null, // å¼€æ ‡æ–¹å¼ï¼ˆå¯é€‰ï¼‰
    kaibiaofangshi: "纸质标", // å¼€æ ‡æ–¹å¼ï¼ˆå¯é€‰ï¼‰
    shifoufenbao: "false", // æ˜¯å¦åˆ†åŒ…(可选)
    shifoutuisongxuanchuan: "true", // æ˜¯å¦æŽ¨é€å®£ä¼ ï¼ˆå¯é€‰ï¼‰
    caigourenmingcheng: null, // é‡‡è´­äººåç§°ï¼ˆå¯é€‰ï¼‰
src/views/system/component/pdfPreview.vue
@@ -15,8 +15,13 @@
</template>
<script setup lang="ts">
import { ref } from "vue";
import pdfSrc from "./四川招标投标交易服务平台用户操作手册(代理机构).pdf";
import { ref, defineProps } from "vue";
defineProps({
  pdfSrc: {
    type: String,
    default: ""
  }
});
let isLoading = ref(true);
const iframeLoaded = () => {
  console.log("jjjjjj");
src/views/system/component/ËÄ´¨ÕбêͶ±ê½»Ò×·þÎñƽ̨Óû§²Ù×÷Êֲᣨ´úÀí»ú¹¹£©.pdf
Binary files differ
src/views/system/dept/detail.vue
@@ -1,11 +1,13 @@
<script setup lang="tsx">
import { ref, reactive, onMounted, computed, PropType } from "vue";
import { ref, reactive, onMounted, computed, PropType, h } from "vue";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { useDept } from "./utils/hook";
import { useDetail } from "./utils/detail";
import { getTenderOrderDetail } from "@/api/item/index";
const isLoading = ref(false);
import { addDialog } from "@/components/ReDialog";
import pdfPreview from "@/views/system/component/pdfPreview.vue";
import { deviceDetection } from "@pureadmin/utils";
interface Emits {
  (e: "backListPage"): void;
}
@@ -17,7 +19,7 @@
import IconParkSolidBack from "~icons/icon-park-solid/back";
const { openDialog } = useDept(ref({}));
const { openUploadDialog, state } = useDetail();
const { openUploadDialog, state, changeDialog } = useDetail();
defineOptions({
  name: "itemdetail"
});
@@ -30,27 +32,16 @@
};
const previewPdf = pdfUrl => {
  addDialog({
    width: "80%",
    title: "确认信息",
    contentRenderer: () => (
      <iframe
        type="application/pdf"
        src={pdfUrl}
        width="800"
        height="600"
      ></iframe>
    ), // jsx è¯­æ³• ï¼ˆæ³¨æ„åœ¨.vue文件启用jsx语法,需要在script开启lang="tsx")
    closeCallBack: ({ options, args }) => {
      // options.props æ˜¯å“åº”式的
      // const { formInline } = options.props as FormProps;
      // const text = `姓名:${formInline.user} åŸŽå¸‚:${formInline.region}`;
      if (args?.command === "cancel") {
        // æ‚¨ç‚¹å‡»äº†å–消按钮
        // active.value -= 1;
      } else if (args?.command === "sure") {
      } else {
      }
    }
    title: `预览pdf`,
    props: {},
    width: "60%",
    draggable: true,
    fullscreen: deviceDetection(),
    fullscreenIcon: true,
    sureBtnLoading: true,
    closeOnClickModal: false,
    contentRenderer: () => h(pdfPreview, { pdfSrc: pdfUrl })
    // jsx è¯­æ³• ï¼ˆæ³¨æ„åœ¨.vue文件启用jsx语法,需要在script开启lang="tsx")
  });
};
</script>
@@ -80,7 +71,12 @@
        </div>
      </template>
      <div>
        <el-descriptions class="margin-top" :column="3" border>
        <el-descriptions
          class="margin-top"
          :column="3"
          border
          label-width="120"
        >
          <el-descriptions-item label="项目编号">
            {{ state.nowInfo.projectCode }}
          </el-descriptions-item>
@@ -93,9 +89,9 @@
          <el-descriptions-item label="联合体投标">
            {{ state.nowInfo.lianhetitoubiao }}
          </el-descriptions-item>
          <!-- <el-descriptions-item label="Remarks">
          <el-descriptions-item label="开标方式">
            {{ state.nowInfo.kaibiaofangshi }}
          </el-descriptions-item>
          <el-descriptions-item label="Address" /> -->
        </el-descriptions>
      </div>
    </el-card>
@@ -114,11 +110,18 @@
              <div>
                <el-form label-width="auto" style="max-width: 1000px">
                  <el-form-item label="项目信息:">
                    æŠ•标报名开始时间:
                    {{ state.nowInfo.toubiaoStartDate ?? "暂无" }}
                    <span class="mr-4">
                      æŠ•标报名开始时间:{{
                        state.nowInfo.toubiaoStartDate ?? "暂无"
                      }}
                    </span>
                    <span class="mr-4">
                    æŠ•标报名截止时间:
                    {{ state.nowInfo.toubiaoEndDate }}
                    å¼€æ ‡æ—¶é—´ï¼š{{ state.nowInfo.kaibiaoDate }}
                      {{ state.nowInfo.toubiaoEndDate ?? "暂无" }}
                    </span>
                    <span class="mr-4">
                      å¼€æ ‡æ—¶é—´ï¼š{{ state.nowInfo.kaibiaoDate ?? "暂无" }}
                    </span>
                  </el-form-item>
                  <el-form-item label="上传公告:">
                    <el-button
@@ -126,7 +129,7 @@
                      type="primary"
                      plain
                      size="small"
                      @click="openUploadDialog('上传')"
                      @click="openUploadDialog('上传', state.nowInfo)"
                    >
                      ä¸Šä¼ å…¬å‘Š
                    </el-button>
@@ -152,7 +155,23 @@
                      >
                        ç‚¹å‡»é¢„览
                      </el-button>
                      <el-button type="primary" plain size="small">
                      <el-button
                        v-if="state.nowInfo?.changeOrder"
                        type="primary"
                        plain
                        size="small"
                        @click="
                          previewPdf(state.nowInfo.changeOrder.biangengwenjian)
                        "
                      >
                        ç‚¹å‡»é¢„览变更公告
                      </el-button>
                      <el-button
                        type="primary"
                        plain
                        size="small"
                        @click="changeDialog('上传变更', state.nowInfo)"
                      >
                        ä¿®æ”¹æ ‡é¢˜
                      </el-button>
                    </div>
src/views/system/dept/form.vue
@@ -8,7 +8,7 @@
import { Operation } from "@element-plus/icons-vue";
import { getCaigoufangshiList } from "@/api/item/index";
const { state } = useDept(ref({}));
const { state, nowRole } = useDept(ref({}));
const props = withDefaults(defineProps<FormProps>(), {
  formInline: () => ({
    id: "",
@@ -22,7 +22,7 @@
    baomingfei: null, // æŠ¥åè´¹ï¼ˆå¯é€‰ï¼‰
    toubiaobaozhengjin: null, // æŠ•标保证金(可选)
    lianhetitoubiao: null, // è”合体投标(可选)
    kaibiaofangshi: null, // å¼€æ ‡æ–¹å¼ï¼ˆå¯é€‰ï¼‰
    kaibiaofangshi: "纸质标", // å¼€æ ‡æ–¹å¼ï¼ˆå¯é€‰ï¼‰
    shifoufenbao: "false", // æ˜¯å¦åˆ†åŒ…(可选)
    shifoutuisongxuanchuan: "true", // æ˜¯å¦æŽ¨é€å®£ä¼ ï¼ˆå¯é€‰ï¼‰
    caigourenmingcheng: null, // é‡‡è´­äººåç§°ï¼ˆå¯é€‰ï¼‰
@@ -96,10 +96,9 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="项目编号">
        <el-form-item label="项目编号" prop="projectCode">
          <el-input
            v-model="newFormInline.projectCode"
            clearable
            placeholder="请输入项目编号"
          />
@@ -353,7 +352,10 @@
        </p>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="代理机构名称" prop="dailijigoumingcheng">
        <el-form-item
          label="代理机构名称"
          :prop="nowRole.code == 'DLJG' ? 'dailijigoumingcheng' : ''"
        >
          <el-input
            v-model="newFormInline.dailijigoumingcheng"
            clearable
@@ -362,7 +364,10 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="联系人" prop="dailiLianxiren">
        <el-form-item
          label="联系人"
          :prop="nowRole.code == 'DLJG' ? 'dailiLianxiren' : ''"
        >
          <el-input
            v-model="newFormInline.dailiLianxiren"
            clearable
@@ -371,7 +376,10 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="联系电话" prop="dailiLianxidianhua">
        <el-form-item
          label="联系电话"
          :prop="nowRole.code == 'DLJG' ? 'dailiLianxidianhua' : ''"
        >
          <el-input
            v-model="newFormInline.dailiLianxidianhua"
            clearable
@@ -380,7 +388,10 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="电子邮箱" prop="dailiDianziyoujian">
        <el-form-item
          label="电子邮箱"
          :prop="nowRole.code == 'DLJG' ? 'dailiDianziyoujian' : ''"
        >
          <el-input
            v-model="newFormInline.dailiDianziyoujian"
            clearable
@@ -389,7 +400,10 @@
        </el-form-item>
      </re-col>
      <re-col :value="12" :xs="24" :sm="24">
        <el-form-item label="通信地址" prop="dailiTongxindizhi">
        <el-form-item
          label="通信地址"
          :prop="nowRole.code == 'DLJG' ? 'dailiTongxindizhi' : ''"
        >
          <el-input
            v-model="newFormInline.dailiTongxindizhi"
            clearable
@@ -398,7 +412,10 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="项目经理" prop="dailiXiangmujingli">
        <el-form-item
          label="项目经理"
          :prop="nowRole.code == 'DLJG' ? 'dailiXiangmujingli' : ''"
        >
          <el-input
            v-model="newFormInline.dailiXiangmujingli"
            clearable
@@ -407,7 +424,10 @@
        </el-form-item>
      </re-col>
      <re-col :value="6" :xs="24" :sm="24">
        <el-form-item label="联系电话" prop="dailijingliLianxidianhua">
        <el-form-item
          label="联系电话"
          :prop="nowRole.code == 'DLJG' ? 'dailijingliLianxidianhua' : ''"
        >
          <el-input
            v-model="newFormInline.dailijingliLianxidianhua"
            clearable
src/views/system/dept/index.vue
@@ -3,13 +3,13 @@
import { useDept } from "./utils/hook";
import { PureTableBar } from "@/components/RePureTableBar";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { type CusExtendDto } from "@/utils/auth";
import Delete from "~icons/ep/delete";
import EditPen from "~icons/ep/edit-pen";
import Refresh from "~icons/ep/refresh";
import AddFill from "~icons/ri/add-circle-line";
import IconamoonEnterDuotone from "~icons/iconamoon/enter-duotone";
import { useUserStoreHook } from "@/store/modules/user";
defineOptions({
  name: "SystemDept"
@@ -39,16 +39,15 @@
  pagination,
  checkboxAsRadio,
  onSelectionCancel,
  onbatchDel
  onbatchDel,
  nowRole
} = useDept(tableRef);
function onFullscreen() {
  // é‡ç½®è¡¨æ ¼é«˜åº¦
  tableRef.value.setAdaptive();
}
const nowRole = computed(() => {
  return useUserStoreHook().nowRole;
});
const enterDetail = item => {
  isList.value = false;
  nowItem.value = item;
@@ -172,7 +171,7 @@
              </el-form-item>
            </el-col>
            <el-col
              v-if="nowRole.code == 'CGR'"
              v-if="nowRole.code == 'DLJG'"
              :xs="24"
              :sm="12"
              :md="8"
@@ -189,7 +188,7 @@
              </el-form-item>
            </el-col>
            <el-col
              v-if="nowRole.code == 'DLJG'"
              v-if="nowRole.code == 'CGR'"
              :xs="24"
              :sm="12"
              :md="8"
@@ -230,9 +229,9 @@
                <el-button type="primary" :loading="loading" @click="onSearch">
                  æœç´¢
                </el-button>
                <el-button :icon="useRenderIcon(Refresh)" @click="resetForm">
                <!-- <el-button :icon="useRenderIcon(Refresh)" @click="resetForm">
                  é‡ç½®
                </el-button>
                </el-button> -->
                <el-button type="primary" @click="openDialog()">
                  æ–°å¢ž
                </el-button>
src/views/system/dept/uploadform.vue
@@ -24,11 +24,13 @@
    toubiaoEndDate: "", // æŠ•标报名结束时间(必填,格式:yyyy-MM-dd HH:mm:ss)
    kaibiaoDate: "", // å¼€æ ‡æ—¶é—´ï¼ˆå¿…填,格式:yyyy-MM-dd HH:mm:ss)
    zhaobiaowenjian: "", // æ‹›æ ‡æ–‡ä»¶ï¼ˆå¿…填,长度1-512字符)
    zhaobiaowenjianName: "",
    biangengwenjian: "",
    fujian: "", // é™„件(可选,最大长度512字符,可为空)
    kaibiaodidian: "" // å¼€æ ‡åœ°ç‚¹ï¼ˆå¿…填,长度1-250字符)
  }),
  isChange: null
  isChange: null,
  changeDetail: null
});
interface FormInlineType {
  // é¡¹ç›®æ ‡é¢˜
@@ -41,8 +43,12 @@
  kaibiaoDate: string | null | undefined;
  // æ‹›æ ‡æ–‡ä»¶ï¼ˆå¯èƒ½æ˜¯æ–‡ä»¶è·¯å¾„、ID或文件对象)
  zhaobiaowenjian: string | null | undefined;
  // æ‹›æ ‡æ–‡ä»¶åï¼ˆå¯èƒ½æ˜¯æ–‡ä»¶è·¯å¾„、ID或文件对象)
  zhaobiaowenjianName?: string | null | undefined;
  // å˜æ›´æ–‡ä»¶
  biangengwenjian: string | null | undefined;
  // å˜æ›´æ–‡ä»¶
  biangengwenjianName?: string | null | undefined;
  // é™„件(文本描述或路径)
  fujian: string | null | undefined;
  // å¼€æ ‡åœ°ç‚¹
@@ -153,6 +159,23 @@
  fetchCredentials(file);
  // upload.value!.submit();
};
const handleChangeFile = file => {
  console.log(file);
  if (file.status !== "ready") return;
  // let suffName = file.name.substring(file.name.lastIndexOf(".") + 1);
  // const extension = suffName === "pdf";
  // // const isLt10M = file.size / 1024 / 1024 < 10;
  // if (!extension) {
  //   message(`仅支持pdf格式,请上传pdf`, {
  //     type: "error"
  //   });
  //   validateForm.fileList = [];
  //   return false;
  // }
  // fetchCredentials(file);
  // upload.value!.submit();
};
// state.formDataNew = {
//   policy: res.result.policy, //表单域
//   "x-oss-signature-version": res.result.x_oss_signature_version, //指定签名的版本和算法
@@ -185,15 +208,18 @@
    formData.append("key", keyVal); // æ–‡ä»¶å
    formData.append("file", file.raw); // file å¿…须为最后一个表单域
    uploadFileAli(formData, res.result.url).then(res => {
      let path = `${upUrl}"/"${upPath}${upPath};`;
      let path = `${upUrl}${keyVal}`;
      if (props.isChange) {
        newFormInline.value.biangengwenjian = path;
        newFormInline.value.biangengwenjianName = file.name;
      } else {
        newFormInline.value.zhaobiaowenjian = path;
        newFormInline.value.zhaobiaowenjianName = file.name;
      }
    });
  }
};
const defaultTime = new Date(2000, 1, 1, 9, 30, 0);
const beforeAvatarUpload: UploadProps["beforeUpload"] = rawFile => {
  isLoading.value = true;
  if (rawFile.type !== "application/pdf") {
@@ -226,10 +252,21 @@
    ref="ruleFormRef"
    :model="newFormInline"
    :rules="gonggaoRules"
    label-width="140px"
    :label-width="props.changeDetail ? '50px' : '140px'"
  >
    <el-row :gutter="30">
      <div v-if="props.isChange">
    <el-row v-if="props.changeDetail" :gutter="10">
      <re-col :value="24" :xs="24" :sm="24">
        <el-form-item label="标题" prop="projectName">
          <el-input
            v-model="newFormInline.projectName"
            clearable
            placeholder="请输入标题"
          />
        </el-form-item>
      </re-col>
    </el-row>
    <el-row v-else :gutter="30">
      <div v-if="props.isChange" style="width: 100%">
        <re-col :value="24" :xs="24" :sm="24">
          <el-form-item label="标题" prop="projectName">
            <el-input
@@ -270,6 +307,7 @@
            v-model="newFormInline.toubiaoStartDate"
            type="datetime"
            clearable
            :default-time="defaultTime"
            placeholder="请选择投标报名开始时间"
            value-format="YYYY-MM-DD HH:mm:ss"
          />
@@ -281,6 +319,7 @@
            v-model="newFormInline.toubiaoEndDate"
            type="datetime"
            clearable
            :default-time="defaultTime"
            placeholder="请选择投标报名结束时间"
            value-format="YYYY-MM-DD HH:mm:ss"
          />
@@ -292,6 +331,7 @@
            v-model="newFormInline.kaibiaoDate"
            type="datetime"
            clearable
            :default-time="defaultTime"
            placeholder="请选择开标时间"
            value-format="YYYY-MM-DD HH:mm:ss"
          />
@@ -318,6 +358,23 @@
          </el-upload>
        </el-form-item>
      </re-col>
      <re-col v-if="!props.isChange" :value="24" :xs="24" :sm="24">
        <el-form-item label="附件" prop="">
          <el-upload
            ref="upload"
            v-model:file-list="validateForm.fileList"
            multiple
            :on-exceed="handleExceed"
            :auto-upload="false"
            :on-success="handleAvatarSuccess"
            :before-upload="beforeAvatarUpload"
            :headers="state.headers"
            @change="handleChangeFile"
          >
            <el-button type="primary">点击上传</el-button>
          </el-upload>
        </el-form-item>
      </re-col>
      <re-col :value="24" :xs="24" :sm="24">
        <el-form-item label="开标地点" prop="kaibiaodidian">
          <el-input
src/views/system/dept/utils/detail.tsx
@@ -9,7 +9,8 @@
import {
  fabuzhaobiao,
  changezhaobiao,
  getTenderOrderDetail
  getTenderOrderDetail,
  updateTittle
} from "@/api/item/index";
const formRef = ref();
@@ -59,7 +60,85 @@
            res = await changezhaobiao(curData);
          }
          if (res.code == "200") {
            getTenderOrderDetail({ id: row?.id });
            getTenderOrderDetail({ id: row?.id }).then(res => {
              state.nowInfo = res.result;
            });
            done(); // å…³é—­å¼¹æ¡†
          } else {
            closeLoading();
            message(res.message, {
              type: "error"
            });
          }
        }
        FormRef.validate((valid, obj) => {
          if (valid) {
            // è¡¨å•规则校验通过
            if (title === "新增") {
              // å®žé™…开发先调用新增接口,再进行下面操作
              chores();
            } else {
              // å®žé™…开发先调用修改接口,再进行下面操作
              chores();
            }
          } else {
            closeLoading();
            const fail = [];
            for (const key in obj) {
              fail.push(obj[key][0].message);
            }
            message(fail[0], {
              type: "warning"
            });
            return false;
          }
        });
      }
    });
  }
  function changeDialog(title = "上传", row?: TenderInfo) {
    addDialog({
      title: `修改标题`,
      props: {
        formInline: {
          tenderId: title == "上传变更" ? row?.id : "",
          id: title == "上传" ? row?.id : "",
          projectName: row?.projectName ?? "",
          toubiaoStartDate: row?.toubiaoStartDate ?? "", //投标报名开始时间
          toubiaoEndDate: row?.toubiaoEndDate ?? "", //投标报名结束时间
          kaibiaoDate: row?.kaibiaoDate ?? "", //开标时间
          biangengwenjian: "", //招标文件
          fujian: row?.fujian ?? "", //附件
          kaibiaodidian: row?.kaibiaodidian ?? "" //开标地点
        }
      },
      width: "30%",
      draggable: true,
      fullscreen: deviceDetection(),
      fullscreenIcon: true,
      sureBtnLoading: true,
      closeOnClickModal: false,
      contentRenderer: () =>
        h(tenderForm, {
          ref: formRef,
          formInline: null,
          changeDetail: true,
          isChange: true
        }),
      beforeSure: (done, { options, closeLoading }) => {
        const FormRef = formRef.value.getRef();
        const curData = cloneDeep(options.props.formInline as TenderInfo);
        async function chores() {
          // message(`您${title}了项目名称为${curData.projectName}的这条数据`, {
          //   type: "success"
          // });
          // curData.dingbiaoguize = curData.dingbiaoguize.join("");
          curData.id = state.nowInfo.id;
          const res = await updateTittle(curData);
          if (res.code == "200") {
            getTenderOrderDetail({ id: row?.id }).then(res => {
              state.nowInfo = res.result;
            });
            done(); // å…³é—­å¼¹æ¡†
          } else {
            closeLoading();
@@ -129,12 +208,13 @@
    );
    // æ‹¼æŽ¥æ—¶é—´æˆ³å’Œéšæœºæ•°
    return (
      `${dirPath}/${timestamp}_${randomNumber}` + filename.match(/\.[^.]+$/)
      `${dirPath}${timestamp}_${randomNumber}` + filename.match(/\.[^.]+$/)
    );
  }
  return {
    openUploadDialog,
    state,
    generateTimestampWithRandom
    generateTimestampWithRandom,
    changeDialog
  };
}
src/views/system/dept/utils/hook.tsx
@@ -2,7 +2,7 @@
import editForm from "../form.vue";
import { handleTree } from "@/utils/tree";
import { message } from "@/utils/message";
import { zhaobiaoPageOrder } from "@/api/item/index";
import { zhaobiaoPageOrder, findWechatOpenId } from "@/api/item/index";
import {
  getCaigoufangshiList,
@@ -10,6 +10,7 @@
  getOrderStatusList,
  getRegionList,
  getDaimaleixingList,
  addgetcontact,
  caigourenAdd,
  caigourenUpdate,
  caigourenDelete,
@@ -17,11 +18,12 @@
} from "@/api/item/index";
// import { usePublicHooks } from "../../hooks";
import { addDialog } from "@/components/ReDialog";
import { type Ref, reactive, ref, onMounted, h } from "vue";
import { type Ref, reactive, ref, onMounted, h, computed } from "vue";
import type { FormItemProps } from "./types";
import { cloneDeep, deviceDetection, getKeyList } from "@pureadmin/utils";
// import { useUserStoreHook } from "@/store/modules/user";
import type { PaginationProps } from "@pureadmin/table";
import { useUserStoreHook } from "@/store/modules/user";
import pdfPreview from "../../component/pdfPreview.vue";
// const nowRole = computed(() => {
@@ -30,6 +32,9 @@
const selectedNum = ref(0);
export function useDept(tableRef: Ref) {
  const nowRole = computed(() => {
    return useUserStoreHook().nowRole;
  });
  const form = reactive({
    // æ–°å¢žæ—¥æœŸèŒƒå›´ï¼Œå¯ä¸º null,类型为数组
    createDateRange: null,
@@ -101,7 +106,7 @@
  // const { tagStyle } = usePublicHooks();
  const getOrderStatus = row => {
    const res = state.orderStatusList.find(item => {
      return row.orderStatus == item.status;
      return row.orderStatus == item.value;
    });
    return res?.label;
  };
@@ -310,6 +315,7 @@
    }
  };
  async function onSearch() {
    findWechatOpenId();
    const obj = cloneDeep(form);
    obj.tousu = obj.tousu.join("");
    obj.zhiyi = obj.zhiyi.join("");
@@ -344,7 +350,9 @@
    return newTreeList;
  }
  function openDialog(title = "新增", row?: FormItemProps) {
  async function openDialog(title = "新增", row?: FormItemProps) {
    const { result } = title == "新增" ? await addgetcontact() : "";
    addDialog({
      title: `${title}项目`,
      props: {
@@ -360,28 +368,36 @@
          baomingfei: row?.baomingfei ?? null, // æŠ¥åè´¹ï¼ˆå¯é€‰ï¼‰
          toubiaobaozhengjin: row?.toubiaobaozhengjin ?? null, // æŠ•标保证金(可选)
          lianhetitoubiao: row?.lianhetitoubiao ?? null, // è”合体投标(可选)
          kaibiaofangshi: row?.kaibiaofangshi ?? null, // å¼€æ ‡æ–¹å¼ï¼ˆå¯é€‰ï¼‰
          kaibiaofangshi: row?.kaibiaofangshi ?? "纸质标", // å¼€æ ‡æ–¹å¼ï¼ˆå¯é€‰ï¼‰
          shifoufenbao: row?.shifoufenbao ?? "false", // æ˜¯å¦åˆ†åŒ…(可选)
          shifoutuisongxuanchuan: row?.shifoutuisongxuanchuan ?? "true", // æ˜¯å¦æŽ¨é€å®£ä¼ ï¼ˆå¯é€‰ï¼‰
          caigourenmingcheng: row?.caigourenmingcheng ?? null, // é‡‡è´­äººåç§°ï¼ˆå¯é€‰ï¼‰
          caigourenmingcheng:
            row?.caigourenmingcheng ?? result?.caigourenmingcheng, // é‡‡è´­äººåç§°ï¼ˆå¯é€‰ï¼‰
          xingzhengquyu: row?.xingzhengquyu.split(",") ?? [], // è¡Œæ”¿åŒºåŸŸï¼ˆå¯é€‰ï¼‰
          xingzhengquyuName: row?.xingzhengquyuName ?? null, // è¡Œæ”¿åŒºåŸŸåç§°ï¼ˆå¯é€‰ï¼‰
          jigoudaima: row?.jigoudaima ?? null, // æœºæž„代码(可选)
          jigoudaima: row?.jigoudaima ?? result?.jigoudaima, // æœºæž„代码(可选)
          daimaleixing: row?.daimaleixing ?? null, // ä»£ç ç±»åž‹ï¼ˆå¯é€‰ï¼‰
          lianxiren: row?.lianxiren ?? null, // è”系人(可选)
          lianxidianhua: row?.lianxidianhua ?? null, // è”系电话(可选)
          tongxindizhi: row?.tongxindizhi ?? null, // é€šä¿¡åœ°å€ï¼ˆå¯é€‰ï¼‰
          dianziyoujian: row?.dianziyoujian ?? null, // ç”µå­é‚®ä»¶ï¼ˆå¯é€‰ï¼‰
          xiangmujingbanren: row?.xiangmujingbanren ?? null, // é¡¹ç›®ç»åŠžäººï¼ˆå¯é€‰ï¼‰
          lianxiren: row?.lianxiren ?? result?.lianxiren, // è”系人(可选)
          lianxidianhua: row?.lianxidianhua ?? result?.lianxidianhua, // è”系电话(可选)
          tongxindizhi: row?.tongxindizhi ?? result?.tongxindizhi, // é€šä¿¡åœ°å€ï¼ˆå¯é€‰ï¼‰
          dianziyoujian: row?.dianziyoujian ?? result?.dianziyoujian, // ç”µå­é‚®ä»¶ï¼ˆå¯é€‰ï¼‰
          xiangmujingbanren:
            row?.xiangmujingbanren ?? result?.xiangmujingbanren, // é¡¹ç›®ç»åŠžäººï¼ˆå¯é€‰ï¼‰
          zhiwu: row?.zhiwu ?? null, // èŒåŠ¡ï¼ˆå¯é€‰ï¼‰
          jingbanrendianhua: row?.jingbanrendianhua ?? null, // ç»åŠžäººç”µè¯ï¼ˆå¯é€‰ï¼‰
          dailijigoumingcheng: row?.dailijigoumingcheng ?? null, // ä»£ç†æœºæž„名称(可选)
          dailiLianxiren: row?.dailiLianxiren ?? null, // ä»£ç†æœºæž„联系人(可选)
          dailiLianxidianhua: row?.dailiLianxidianhua ?? null, // ä»£ç†æœºæž„联系电话(可选)
          dailiDianziyoujian: row?.dailiDianziyoujian ?? null, // ä»£ç†æœºæž„电子邮件(可选)
          dailiTongxindizhi: row?.dailiTongxindizhi ?? null, // ä»£ç†æœºæž„通信地址(可选)
          dailiXiangmujingli: row?.dailiXiangmujingli ?? null, // ä»£ç†æœºæž„项目经理(可选
          dailijingliLianxidianhua: row?.dailijingliLianxidianhua ?? null // ä»£ç†æœºæž„项目经理联系电话(可选)
          dailijigoumingcheng:
            row?.dailijigoumingcheng ?? result?.dailijigoumingcheng, // ä»£ç†æœºæž„名称(可选)
          dailiLianxiren: row?.dailiLianxiren ?? result?.dailiLianxiren, // ä»£ç†æœºæž„联系人(可选)
          dailiLianxidianhua:
            row?.dailiLianxidianhua ?? result?.dailiLianxidianhua, // ä»£ç†æœºæž„联系电话(可选)
          dailiDianziyoujian:
            row?.dailiDianziyoujian ?? result?.dailiDianziyoujian, // ä»£ç†æœºæž„电子邮件(可选)
          dailiTongxindizhi:
            row?.dailiTongxindizhi ?? result?.dailiTongxindizhi, // ä»£ç†æœºæž„通信地址(可选)
          dailiXiangmujingli:
            row?.dailiXiangmujingli ?? result?.dailiXiangmujingli, // ä»£ç†æœºæž„项目经理(可选
          dailijingliLianxidianhua:
            row?.dailijingliLianxidianhua ?? result?.dailijingliLianxidianhua // ä»£ç†æœºæž„项目经理联系电话(可选)
        }
      },
      width: "80%",
@@ -395,9 +411,6 @@
        const FormRef = formRef.value.getRef();
        const curData = cloneDeep(options.props.formInline as FormItemProps);
        async function chores() {
          message(`您${title}了项目名称为${curData.projectName}的这条数据`, {
            type: "success"
          });
          // curData.dingbiaoguize = curData.dingbiaoguize.join("");
          curData.xingzhengquyu = curData.xingzhengquyu.join(",");
          let res;
@@ -409,6 +422,9 @@
          if (res.code == "200") {
            done(); // å…³é—­å¼¹æ¡†
            onSearch(); // åˆ·æ–°è¡¨æ ¼æ•°æ®
            message(`您${title}了项目名称为${curData.projectName}的这条数据`, {
              type: "success"
            });
          } else {
            closeLoading();
            message(res.message, {
@@ -487,6 +503,7 @@
    pagination,
    checkboxAsRadio,
    onSelectionCancel,
    onbatchDel
    onbatchDel,
    nowRole
  };
}
src/views/system/dept/utils/types.ts
@@ -49,6 +49,10 @@
  // æ‹›æ ‡æ–‡ä»¶ï¼Œé•¿åº¦1-512字符
  zhaobiaowenjian: string;
  biangengwenjian: string;
  // æ‹›æ ‡æ–‡ä»¶åï¼ˆå¯èƒ½æ˜¯æ–‡ä»¶è·¯å¾„、ID或文件对象)
  zhaobiaowenjianName?: string | null | undefined;
  // å˜æ›´æ–‡ä»¶
  biangengwenjianName?: string | null | undefined;
  // é™„件,可为空,最大长度512字符
  fujian?: string;
  // å¼€æ ‡åœ°ç‚¹ï¼Œé•¿åº¦1-250字符
@@ -61,6 +65,7 @@
interface TenderProps {
  formInline: TenderInfo;
  isChange: boolean;
  changeDetail?: boolean;
}
export type { FormItemProps, FormProps, TenderInfo, TenderProps };
vite.config.ts
@@ -27,7 +27,8 @@
      proxy: {
        "/api": {
          // è¿™é‡Œå¡«å†™åŽç«¯åœ°å€http://114.132.78.38:8096 http://192.168.0.36:5005
          target: "http://192.168.18.52:5005",
          target: "http://192.168.18.15:5005",
          // target: "http://192.168.18.52:5005",
          changeOrigin: true,
          rewrite: path => path.replace(/^\/api/, "")
        },