addContent.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. <template>
  2. <div class="bid-content-page">
  3. <div class="bid-container">
  4. <el-dialog v-model="dialogFormVisible" draggable title="提示信息" width="500" @close="close">
  5. <el-form label-width="auto" :model="addForm" :rules="rules" ref="formRef" style="max-height: 500px;overflow: auto;">
  6. <el-form-item label="登记类型">
  7. <el-select v-model="addForm.type" placeholder="请选择登记类型" value-key="value" @change="handleTypeChange" >
  8. <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
  9. </el-select>
  10. </el-form-item>
  11. <el-form-item label="项目名称" v-if="addForm.type == '监控中'">
  12. <el-select v-model="addForm.title" placeholder="请选择项目名称" @change="handleProjectChange" value-key="id">
  13. <el-option v-for="item in jkList" :key="item.id" :label="item.title" :value="item" />
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item label="项目名称" v-else-if="addForm.type == '投续标'">
  17. <el-select v-model="addForm.title" placeholder="请选择项目名称" @change="handleProjectChange" value-key="id">
  18. <el-option v-for="item in txbList" :key="item.id" :label="item.title" :value="item" />
  19. </el-select>
  20. </el-form-item>
  21. <el-form-item label="类似项目名称" prop="title" v-else>
  22. <el-cascader v-model="adminCascader" :options="props.areaProject" :show-all-levels="true" @change="handleAdminCascaderChange" style="width: 100%"></el-cascader>
  23. </el-form-item>
  24. <!-- <el-form-item label="项目名称" v-else>
  25. <el-input v-model="addForm.title" autocomplete="off" placeholder="请输入项目名称"/>
  26. </el-form-item> -->
  27. <!-- <el-form-item label="中标类型选项">
  28. <el-switch v-model="finishBidObjectTemp.flag" inline-prompt active-text="从中标结果中选择" inactive-text="手动输入" style="background-color: unset;" @change="handleSwitchChange"/>
  29. </el-form-item>
  30. <div v-if="finishBidObjectTemp.flag">
  31. <el-form-item label="中标项目">
  32. <el-select v-model="finishBidObject" filterable placeholder="请选择中标项目" style="width: 100%;overflow: auto;" @change="handleChange" value-key="id">
  33. <el-option v-for="item in finishBidOption" :key="item.id" :label="item.title" :value="item" :title="item.title" style="width: 380px;"/>
  34. </el-select>
  35. </el-form-item>
  36. </div>
  37. <div v-else> -->
  38. <div v-if="addForm.type == '新创建'">
  39. <el-form-item label="是否续标">
  40. <el-switch v-model="addForm.c_is_xb" inline-prompt active-text="是" inactive-text="否" style="background-color: unset;" @change="handleXBSwitchChange"/>
  41. </el-form-item>
  42. </div>
  43. <el-form-item label="中标结果URL">
  44. <el-input v-model="finishBidObjectTemp.url" placeholder="请输入中标结果URL"/>
  45. </el-form-item>
  46. <!-- </div> -->
  47. <div v-if="addForm.type != '监控中'">
  48. <el-form-item label="管理区域" prop="c_glqy">
  49. <el-cascader ref="areaCascader" v-model="addFormArea" :options="props.glArea" :show-all-levels="true" @change="handleNodeAreaClick" style="width: 100%"></el-cascader>
  50. </el-form-item>
  51. <el-form-item label="投标日期" prop="tb_date">
  52. <el-date-picker
  53. style="width: 100%;"
  54. v-model="addForm.tb_date"
  55. type="date"
  56. placeholder="请选择投标日期"
  57. />
  58. </el-form-item>
  59. <el-form-item label="投标报价" prop="tb_money">
  60. <el-input-number
  61. style="width: 100%"
  62. v-model="addForm.tb_money"
  63. controls-position="right"
  64. placeholder="请输入投标报价"
  65. />
  66. </el-form-item>
  67. <el-form-item label="招标编号" prop="zb_code">
  68. <el-input v-model="addForm.zb_code" autocomplete="off" placeholder="请输入招标编号"/>
  69. </el-form-item>
  70. <el-form-item label="招标项目名称" prop="zb_name">
  71. <el-input v-model="addForm.zb_name" autocomplete="off" placeholder="请输入招标项目名称"/>
  72. </el-form-item>
  73. <el-form-item label="招标发布机构" prop="zb_org">
  74. <el-input v-model="addForm.zb_org" autocomplete="off" placeholder="请输入招标发布机构"/>
  75. </el-form-item>
  76. <el-form-item label="招标数据来源" prop="zb_source">
  77. <el-input v-model="addForm.zb_source" autocomplete="off" placeholder="请输入招标数据来源"/>
  78. </el-form-item>
  79. <el-form-item label="招标金额" prop="zb_money">
  80. <el-input-number
  81. style="width: 100%"
  82. v-model="addForm.zb_money"
  83. controls-position="right"
  84. placeholder="请输入招标金额"
  85. />
  86. </el-form-item>
  87. <el-form-item label="开标发布日期" prop="zb_startdate">
  88. <el-date-picker
  89. style="width: 100%;"
  90. v-model="addForm.zb_startdate"
  91. type="datetime"
  92. placeholder="请选择开标发布日期"
  93. />
  94. </el-form-item>
  95. <el-form-item label="开标截止日期" prop="zb_enddate">
  96. <el-date-picker
  97. style="width: 100%;"
  98. v-model="addForm.zb_enddate"
  99. type="datetime"
  100. placeholder="请选择开标截止日期"
  101. />
  102. </el-form-item>
  103. <el-form-item label="招标详情URL" prop="zb_url">
  104. <el-input v-model="addForm.zb_url" autocomplete="off" placeholder="请输入招标详情URL"/>
  105. </el-form-item>
  106. </div>
  107. <div v-if="addForm.type != '监控中'">
  108. <el-form-item label="业态" prop="c_ytfw">
  109. <el-tree-select
  110. placeholder="请选择业态"
  111. v-model="addFormYT"
  112. :data="ytList"
  113. collapse-tags
  114. filterable
  115. style="width: 100%"
  116. />
  117. </el-form-item>
  118. <el-form-item label="委托类型" prop="c_zgfw">
  119. <el-radio v-model="addFormZgfw" v-for="item in zgfwOptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio>
  120. </el-form-item>
  121. <el-form-item label="服务类型" prop="c_fwlx">
  122. <el-checkbox-group v-model="addFormFwlx">
  123. <el-checkbox label="会务"></el-checkbox>
  124. <el-checkbox label="工程"></el-checkbox>
  125. <el-checkbox label="绿化"></el-checkbox>
  126. <el-checkbox label="保安"></el-checkbox>
  127. <el-checkbox label="保洁"></el-checkbox>
  128. </el-checkbox-group>
  129. </el-form-item>
  130. </div>
  131. </el-form>
  132. <template #footer>
  133. <div class="dialog-footer">
  134. <el-button @click="close" class="btn">取消</el-button>
  135. <el-button type="primary" class="btn enter-btn" @click="submitForm(formRef)">
  136. 确认
  137. </el-button>
  138. </div>
  139. </template>
  140. </el-dialog>
  141. </div>
  142. </div>
  143. </template>
  144. <script setup lang="ts">
  145. import { ref,onMounted } from 'vue'
  146. import moment from 'moment'
  147. import api from '@/api/common'
  148. import CONFIG from '@/utils/config'
  149. import type { FormInstance } from 'element-plus'
  150. const formRef = ref<FormInstance>()
  151. const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
  152. const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
  153. const props = defineProps({
  154. flag: {
  155. type: Boolean,
  156. default: false,
  157. },
  158. close: {
  159. type: Function,
  160. default: () => {},
  161. },
  162. glArea: {
  163. type: Array,
  164. default: () => [],
  165. },
  166. areaProject: {
  167. type: Array,
  168. default: () => [],
  169. }
  170. })
  171. interface resultForm {
  172. [key: string]: any
  173. }
  174. const finishObject = ref<resultForm>({})
  175. const finishProjects = ref<any[]>([])
  176. const finishTreeProjects = ref<any[]>([])
  177. const txbList = ref<any[]>([])
  178. const jkList = ref<any[]>([])
  179. const ytList = ref<resultForm[]>([])
  180. const addFormZgfw = ref('')
  181. const addFormFwlx = ref([])
  182. const addFormYT = ref('')
  183. const addFormArea = ref([])
  184. const zgfwOptions = ref<any>([])
  185. // interface TreeItem {
  186. // id: string | number
  187. // value: string
  188. // label: string
  189. // children: TreeItem[],
  190. // [key: string]: any
  191. // }
  192. const areaCascader = ref(null)
  193. const areaObject = ref({})
  194. const adminCascader = ref([])
  195. // const finishBidOption = ref([{} as resultForm])
  196. const jkBidObject = ref<any>(null)
  197. const txbBidObject = ref<any>(null)
  198. const finishBidObject = ref<any>(null)
  199. const finishBidObjectTemp = ref({
  200. flag:false,
  201. url:''
  202. })
  203. onMounted(() => {
  204. initData()
  205. getDmsTypes()
  206. })
  207. const getDmsTypes = () => {
  208. let params = {
  209. type:0,
  210. cName: "sq_wtfs",
  211. }
  212. api.getDmsTypes(params).then(res => {
  213. if((res as any).code === 200){
  214. let ret = (res as any).content
  215. zgfwOptions.value = ret.map((item: any) => ({
  216. ...item,
  217. label: item.name,
  218. value: item.index
  219. }))
  220. }else{
  221. zgfwOptions.value = []
  222. }
  223. })
  224. }
  225. const initData = async () => {
  226. await getFinishProjects()
  227. const itemTxbList = await getTypeProjects(CONFIG.COLUMNIDARR[2]) // 投续标项目
  228. const itemJkList = await getTypeProjects(CONFIG.COLUMNIDARR[6]) // 中标监控项目
  229. // const itemFinishList = await getTypeProjects(CONFIG.COLUMNIDARR[7]) // 已中标项目
  230. const itemYtList = await getTypeProjects(CONFIG.COLUMNIDARR[8]) // 业态
  231. // finishBidOption.value = itemFinishList.data || []
  232. txbList.value = []
  233. jkList.value = []
  234. ytList.value = []
  235. itemTxbList.data.filter((item: any) => {
  236. const json = JSON.parse(item.c_xmjd_json)
  237. if(json.length > 0 && json[json.length - 1].xmjd < 6){
  238. txbList.value.push(item)
  239. }
  240. })
  241. itemJkList.data.filter((item: any) => {
  242. const flag = item.c_sfzb
  243. if(flag == false){// 已中标
  244. jkList.value.push(item)
  245. }
  246. })
  247. ytList.value = itemYtList.data.map((item: any) => ({
  248. ...item,
  249. label: item.c_yt_name,
  250. value: item.c_yt_name,
  251. children: item.children || []
  252. }))
  253. }
  254. const dialogFormVisible = props.flag
  255. const close = () => {
  256. props.close()
  257. }
  258. const getFinishProjects = async () => {
  259. const params: any = {
  260. columnId: CONFIG.COLUMNIDARR[0], //原项目数据
  261. orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
  262. states: '0',// 只看草稿箱
  263. pageSize: 9999,
  264. page: 0
  265. }
  266. await api.getDmsDataList(params).then(res => {
  267. if ((res as any).code === 200) {
  268. finishProjects.value = (res as any).content.data
  269. finishTreeProjects.value = buildTree(finishProjects.value)
  270. }else{
  271. finishProjects.value = []
  272. }
  273. })
  274. }
  275. const buildTree = (data: any[]): any[] => {
  276. const map = new Map()
  277. const tree: any[] = []
  278. data.forEach((item: any) => {
  279. map.set(item.c_guid, {
  280. ...item,
  281. value: item.id,
  282. label: item.c_xmmc,
  283. children: []
  284. })
  285. })
  286. data.forEach((item: any) => {
  287. const node = map.get(item.c_guid)
  288. if (item.c_father_code && map.has(item.c_father_code)) {
  289. // map.get(item.c_father_code).children.push(node)
  290. } else {
  291. tree.push(node)
  292. }
  293. })
  294. return tree
  295. }
  296. const typeOptions = ref([
  297. {
  298. value: '新创建',
  299. label: '新创建',
  300. },
  301. {
  302. value: '监控中',
  303. label: '监控中',
  304. },
  305. {
  306. value: '投续标',
  307. label: '投续标',
  308. },
  309. ])
  310. const addForm = ref({
  311. id: '',
  312. type: '新创建',
  313. title: '',
  314. tb_date:'',
  315. tb_money:'',
  316. zb_code:'',
  317. zb_name:'',
  318. zb_org:'',
  319. zb_source:'',
  320. zb_money:'',
  321. zb_startdate:'',
  322. zb_enddate:'',
  323. zb_url:'',
  324. c_is_xb:false,
  325. })
  326. const rules = ref({
  327. })
  328. const submitForm = (formEl: FormInstance | undefined) => {
  329. if (!formEl) return
  330. formEl.validate(async (valid) => {
  331. if (valid) {
  332. if(addForm.value.type == '监控中'){
  333. //流程
  334. const id = 7 // 固定进度数值
  335. const rwlcqd = JSON.parse(txbBidObject.value.rwlcqd || '[]')
  336. rwlcqd.find((p: any) => p.id == id).done = true
  337. rwlcqd.find((p: any) => p.id == id).create_time = moment().format('YYYY-MM-DD HH:mm')
  338. rwlcqd.find((p: any) => p.id == id).username = userName
  339. rwlcqd.find((p: any) => p.id == id).userid = userInfo?.id || ''
  340. rwlcqd.find((p: any) => p.id == id).type = 0
  341. // 进度
  342. let xmjd_json = JSON.parse(txbBidObject.value.c_xmjd_json || '[]');
  343. xmjd_json[5].create_time = moment().format('YYYY-MM-DD HH:mm')
  344. xmjd_json[5].username = userName
  345. xmjd_json[5].userid = userInfo?.id || ''
  346. xmjd_json[5].type = 0
  347. if(!xmjd_json[6]){
  348. xmjd_json.push({xmjd: id, type: 1, create_time: '', username: '', userid: ''})
  349. }
  350. const content = JSON.stringify({
  351. id: txbBidObject.value.id,
  352. rwlcqd:rwlcqd,
  353. c_xmjd_json:xmjd_json
  354. })
  355. updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],content)
  356. // 修改中标监控
  357. const steps = [
  358. { n: 1, label: '预警触发'},
  359. { n: 2, label: '投/续标准备'},
  360. { n: 3, label: '招标监控'},
  361. { n: 4, label: '标书制作'},
  362. { n: 5, label: '投标提交'},
  363. { n: 6, label: '开标监控'},
  364. { n: 7, label: '确认中标'},
  365. ]
  366. let json = xmjd_json.map((item:any) => {
  367. return {
  368. create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
  369. desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
  370. username:item.username ? item.username : userName,
  371. userid:item.userid ? item.userid : userInfo?.id || '',
  372. }
  373. })
  374. const content2 = JSON.stringify({
  375. id: jkBidObject.value.id || '',
  376. c_gljg: finishBidObjectTemp.value?.flag ? finishBidObject.value?.id : '',
  377. c_jgjk_url: finishBidObjectTemp.value?.flag ? finishBidObject.value?.c_detail_url : finishBidObjectTemp.value?.url || '',
  378. c_lcsjx:json || '',
  379. c_sfzb:true,
  380. c_type:"中标登记",
  381. c_enable: false
  382. })
  383. updateProject(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3],content2)
  384. }else if(addForm.value.type == '投续标'){
  385. //流程
  386. const rwlcqd = JSON.parse(selectedObject.value.rwlcqd || '[]')
  387. rwlcqd.forEach((p: any) => {
  388. if(!p.danger && p.id !=8){//未处理的流程全部重新处理
  389. p.done = true,
  390. p.create_time = moment().format('YYYY-MM-DD HH:mm'),
  391. p.username = userName,
  392. p.userid = userInfo?.id || '',
  393. p.type = 0
  394. }
  395. })
  396. let xmjd_json = JSON.parse(selectedObject.value.c_xmjd_json || '[]');
  397. const curNumber = xmjd_json[xmjd_json.length - 1].xmjd
  398. for(let i = curNumber; i < 8; i++){
  399. if(i == curNumber){
  400. xmjd_json[i-1].create_time = moment().format('YYYY-MM-DD HH:mm')
  401. xmjd_json[i-1].username = userName
  402. xmjd_json[i-1].userid = userInfo?.id || ''
  403. xmjd_json[i-1].type = 0
  404. }else{
  405. if( i == 7){
  406. xmjd_json.push({xmjd: i, type: 1, create_time: '', username: '', userid: ''})
  407. }else{
  408. xmjd_json.push({xmjd: i, type: 0, create_time: moment().format('YYYY-MM-DD HH:mm'), username: userName, userid: userInfo?.id || ''})
  409. }
  410. }
  411. }
  412. const steps = [
  413. { n: 1, label: '预警触发'},
  414. { n: 2, label: '投/续标准备'},
  415. { n: 3, label: '招标监控'},
  416. { n: 4, label: '标书制作'},
  417. { n: 5, label: '投标提交'},
  418. { n: 6, label: '开标监控'},
  419. { n: 7, label: '确认中标'},
  420. ]
  421. let json = xmjd_json.map((item:any) => {
  422. return {
  423. create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
  424. desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
  425. username:item.username ? item.username : userName,
  426. userid:item.userid ? item.userid : userInfo?.id || '',
  427. }
  428. })
  429. // 开标监控
  430. let kbFormData = {
  431. title: selectedObject.value.title,
  432. content: selectedObject.value.content,
  433. c_zbbh: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  434. c_sfzb: true,
  435. c_jgjk_url: finishBidObjectTemp.value?.url || '',
  436. c_kbsj: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
  437. c_xmmc: selectedObject.value.c_xmbt,
  438. c_zbtjr: selectedObject.value.tbrq ? selectedObject.value.tbrq : addForm.value.tb_date,
  439. c_tbbj: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
  440. c_glxm: selectedObject.value.xmbh,
  441. c_lcsjx: json || '',
  442. c_type: '中标登记',
  443. c_enable: false
  444. }
  445. const res = await addContentParams(kbFormData,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
  446. let desc = {
  447. zb_project_code: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  448. zb_source_name: addForm.value.zb_source,
  449. zb_project_name: addForm.value.zb_name,
  450. zb_budget_amount: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
  451. zb_detail_url: finishBidObjectTemp.value?.url || '',
  452. zb_publish_time: selectedObject.value.zbkssj ? selectedObject.value.zbkssj : addForm.value.zb_startdate,
  453. zb_bid_deadline: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
  454. zb_author: userName
  455. }
  456. let areaArr = (areaObject.value as any)?.pathLabels || []
  457. let tbFormData = {
  458. id: selectedObject.value.id || '',
  459. c_zgfw: selectedObject.value.c_zgfw ? selectedObject.value.c_zgfw : addFormZgfw.value,
  460. c_xgzb: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  461. c_xgjk: (res as any).content || '',
  462. c_xmbtqc: selectedObject.value.c_xmbt,
  463. c_qx: selectedObject.value.c_qx ? selectedObject.value.c_qx : areaArr[0] || '',
  464. c_xmbt: selectedObject.value.c_xmbt,
  465. c_xmjd_json:xmjd_json,
  466. zbxmbh: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  467. tbrq: selectedObject.value.tbrq ? selectedObject.value.tbrq : addForm.value.tb_date,
  468. tbbj: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
  469. zbkssj: selectedObject.value.zbkssj ? selectedObject.value.zbkssj : addForm.value.zb_startdate,
  470. zbjzsj: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
  471. rwlcqd: rwlcqd,
  472. zbmsxx: selectedObject.value.zbmsx ? selectedObject.value.zbmsx : desc,
  473. c_ytfw: selectedObject.value.ytfxw ? selectedObject.value.ytfxw : addFormYT.value,
  474. c_fwlx: selectedObject.value.fwlx ? selectedObject.value.fwlx : addFormFwlx.value.toString(),
  475. c_glqy: selectedObject.value.glqy ? selectedObject.value.glqy : areaArr[1] || '',
  476. }
  477. updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],JSON.stringify(tbFormData))
  478. }else{
  479. //流程
  480. const rwlcqd = CONFIG.TASKLIST
  481. rwlcqd.forEach((p: any) => {
  482. if(!p.danger && p.id !=8){//未处理的流程全部重新处理
  483. p.done = true,
  484. p.create_time = moment().format('YYYY-MM-DD HH:mm'),
  485. p.username = userName,
  486. p.userid = userInfo?.id || '',
  487. p.type = 0
  488. }
  489. })
  490. let xmjd_json = [];
  491. for(let i = 1; i < 8; i++){
  492. if( i == 7){
  493. xmjd_json.push({xmjd: i, type: 1, create_time: '', username: '', userid: ''})
  494. }else{
  495. xmjd_json.push({xmjd: i, type: 0, create_time: moment().format('YYYY-MM-DD HH:mm'), username: userName, userid: userInfo?.id || ''})
  496. }
  497. }
  498. const steps = [
  499. { n: 1, label: '预警触发'},
  500. { n: 2, label: '投/续标准备'},
  501. { n: 3, label: '招标监控'},
  502. { n: 4, label: '标书制作'},
  503. { n: 5, label: '投标提交'},
  504. { n: 6, label: '开标监控'},
  505. { n: 7, label: '确认中标'},
  506. ]
  507. let json = xmjd_json.map((item:any) => {
  508. return {
  509. create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
  510. desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
  511. username:item.username ? item.username : userName,
  512. userid:item.userid ? item.userid : userInfo?.id || '',
  513. }
  514. })
  515. // 开标监控
  516. let kbFormData = {
  517. title: finishObject.value.title,
  518. content: finishObject.value.content,
  519. c_zbbh: addForm.value.zb_code,
  520. c_sfzb: true,
  521. c_jgjk_url: finishBidObjectTemp.value?.url || '',
  522. c_kbsj: addForm.value.zb_enddate,
  523. c_xmmc: finishObject.value.c_xmmc,
  524. c_zbtjr: addForm.value.tb_date,
  525. c_tbbj: addForm.value.tb_money,
  526. c_glxm: finishObject.value.c_guid,
  527. c_lcsjx: json || '',
  528. c_type: '中标登记',
  529. c_enable: false
  530. }
  531. const res = await addContentParams(kbFormData,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
  532. let desc = {
  533. zb_project_code: addForm.value.zb_code,
  534. zb_source_name: addForm.value.zb_source,
  535. zb_project_name: addForm.value.zb_name,
  536. zb_budget_amount: addForm.value.tb_money,
  537. zb_detail_url: finishBidObjectTemp.value?.url || '',
  538. zb_publish_time: addForm.value.zb_startdate,
  539. zb_bid_deadline: addForm.value.zb_enddate,
  540. zb_author: userName
  541. }
  542. let areaArr = (areaObject.value as any)?.pathLabels || []
  543. let tbFormData = {
  544. title: finishObject.value.title,
  545. content: finishObject.value.content,
  546. c_sfzb: finishObject.value.c_htqyjf,
  547. c_zgfw: addFormZgfw.value ? addFormZgfw.value : finishObject.value.c_wtfs || '',
  548. c_kssj: moment(finishObject.value.c_zgxmhtksrq).format('YYYY-MM-DD HH:mm') || '',
  549. c_dqsj: moment(finishObject.value.c_zgxmhtdqrq).format('YYYY-MM-DD HH:mm') || '',
  550. xmbh: finishObject.value.c_guid,
  551. c_nh: finishObject.value.c_nhhtsr || '',
  552. c_is_xb: addForm.value.c_is_xb,
  553. c_xgzb: addForm.value.zb_code,
  554. c_xgjk: (res as any).content || '',
  555. c_xmbtqc: finishObject.value.c_xmmc,
  556. c_qx: areaArr[0] ? areaArr[0] : finishObject.value.c_sq || '',
  557. c_xmbt: finishObject.value.c_xmmc,
  558. c_xmjd_json:xmjd_json,
  559. zbxmbh: addForm.value.zb_code,
  560. tbrq: addForm.value.tb_date,
  561. tbbj: addForm.value.tb_money,
  562. zbkssj: addForm.value.zb_startdate,
  563. zbjzsj: addForm.value.zb_enddate,
  564. rwlcqd: rwlcqd,
  565. zbmsxx: desc,
  566. c_ytfw: addFormYT.value,
  567. c_fwlx: addFormFwlx.value.toString(),
  568. c_glqy: areaArr[1] ? areaArr[1] : finishObject.value.c_glqynbkj || '',
  569. }
  570. await addContentParams(tbFormData,CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0])
  571. }
  572. } else {
  573. }
  574. close()
  575. })
  576. }
  577. const addContentParams = async (formData: any,columnId:number,modelId:number) => {
  578. const params = {
  579. content: JSON.stringify(formData),
  580. columnId: columnId,
  581. modelId: modelId,
  582. }
  583. const res = await api.addContent(params)
  584. return res
  585. }
  586. const handleTypeChange = (val: any) => {
  587. addForm.value.title = ''
  588. addForm.value.type = val || ''
  589. }
  590. const selectedObject = ref<any>({})
  591. const handleProjectChange = async (val: any) => {
  592. addForm.value.title = val.title || ''
  593. jkBidObject.value = null
  594. txbBidObject.value = null
  595. finishBidObject.value = null
  596. if(addForm.value.type == '监控中'){
  597. jkBidObject.value = val
  598. const res = await getTxbBidContent(CONFIG.COLUMNIDARR[2],val.id,"c_xgjk")
  599. txbBidObject.value = res || {}
  600. }else{
  601. selectedObject.value = val
  602. }
  603. }
  604. const getTypeProjects = async (columnId:number) => {
  605. const params: any = {
  606. columnId: columnId,
  607. orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
  608. states: '0,1,2,3,4',
  609. pageSize: 9999,
  610. page: 0
  611. }
  612. const res = await getDmsDataList(params)
  613. return (res as any).content
  614. }
  615. const getDmsDataList = async (params: any) => {
  616. return await api.getDmsDataList(params)
  617. }
  618. const updateProject = async (columnId:number,modelId:number,content:string) => {
  619. const params: any = {
  620. columnId: columnId,
  621. modelId: modelId,
  622. content: content,
  623. }
  624. const res = await api.updateContent(params)
  625. if ((res as any).code === 200) {
  626. // ElMessage.success('添加成功')
  627. initData()
  628. }else{
  629. // ElMessage.error('添加失败')
  630. }
  631. }
  632. // const handleSwitchChange = (val: any) => {
  633. // finishBidObjectTemp.value.flag = val
  634. // finishBidObjectTemp.value.url = ''
  635. // finishObject.value = {}
  636. // }
  637. // const handleChange = (val: any) => {
  638. // finishBidObject.value = val
  639. // }
  640. const handleXBSwitchChange = (val: any) => {
  641. addForm.value.c_is_xb = val
  642. }
  643. // 获取投续标内容
  644. const getTxbBidContent = async (columnId:number,search:string,type:string) => {
  645. const params: any = {
  646. columnId: columnId,
  647. orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
  648. states: '0,1,2,3,4',
  649. pageSize: 1,
  650. page: 0
  651. }
  652. if (search) {
  653. params.search = JSON.stringify([
  654. ...(params.search ? JSON.parse(params.search) : []),
  655. {
  656. field: type,
  657. searchType: 1,
  658. content: { value: search },
  659. },
  660. ]);
  661. }
  662. const res = await getDmsDataList(params)
  663. return (res as any).content.data[0]
  664. }
  665. const handleNodeAreaClick = (value: any[]) => {
  666. const val = value
  667. const nodes = (areaCascader.value as any)?.getCheckedNodes?.() || []
  668. if(nodes.length) {
  669. const targetNode = nodes[nodes.length - 1]
  670. areaObject.value = targetNode
  671. }
  672. }
  673. const handleAdminCascaderChange = (val: any) => {
  674. const tempObj = finishTreeProjects.value.filter((item: any) => item.id.includes(val[1]))[0]
  675. finishObject.value = tempObj
  676. }
  677. </script>
  678. <style scoped>
  679. .bid-content-page {
  680. width: 100%;
  681. }
  682. .bid-container{
  683. height: calc(100vh - 180px);
  684. overflow-y: auto;
  685. }
  686. </style>