| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669 |
- <template>
- <div class="expire-detail-page">
- <!-- 顶部绿色头部 -->
- <div class="header-bar">
- <div class="header-info">
- <div class="project-title">{{projects.title}}</div>
- <!-- <div class="project-subtitle">{{ projects.c_xmbtqc }}</div> -->
- <div class="project-meta">{{projects.c_fbz || projects.zbmsxx ?.zb_source_name || ''}} · {{projects.zbmsxx ?.zb_project_name || ''}} · 金额{{UTIL.formatCurrency(projects.c_nh/10000 || '0')}}万元</div>
- <!-- <div class="project-meta">{{projects.c_fbz || projects.zbmsxx ?.zb_source_name || '上海市杨浦区政府采购中心'}} · 杨浦区图书馆总馆物业管理服务项目 · 金额{{UTIL.formatCurrency(projects.c_nh || '0')}}万元</div> -->
- <!-- <div class="project-subtitle">{{ projects.c_is_xb == true ? projects.c_xmbtqc : projects.zbmsxx ?.zb_project_name || ''}}</div>
- <div class="project-meta">{{projects.c_is_xb == true ? projects.c_fbz : projects.zbmsxx ?.zb_source_name || ''}} · {{projects.c_is_xb == true ? projects.c_zgfw: projects.zbmsxx?.zb_project_name || ''}} · 金额{{UTIL.formatCurrency(projects.c_is_xb == true ? projects.c_nh : projects.zbmsxx ?.zb_budget_amount || '0')}}元</div> -->
- </div>
- <div class="countdown-badge">
- <span class="countdown-number">{{projects.days}}</span>
- <span class="countdown-label">天后到期</span>
- </div>
- </div>
- <!-- 进度指示器 -->
- <div class="renewal-stepper" >
- <div v-for="step in steps" :key="step.n" style="display: flex;align-items: center;">
- <div :class="['renewal-step', step.n < stage ? 'done' : step.n === stage ? 'active' : '']">
- <span class="renewal-step-dot">{{step.n < stage ? '✓' : step.n}}</span>
- {{step.label}}
- </div>
- <span class="renewal-step-arrow" v-if="step.n < steps[steps.length - 1].n">→</span>
- </div>
- </div>
- <!-- 主内容区域 -->
- <div class="main-content">
- <!-- 左侧内容 -->
- <div class="left-panel">
- <!-- 监控招标公告 -->
- <div class="panel-card monitoring-card">
- <div class="card-body">
- <h3 class="monitoring-name">
- {{(steps.filter(item => item.n === stage)[0] || {}).title || ''}}
- </h3>
- <p class="monitoring-desc">
- {{(steps.filter(item => item.n === stage)[0] || {}).text || ''}}
- </p>
- <div class="monitoring-actions" v-if="(steps.filter(item => item.n === stage)[0] || {}).left_btn_text">
- <div v-if="(steps.filter(item => item.n === stage)[0] || {}).label == '标书制作'" style="width: 100%;">
- <div v-if="stepsType == '1'" style="display: inline-block;">
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'')">
- 提交资料
- </el-button>
- </div>
- <div v-if="stepsType == '2'" style="display: inline-block;">
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'')">
- 生成标书
- </el-button>
- <el-button type="primary" v-if="!bidFile.isFileFlag" class="btn enter-btn" @click="dialogFormBidFileVisible = true">
- 上传参考标书
- </el-button>
- <!-- <el-button type="primary" :loading="swb_status == '2'" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'swb')">
- 生成商务标书
- </el-button>
- <el-button type="primary" :loading="jsb_status == '2'" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'jsb')">
- 生成技术标书
- </el-button> -->
- </div>
- <div v-if="stepsType == '3'" style="display: inline-block;">
- <el-button type="primary" :loading="stepsType == '3'" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'')">
- 生成标书
- </el-button>
- </div>
- <div v-if="stepsType == '4'" style="display: inline-block;">
- <el-button type="primary" :disabled="!bidFile.flag" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'')">
- 进入投标提交
- </el-button>
- <el-button type="primary" class="btn" @click="getBidFile()">
- 获取标书
- </el-button>
- <!-- <el-button type="primary" class="btn" @click="getBidFile('swb')">
- 获取商务标书
- </el-button>
- <el-button type="primary" class="btn" @click="getBidFile('jsb')">
- 获取技术标书
- </el-button> -->
- </div>
- <!-- <div style="float: right;">
- <el-button type="primary" class="btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'cqgg')">
- 上传澄清公告
- </el-button>
- </div> -->
- </div>
- <div v-else-if="(steps.filter(item => item.n === stage)[0] || {}).label == '招标监控'" style="width: 100%;">
- <!-- <div v-if="stepsType == '1'" style="display: inline-block;">
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'swb')">
- 添加招标监控
- </el-button>
- </div> -->
- <div v-if="stepsType == '1'" style="display: inline-block;">
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'swb')">
- 进入标书制作
- </el-button>
- </div>
- <!-- <div style="float: right;">
- <el-button type="primary" class="btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'cqgg')">
- 上传招标公告
- </el-button>
- </div> -->
- </div>
- <div v-else-if="(steps.filter(item => item.n === stage)[0] || {}).label == '开标监控'">
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'detail')">
- 查看监控详情
- </el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick(steps.filter(item => item.n === stage)[0] || {},'')">
- 进入中标推送
- </el-button>
- </div>
- <div v-else>
- <el-button type="primary" class="btn enter-btn" @click="handleViewClick((steps.filter(item => item.n === stage)[0] || {}),'')" :disabled="left_btn_disabled" :loading="left_btn_disabled">
- {{(steps.filter(item => item.n === stage)[0] || {}).left_btn_text || ''}}
- </el-button>
- <el-button type="primary" class="btn enter-btn" v-if="(steps.filter(item => item.n === stage)[0] || {}).right_btn_text" @click="handleViewClick((steps.filter(item => item.n === stage)[0] || {}),'')" :disabled="right_btn_disabled" :loading="right_btn_disabled">
- {{(steps.filter(item => item.n === stage)[0] || {}).right_btn_text || ''}}
- </el-button>
- </div>
- </div>
- </div>
- </div>
- <!-- 投标任务清单 -->
- <div class="panel-card">
- <div class="card-header">
- <span class="card-title">投标任务清单</span>
- </div>
- <div class="card-body">
- <ul class="checklist">
- <li :class="['checklist-item']" v-for="task in projects.rwlcqd" :key="task.id">
- <span :class="['checklist-status', task.done ? 'done' : '']">{{task.done ? '✓' : '○'}} {{task.text}}</span>
- <!-- <span class="checklist-text">{{task.text}}</span> -->
- <strong style="cursor: pointer;color: var(--primary);" v-if="task.done && projects.zbmsxx?.zb_detail_url && task.id == 4" @click="handleOpenViewClick('1')">查看招标公告</strong>
- <div class="checklist-actions" v-if="task.seq<=stage">
- <el-button type="primary" size="small" :disabled="task.done" :plain="task.done" v-if="[3].includes(task.id) && !task.done && stepsType == '1'">
- <span v-if="!task.done" @click="confirmTask(task)">人工处理</span>
- </el-button>
- <el-button type="primary" size="small" :disabled="task.done" :plain="task.done" v-if="task.id == 3" :loading="task.type == 1">
- <span v-if="task.done">匹配成功</span>
- <span v-else @click="confirmTask(task)">{{task.type == 1 ? '匹配中' : task.type == 2 ? '待确认' :''}}</span>
- </el-button>
- <el-button type="primary" size="small" :disabled="task.done" :plain="task.done" v-if="[7].includes(task.id) && !task.done">
- <span v-if="!task.done" @click="confirmTask(task)">人工处理</span>
- </el-button>
- <el-button type="primary" size="small" :disabled="task.done" :plain="task.done" v-if="task.id == 7" :loading="task.type == 1">
- <span v-if="task.done">已完成</span>
- <span v-else @click="confirmTask(task)">{{task.type == 1 ? '监控中' : task.type == 2 ? '待确认' :''}}</span>
- </el-button>
- <el-button type="primary" size="small" :disabled="task.done" :plain="task.done" v-if="task.id != 3 && task.id != 7">
- <span v-if="task.done">已完成</span>
- <span v-else @click="confirmTask(task)">待确认</span>
- </el-button>
-
- </div>
- </li>
- </ul>
- </div>
- </div>
- <!-- 历史投标参考 -->
- <div class="panel-card">
- <div class="card-header">
- <span class="card-title">历史投标参考</span>
- </div>
- <div class="card-body">
- <table>
- <thead>
- <tr>
- <th>年份</th>
- <th>结果</th>
- <th>金额</th>
- <th>地址</th>
- <!-- <th>操作</th> -->
- </tr>
- </thead>
- <tbody>
- <tr v-for="item in historyBidList" :key="item.id">
- <td>{{ item.year }}</td>
- <td>{{ item.type }}</td>
- <td>{{ UTIL.formatCurrency(item.money/10000) }} 万元</td>
- <td>{{ item.address }}</td>
- <!-- <td class="link-text" >
- 查看
- </td> -->
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- <!-- 右侧边栏 -->
- <div class="right-panel">
- <!-- 项目信息 -->
- <div class="side-card">
- <div class="card-header">
- <span class="card-title">项目信息</span>
- </div>
- <div class="card-body">
- <!-- <div class="info-row">
- <span class="label">金蝶编码</span>
- <span class="value">{{projects.c_jdbm}}</span>
- </div> -->
- <div class="info-row">
- <span class="label">项目编码</span>
- <span class="value">{{projects.xmbh}}</span>
- </div>
- <div class="info-row">
- <span class="label">合同起止</span>
- <span class="value">{{moment(projects.c_kssj).format('YYYY.MM.DD')}}-{{moment(projects.c_dqsj).format('YYYY.MM.DD')}}</span>
- </div>
- <div class="info-row">
- <span class="label">合同金额</span>
- <span class="value">{{UTIL.formatCurrency(projects.c_nh/10000)}}万元</span>
- </div>
- <div class="info-row">
- <span class="label">委托服务</span>
- <span class="value">{{getWTFWLabel(projects.c_zgfw)}}</span>
- </div>
- <!-- <div class="info-row">
- <span class="label">合同状况</span>
- <span class="value">已签/已签</span>
- </div> -->
- </div>
- </div>
- <!-- 右侧边栏 -->
- <div class="right-panel">
- <!-- 项目信息 -->
- <div class="side-card">
- <div class="card-header">
- <span class="card-title">招标信息</span>
- </div>
- <div class="card-body">
- <div class="info-row">
- <span class="label">招标编码</span>
- <!-- <span class="value">{{projects.zbProject?.c_project_code || '-' }}</span> -->
- <span class="value">{{projects.zbmsxx ?.zb_project_code ? projects.zbmsxx ?.zb_project_code : projects.zbProject?.c_project_code || '-' }}</span>
- </div>
- <div class="info-row">
- <span class="label">招标起止</span>
- <!-- <span class="value">{{projects.zbProject?.c_publish_time ? moment(projects.zbProject?.c_publish_time).format('YYYY.MM.DD') : '' }}-{{projects.zbProject?.c_bid_deadline ? moment(projects.zbProject?.c_bid_deadline.replace(/\s*\(.*\)$/, '') , 'YYYY年MM月DD日 HH:mm').format('YYYY.MM.DD') : '' }}</span> -->
- <span class="value">{{projects.zbkssj ? moment(projects.zbkssj).format('YYYY.MM.DD') : '' }}-{{projects.zbjzsj ? moment(projects.zbjzsj).format('YYYY.MM.DD') : '' }}</span>
- </div>
- <div class="info-row">
- <span class="label">招标金额</span>
- <span class="value">{{projects.zbmsxx ?.zb_budget_amount ? UTIL.formatCurrency(projects.zbmsxx ?.zb_budget_amount / 10000 || 0) + '万元' : '-'}}</span>
- </div>
- <div class="info-row">
- <span class="label">数据源名称</span>
- <span class="value">{{projects.zbmsxx ?.zb_source_name || '-' }}</span>
- </div>
- </div>
- </div>
- </div>
- <!-- 关联模块 -->
- <div class="side-card">
- <div class="card-header">
- <span class="card-title">关联模块</span>
- </div>
- <div class="card-body">
- <div class="module-links">
- <el-button size="small" class="btn" @click="goToPage('/renewal')">投标列表</el-button>
- <el-button size="small" class="btn" style="margin-left: 0px;" @click="goToPage('/bid-result')">开标与中标</el-button>
- <span style="color: var(--text2);cursor: pointer;" @click="goToPage('/tender-pool')">查看全部招标信息→</span>
- <!-- <a href="#" class="module-link">标书制作</a>
- <a href="#" class="module-link">开标与中标</a>
- <a href="#" class="module-link">查看全期招标信息 →</a> -->
- </div>
- </div>
- </div>
- <!-- 进程记录 -->
- <!-- <div class="side-card">
- <div class="card-header">
- <span class="card-title">进程记录</span>
- </div>
- <div class="card-body">
- <div class="process-list">
- <div class="process-item">
- <span class="process-dot"></span>
- <span class="process-text">合同到期预警触发</span>
- </div>
- <div class="process-item">
- <span class="process-dot"></span>
- <span class="process-text">续标预警</span>
- </div>
- <div class="process-item">
- <span class="process-dot"></span>
- <span class="process-text">招标公告监控</span>
- </div>
- <div class="process-item">
- <span class="process-dot"></span>
- <span class="process-text">标书生成</span>
- </div>
- <div class="process-item">
- <span class="process-dot"></span>
- <span class="process-text">投标报名</span>
- </div>
- <div class="process-item">
- <span class="process-dot"></span>
- <span class="process-text">开标结果抓取</span>
- </div>
- </div>
- </div>
- </div> -->
- </div>
- </div>
- <el-dialog v-model="dialogKBJKVisible" draggable title="提示信息" width="500">
- <div style="height: auto;overflow: auto;">
- <el-form
- ref="ruleKBJKFormRef"
- style="max-width: 600px"
- :model="ruleKBJKForm"
- :rules="kbjkrules"
- label-width="auto"
- >
- <!-- <el-form-item label="标题" prop="title">
- <el-input v-model="ruleKBJKForm.title" placeholder="请输入标题"/>
- </el-form-item>
- <el-form-item label="描述" prop="content">
- <el-input v-model="ruleKBJKForm.content" placeholder="请输入描述"/>
- </el-form-item>
- <el-form-item label="监控说明" prop="c_jksm">
- <el-input v-model="ruleKBJKForm.c_jksm" placeholder="请输入监控说明"/>
- </el-form-item> -->
- <el-form-item label="投标日期" prop="c_zbtjr">
- <el-date-picker
- style="width: 100%"
- v-model="ruleKBJKForm.c_zbtjr"
- type="date"
- placeholder="请输入投标日期"
- />
- </el-form-item>
- <el-form-item label="投标报价" prop="c_tbbj">
- <el-input-number
- style="width: 100%"
- v-model="ruleKBJKForm.c_tbbj"
- controls-position="right"
- placeholder="请输入投标报价"
- />
- </el-form-item>
-
- </el-form>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogKBJKVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleKBJKSubmit(ruleKBJKFormRef)">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <!-- <el-dialog v-model="dialogZBJKVisible" draggable title="提示信息" width="500">
- <div style="height: auto;overflow: auto;">
- <el-form
- ref="ruleZBJKFormRef"
- style="max-width: 600px"
- :model="ruleZBJKForm"
- :rules="zbjkrules"
- label-width="auto"
- >
- <el-form-item label="标题" prop="title">
- <el-input v-model="ruleZBJKForm.title" placeholder="请输入标题"/>
- </el-form-item>
- <el-form-item label="描述" prop="content">
- <el-input v-model="ruleZBJKForm.content" placeholder="请输入描述"/>
- </el-form-item>
- <el-form-item label="省份" prop="c_province">
- <el-input v-model="ruleZBJKForm.c_province" placeholder="请输入省份"/>
- </el-form-item>
- <el-form-item label="市区" prop="c_city">
- <el-input v-model="ruleZBJKForm.c_city" placeholder="请输入市区"/>
- </el-form-item>
- <el-form-item label="区县" prop="c_district">
- <el-input v-model="ruleZBJKForm.c_district" placeholder="请输入区县"/>
- </el-form-item>
- <el-form-item label="标题关键词" prop="c_title_key_word">
- <el-input v-model="ruleZBJKForm.c_title_key_word" placeholder="请输入标题关键词(逗号分隔)"/>
- </el-form-item>
- <el-form-item label="发布机构关键字" prop="c_publisher_key_word">
- <el-input v-model="ruleZBJKForm.c_publisher_key_word" placeholder="请输入发布机构关键字(逗号分隔)"/>
- </el-form-item>
- </el-form>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogZBJKVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleZBJKSubmit(ruleZBJKFormRef)">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog> -->
- <el-dialog v-model="dialogZBJKVisible" draggable title="提示信息" width="500">
- <div style="height: auto;overflow: auto;">
- <el-select v-model="ruleZBJKForm.c_project_jkname" placeholder="请选择匹配的项目" value-key="value" @change="handleJKTypeChange" >
- <el-option v-for="item in zbjkProject" :key="item.id" :label="item.name" :value="item.id" />
- </el-select>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <!-- <el-button @click="dialogZBJKVisible = false" class="btn">取消</el-button> -->
- <el-button type="primary" class="btn enter-btn" @click="handleJKZBJKSubmit()">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogZBVisible" draggable title="提示信息" width="500">
- <div style="overflow: auto;">
- <el-form
- ref="ruleZBFormRef"
- style="max-width: 600px"
- :model="ruleZBForm"
- :rules="zbrules"
- label-width="auto"
- >
- <el-form-item label="招标编码" prop="c_project_code">
- <el-input v-model="ruleZBForm.c_project_code" placeholder="请输入招标编码"/>
- </el-form-item>
- <el-form-item label="招标项目名称" prop="c_project_name">
- <el-input v-model="ruleZBForm.c_project_name" placeholder="请输入招标项目名称"/>
- </el-form-item>
- <el-form-item label="招标金额" prop="c_budget_amount">
- <el-input-number
- style="width: 100%"
- v-model="ruleZBForm.c_budget_amount"
- controls-position="right"
- placeholder="请输入招标金额"
- />
- </el-form-item>
- <el-form-item label="数据源名称" prop="c_source_name">
- <el-input v-model="ruleZBForm.c_source_name" placeholder="例:上海政府采购网"/>
- </el-form-item>
- <el-form-item label="发布机构" prop="c_author">
- <el-input v-model="ruleZBForm.c_author" placeholder="请输入发布机构"/>
- </el-form-item>
- <el-form-item label="发布时间" prop="c_publish_time">
- <el-date-picker
- style="width: 100%"
- v-model="ruleZBForm.c_publish_time"
- type="datetime"
- placeholder="请输入发布时间"
- />
- </el-form-item>
- <el-form-item label="开标时间" prop="c_bid_open_time">
- <el-date-picker
- style="width: 100%"
- v-model="ruleZBForm.c_bid_open_time"
- type="datetime"
- placeholder="请输入开标时间"
- />
- </el-form-item>
- <el-form-item label="招标详情URL" prop="c_detail_url">
- <el-input v-model="ruleZBForm.c_detail_url" placeholder="请输入招标详情URL"/>
- </el-form-item>
- </el-form>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogZBVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleZBSubmit(ruleZBFormRef)">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogBidVisible" draggable title="提示信息" width="500">
- <div style="height: 500px;overflow: auto;">
- <el-form
- ref="ruleBidFormRef"
- style="max-width: 600px"
- :model="ruleBidForm"
- :rules="bidRules"
- label-width="auto"
- >
- <el-form-item label="上传招标文件" prop="file1">
- <el-upload
- class="upload-demo"
- drag
- :auto-upload="false"
- v-model="ruleBidForm.file1.name"
- :accept="'.pdf,.docx,.doc'"
- :max-size="10 * 1024 * 1024"
- :limit="1"
- :on-change="handleFileChange"
- action=""
- >
- <!-- :on-change="handleFileChange" -->
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">
- <em>拖拽或点击选择文件到此处</em>
- </div>
- <template #tip>
- <div class="el-upload__tip">
- 仅支持PDF、DOCX、DOC格式,大小不超过10MB
- </div>
- </template>
- </el-upload>
- </el-form-item>
- <el-form-item label="上传采购需求文件" prop="file2">
- <el-upload
- class="upload-demo"
- drag
- :auto-upload="false"
- v-model="ruleBidForm.file2.name"
- :accept="'.pdf,.docx,.doc'"
- :max-size="10 * 1024 * 1024"
- :limit="1"
- :on-change="handleFileChange2"
- action=""
- >
- <!-- -->
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">
- <em>拖拽或点击选择文件到此处</em>
- </div>
- <template #tip>
- <div class="el-upload__tip">
- 仅支持PDF、DOCX、DOC格式,大小不超过10MB
- </div>
- </template>
- </el-upload>
- </el-form-item>
- <el-form-item label="上传澄清公告文件" >
- <el-upload
- class="upload-demo"
- drag
- v-model="ruleBidForm.file3.name"
- :auto-upload="false"
- :accept="'.pdf,.docx,.doc'"
- :max-size="10 * 1024 * 1024"
- :limit="1"
- :on-change="handleFileChange3"
- action=""
- >
- <!-- :on-remove="handleFileRemove3"
- :file-list="ruleBidForm.file3.file" -->
- <el-icon class="el-icon--upload"><upload-filled /></el-icon>
- <div class="el-upload__text">
- <em>拖拽或点击选择文件到此处</em>
- </div>
- <template #tip>
- <div class="el-upload__tip">
- 仅支持PDF、DOCX、DOC格式,大小不超过10MB
- </div>
- </template>
- </el-upload>
- </el-form-item>
-
- </el-form>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogBidVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleBidSubmit(ruleBidFormRef)">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogFinishBidVisible" draggable title="提示信息" width="350">
- <div style="margin-bottom: 5px;">
- <el-switch v-model="finishBidObjectTemp.flag" inline-prompt active-text="从中标结果中选择" inactive-text="手动输入" style="background-color: unset;" @change="handleSwitchChange"/>
- </div>
- <div v-if="finishBidObjectTemp.flag">
- <el-select v-model="finishBidObject" filterable placeholder="请选择" style="width: 100%;overflow: auto;" @change="handleChange" value-key="id">
- <el-option v-for="item in finishBidOption" :key="item.id" :label="item.title" :value="item" :title="item.title" style="width: 320px;"/>
- </el-select>
- <div v-if="finishBidObject?.c_detail_url" style="padding-top: 20px;text-align: center;color: var(--primary);">
- <strong style="cursor: pointer;" @click="handleOpenViewClick('0')">点击查看招标结果文件</strong>
- </div>
- </div>
- <div v-else>
- <el-input v-model="finishBidObjectTemp.url" placeholder="请输入中标结果URL"/>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogFinishBidVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleFinishBidSubmit()">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogFinishBidVisible2" draggable title="提示信息" width="350">
- <div v-if="finishBidObject?.c_detail_url" style="padding-top: 20px;text-align: center;color: var(--primary);">
- <strong style="cursor: pointer;" @click="handleOpenViewClick('0')">点击查看招标结果文件</strong>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogFinishBidVisible2 = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleFinishBidSubmit()">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogBidFileVisible" draggable title="提示信息" width="300">
- <div>
- <strong style="cursor: pointer;" @click="handleOpenViewClick('1')">点击查看招标公告</strong>
- </div>
-
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogBidFileVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="handleBidFileSubmit()">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogFormFileVisible" draggable title="提示信息" width="300">
- <el-input v-model="FileForm.name" autocomplete="off" placeholder="请输入文件名称"/>
- <div style="margin-top: 10px;">
- <el-upload
- class="upload-demo"
- action=""
- accept=".pdf,.doc,.docx"
- style="width: 100%;"
- :auto-upload="false"
- :on-change="handleCQFileChange"
- :file-list="fileList"
- limit="1"
- >
- <el-button size="small" type="primary" style="width: 268px;">点击上传文件</el-button>
- <!-- <template #tip>
- <div class="el-upload__tip">只能上传 jpg/png 文件,且不超过 500kb</div>
- </template> -->
- </el-upload>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="dialogFormFileVisible = false" class="btn">取消</el-button>
- <el-button type="primary" class="btn enter-btn" @click="submitFileForm(FileForm.value.file.raw)">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- <el-dialog v-model="dialogFormBidFileVisible" draggable title="提示信息" width="300">
- <!-- <el-input v-model="FileForm.name" autocomplete="off" placeholder="请输入文件名称"/> -->
- <div style="margin-top: 10px;">
- <el-upload
- class="upload-demo"
- action=""
- accept=".docx"
- style="width: 100%;"
- :auto-upload="false"
- :on-change="handleBidFileChange"
- :file-list="bidFileList"
- limit="1"
- >
- <el-button size="small" type="primary" style="width: 268px;">点击上传参考标书</el-button>
- <!-- <template #tip>
- <div class="el-upload__tip">只能上传 jpg/png 文件,且不超过 500kb</div>
- </template> -->
- </el-upload>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <!-- <el-button @click="dialogFormBidFileVisible = false" class="btn">取消</el-button> -->
- <el-button type="primary" class="btn enter-btn" @click="submitBidFileForm">
- 确认
- </el-button>
- </div>
- </template>
- </el-dialog>
- </div>
- </template>
- <script setup lang="ts">
- import { ref,reactive, onMounted } from 'vue'
- import { useRouter } from 'vue-router'
- const router = useRouter()
- import moment from 'moment'
- import api from '@/api/common'
- import CONFIG from '@/utils/config'
- import UTIL from '@/utils/util'
- import { ElMessage,ElLoading } from 'element-plus'
- import type { FormInstance, FormRules } from 'element-plus'
- // const filePath = '/static/data/杨浦区图书馆总馆物业管理服务项目投标文件.docx'
- const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
- const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
- const projects = ref<any>({})
- const soureProjects = ref<any>({})
- const left_btn_disabled = ref(false)
- const right_btn_disabled = ref(false)
- const dialogZBVisible = ref(false)
- const dialogZBJKVisible = ref(false)
- const tempTask = ref<any>({})
- const dialogBidVisible = ref(false)
- const ruleBidFormRef = ref<FormInstance>()
- const ruleBidForm = reactive<RuleForm>({
- title: '',
- content: '',
- file1: {
- name:'',
- file:null,
- },
- file2: {
- name:'',
- file:null,
- },
- file3: {
- name:'',
- file:null,
- },
- })
- const historyBidList = ref<any>([])
- const dialogBidFileVisible = ref(false)
- const bidRules = reactive<FormRules<RuleForm>>({
- file1: [
- { required: true, message: '请上传招标需求文件', trigger: 'blur' },
- ],
- file2: [
- { required: true, message: '请上传采购需求文件', trigger: 'blur' },
- ],
- })
- const steps = ref<any[]>([]);
- const stage = ref(Number(sessionStorage.getItem('progres')) || 0);
- const stepsType = ref('')
- // const swb_status = ref('1')
- // const jsb_status = ref('1')
- interface RuleForm {
- title?: string
- content?: string
- [key: string]: any
- }
- const ruleZBFormRef = ref<FormInstance>()
- const zbrules = reactive<FormRules<RuleForm>>({
- // title: [
- // { required: true, message: '请输入标题', trigger: 'blur' },
- // ],
- // content: [
- // { required: true, message: '请输入描述', trigger: 'blur' },
- // ],
- c_project_code: [
- { required: true, message: '请输入项目编码', trigger: 'blur' },
- ],
- c_project_name: [
- { required: true, message: '请输入项目名称', trigger: 'blur' },
- ],
- c_budget_amount: [
- { required: true, message: '请输入预算金额', trigger: 'blur' },
- ],
- c_bid_open_time: [
- { required: true, message: '请输入招标开始时间', trigger: 'blur' },
- ],
- c_source_name: [
- { required: true, message: '请输入来源名称', trigger: 'blur' },
- ],
- c_author: [
- { required: true, message: '请输入作者', trigger: 'blur' },
- ],
- c_publish_time: [
- { required: true, message: '请输入发布时间', trigger: 'blur' },
- ],
- c_detail_url: [
- { required: true, message: '请输入招标结果URL', trigger: 'blur' },
- ],
- })
- const ruleZBForm = reactive<RuleForm>({
- id:'',
- title: '',
- content: '',
- c_gp_catalog_name: '',
- c_province: '',
- c_bid_deadline: '',
- c_crawled_at: '',
- c_attachments_meta: '',
- c_match_score: '',
- c_bid_open_place: '',
- c_content_document: '',
- c_project_code:'',
- c_district:'',
- c_project_name:'',
- c_external_id:'',
- c_is_priority:'',
- c_bid_open_time:'',
- c_content_html_path:'',
- c_keywords_hit:'',
- c_path_name:'',
- c_content_fields:'',
- c_budget_amount:'',
- c_service_keywords:'',
- c_city:'',
- c_source_name:'',
- c_author:'',
- c_publish_time:'',
- c_source_id:'',
- c_priority:'',
- c_record_uuid:UTIL.generateUUID(),
- c_content_chunks:'',
- c_attachment_urls:'',
- c_detail_url:'',
- c_category_label:'',
- c_project_overview:'',
- c_procurement_method:'',
- c_bid_type:'0',//招标
- })
- // const dialogZBJKVisible = ref(false)
- // const ruleZBJKFormRef = ref<FormInstance>()
- // const zbjkrules = reactive<FormRules<RuleForm>>({
- // title: [
- // { required: true, message: '请输入标题', trigger: 'blur' },
- // ],
- // content: [
- // { required: true, message: '请输入描述', trigger: 'blur' },
- // ],
- // })
- const ruleZBJKForm = reactive<RuleForm>({
- title: '',
- content: '',
- c_province:'',
- c_city:'',
- c_district:'',
- c_project_code:'',
- c_title_key_word:'',
- c_publisher_key_word:'',
- c_complete:false,
- c_gl_xm:'',
- c_enable: true
- })
- const dialogKBJKVisible = ref(false)
- const ruleKBJKFormRef = ref<FormInstance>()
- const kbjkrules = reactive<FormRules<RuleForm>>({
- // title: [
- // { required: true, message: '请输入标题', trigger: 'blur' },
- // ],
- // content: [
- // { required: true, message: '请输入描述', trigger: 'blur' },
- // ],
- c_zbtjr: [
- { required: true, message: '请输入投标时间', trigger: 'blur' },
- ],
- c_tbbj: [
- { required: true, message: '请输入投标报价', trigger: 'blur' },
- ],
- })
- const ruleKBJKForm = reactive<RuleForm>({
- title: '',
- content: '',
- c_jksm:'',
- c_zbbh:'',
- c_sfzb:false,
- c_kbsj:'',
- c_xmmc:'',
- // c_zbtjr:moment('2026-06-29 10:00:00').format('YYYY-MM-DD HH:mm:ss'),
- c_zbtjr:'',
- c_tbbj:'',
- c_glxm:'',
- c_enable: true
- })
- const dialogFinishBidVisible = ref(false)
- const dialogFinishBidVisible2 = ref(false)
- const finishBidObjectTemp = ref({
- flag:false,
- url:''
- })
- const finishBidObject = ref<any>(null)
- const finishBidOption = ref([{} as RuleForm])
- const goToPage = (path: string) => {
- router.push(path)
- }
- onMounted(() => {
- initCName()
- initData()
- })
- const wtfwOptions = ref<any>([])
- const getWTFWLabel = (value: string) => {
- return wtfwOptions.value.find((item: any) => item.value == value)?.label || '-'
- }
- const getDmsTypes = async (cName: string) => {
- const params = {
- type: 0,
- cName: cName,
- }
- const res = await api.getDmsTypes(params)
- if ((res as any).code === 200) {
- const ret = (res as any).content
- return ret.map((item: any) => ({
- ...item,
- label: item.name,
- value: item.index
- }))
- } else {
- return []
- }
- }
- const initCName = async () => {
- // 并行请求两个字典,比await串行更快
- const [wtOptions,] = await Promise.all([
- getDmsTypes("sq_wtfs"),
- ])
- wtfwOptions.value = wtOptions
- }
- const initData = () => {
- stage.value = Number(Number(sessionStorage.getItem('progres')) || 0);
- getProjects();
- getStage()
- }
- const getStage = () => {
- steps.value = [
- { n: 1, label: '预警触发', status: '', title:'预警触发',text:'忽略预警触发,准备进入投/续标准备阶段。',left_btn_text:'忽略预警 · 启动续标',left_url:'' },
- { n: 2, label: '投/续标准备', status: '', title:'投/续标准备',text:'确认客户回访与现场踏勘和服务评估后,准备进入招标监控阶段。',left_btn_text:'进入招标监控',left_url:'' },
- { n: 3, label: '招标监控', status: '', title:'监控招标公告',text:'系统正在监控,匹配本项目续标公告。',left_btn_text:'进入标书制作',left_url:''},
- { n: 4, label: '标书制作', status: '', title:'制作续标投标文件',text:'招标文件已就绪,进入标书编制完成拆解与生成。',left_btn_text:'生成商务标书',left_url:'',right_btn_text:'生成技术标书',right_url:''},
- { n: 5, label: '投标提交', status: '', title:'提交投标并登记',text:'标书完成后,登记投标信息以便开标监控。',left_btn_text:'登记投标',left_url:'',right_btn_text:'',right_url:''},
- { n: 6, label: '开标监控', status: '', title:'开标监控中',text:'已登记投标,在开标时间内监控开标结果。',left_btn_text:'查看监控详情',left_url:'/bid-result',right_btn_text:'进入中标推送',right_url:''},
- { n: 7, label: '中标推送', status: '', title:'中标推送',text:'开标结果已出,请确认中标信息并推送至各职能部门',left_btn_text:'',left_url:'/bid-result',right_btn_text:'',right_url:''},
- ]
- steps.value.forEach((item: any) => {
- if (item.n < stage.value) {
- item.status = 'done'
- }else if (item.n == stage.value) {
- item.status = 'active'
- }else{
- item.status = ''
- }
- })
- }
- const confirmTask = async (task: any) => {
- tempTask.value = {}
- if(task.id == "1" || task.id == "2"){
- const msg = getMessage(2)
- if(msg){
- ElMessage.error(msg)
- }else{
- updaterwlcqdProject(task)
- }
- }else if(task.id == "3"){
- const msg = getMessage(3)
- if(msg){
- ElMessage.error(msg)
- }else{
- tempTask.value = task
- if(task.type != 2){
- dialogZBVisible.value = true
- }else{
- dialogZBJKVisible.value = true
- }
-
- }
- }else if(task.id == "4"){
- const msg = getMessage(4)
- if(msg){
- ElMessage.error(msg)
- }else{
- tempTask.value = task
- dialogBidFileVisible.value = true
- }
- }else if(task.id == "5"){
- const msg = getMessage(4)
- if(msg){
- ElMessage.error(msg)
- }else{
- updaterwlcqdProject(task)
- }
- }else if(task.id == "6"){
- updaterwlcqdProject(task)
- }else if(task.id == "7"){
- const res = await getfinishProjects()
- if(res){
- finishBidOption.value = res
- if(task.type != 2){
- dialogFinishBidVisible.value = true
- dialogFinishBidVisible2.value = false
- }else{
- dialogFinishBidVisible2.value = true
- dialogFinishBidVisible.value = false
- }
- }else{
- finishBidOption.value = []
- }
- }else if(task.id == "8"){
- sessionStorage.setItem('activeTab','won')
- sessionStorage.setItem('jkId', projects.value.c_xgjk);
- goToPage('/bid-result')
- }
- }
- const getMessage = (ids: any) => {
- if(ids == stage.value){
- return ""
- }else{
- return "请先执行完"+steps.value.filter((item: any) => item.n == stage.value)[0].label
- }
- }
- // 点击进入下一步
- const handleViewClick = (item: any,type: string) => {
- if(item.n == 1){
- updateProject()
- }else if(item.n == 2){
- let flag = projects.value.rwlcqd.find((p: any) => p.id == '1').done
- let flag2 = projects.value.rwlcqd.find((p: any) => p.id == '2').done
- if(flag && flag2){
- updateProject()
- ruleZBJKForm.title = projects.value.title,
- ruleZBJKForm.content = projects.value.content,
- ruleZBJKForm.c_province = projects.value.sourceProject.c_sfzxs,
- ruleZBJKForm.c_city = projects.value.sourceProject.c_sfzxs,
- ruleZBJKForm.c_district = projects.value.sourceProject.c_sq,
- // ruleZBJKForm.c_project_code = projects.value.xmbh
- ruleZBJKForm.c_title_key_word = projects.value.c_xmbt,
- ruleZBJKForm.c_publisher_key_word = projects.value.c_xfyt,
- ruleZBJKForm.c_complete = false,
- ruleZBJKForm.c_gl_xm = projects.value.id,
- ruleZBJKForm.c_enable = true
- addContentParams(ruleZBJKForm,CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2])
-
- if(projects.value.c_xgzb){
- let str = {id: (item.n+1)}
- updaterwlcqdProject(str)
- }
- }else{
- ElMessage.error("请先确认任务清单中的客户回访与现场踏勘和服务评估")
- }
- }else if(item.n == 3){
- let flag = projects.value.rwlcqd.find((p: any) => p.id == '3').done
- if(flag){
- updateProject()
- }else{
- ElMessage.error("请先确认匹配标书,待匹配完成后,可进入标书制作")
- }
-
- }else if(item.n == 4){
- if(type == 'cqgg'){
- dialogFormFileVisible.value = true
- }else if(stepsType.value == '1'){
- let flag = projects.value.rwlcqd.find((p: any) => p.id == '4').done
- if(flag){
- dialogBidVisible.value = true
- }else{
- ElMessage.error("请先报名获取招标文件后,可进行提交资料")
- }
-
- }else if(stepsType.value == '2'){
- let flag = projects.value.rwlcqd.find((p: any) => p.id == '5').done
- if(flag){
- if(soureProjects.value.c_history_tender){// 有历史标书
- if(soureProjects.value.c_history_tender.indexOf(".docx") != -1){// 历史标书是正常的docx文件
- // 生成招标文件
- api.getGenerateTender({txbId: projects.value.id}).then((res: any) => {
- if ((res as any).code === 200) {
- updateTypeProject(3)
- ElMessage.success("标书文件生成成功")
- bidFile.value.isFileFlag = false
- sessionStorage.setItem('isFileFlag', 'false')
- }else{
- ElMessage.error((res as any).content || "标书文件生成失败")
- }
- })
- }else{
- ElMessage.error("请先确认上传参考标书")
- bidFile.value.isFileFlag = false
- sessionStorage.setItem('isFileFlag', 'false')
- }
- }else{
- // 无历史标书
- ElMessage.error("请先确认上传参考标书")
- bidFile.value.isFileFlag = false
- sessionStorage.setItem('isFileFlag', 'false')
- }
-
-
- }else{
- ElMessage.error("请先确认标书需求拆解与生成")
- }
- }else if(stepsType.value == '4'){
- updateProject()
- }
- }else if(item.n == 5){
- let flag = projects.value.rwlcqd.find((p: any) => p.id == '6').done
- if(flag){
- dialogKBJKVisible.value = true
- }else{
- ElMessage.error("请先确认登记投标信息")
- }
- }else if(item.n == 6){
- if(type == 'detail'){
- goToPage(item.left_url)
- }else{
- let flag = projects.value.rwlcqd.find((p: any) => p.id == '7').done
- if(flag){
- updateProject()
- // 修改中标监控
- updateJKLCProject()
- }else{
- ElMessage.error("请先确认开标监控,待开标监控完成后,可进入中标推送")
- }
- }
- }else{
- sessionStorage.setItem('activeTab','won')
- sessionStorage.setItem('jkId', projects.value.c_xgjk);
- goToPage(item.left_url)
- }
- }
- //只修改项目进度
- const updateProject = async () => {
- let xmjd_json = projects.value.c_xmjd_json;
- xmjd_json[xmjd_json.length-1].create_time = moment().format('YYYY-MM-DD HH:mm')
- xmjd_json[xmjd_json.length-1].username = userName
- xmjd_json[xmjd_json.length-1].userid = userInfo?.id || ''
- xmjd_json[xmjd_json.length-1].type = 0
- let str = {xmjd: (stage.value+1), type: 1, create_time: '', username: '', userid: ''}
- xmjd_json.push(str)
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- modelId: CONFIG.MODELIDARR[0],
- content: JSON.stringify({
- id: projects.value.id,
- c_xmjd_json: xmjd_json
- }),
- }
- const res = await api.updateContent(params)
- if ((res as any).code === 200) {
- sessionStorage.setItem('progres', (stage.value+1).toString());
- initData()
- }else{
- sessionStorage.setItem('progres', (stage.value).toString());
- }
- }
- // 更新项目流程状态
- const updaterwlcqdProject = async (item:any) => {
- projects.value.rwlcqd.find((p: any) => p.id == item.id).done = true
- projects.value.rwlcqd.find((p: any) => p.id == item.id).create_time = moment().format('YYYY-MM-DD HH:mm')
- projects.value.rwlcqd.find((p: any) => p.id == item.id).username = userName
- projects.value.rwlcqd.find((p: any) => p.id == item.id).userid = userInfo?.id || ''
- projects.value.rwlcqd.find((p: any) => p.id == item.id).type = 0
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- modelId: CONFIG.MODELIDARR[0],
- content: JSON.stringify({
- id: projects.value.id,
- rwlcqd:projects.value.rwlcqd
- }),
- }
- const res = await api.updateContent(params)
- if ((res as any).code === 200) {
- initData()
- }
- }
- // 更新投续标
- const updateTXBProject = async (columnId:any,modelId:any,content:any) => {
- const params: any = {
- columnId: columnId,
- modelId: modelId,
- content: JSON.stringify(content),
- }
- const res = await api.updateContent(params)
- if ((res as any).code === 200) {
- sessionStorage.setItem('progres', (stage.value+1).toString());
- initData()
- }else{
- sessionStorage.setItem('progres', (stage.value).toString());
- }
- }
- const getProjects = async () => {
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
- states: '0,1,2,3',
- pageSize: 10,
- page: 0
- }
- if (sessionStorage.getItem('dmsId')) {
- params.search = JSON.stringify([
- ...(params.search ? JSON.parse(params.search) : []),
- {
- field: "id",
- searchType: 1,
- content: { value: sessionStorage.getItem('dmsId') },
- },
- ]);
- }
- const res = await getDmsDataList(params)
- if ((res as any).code === 200) {
- // 使用 Promise.all 等待所有异步操作完成
- const data = (res as any).content.data
- const promises = data.map((item: any) =>
- calculateRemaining(
- // item.c_is_xb == true ? item.c_kssj : item.zbkssj,
- // item.c_is_xb == true ? item.c_dqsj : item.zbjzsj,
- item.c_kssj,
- item.c_dqsj,
- item.zbxmbh,
- item.xmbh,
- ).then(result => ({
- ...item,
- zbmsxx:item.zbmsxx == undefined ? {} : JSON.parse(item.zbmsxx),
- c_xmjd_json:JSON.parse(item.c_xmjd_json),
- rwlcqd:JSON.parse(item.rwlcqd),
- ...result
- }))
- )
- const result = await Promise.all(promises)
- projects.value = result[0]
- stepsType.value = projects.value.c_xmjd_json[projects.value.c_xmjd_json.length-1].type
- // swb_status.value = projects.value.c_xmjd_json[projects.value.c_xmjd_json.length-1].typeObj?.swb || ''
- // jsb_status.value = projects.value.c_xmjd_json[projects.value.c_xmjd_json.length-1].typeObj?.jsb || ''
- historyBidList.value = []
- soureProjects.value = await getSoureProjects(CONFIG.COLUMNIDARR[0],projects.value.xmbh,"c_guid")
- historyBidList.value = [{
- year: soureProjects.value.c_guid.substring(10,14),
- name: soureProjects.value.c_xmmc,
- type: "中标",
- money: soureProjects.value.c_nhhtsr,
- address: soureProjects.value.c_query_address || ''
- }]
- }
-
- if(projects.value.rwlcqd[2].done == false){//匹配招标监控
- getzbjkPorject(projects.value.id)
- }
- if(projects.value.rwlcqd[5].done == true && projects.value.rwlcqd[6].done == false){//匹配开标监控
- getkbjkPorject(projects.value.c_xgjk)
- }
- }
- const zbjkProject = ref<any[]>([]);
- const getzbjkPorject = async (id:any) => {
- const ret = await getTypeProjects(CONFIG.COLUMNIDARR[5],id,"c_gl_xm")
- if(ret.c_result_json){
- const reslust = JSON.parse(ret.c_result_json)
- let arr:any[] = []
- reslust.notices.forEach((item:any) => {
- let str = {id:item.data.id,type:item.type,name:item.data.title || ''}
- arr.push(str)
- })
- reslust.intents.forEach((item:any) => {
- let str = {id:item.data.id,type:item.type,name:item.data.title || ''}
- arr.push(str)
- })
- zbjkProject.value = arr
- updaterwlcqdProject2(projects.value,2)//匹配招标监控成功,进行修改投续标流程状态
- }
- }
- const getkbjkPorject = async (id:any) => {
- const ret = await getTypeProjects(CONFIG.COLUMNIDARR[6],id,"id")
- if(ret){
- if(ret.c_jgjk_url){
- let str = {c_detail_url:ret.c_jgjk_url}
- finishBidObject.value = str
- updaterwlcqdProject2(projects.value,6)//匹配开标监控成功,进行修改投续标流程状态
- }
- }
- }
- // 匹配招标有数据进行更新项目流程状态
- const updaterwlcqdProject2 = async (item:any,lcid:any) => {
- item.rwlcqd[lcid].type = 2
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- modelId: CONFIG.MODELIDARR[0],
- content: JSON.stringify({
- id: item.id,
- rwlcqd:item.rwlcqd
- }),
- }
- await api.updateContent(params)
- }
- // 项目类型改变时,进行更新项目类型
- const handleJKTypeChange = async (val:any) => {
- console.log(val)
- let opt = zbjkProject.value.find((item:any) => item.id == val)
- console.log(opt)
- if(opt){
- if(opt.type == 'notice'){//公告
- let ret = await getSoureProjects(CONFIG.COLUMNIDARR[3],opt.id,"id")
- console.log(ret)
- ruleZBForm.c_project_code = ret.c_project_code || ""
- ruleZBForm.c_project_name = ret.c_project_name || ""
- ruleZBForm.c_budget_amount = ret.c_budget_amount || ""
- ruleZBForm.c_bid_open_time = ret.c_bid_open_time || ""
- ruleZBForm.c_bid_deadline = ret.c_bid_deadline || ""
- ruleZBForm.c_source_name = ret.c_source_name || ""
- ruleZBForm.c_author = ret.c_author || ""
- ruleZBForm.c_publish_time = ret.c_publish_time || ""
- ruleZBForm.c_detail_url = ret.c_detail_url || ""
- }else{//意向
- let ret = await getSoureProjects(CONFIG.COLUMNIDARR[4],opt.id,"id")
- console.log(ret)
- ruleZBForm.c_project_code = ret.id || ""
- ruleZBForm.c_project_name = ret.title || ""
- ruleZBForm.c_budget_amount = 0
- ruleZBForm.c_bid_open_time = ret.c_publish_time || ""
- ruleZBForm.c_bid_deadline = ret.c_publish_time || ""
- ruleZBForm.c_source_name = ret.c_source_name || ""
- ruleZBForm.c_author = ret.c_author || ""
- ruleZBForm.c_publish_time = ret.c_publish_time || ""
- ruleZBForm.c_detail_url = ret.c_detail_url || ""
- }
- }
- }
- // 匹配招标监控
- const handleJKZBJKSubmit = async () => {
- dialogZBJKVisible.value = false
- let formData = {
- c_project_code:ruleZBForm.c_project_code,
- c_project_name:ruleZBForm.c_project_name,
- c_budget_amount:ruleZBForm.c_budget_amount,
- c_bid_open_time:moment(ruleZBForm.c_bid_open_time, 'YYYY年MM月DD日 HH:mm').format('YYYY-MM-DD HH:mm'),
- c_bid_deadline:moment(ruleZBForm.c_bid_open_time, 'YYYY年MM月DD日 HH:mm').format('YYYY-MM-DD HH:mm'),
- c_source_name:ruleZBForm.c_source_name,
- c_author:ruleZBForm.c_author,
- c_publish_time:ruleZBForm.c_publish_time,
- c_detail_url:ruleZBForm.c_detail_url,
- }
- updateZBProject(tempTask.value,formData,ruleZBForm.c_project_code)
- getProjectParams(projects.value.id,'c_gl_xm',CONFIG.COLUMNIDARR[5]).then(async res => {
- const reslust = (res as any)[0]
- const content = {
- id: reslust.id,
- c_complete: true,
- c_enable: false
- }
- updateProjectParams(CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2], content)
- })
- }
- const getSoureProjects = async (columnId:number,ids: string,type: string) =>{
- const params: any = {
- columnId: columnId,
- states: '0,1,2,3',
- pageSize: 1,
- page: 0
- }
- if (ids !== "") {
- params.search = JSON.stringify([
- ...(params.search ? JSON.parse(params.search) : []),
- {
- field: type,
- searchType: 2,
- content: { value: `%${ids}%` },
- },
- ]);
- }
- const res = await getDmsDataList(params)
- if((res as any).code == 200){
- return (res as any).content.data[0]
- }else{
- return ''
- }
-
- }
- const getDmsDataList = async (params: any) => {
- return await api.getDmsDataList(params)
- }
- const calculateRemaining = async (st: string, et: string, zbxmbh: string,xmbh: string): Promise<{ days: string; daysClass: string; year: string; type: string, zbProject: any,sourceProject:any }> => {
- if (!et) return { days: '', daysClass: '', year: '', type: '', zbProject: {},sourceProject:{} }
- const startDate = moment(moment(st).format('YYYY-MM-DD'), 'YYYY-MM-DD')
- const expireDate = moment(moment(et).add(0, 'days').format('YYYY-MM-DD'), 'YYYY-MM-DD')
-
- if (!startDate.isValid() || !expireDate.isValid()) {
- return { days: '', daysClass: '', year: '', type: '', zbProject: {},sourceProject:{} }
- }
- const zbProject = await getTypeProjects(CONFIG.COLUMNIDARR[3],zbxmbh,"id")
- const sourceProject = await getTypeProjects(CONFIG.COLUMNIDARR[0],xmbh,"c_guid")
- const today = moment().startOf('day')
- const diffDays = expireDate.diff(today, 'days')
-
- let yearNum = 0
- if (today.isAfter(expireDate)) {
- yearNum = expireDate.year() - startDate.year()
- } else {
- yearNum = today.year() - startDate.year()
- if (yearNum > expireDate.year() - startDate.year()) {
- yearNum = expireDate.year() - startDate.year()
- }
- if (yearNum < 0) yearNum = 0
- }
- if (diffDays < 0) {
- return { days: `${Math.abs(diffDays)}`, daysClass: 'grey', year: yearNum.toString(), type: '已完成', zbProject:zbProject,sourceProject:sourceProject }
- } else if (diffDays === 0) {
- return { days: '0', daysClass: 'grey', year: yearNum.toString(), type: '进行中', zbProject:zbProject,sourceProject:sourceProject }
- } else if (diffDays <= 60) {
- return { days: `${diffDays}`, daysClass: 'red', year: yearNum.toString(), type: '进行中', zbProject:zbProject,sourceProject:sourceProject }
- } else if (diffDays <= 90) {
- return { days: `${diffDays}`, daysClass: 'orange', year: yearNum.toString(), type: '监控中', zbProject:zbProject,sourceProject:sourceProject }
- } else if (diffDays <= 180) {
- return { days: `${diffDays}`, daysClass: 'yellow', year: yearNum.toString(), type: '监控中', zbProject:zbProject,sourceProject:sourceProject }
- } else {
- return { days: `${diffDays}`, daysClass: 'green', year: yearNum.toString(), type: '监控中', zbProject:zbProject,sourceProject:sourceProject }
- }
- }
- const getTypeProjects = async (columnId: number,id: string,type:string) => {
- const params: any = {
- columnId: columnId,
- orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
- states: '0,1,2,3',
- pageSize: 1,
- page: 0
- }
- params.search = JSON.stringify([
- ...(params.search ? JSON.parse(params.search) : []),
- {
- field: type,
- searchType: 1,
- content: { value: id },
- },
- ]);
- const res = await getDmsDataList(params)
- if ((res as any).code === 200) {
- return (res as any).content.data[0]
- }else{
- return {}
- }
- }
- const getfinishProjects = async () => {
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[7],
- orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
- states: '0,1,2,3',
- pageSize: 9999,
- page: 0
- }
- const res = await getDmsDataList(params)
- if ((res as any).code === 200) {
- return (res as any).content.data
- }else{
- return {}
- }
- }
- // const addContent = async (formData: any) => {
- // const params = {
- // content: JSON.stringify(formData),
- // columnId: CONFIG.COLUMNIDARR[3],
- // modelId: CONFIG.MODELIDARR[1],
- // }
- // const res = await api.addContent(params)
- // if((res as any).code === 200){
- // ElMessage.success('添加成功')
- // updateZBProject(tempTask.value,formData,(res as any).content)
- // dialogZBVisible.value = false
- // }else{
- // // ElMessage.error('添加失败')
- // dialogZBVisible.value = false
- // }
- // }
- const addContentParams = async (formData: any,columnId:number,modelId:number) => {
- const params = {
- content: JSON.stringify(formData),
- columnId: columnId,
- modelId: modelId,
- }
- const res = await api.addContent(params)
- return res
- }
- //更新招标数据进入到投续标
- const updateZBProject = async (item:any,formData:any,contentId:any) => {
- projects.value.rwlcqd.find((p: any) => p.id == item.id).done = true
- projects.value.rwlcqd.find((p: any) => p.id == item.id).create_time = moment().format('YYYY-MM-DD HH:mm')
- projects.value.rwlcqd.find((p: any) => p.id == item.id).username = userName
- projects.value.rwlcqd.find((p: any) => p.id == item.id).userid = userInfo?.id || ''
- projects.value.rwlcqd.find((p: any) => p.id == item.id).type = 0
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- modelId: CONFIG.MODELIDARR[0],
- content: JSON.stringify({
- id: projects.value.id,
- rwlcqd:projects.value.rwlcqd,
- c_xgzb:contentId,
- zbxmbh:contentId,
- zbmsxx:JSON.stringify({
- zb_project_code:formData.c_project_code,
- zb_source_name:formData.c_source_name,
- zb_project_name:formData.c_project_name,
- zb_budget_amount:formData.c_budget_amount,
- zb_detail_url:formData.c_detail_url,
- zb_publish_time:formData.c_publish_time,
- zb_bid_deadline:formData.c_bid_deadline,
- zb_author:formData.c_author,
- }),
- zbkssj:moment(formData.c_publish_time).format('YYYY-MM-DD HH:mm'),
- zbjzsj:moment(formData.c_bid_deadline).format('YYYY-MM-DD HH:mm'),
- }),
- }
- const res = await api.updateContent(params)
- if ((res as any).code === 200) {
- ElMessage.success('更新成功')
- dialogZBVisible.value = false
- setTimeout(() => {
- initData()
- }, 1000);
- }
- }
- const handleZBSubmit = async (formEl: FormInstance | undefined) => {
- if (!formEl) return
- await formEl.validate((valid) => {
- if (valid) {
- let formData = {
- c_project_code:ruleZBForm.c_project_code,
- c_project_name:ruleZBForm.c_project_name,
- c_budget_amount:ruleZBForm.c_budget_amount,
- c_bid_open_time:ruleZBForm.c_bid_open_time,
- c_bid_deadline:ruleZBForm.c_bid_open_time,
- c_source_name:ruleZBForm.c_source_name,
- c_author:ruleZBForm.c_author,
- c_publish_time:ruleZBForm.c_publish_time,
- c_detail_url:ruleZBForm.c_detail_url,
- }
- updateZBProject(tempTask.value,formData,ruleZBForm.c_project_code)
- getProjectParams(projects.value.id,'c_gl_xm',CONFIG.COLUMNIDARR[5]).then(async res => {
- const reslust = (res as any)[0]
- const content = {
- id: reslust.id,
- c_complete: true,
- c_enable: false
- }
- updateProjectParams(CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2], content)
- })
-
- dialogZBVisible.value = false
- } else {
- // ElMessage.error('请填写完整信息')
- // dialogZBVisible.value = false
- }
- })
- }
- // const handleZBJKSubmit = async (formEl: FormInstance | undefined) => {
- // if (!formEl) return
- // await formEl.validate(async (valid) => {
- // if (valid) {
- // ruleZBJKForm.c_project_code = projects.value.xmbh
- // ruleZBJKForm.c_gl_xm = projects.value.id
- // const res = await addContentParams(ruleZBJKForm,CONFIG.COLUMNIDARR[5],CONFIG.MODELIDARR[2])
- // if((res as any).code === 200){
- // // updateTypeProject(2)
- // }
- // } else {
- // }
- // dialogZBJKVisible.value = false
- // })
- // }
-
- const handleKBJKSubmit = async (formEl: FormInstance | undefined) => {
- if (!formEl) return
- await formEl.validate(async (valid) => {
- if (valid) {
- ruleKBJKForm.c_glxm = projects.value.xmbh
- ruleKBJKForm.c_xmmc = projects.value.c_xmbt
- ruleKBJKForm.c_zbbh = projects.value.zbxmbh
- ruleKBJKForm.c_kbsj = moment(projects.value.zbkssj).format('YYYY-MM-DD HH:mm')
- ruleKBJKForm.title = projects.value.c_xmbt
- ruleKBJKForm.content = projects.value.content
- ruleKBJKForm.c_enable = true
- const res = await addContentParams(ruleKBJKForm,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
-
- projects.value.rwlcqd.find((p: any) => p.id == 5).done = true
- projects.value.rwlcqd.find((p: any) => p.id == 5).create_time = moment().format('YYYY-MM-DD HH:mm')
- projects.value.rwlcqd.find((p: any) => p.id == 5).username = userName
- projects.value.rwlcqd.find((p: any) => p.id == 5).userid = userInfo?.id || ''
- projects.value.rwlcqd.find((p: any) => p.id == 5).type = 0
- let xmjd_json = projects.value.c_xmjd_json;
- xmjd_json[xmjd_json.length-1].create_time = moment().format('YYYY-MM-DD HH:mm')
- xmjd_json[xmjd_json.length-1].username = userName
- xmjd_json[xmjd_json.length-1].userid = userInfo?.id || ''
- xmjd_json[xmjd_json.length-1].type = 0
- let str = {xmjd: (stage.value+1), type: 1, create_time: '', username: '', userid: ''}
- xmjd_json.push(str)
- let constParams = {
- id: projects.value.id,
- rwlcqd:projects.value.rwlcqd,
- c_xmjd_json: xmjd_json,
- c_xgjk:(res as any).content,
- tbrq:ruleKBJKForm.c_zbtjr,
- tbbj:ruleKBJKForm.c_tbbj,
- }
- updateTXBProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],constParams)
- dialogKBJKVisible.value = false
- } else {
- }
-
- })
- }
- const handleBidSubmit = async (formEl: FormInstance | undefined) => {
- if (!formEl) return
- await formEl.validate((valid) => {
- if (valid) {
- // ruleBidForm.file3.file.forEach((item: any) => {
- // submitFileForm(item.raw)
- // })
- const loading = ElLoading.service({
- lock: true,
- text: '上传中...',
- background: 'rgba(0, 0, 0, 0.7)',
- })
- updateTypeProject(2)
- if(ruleBidForm.file3.name){//做澄清文件
- submitFileForm(ruleBidForm.file3.raw)
- }
- updateFIleProject(loading)//更新项目文件
- // setTimeout(() => {
- // dialogBidVisible.value = false
- // loading.close()
- // ElMessage.success('上传成功')
- // }, 2000);
- } else {
- }
- })
- }
- const handleOpenViewClick = (type:any) => {
- if(type == '0'){
- window.open(finishBidObject.value.c_detail_url)
- }else if(type == '1'){
- window.open(projects.value.zbmsxx.zb_detail_url)
- }
- }
- const handleBidFileSubmit = () => {
- dialogBidFileVisible.value = false
- updaterwlcqdProject(tempTask.value)
- }
- const dialogFormFileVisible = ref(false)
- const dialogFormBidFileVisible = ref(false)
- const FileForm = ref<RuleForm>({})
- const fileList = ref([])
- const handleCQFileChange = (file: any) => {
- FileForm.value.name = file.name
- FileForm.value.file = file
- }
- const BidFileForm = ref<RuleForm>({})
- const bidFileList = ref([])
- const handleBidFileChange = (file: any) => {
- BidFileForm.value.name = file.name
- BidFileForm.value.file = file
- }
- const submitBidFileForm = () => {
- console.log(BidFileForm.value)
- const columnId = CONFIG.COLUMNIDARR[0]
- const params: any = {
- columnId: columnId,
- contentId: soureProjects.value.id,
- paraName: 'c_history_tender',
- type: 3,
- file: BidFileForm.value.file.raw
- }
- api.uploadFile(params).then((res: any) => {
- if((res as any).code === 200){
- const content = res.content
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[0],
- modelId: CONFIG.MODELIDARR[7],
- content: JSON.stringify({
- id: soureProjects.value.id,
- c_history_tender: content,
- }),
- }
- api.updateContent(params).then((res: any) => {
- if((res as any).code === 200){
- dialogFormBidFileVisible.value = false
- bidFile.value.isFileFlag = true
- sessionStorage.setItem('isFileFlag', 'true')
- }
- })
- }else{
- ElMessage.error('上传失败')
- }
- })
- }
- const submitFileForm = (file:any) => {
- const columnId = CONFIG.COLUMNIDARR[10]
- const modelId = CONFIG.MODELIDARR[5]
- const params: any = {
- columnId: columnId,
- contentId: 'content',
- paraName: 'c_cqgg',
- type: 3,
- file: file
- }
- api.uploadFile(params).then((res: any) => {
- if((res as any).code === 200){
- // ElMessage.success('上传成功')
- const path = (res as any).content
- getProjectParams(projects.value.id,'c_gltxbid',columnId).then(async res2 => {
- let arr = []
- if((res2 as any).length > 0){
- const reslust = (res2 as any)[0]
- arr = await JSON.parse(reslust.c_cqgg)
- arr.push({
- path: path,
- name: file.name,
- create_time: moment().format('YYYY-MM-DD HH:mm'),
- author: userName,
- })
- const params: any = {
- columnId: columnId,
- modelId: modelId,
- content: JSON.stringify({
- id: reslust.id,
- c_cqgg: arr,
- }),
- }
- api.updateContent(params)
- }else{
- arr.push({
- path: path,
- name: file.name,
- create_time: moment().format('YYYY-MM-DD HH:mm'),
- author: userName,
- })
- let formData = {
- c_gltxbid: projects.value.id,
- title: file.name,
- content: file.name,
- c_cqgg: JSON.stringify(arr),
- }
- const params = {
- content: JSON.stringify(formData),
- columnId: columnId,
- modelId: modelId,
- }
- api.addContent(params)
- }
- })
-
-
- }
- })
- dialogFormFileVisible.value = false
- }
- //获取数据
- const getProjectParams = async (id: string,type: string,columnId: number) => {
- const params: any = {
- columnId: columnId,
- states: '0,1,2,3',
- pageSize: 1,
- page: 0
- }
- if (id !== "") {
- params.search = JSON.stringify([
- ...(params.search ? JSON.parse(params.search) : []),
- {
- field: type,
- searchType: 2,
- content: { value: `%${id}%` },
- },
- ]);
- }
- const res = await getDmsDataList(params)
- if ((res as any).code === 200) {
- return (res as any).content.data
- }else{
- return []
- }
- }
- // const filename = ref('')
- const handleFileChange = (file: any) => {
- ruleBidForm.file1 = file
- }
- const handleFileChange2 = (file: any) => {
- ruleBidForm.file2 = file
- }
- const handleFileChange3 = (file: any) => {
- // filename.value = file.raw.name
- ruleBidForm.file3 = file
- }
- // const handleFileChange3 = (file: any,fileList:any) => {
- // filename.value = file.raw.name
- // ruleBidForm.file3.file = fileList
- // }
- // const handleFileRemove3 = (file: any,fileList:any) => {
- // filename.value = file.raw.name
- // ruleBidForm.file3.file = fileList
- // }
- // 更新项目进度状态
- const updateTypeProject = async (type:any) => {
- let xmjd_json = projects.value.c_xmjd_json;
- stepsType.value = type
- xmjd_json[xmjd_json.length-1].type = type
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- modelId: CONFIG.MODELIDARR[0],
- content: JSON.stringify({
- id: projects.value.id,
- c_xmjd_json: xmjd_json
- }),
- }
- const res = await api.updateContent(params)
- if ((res as any).code === 200) {
- }
- }
- // 更新项目文件
- const updateFIleProject = async (loading:any) => {
- let param = {
- columnId: CONFIG.COLUMNIDARR[2],
- contentId: projects.value.id,
- paraName: '',
- type: 3,
- file: ''
- }
- const [file1, file2, file3] = await Promise.all([
- ruleBidForm.file1.name ? getFIlePath({ ...param, paraName: ruleBidForm.file1.name, file: ruleBidForm.file1.raw }) : '',
- ruleBidForm.file2.name ? getFIlePath({ ...param, paraName: ruleBidForm.file2.name, file: ruleBidForm.file2.raw }) : '',
- ruleBidForm.file3.name ? getFIlePath({ ...param, paraName: ruleBidForm.file3.name, file: ruleBidForm.file3.raw }) : '',
- ])
- const params: any = {
- columnId: CONFIG.COLUMNIDARR[2],
- modelId: CONFIG.MODELIDARR[0],
- content: JSON.stringify({
- id: projects.value.id,
- c_zbwj: file1,
- c_cgxqwj: file2,
- c_cqggwj: file3,
- }),
- }
- const res = await api.updateContent(params)
- dialogBidVisible.value = false
- loading.close()
- if ((res as any).code === 200) {
- ElMessage.success('上传成功')
- }else{
- ElMessage.error('上传失败')
- }
- }
- const getFIlePath = async (params: any) => {
- const res = await api.uploadFile(params)
- if ((res as any).code === 200) {
- return (res as any).content
- } else {
- return null
- }
- }
- const bidFile = ref({
- flag: sessionStorage.getItem('bidFileFlag') == 'true' ? true : false, //是否获取到标书
- swb:false,
- jsb:false,
- isFileFlag: sessionStorage.getItem('isFileFlag') == 'true' ? true : false, //是否历史标书
- })
- const getBidFile = async () => {
- const loading = ElLoading.service({
- lock: true,
- text: '获取中...',
- background: 'rgba(0, 0, 0, 0.7)',
- })
- setTimeout(() => {
- // const fileName = `杨浦区图书馆总馆物业管理服务项目投标文件.docx`
- // UTIL.downloadFile(fileName, filePath)
- const aiscbs = projects.value.c_ai_scbs || "";
- // let aiscbs = "/data/model/shenqin_data/57f7bf655e994fa8a8867e4bc55e8709/1779-杨浦区图书馆总馆物业管理服务项目招标文件.pdf-ca9d5daf-443b-44c6-a1f3-bf43890a55d8.docx"
- if(aiscbs){
- let filename = aiscbs.split('/').pop() || ''
- filename = filename.replace(/\?.*$/, '')
- if(filename.includes('.docx')){
- UTIL.downloadFile(filename, CONFIG.FILEPATH + (aiscbs.replace("/data/model","")))
- loading.close()
- ElMessage.success('获取标书成功')
- bidFile.value.flag = true
- sessionStorage.setItem('bidFileFlag', "true")
- }else{
- sessionStorage.setItem('bidFileFlag', "false")
- ElMessage.error('暂无标书文件')
- }
-
- }else{
- loading.close()
- // bidFile.value.flag = true
- ElMessage.error('获取标书失败')
- }
-
- }, 3000);
-
- // if(bittype == 'swb'){
- // ElMessage.success('获取商务标书成功')
- // bidFile.value.swb = true
- // }else if(bittype == 'jsb'){
- // ElMessage.success('获取技术标书成功')
- // bidFile.value.jsb = true
- // }
- }
- const handleChange = (val: any) => {
- finishBidObject.value = val
- }
- const handleSwitchChange = (val: any) => {
- finishBidObjectTemp.value.flag = val
- finishBidObjectTemp.value.url = ''
- }
- const handleFinishBidSubmit = async () => {
- dialogFinishBidVisible.value = false
- dialogFinishBidVisible2.value = false
- let str = {id: '7'} // 修改
- updaterwlcqdProject(str)
- // 修改中标监控
- updateJKLCProject()
-
- }
- const updateJKLCProject = async () => {
- // 修改中标监控
- const steps = [
- { n: 1, label: '预警触发'},
- { n: 2, label: '投/续标准备'},
- { n: 3, label: '招标监控'},
- { n: 4, label: '标书制作'},
- { n: 5, label: '投标提交'},
- { n: 6, label: '开标监控'},
- { n: 7, label: '开标监控完成,已中标'},
- ]
- let xmjd_json = projects.value.c_xmjd_json
- let json = xmjd_json.map((item:any) => {
- return {
- create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
- desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
- username:item.username ? item.username : userName,
- userid:item.userid ? item.userid : userInfo?.id || '',
- }
- })
- const content = {
- id: projects.value.c_xgjk,
- c_gljg:finishBidObject.value?.id || '',
- c_jgjk_url: finishBidObjectTemp.value.url ? finishBidObjectTemp.value.url : finishBidObject.value?.c_detail_url || '',
- c_lcsjx:json || '',
- c_sfzb:true,
- c_type:"投续标",
- c_enable: false
- }
- updateProjectParams(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3], content)
- }
- // 更新数据
- const updateProjectParams = async (columnId:any,modelId:any,content:any) => {
- const params: any = {
- columnId: columnId,
- modelId: modelId,
- content: JSON.stringify(content),
- }
- const res = await api.updateContent(params)
- if ((res as any).code === 200) {
- // initData()
- }
- }
- </script>
- <style scoped>
- .expire-detail-page {
- width: 100%;
- min-height: 100vh;
- background: var(--bg);
- }
- th, td {
- text-align: left;
- padding: 10px 12px;
- border-bottom: 1px solid #e8ecef;
- }
- /* 顶部绿色头部 */
- .header-bar {
- display: flex;
- justify-content: space-between;
- align-items: center;
- background: linear-gradient(90deg, #0d9488 0%, #0f766e 100%);
- padding: 20px 24px;
- color: #fff;
- border-radius: 8px;
- }
- .header-info {
- display: flex;
- flex-direction: column;
- gap: 4px;
- }
- .project-title {
- display: flex;
- align-items: center;
- gap: 8px;
- font-size: 18px;
- font-weight: 600;
- }
- .title-icon {
- display: flex;
- align-items: center;
- }
- .project-subtitle {
- font-size: 14px;
- opacity: 0.9;
- }
- .project-meta {
- font-size: 12px;
- opacity: 0.8;
- }
- .countdown-badge {
- display: flex;
- flex-direction: column;
- align-items: center;
- background: rgba(255, 255, 255, 0.15);
- padding: 8px 16px;
- border-radius: 6px;
- min-width: 70px;
- }
- .countdown-number {
- font-size: 28px;
- font-weight: bold;
- line-height: 1;
- }
- .countdown-label {
- font-size: 10px;
- opacity: 0.9;
- }
- .countdown-unit {
- font-size: 10px;
- opacity: 0.8;
- }
- /* 进度指示器 */
- .progress-bar {
- margin: 20px 0px;
- background: #fff;
- border-radius: 8px;
- border: 1px solid var(--border);
- }
- .progress-container {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- padding: 12px 16px;
- }
- .arrow {
- font-size: 12px;
- color: #8a9bab;
- padding: 0px 10px;
- }
- .progress-step {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 4px;
- }
- .step-circle {
- width: 20px;
- height: 20px;
- border-radius: 50%;
- background: #e8ecef;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 10px;
- color: var(--text3);
- }
- .progress-step.completed .step-circle {
- background: var(--primary);
- color: #fff;
- }
- .progress-step.active .step-circle {
- background: #fff;
- border: 2px solid var(--primary);
- }
- .active-circle {
- background: #fff !important;
- border: 2px solid var(--primary) !important;
- }
- .step-label {
- font-size: 11px;
- color: var(--text3);
- text-align: center;
- }
- .progress-step.completed .step-label,
- .progress-step.active .step-label {
- color: var(--text);
- font-weight: 500;
- }
- .progress-line {
- flex: 1;
- height: 2px;
- background: #e8ecef;
- margin: 0 8px;
- min-width: 40px;
- }
- .progress-line.completed {
- background: var(--primary);
- }
- /* 主内容区域 */
- .main-content {
- display: flex;
- gap: 20px;
- }
- .left-panel {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 20px;
- }
- .right-panel {
- width: 320px;
- display: flex;
- flex-direction: column;
- gap: 20px;
- }
- /* 面板卡片 */
- .panel-card {
- background: #fff;
- width: 100%;
- border-radius: 8px;
- border: 1px solid var(--border);
- overflow: hidden;
- }
- .panel-card.monitoring-card {
- background: linear-gradient(135deg, #ecfdf5 0%, #f0fdf4 100%);
- border-color: var(--primary);
- }
- .card-header {
- padding: 12px 16px;
- border-bottom: 1px solid var(--border);
- /* background: #fafafa; */
- }
- .panel-card.monitoring-card .card-header {
- background: transparent;
- border-bottom: 1px solid rgba(13, 148, 136, 0.1);
- }
- .card-title {
- font-size: 14px;
- font-weight: 600;
- color: var(--text);
- }
- /* 监控区域 */
- .monitoring-name {
- font-size: 16px;
- font-weight: bold;
- color: var(--text);
- margin-bottom: 8px;
- }
- .monitoring-desc {
- font-size: 13px;
- color: var(--text2);
- margin-bottom: 12px;
- }
- .monitoring-actions {
- display: flex;
- gap: 8px;
- }
- /* 历史投标表格 */
- .history-table {
- width: 100%;
- border-collapse: collapse;
- }
- .history-table thead th {
- padding: 8px 0;
- border-bottom: 1px solid var(--border);
- font-size: 12px;
- color: var(--text3);
- text-align: left;
- font-weight: normal;
- }
- .history-table thead th:last-child {
- text-align: right;
- }
- .history-table tbody tr {
- border-bottom: 1px dashed #f0f0f0;
- }
- .history-table tbody tr:last-child {
- border-bottom: none;
- }
- .history-table tbody td {
- padding: 10px 0;
- font-size: 13px;
- }
- .history-table tbody td:last-child {
- text-align: right;
- }
- .table-header {
- display: flex;
- padding: 8px 0;
- border-bottom: 1px solid var(--border);
- font-size: 12px;
- color: var(--text3);
- }
- .table-header span {
- flex: 1;
- }
- .table-header span:last-child {
- text-align: right;
- }
- .table-row {
- display: flex;
- padding: 10px 0;
- border-bottom: 1px dashed #f0f0f0;
- font-size: 13px;
- }
- .table-row:last-child {
- border-bottom: none;
- }
- .table-row span {
- flex: 1;
- }
- .table-row span:last-child {
- text-align: right;
- }
- .result-badge {
- font-size: 11px;
- padding: 2px 8px;
- border-radius: 4px;
- }
- .result-badge.success {
- background: var(--success-soft);
- color: var(--success);
- }
- .link-btn {
- font-size: 12px;
- color: var(--primary);
- text-decoration: none;
- }
- .link-btn:hover {
- text-decoration: underline;
- }
- /* 侧边栏卡片 */
- .side-card {
- background: #fff;
- border-radius: 8px;
- border: 1px solid var(--border);
- overflow: hidden;
- }
- .card-body.highlight-card {
- border: 1px solid #fbbf24;
- background: #fffbeb;
- margin: 16px;
- border-radius: 8px;
- }
- .info-row {
- display: flex;
- justify-content: space-between;
- padding: 6px 0;
- /* border-bottom: 1px dashed #f0f0f0; */
- }
- .info-row:last-child {
- border-bottom: none;
- }
- .label {
- font-size: 12px;
- color: var(--text3);
- }
- .value {
- font-size: 12px;
- color: var(--text);
- font-weight: 500;
- }
- /* 招标动态 */
- .dynamic-item {
- margin-bottom: 0px;
- }
- .dynamic-badge {
- display: inline-block;
- font-size: 10px;
- padding: 2px 6px;
- background: #fbbf24;
- color: #92400e;
- border-radius: 4px;
- margin-bottom: 8px;
- }
- .dynamic-item p {
- font-size: 13px;
- color: var(--text);
- margin-bottom: 4px;
- }
- .dynamic-date {
- font-size: 11px;
- color: var(--text3);
- }
- .dynamic-actions {
- display: flex;
- gap: 8px;
- }
- /* 关联模块 */
- .module-links {
- display: flex;
- flex-direction: column;
- gap: 8px;
- }
- .module-link {
- font-size: 13px;
- color: var(--primary);
- text-decoration: none;
- padding: 4px 0;
- }
- .module-link:hover {
- text-decoration: underline;
- }
- /* 进程记录 */
- .process-list {
- display: flex;
- flex-direction: column;
- gap: 8px;
- }
- .process-item {
- display: flex;
- align-items: center;
- gap: 8px;
- }
- .process-dot {
- width: 6px;
- height: 6px;
- border-radius: 50%;
- background: var(--primary);
- }
- .process-text {
- font-size: 12px;
- color: var(--text2);
- }
- .renewal-stepper {
- display: flex; align-items: center; gap: 0; margin: 20px 0px; overflow-x: auto;
- padding: 12px 16px; background: #fff; border: 1px solid var(--border); border-radius: var(--radius);
- }
- .renewal-step {
- display: flex; align-items: center; flex-shrink: 0; font-size: 12px; color: var(--text3);
- }
- .renewal-step-dot {
- width: 28px; height: 28px; border-radius: 50%; background: #e8ecef; color: var(--text3);
- display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 11px;
- margin-right: 6px; flex-shrink: 0;
- }
- .renewal-step.done .renewal-step-dot {
- background: var(--success); color: #fff;
- }
- .renewal-step.active .renewal-step-dot {
- background: var(--primary);
- color: #fff;
- box-shadow: 0 0 0 3px var(--primary-soft);
- }
- .renewal-step.active {
- color: var(--primary); font-weight: 600;
- }
- /* 投标任务清单 */
- .checklist {
- list-style: none;
- padding: 0;
- margin: 0;
- }
- .checklist-item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 10px 0;
- border-bottom: 1px dashed #f0f0f0;
- }
- .checklist-item:last-child {
- border-bottom: none;
- }
- .checklist-status {
- margin-right: 8px;
- font-size: 14px;
- }
- .checklist-status.done {
- text-decoration: line-through;
- color: var(--text3);
- }
- .checklist-text {
- flex: 1;
- font-size: 13px;
- }
- .checklist-actions {
- display: flex;
- gap: 8px;
- }
- .renewal-step-arrow {
- color: var(--border);
- margin: 0 8px;
- font-size: 14px;
- }
- @media (max-width: 768px) {
- .main-content {
- flex-direction: column;
- }
- .right-panel {
- width: 100%;
- }
- .progress-indicator {
- flex-wrap: wrap;
- }
- .progress-step {
- min-width: 60px;
- }
- }
- .drawer-content {
- padding: 16px;
- padding-top: 0px;
- }
- .pool-row-meta {
- font-size: 12px;
- color: #8a9bab;
- display: flex;
- flex-wrap: wrap;
- gap: 12px;
- }
- .section {
- margin-bottom: 10px;
- }
- .info {
- display: grid;
- grid-template-columns: 100px 1fr;
- gap: 8px 12px;
- font-size: 13px;
- }
- .info dt {
- color: var(--text3);
- }
- .score-badge {
- font-size: 11px;
- padding: 2px 8px;
- border-radius: 10px;
- font-weight: 600;
- background: var(--info-soft);
- color: var(--info);
- }
- .score-badge.high {
- background: var(--danger-soft);
- color: var(--danger);
- }
- .section-title {
- font-size: 14px;
- font-weight: 600;
- color: var(--text2);
- margin-bottom: 12px;
- padding-left: 8px;
- border-left: 3px solid var(--primary);
- }
- .link-list {
- background: #f8fafc;
- border-radius: 8px;
- padding: 12px;
- border: 1px solid #e8ecef;
- }
- .link-item {
- display: flex;
- align-items: center;
- gap: 8px;
- /* padding: 6px 0; */
- }
- .link-icon {
- font-size: 14px;
- }
- .link-text {
- font-size: 12px;
- color: var(--primary);
- }
- .link-url {
- font-size: 12px;
- color: #3b82f6;
- word-break: break-all;
- }
- .info-grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 10px;
- }
- .info-row {
- display: flex;
- flex-direction: column;
- gap: 4px;
- }
- .info-label {
- font-size: 12px;
- color: #8a9bab;
- }
- .info-value {
- font-size: 13px;
- color: #1a2b3c;
- }
- .score-tag {
- background: #fee2e2;
- color: #dc2626;
- padding: 2px 8px;
- border-radius: 12px;
- font-size: 12px;
- font-weight: 600;
- display: inline-block;
- }
- .summary-content {
- /* background: #f8fafc; */
- border-radius: 8px;
- /* padding: 12px; */
- font-size: 13px;
- line-height: 1.6;
- color: #1a2b3c;
- }
- .summary-content p {
- margin: 0 0 8px 0;
- }
- .summary-content p:last-child {
- margin-bottom: 0;
- }
- .summary-content strong {
- color: #5c6f82;
- }
- .eval-item {
- display: flex;
- align-items: center;
- gap: 8px;
- padding: 6px 0;
- }
- .eval-dot {
- width: 8px;
- height: 8px;
- border-radius: 50%;
- background: #f59e0b;
- }
- .eval-dot.success {
- background: #10b981;
- }
- .eval-text {
- font-size: 13px;
- color: #1a2b3c;
- }
- .action-buttons {
- display: flex;
- gap: 10px;
- margin-bottom: 12px;
- }
- .secondary-buttons {
- display: flex;
- gap: 10px;
- }
- </style>
|