addContent.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  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="adminArea" :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="allArea" :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" label="全委">全委</el-radio>
  120. <el-radio v-model="addFormZgfw" label="单一单委">单一单委</el-radio>
  121. <el-radio v-model="addFormZgfw" label="多项单委">多项单委</el-radio>
  122. </el-form-item>
  123. <el-form-item label="服务类型" prop="c_fwlx">
  124. <el-checkbox-group v-model="addFormFwlx">
  125. <el-checkbox label="会务"></el-checkbox>
  126. <el-checkbox label="工程"></el-checkbox>
  127. <el-checkbox label="绿化"></el-checkbox>
  128. <el-checkbox label="保安"></el-checkbox>
  129. <el-checkbox label="保洁"></el-checkbox>
  130. </el-checkbox-group>
  131. </el-form-item>
  132. </div>
  133. </el-form>
  134. <template #footer>
  135. <div class="dialog-footer">
  136. <el-button @click="close" class="btn">取消</el-button>
  137. <el-button type="primary" class="btn enter-btn" @click="submitForm(formRef)">
  138. 确认
  139. </el-button>
  140. </div>
  141. </template>
  142. </el-dialog>
  143. </div>
  144. </div>
  145. </template>
  146. <script setup lang="ts">
  147. import { ref,onMounted } from 'vue'
  148. import moment from 'moment'
  149. import api from '@/api/common'
  150. import CONFIG from '@/utils/config'
  151. import type { FormInstance } from 'element-plus'
  152. const formRef = ref<FormInstance>()
  153. const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
  154. const userName = userInfo?.username =='user_xtw' ? '徐天炜' : userInfo?.username || ''
  155. const props = defineProps({
  156. flag: {
  157. type: Boolean,
  158. default: false,
  159. },
  160. close: {
  161. type: Function,
  162. default: () => {},
  163. }
  164. })
  165. interface resultForm {
  166. [key: string]: any
  167. }
  168. const finishObject = ref<resultForm>({})
  169. const finishProjects = ref<any[]>([])
  170. const finishTreeProjects = ref<any[]>([])
  171. const txbList = ref<any[]>([])
  172. const jkList = ref<any[]>([])
  173. const ytList = ref<resultForm[]>([])
  174. const glArea = ref([{} as TreeItem])
  175. const addFormZgfw = ref('')
  176. const addFormFwlx = ref([])
  177. const addFormYT = ref('')
  178. const addFormArea = ref([])
  179. interface TreeItem {
  180. id: string | number
  181. value: string
  182. label: string
  183. children: TreeItem[],
  184. [key: string]: any
  185. }
  186. const areaCascader = ref(null)
  187. const areaObject = ref({})
  188. const adminCascader = ref([])
  189. const adminArea = ref([{} as TreeItem])
  190. const allArea = ref([{} as TreeItem])
  191. const finishBidOption = ref([{} as resultForm])
  192. const jkBidObject = ref<any>(null)
  193. const txbBidObject = ref<any>(null)
  194. const finishBidObject = ref<any>(null)
  195. const finishBidObjectTemp = ref({
  196. flag:false,
  197. url:''
  198. })
  199. onMounted(() => {
  200. initData()
  201. })
  202. const initData = async () => {
  203. await getFinishProjects()
  204. const itemTxbList = await getTypeProjects(CONFIG.COLUMNIDARR[2]) // 投续标项目
  205. const itemJkList = await getTypeProjects(CONFIG.COLUMNIDARR[6]) // 中标监控项目
  206. const itemFinishList = await getTypeProjects(CONFIG.COLUMNIDARR[7]) // 已中标项目
  207. const itemYtList = await getTypeProjects(CONFIG.COLUMNIDARR[8]) // 业态
  208. const itemGLList = await getTypeProjects(CONFIG.COLUMNIDARR[9]) // 管理区域
  209. console.log(itemFinishList)
  210. finishBidOption.value = itemFinishList.data || []
  211. txbList.value = []
  212. jkList.value = []
  213. glArea.value = []
  214. allArea.value = []
  215. ytList.value = []
  216. itemTxbList.data.filter((item: any) => {
  217. const json = JSON.parse(item.c_xmjd_json)
  218. if(json.length > 0 && json[json.length - 1].xmjd < 6){
  219. txbList.value.push(item)
  220. }
  221. })
  222. itemJkList.data.filter((item: any) => {
  223. const flag = item.c_sfzb
  224. if(flag == false){// 已中标
  225. jkList.value.push(item)
  226. }
  227. })
  228. ytList.value = itemYtList.data.map((item: any) => ({
  229. ...item,
  230. label: item.c_yt_name,
  231. value: item.c_yt_name,
  232. children: item.children || []
  233. }))
  234. // glArea.value = itemGLList.data
  235. // .filter((item: any) => item?.c_part_name && item?.c_district_code?.startsWith('3101')) // 过滤空、null、undefined、''
  236. // .map((item: any) => ({
  237. // label: item.c_part_name,
  238. // value: item.c_part_name,
  239. // children: []
  240. // }))
  241. // const uniqueGlTree = Array.from(
  242. // new Map(glArea.value.map(item => [item.value, item])).values()
  243. // )
  244. // glArea.value = uniqueGlTree
  245. adminArea.value = itemGLList.data.filter((item: any) => item?.c_district_name && item?.c_district_code?.startsWith('310')) // 过滤空、null、undefined、''
  246. .map((item: any) => ({
  247. label: item.c_district_name,
  248. value: item.c_district_name,
  249. children: finishTreeProjects.value.filter((item2: any) => item.c_district_name.includes(item2.c_sq))
  250. }))
  251. const uniqueTree = Array.from(
  252. new Map(adminArea.value.map(item => [item.value, item])).values()
  253. )
  254. adminArea.value = uniqueTree
  255. allArea.value = buildAreaTree(itemGLList.data)
  256. console.log(itemFinishList)
  257. }
  258. const dialogFormVisible = props.flag
  259. const close = () => {
  260. props.close()
  261. }
  262. const getFinishProjects = async () => {
  263. const params: any = {
  264. columnId: CONFIG.COLUMNIDARR[0], //原项目数据
  265. orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
  266. states: '0',// 只看草稿箱
  267. pageSize: 9999,
  268. page: 0
  269. }
  270. await api.getDmsDataList(params).then(res => {
  271. if ((res as any).code === 200) {
  272. finishProjects.value = (res as any).content.data
  273. finishTreeProjects.value = buildTree(finishProjects.value)
  274. }else{
  275. finishProjects.value = []
  276. }
  277. })
  278. }
  279. const buildTree = (data: any[]): any[] => {
  280. const map = new Map()
  281. const tree: any[] = []
  282. data.forEach((item: any) => {
  283. map.set(item.c_guid, {
  284. ...item,
  285. value: item.id,
  286. label: item.title,
  287. children: []
  288. })
  289. })
  290. data.forEach((item: any) => {
  291. const node = map.get(item.c_guid)
  292. if (item.c_father_code && map.has(item.c_father_code)) {
  293. // map.get(item.c_father_code).children.push(node)
  294. } else {
  295. tree.push(node)
  296. }
  297. })
  298. return tree
  299. }
  300. const typeOptions = ref([
  301. {
  302. value: '新创建',
  303. label: '新创建',
  304. },
  305. {
  306. value: '监控中',
  307. label: '监控中',
  308. },
  309. {
  310. value: '投续标',
  311. label: '投续标',
  312. },
  313. ])
  314. const addForm = ref({
  315. id: '',
  316. type: '新创建',
  317. title: '',
  318. tb_date:'',
  319. tb_money:'',
  320. zb_code:'',
  321. zb_name:'',
  322. zb_org:'',
  323. zb_source:'',
  324. zb_money:'',
  325. zb_startdate:'',
  326. zb_enddate:'',
  327. zb_url:'',
  328. c_is_xb:false,
  329. })
  330. const rules = ref({
  331. })
  332. // interface ProjectItem {
  333. // [key: string]: any
  334. // }
  335. const submitForm = (formEl: FormInstance | undefined) => {
  336. if (!formEl) return
  337. formEl.validate(async (valid) => {
  338. if (valid) {
  339. if(addForm.value.type == '监控中'){
  340. //流程
  341. const id = 7 // 固定进度数值
  342. const rwlcqd = JSON.parse(txbBidObject.value.rwlcqd || '[]')
  343. rwlcqd.find((p: any) => p.id == id).done = true
  344. rwlcqd.find((p: any) => p.id == id).create_time = moment().format('YYYY-MM-DD HH:mm')
  345. rwlcqd.find((p: any) => p.id == id).username = userName
  346. rwlcqd.find((p: any) => p.id == id).userid = userInfo?.id || ''
  347. rwlcqd.find((p: any) => p.id == id).type = 0
  348. // 进度
  349. let xmjd_json = JSON.parse(txbBidObject.value.c_xmjd_json || '[]');
  350. xmjd_json[5].create_time = moment().format('YYYY-MM-DD HH:mm')
  351. xmjd_json[5].username = userName
  352. xmjd_json[5].userid = userInfo?.id || ''
  353. xmjd_json[5].type = 0
  354. if(!xmjd_json[6]){
  355. xmjd_json.push({xmjd: id, type: 1, create_time: '', username: '', userid: ''})
  356. }
  357. const content = JSON.stringify({
  358. id: txbBidObject.value.id,
  359. rwlcqd:rwlcqd,
  360. c_xmjd_json:xmjd_json
  361. })
  362. updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],content)
  363. // 修改中标监控
  364. const steps = [
  365. { n: 1, label: '预警触发'},
  366. { n: 2, label: '投/续标准备'},
  367. { n: 3, label: '招标监控'},
  368. { n: 4, label: '标书制作'},
  369. { n: 5, label: '投标提交'},
  370. { n: 6, label: '开标监控'},
  371. { n: 7, label: '确认中标'},
  372. ]
  373. let json = xmjd_json.map((item:any) => {
  374. return {
  375. create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
  376. desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
  377. username:item.username ? item.username : userName,
  378. userid:item.userid ? item.userid : userInfo?.id || '',
  379. }
  380. })
  381. const content2 = JSON.stringify({
  382. id: jkBidObject.value.id || '',
  383. c_gljg: finishBidObjectTemp.value?.flag ? finishBidObject.value?.id : '',
  384. c_jgjk_url: finishBidObjectTemp.value?.flag ? finishBidObject.value?.c_detail_url : finishBidObjectTemp.value?.url || '',
  385. c_lcsjx:json || '',
  386. c_sfzb:true,
  387. c_type:"中标登记",
  388. c_enable: false
  389. })
  390. updateProject(CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3],content2)
  391. }else if(addForm.value.type == '投续标'){
  392. //流程
  393. const rwlcqd = JSON.parse(selectedObject.value.rwlcqd || '[]')
  394. rwlcqd.forEach((p: any) => {
  395. if(!p.danger && p.id !=8){//未处理的流程全部重新处理
  396. p.done = true,
  397. p.create_time = moment().format('YYYY-MM-DD HH:mm'),
  398. p.username = userName,
  399. p.userid = userInfo?.id || '',
  400. p.type = 0
  401. }
  402. })
  403. let xmjd_json = JSON.parse(selectedObject.value.c_xmjd_json || '[]');
  404. const curNumber = xmjd_json[xmjd_json.length - 1].xmjd
  405. for(let i = curNumber; i < 8; i++){
  406. if(i == curNumber){
  407. xmjd_json[i-1].create_time = moment().format('YYYY-MM-DD HH:mm')
  408. xmjd_json[i-1].username = userName
  409. xmjd_json[i-1].userid = userInfo?.id || ''
  410. xmjd_json[i-1].type = 0
  411. }else{
  412. if( i == 7){
  413. xmjd_json.push({xmjd: i, type: 1, create_time: '', username: '', userid: ''})
  414. }else{
  415. xmjd_json.push({xmjd: i, type: 0, create_time: moment().format('YYYY-MM-DD HH:mm'), username: userName, userid: userInfo?.id || ''})
  416. }
  417. }
  418. }
  419. const steps = [
  420. { n: 1, label: '预警触发'},
  421. { n: 2, label: '投/续标准备'},
  422. { n: 3, label: '招标监控'},
  423. { n: 4, label: '标书制作'},
  424. { n: 5, label: '投标提交'},
  425. { n: 6, label: '开标监控'},
  426. { n: 7, label: '确认中标'},
  427. ]
  428. let json = xmjd_json.map((item:any) => {
  429. return {
  430. create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
  431. desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
  432. username:item.username ? item.username : userName,
  433. userid:item.userid ? item.userid : userInfo?.id || '',
  434. }
  435. })
  436. // 开标监控
  437. let kbFormData = {
  438. title: selectedObject.value.title,
  439. content: selectedObject.value.content,
  440. c_zbbh: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  441. c_sfzb: true,
  442. c_jgjk_url: finishBidObjectTemp.value?.url || '',
  443. c_kbsj: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
  444. c_xmmc: selectedObject.value.c_xmbt,
  445. c_zbtjr: selectedObject.value.tbrq ? selectedObject.value.tbrq : addForm.value.tb_date,
  446. c_tbbj: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
  447. c_glxm: selectedObject.value.xmbh,
  448. c_lcsjx: json || '',
  449. c_type: '中标登记',
  450. c_enable: false
  451. }
  452. console.log(kbFormData)
  453. const res = await addContentParams(kbFormData,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
  454. let desc = {
  455. zb_project_code: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  456. zb_source_name: addForm.value.zb_source,
  457. zb_project_name: addForm.value.zb_name,
  458. zb_budget_amount: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
  459. zb_detail_url: finishBidObjectTemp.value?.url || '',
  460. zb_publish_time: selectedObject.value.zbkssj ? selectedObject.value.zbkssj : addForm.value.zb_startdate,
  461. zb_bid_deadline: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
  462. zb_author: userName
  463. }
  464. let areaArr = (areaObject.value as any)?.pathLabels || []
  465. let tbFormData = {
  466. id: selectedObject.value.id || '',
  467. c_zgfw: selectedObject.value.c_zgfw ? selectedObject.value.c_zgfw : addFormZgfw.value,
  468. c_xgzb: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  469. c_xgjk: (res as any).content || '',
  470. c_xmbtqc: selectedObject.value.c_xmbt,
  471. c_qx: selectedObject.value.c_qx ? selectedObject.value.c_qx : areaArr[0] || '',
  472. c_xmbt: selectedObject.value.c_xmbt,
  473. c_xmjd_json:xmjd_json,
  474. zbxmbh: selectedObject.value.c_xgzb ? selectedObject.value.c_xgzb : addForm.value.zb_code,
  475. tbrq: selectedObject.value.tbrq ? selectedObject.value.tbrq : addForm.value.tb_date,
  476. tbbj: selectedObject.value.tbbj ? selectedObject.value.tbbj : addForm.value.tb_money,
  477. zbkssj: selectedObject.value.zbkssj ? selectedObject.value.zbkssj : addForm.value.zb_startdate,
  478. zbjzsj: selectedObject.value.zbjzsj ? selectedObject.value.zbjzsj : addForm.value.zb_enddate,
  479. rwlcqd: rwlcqd,
  480. zbmsxx: selectedObject.value.zbmsx ? selectedObject.value.zbmsx : desc,
  481. c_ytfw: selectedObject.value.ytfxw ? selectedObject.value.ytfxw : addFormYT.value,
  482. c_fwlx: selectedObject.value.fwlx ? selectedObject.value.fwlx : addFormFwlx.value.toString(),
  483. c_glqy: selectedObject.value.glqy ? selectedObject.value.glqy : areaArr[1] || '',
  484. }
  485. updateProject(CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0],JSON.stringify(tbFormData))
  486. // console.log("其他")
  487. }else{
  488. console.log("其他")
  489. //流程
  490. const rwlcqd = CONFIG.TASKLIST
  491. rwlcqd.forEach((p: any) => {
  492. if(!p.danger && p.id !=8){//未处理的流程全部重新处理
  493. p.done = true,
  494. p.create_time = moment().format('YYYY-MM-DD HH:mm'),
  495. p.username = userName,
  496. p.userid = userInfo?.id || '',
  497. p.type = 0
  498. }
  499. })
  500. let xmjd_json = [];
  501. for(let i = 1; i < 8; i++){
  502. if( i == 7){
  503. xmjd_json.push({xmjd: i, type: 1, create_time: '', username: '', userid: ''})
  504. }else{
  505. xmjd_json.push({xmjd: i, type: 0, create_time: moment().format('YYYY-MM-DD HH:mm'), username: userName, userid: userInfo?.id || ''})
  506. }
  507. }
  508. const steps = [
  509. { n: 1, label: '预警触发'},
  510. { n: 2, label: '投/续标准备'},
  511. { n: 3, label: '招标监控'},
  512. { n: 4, label: '标书制作'},
  513. { n: 5, label: '投标提交'},
  514. { n: 6, label: '开标监控'},
  515. { n: 7, label: '确认中标'},
  516. ]
  517. let json = xmjd_json.map((item:any) => {
  518. return {
  519. create_time: item.create_time ? item.create_time : moment().format('YYYY-MM-DD HH:mm'),
  520. desc:steps.find((s:any) => s.n == item.xmjd)?.label || '',
  521. username:item.username ? item.username : userName,
  522. userid:item.userid ? item.userid : userInfo?.id || '',
  523. }
  524. })
  525. // 开标监控
  526. let kbFormData = {
  527. title: finishObject.value.title,
  528. content: finishObject.value.content,
  529. c_zbbh: addForm.value.zb_code,
  530. c_sfzb: true,
  531. c_jgjk_url: finishBidObjectTemp.value?.url || '',
  532. c_kbsj: addForm.value.zb_enddate,
  533. c_xmmc: finishObject.value.c_xmmc,
  534. c_zbtjr: addForm.value.tb_date,
  535. c_tbbj: addForm.value.tb_money,
  536. c_glxm: finishObject.value.c_guid,
  537. c_lcsjx: json || '',
  538. c_type: '中标登记',
  539. c_enable: false
  540. }
  541. console.log(kbFormData)
  542. const res = await addContentParams(kbFormData,CONFIG.COLUMNIDARR[6],CONFIG.MODELIDARR[3])
  543. let desc = {
  544. zb_project_code: addForm.value.zb_code,
  545. zb_source_name: addForm.value.zb_source,
  546. zb_project_name: addForm.value.zb_name,
  547. zb_budget_amount: addForm.value.tb_money,
  548. zb_detail_url: finishBidObjectTemp.value?.url || '',
  549. zb_publish_time: addForm.value.zb_startdate,
  550. zb_bid_deadline: addForm.value.zb_enddate,
  551. zb_author: userName
  552. }
  553. let areaArr = (areaObject.value as any)?.pathLabels || []
  554. let tbFormData = {
  555. title: finishObject.value.title,
  556. content: finishObject.value.content,
  557. c_sfzb: finishObject.value.c_htqyjf,
  558. c_zgfw: addFormZgfw.value ? addFormZgfw.value : finishObject.value.c_wtfs || '',
  559. c_kssj: moment(finishObject.value.c_zgxmhtksrq).format('YYYY-MM-DD HH:mm') || '',
  560. c_dqsj: moment(finishObject.value.c_zgxmhtdqrq).format('YYYY-MM-DD HH:mm') || '',
  561. xmbh: finishObject.value.c_guid,
  562. c_nh: finishObject.value.c_nhhtsr || '',
  563. c_is_xb: addForm.value.c_is_xb,
  564. c_xgzb: addForm.value.zb_code,
  565. c_xgjk: (res as any).content || '',
  566. c_xmbtqc: finishObject.value.c_xmmc,
  567. c_qx: areaArr[0] ? areaArr[0] : finishObject.value.c_sq || '',
  568. c_xmbt: finishObject.value.c_xmmc,
  569. c_xmjd_json:xmjd_json,
  570. zbxmbh: addForm.value.zb_code,
  571. tbrq: addForm.value.tb_date,
  572. tbbj: addForm.value.tb_money,
  573. zbkssj: addForm.value.zb_startdate,
  574. zbjzsj: addForm.value.zb_enddate,
  575. rwlcqd: rwlcqd,
  576. zbmsxx: desc,
  577. c_ytfw: addFormYT.value,
  578. c_fwlx: addFormFwlx.value.toString(),
  579. c_glqy: areaArr[1] ? areaArr[1] : finishObject.value.c_glqynbkj || '',
  580. }
  581. await addContentParams(tbFormData,CONFIG.COLUMNIDARR[2],CONFIG.MODELIDARR[0])
  582. }
  583. } else {
  584. // console.log('error submit!')
  585. }
  586. close()
  587. })
  588. }
  589. const addContentParams = async (formData: any,columnId:number,modelId:number) => {
  590. const params = {
  591. content: JSON.stringify(formData),
  592. columnId: columnId,
  593. modelId: modelId,
  594. }
  595. const res = await api.addContent(params)
  596. return res
  597. }
  598. const handleTypeChange = (val: any) => {
  599. addForm.value.title = ''
  600. addForm.value.type = val || ''
  601. }
  602. const selectedObject = ref<any>({})
  603. const handleProjectChange = async (val: any) => {
  604. addForm.value.title = val.title || ''
  605. jkBidObject.value = null
  606. txbBidObject.value = null
  607. finishBidObject.value = null
  608. if(addForm.value.type == '监控中'){
  609. jkBidObject.value = val
  610. const res = await getTxbBidContent(CONFIG.COLUMNIDARR[2],val.id,"c_xgjk")
  611. txbBidObject.value = res || {}
  612. }else{
  613. selectedObject.value = val
  614. }
  615. console.log("项目名称:", val)
  616. }
  617. const getTypeProjects = async (columnId:number) => {
  618. const params: any = {
  619. columnId: columnId,
  620. orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
  621. states: '0,1,2,3,4',
  622. pageSize: 9999,
  623. page: 0
  624. }
  625. const res = await getDmsDataList(params)
  626. return (res as any).content
  627. }
  628. const getDmsDataList = async (params: any) => {
  629. return await api.getDmsDataList(params)
  630. }
  631. const updateProject = async (columnId:number,modelId:number,content:string) => {
  632. const params: any = {
  633. columnId: columnId,
  634. modelId: modelId,
  635. content: content,
  636. }
  637. // console.log(params)
  638. const res = await api.updateContent(params)
  639. if ((res as any).code === 200) {
  640. // ElMessage.success('添加成功')
  641. initData()
  642. }else{
  643. // ElMessage.error('添加失败')
  644. }
  645. }
  646. // const handleSwitchChange = (val: any) => {
  647. // finishBidObjectTemp.value.flag = val
  648. // finishBidObjectTemp.value.url = ''
  649. // finishObject.value = {}
  650. // }
  651. // const handleChange = (val: any) => {
  652. // finishBidObject.value = val
  653. // }
  654. const handleXBSwitchChange = (val: any) => {
  655. addForm.value.c_is_xb = val
  656. console.log(val)
  657. }
  658. // 获取投续标内容
  659. const getTxbBidContent = async (columnId:number,search:string,type:string) => {
  660. const params: any = {
  661. columnId: columnId,
  662. orderBy: JSON.stringify([{ field: "update_time", orderByType: 2 }]),
  663. states: '0,1,2,3,4',
  664. pageSize: 1,
  665. page: 0
  666. }
  667. if (search) {
  668. params.search = JSON.stringify([
  669. ...(params.search ? JSON.parse(params.search) : []),
  670. {
  671. field: type,
  672. searchType: 1,
  673. content: { value: search },
  674. },
  675. ]);
  676. }
  677. const res = await getDmsDataList(params)
  678. return (res as any).content.data[0]
  679. }
  680. const buildAreaTree = (flatList: any[]) => {
  681. const districtMap = new Map<string, TreeItem>()
  682. const filteredList = flatList.filter(item => item?.c_district_code?.startsWith('3101'))
  683. for (const item of filteredList) {
  684. const districtCode = item.c_district_code
  685. const districtName = item.c_district_name
  686. if (!districtCode || !districtName) continue
  687. let districtNode = districtMap.get(districtCode)
  688. if (!districtNode) {
  689. districtNode = {
  690. id: districtCode,
  691. label: districtName,
  692. value: districtCode,
  693. children: [],
  694. ...item
  695. }
  696. districtMap.set(districtCode, districtNode as TreeItem)
  697. }
  698. const partCode = item.c_part_code
  699. const partName = item.c_part_name
  700. if (!partCode || !partName) continue
  701. const partMap = new Map<string, TreeItem>()
  702. for (const child of (districtNode?.children || []) as TreeItem[]) {
  703. partMap.set(child.value, child)
  704. }
  705. let partNode = partMap.get(partCode)
  706. if (!partNode) {
  707. partNode = {
  708. id: partCode,
  709. label: partName,
  710. value: partCode,
  711. children: [],
  712. ...item
  713. }
  714. districtNode?.children?.push(partNode as TreeItem)
  715. }
  716. }
  717. return Array.from(districtMap.values())
  718. }
  719. const handleNodeAreaClick = (value: any[]) => {
  720. console.log('选中的值数组:', value)
  721. const nodes = (areaCascader.value as any)?.getCheckedNodes?.() || []
  722. if(nodes.length) {
  723. const targetNode = nodes[nodes.length - 1]
  724. areaObject.value = targetNode
  725. }
  726. }
  727. const handleAdminCascaderChange = (val: any) => {
  728. const tempObj = finishTreeProjects.value.filter((item: any) => item.id.includes(val[1]))[0]
  729. finishObject.value = tempObj
  730. console.log(tempObj)
  731. }
  732. </script>
  733. <style scoped>
  734. .bid-content-page {
  735. width: 100%;
  736. }
  737. .bid-container{
  738. height: calc(100vh - 180px);
  739. overflow-y: auto;
  740. }
  741. </style>