| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509 |
- <template>
- <div class="card">
- <div class="df aic jcsb mb10">
- <div class="t20">招标信息</div>
- <div class="df aic">
- <div
- class="mr10 fs18"
- :style="{ color: tenderData.status === 1 ? '#00B050' : '#FFA500' }"
- >
- {{ tenderData.status === 1 ? "招标中" : "" }}
- {{ tenderData.status === 2 ? "招标完成" : "" }}
- {{ tenderData.status === 3 ? "取消招标" : "" }}
- </div>
- <div class="mr10" v-if="tenderData.status === 1">
- 竞标截止剩余: {{ getLeftTime(tenderData.bidDeadlineDatetime) }}
- </div>
- </div>
- </div>
- <div class="card mb20">
- <div class="df aic mb10">
- <div class="info-title">发起时间:</div>
- <div class="info-text">{{ tenderData.operatorDate }}</div>
- <div class="info-title">货种:</div>
- <div class="info-text">{{ tenderData.cargo }}</div>
- <div class="info-title">装货港:</div>
- <div class="info-text">{{ tenderData.loadPortName }}</div>
- </div>
- <div class="df aic mb10">
- <div class="info-title">截止时间:</div>
- <div class="info-text">{{ tenderData.bidDeadlineDatetime }}</div>
- <div class="info-title">发货吨位:</div>
- <div class="info-text">{{ tenderData.tons }} 吨</div>
- <div class="info-title">卸货港:</div>
- <div class="info-text">{{ tenderData.dischargePortName }}</div>
- </div>
- </div>
- <div v-if="tenderData.initMethod === 3">
- <div class="t20 mb10">前置航次信息</div>
- <div class="card">
- <AMapContainer
- :ships="[voyage]"
- :loadPorts="loadPorts"
- :dischargePorts="dischargePorts"
- style="width: 100%; height: 500px"
- ></AMapContainer>
- <div class="card mt10">
- <div class="t16 mb10">航次信息</div>
- <div class="df aic mb10">
- <div class="info-title">船名:</div>
- <div class="info-text">{{ voyage.shipName }}</div>
- <div class="info-title">装货港:</div>
- <div class="info-text">{{ voyage.loadPort }}</div>
- <div class="info-title">货种:</div>
- <div class="info-text">{{ voyage.cargo }}</div>
- </div>
- <div class="df aic mb10">
- <div class="info-title">MMSI:</div>
- <div class="info-text">{{ voyage.mmsi }}</div>
- <div class="info-title">卸货港:</div>
- <div class="info-text">{{ voyage.dischargePorts }}</div>
- <div class="info-title">装载吨位:</div>
- <div class="info-text">{{ voyage.tons }} 吨</div>
- </div>
- </div>
- </div>
- </div>
- <div class="t20 mt20 mb10">运力要求</div>
- <div class="card">
- <pre style="white-space: pre-wrap">{{
- tenderData.capacityRequirements
- }}</pre>
- </div>
- <div class="t20 mt20 mb10">报价要求</div>
- <div class="card">
- <pre style="white-space: pre-wrap">{{ tenderData.quotationRequest }}</pre>
- </div>
- <el-divider></el-divider>
- <div class="t20 mb10">投标信息</div>
- <div class="df aic mb10">
- <div class="mr10">参与竞标公司数量:</div>
- <div class="mr20">{{ tenderData.participateProxyNum }}</div>
- <el-button
- v-if="tenderData.status === 1"
- size="small"
- type="primary"
- @click="showAddTenderCompany()"
- >
- 增加竞标公司
- </el-button>
- <el-dialog v-model="isAddProxyCompanyVisible" title="增加竞标公司">
- <div class="df aic mb10">
- <div class="red">*</div>
- <div>请选择新代理公司(可多选):</div>
- <el-select
- class="w300 ml20"
- v-model="currentProxyCompanies"
- value-key="id"
- placeholder="请选择参与竞标代理公司"
- multiple
- clearable
- @change="proxyCompaniesChange"
- >
- <el-option
- v-for="item in proxyCompanies"
- :key="item.id"
- :label="item.companyName"
- :value="item"
- ></el-option>
- </el-select>
- </div>
- <el-table
- v-if="currentProxyCompanies.length > 0"
- :data="currentProxyCompanies"
- border
- stripe
- >
- <el-table-column label="公司名称" prop="companyName" />
- <el-table-column label="联系人" prop="contactName" />
- <el-table-column label="手机号" prop="contactPhone" />
- <el-table-column label="邮箱" prop="contactEmail" />
- <el-table-column label="操作" width="80">
- <template #default="scope">
- <el-button type="danger" @click="remove(scope)" size="small">
- 移除
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- <div class="df aic jcfe mt20 pr20">
- <el-button @click="cancelAddTenderCompany()">取消</el-button>
- <el-button type="primary" @click="addTenderProxy()">
- 确定添加
- </el-button>
- </div>
- </el-dialog>
- </div>
- <div class="df aic mb10">
- <div class="mr10">未参与竞标公司数量:</div>
- <div class="mr20">{{ tenderData.notCompleteBidProxyNum }}</div>
- <div class="mr10">完成竞标公司数量:</div>
- <div class="mr20">{{ tenderData.completeBidProxyNum }}</div>
- </div>
- <div class="card mb30" v-for="(item, index) in tenderData.tenderProxies">
- <div class="df aic jcsb mb10">
- <div>{{ item.proxyCompanyName }}</div>
- <div class="df aic" v-if="tenderData.status === 1">
- <div class="mr10">邮件通知状态:</div>
- <div
- class="mr10 fs18"
- :style="{
- color: item.emailSendStatus === 0 ? '#9d0016' : '#00B050',
- }"
- >
- {{ item.emailSendStatus === 0 ? "未发送" : "" }}
- {{ item.emailSendStatus === 1 ? "已发送" : "" }}
- </div>
- <el-button
- v-if="item.emailSendStatus === 0"
- size="small"
- type="primary"
- >
- 发送
- </el-button>
- <el-button
- v-if="item.emailSendStatus === 1"
- size="small"
- type="primary"
- >
- 再次发送
- </el-button>
- </div>
- </div>
- <div v-if="item.bidStatus !== 2">
- <AMapContainer
- :mapId="'map' + index"
- :ships="item.tenderProxyBids"
- style="height: 300px"
- class="mb10"
- ></AMapContainer>
- <el-table
- :data="item.tenderProxyBids"
- border
- stripe
- show-summary
- :summary-method="getSummaries"
- >
- <el-table-column label="船名" prop="shipName"></el-table-column>
- <el-table-column label="MMSI" prop="shipMmsi"></el-table-column>
- <el-table-column label="装载吨位" prop="loadTons"></el-table-column>
- <el-table-column
- label="报价(元/吨)"
- prop="quotePrice"
- ></el-table-column>
- <el-table-column
- label="预计运费(元,单船)"
- prop="estimatedCost"
- ></el-table-column>
- <el-table-column label="操作">
- <template #default="scope">
- <div class="df aic jcc" v-if="tenderData.status === 1">
- <el-button
- v-if="scope.row.status === 1"
- size="small"
- type="primary"
- @click="selectTenderShip(scope.row, 1)"
- >
- 选择中标
- </el-button>
- <el-button
- v-if="scope.row.status === 2"
- size="small"
- type="danger"
- @click="selectTenderShip(scope.row, 2)"
- >
- 取消中标
- </el-button>
- </div>
- <el-tag
- type="success"
- v-if="scope.row.status === 2 && tenderData.status === 2"
- >
- 已中标
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </div>
- <div v-else>
- <el-result
- class="card"
- icon="error"
- title="放弃竞标"
- :sub-title="item.giveUpRemark"
- ></el-result>
- </div>
- </div>
- <div v-if="tenderData.status === 1" class="df aic jcfe mt30">
- <div>
- <el-button type="default" @click="completeTender(2)">
- 取消招标
- </el-button>
- <el-button type="primary" @click="completeTender(1)">
- 完成招标
- </el-button>
- </div>
- </div>
- </div>
- </template>
- <script setup>
- import api from "../../apis/fetch";
- import store from "../../store";
- import router from "../../router";
- import { ref, onMounted, reactive, computed } from "vue";
- import { ElNotification, ElMessage, ElMessageBox } from "element-plus";
- import { mapGetters } from "vuex";
- import { useRoute } from "vue-router";
- const route = useRoute();
- const tenderData = ref({
- operatorDate: "",
- bidDeadlineDatetime: "",
- cargo: "",
- loadPortName: "",
- tons: "",
- dischargePortName: "",
- participateProxyNum: "",
- capacityRequirements: "",
- quotationRequest: "",
- tenderProxies: [],
- });
- const voyage = ref({
- // shipName: "航次船舶",
- // loadPort: "武汉",
- // cargo: "豆粕",
- // mmsi: "998221222",
- // dischargePorts: "北仑",
- // tons: 5000,
- // longitude: 120.487381,
- // latitude: 32.042158,
- });
- const tenderTableData = ref([]);
- const getSummaries = (param) => {
- const { columns, data } = param;
- const sums = [];
- columns.forEach((column, index) => {
- if (index === 0) {
- sums[index] = "预估总运费";
- return;
- }
- const values = data.map((item) => Number(item[column.property]));
- if (index == 4) {
- sums[index] = `${values.reduce((prev, curr) => {
- const value = Number(curr);
- if (!Number.isNaN(value)) {
- return prev + curr;
- } else {
- return prev;
- }
- }, 0)} 元`;
- }
- });
- return sums;
- };
- const loadPorts = ref([]);
- const dischargePorts = ref([]);
- async function getTenderDetail() {
- let { data } = await api.getTenderDetail({
- tenderId: route.query.id,
- });
- if (data.status === 0) {
- tenderData.value = data.result;
- for (let i of tenderData.value.tenderProxies) {
- for (let j of i.tenderProxyBids) {
- j.estimatedCost = j.loadTons * j.quotePrice;
- }
- }
- } else {
- tenderData.value = {
- operatorDate: "",
- bidDeadlineDatetime: "",
- cargo: "",
- loadPortName: "",
- tons: "",
- dischargePortName: "",
- participateProxyNum: "",
- capacityRequirements: "",
- quotationRequest: "",
- tenderProxies: [],
- };
- }
- }
- function getLeftTime(givenTime = "2099-12-31 23:59:59") {
- givenTime = new Date(givenTime);
- const currentTime = new Date();
- // 检查当前时间是否超出了截止时间
- if (currentTime > givenTime) {
- return "已超过截止时间";
- }
- const differenceInMilliseconds = Math.abs(givenTime - currentTime);
- const days = Math.floor(differenceInMilliseconds / (1000 * 60 * 60 * 24));
- const hours = Math.floor(
- (differenceInMilliseconds % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
- );
- return `${days}天${hours}小时`;
- }
- const isAddProxyCompanyVisible = ref(false);
- const proxyCompanies = ref([]);
- async function getTenderProxySelect() {
- let { data } = await api.getTenderProxySelect({
- cargoId: tenderData.value.cargoId,
- });
- if (data.status === 0) {
- proxyCompanies.value = data.result.filter(
- (item) =>
- !tenderData.value.tenderProxies.some(
- (item1) => item.id === item1.proxyCompanyId
- )
- );
- } else {
- proxyCompanies.value = [];
- }
- }
- const currentProxyCompanies = ref([]);
- function proxyCompaniesChange(e) {
- currentProxyCompanies.value = e;
- }
- function remove(scope) {
- currentProxyCompanies.value.splice(scope.$index, 1);
- }
- function showAddTenderCompany() {
- isAddProxyCompanyVisible.value = true;
- getTenderProxySelect();
- }
- function cancelAddTenderCompany() {
- currentProxyCompanies.value = [];
- isAddProxyCompanyVisible.value = false;
- }
- async function addTenderProxy() {
- if (currentProxyCompanies.value.length === 0) {
- ElMessage({
- type: "warning",
- message: "请选择代理公司!",
- });
- return;
- }
- let { data } = await api.addTenderProxy({
- tenderId: route.query.id,
- proxyCompanyIds: currentProxyCompanies.value
- .map((item) => item.id)
- .join(","),
- });
- if (data.status === 0) {
- ElNotification({
- type: "success",
- message: "添加成功!",
- });
- getTenderDetail();
- } else {
- ElNotification({
- type: "error",
- message: data.msg,
- });
- }
- cancelAddTenderCompany();
- }
- function completeTender(status) {
- ElMessageBox.confirm(`确认${status === 2 ? "取消" : "完成"}招标?`, "提示", {
- confirmButtonText: "确认",
- cancelButtonText: "取消",
- type: "warning",
- }).then(async () => {
- let { data } = await api.completeTender({
- tenderId: route.query.id,
- status,
- });
- if (data.status === 0) {
- ElNotification({
- type: "success",
- message: `${status === 2 ? "取消" : "完成"}成功!`,
- });
- } else {
- ElNotification({
- type: "error",
- message: data.msg,
- });
- }
- getTenderDetail();
- });
- }
- function selectTenderShip(row, status) {
- ElMessageBox.confirm(
- `确认${status === 1 ? "选择" : "取消"}${row.shipName}中标?`,
- "提示",
- {
- confirmButtonText: "确认",
- cancelButtonText: "取消",
- type: "warning",
- }
- ).then(async () => {
- let { data } = await api.selectTenderShip({
- tenderId: route.query.id,
- status,
- tenderProxyBidId: row.id,
- });
- if (data.status === 0) {
- ElNotification({
- type: "success",
- message: `${status === 1 ? "选择" : "取消"}成功!`,
- });
- getTenderDetail();
- } else {
- ElNotification({
- type: "error",
- message: data.msg,
- });
- console.log(data);
- }
- });
- }
- onMounted(() => {
- getTenderDetail();
- });
- </script>
- <style scoped>
- .info-title {
- width: 110px;
- text-align: right;
- color: #666;
- margin-right: 10px;
- }
- .info-text {
- width: 160px;
- color: #333;
- }
- .table-title {
- color: #666;
- margin-right: 10px;
- }
- .table-text {
- color: #333;
- margin-right: 30px;
- }
- </style>
|