|
@@ -0,0 +1,1058 @@
|
|
|
+import dayjs from 'dayjs'
|
|
|
+import { InfoTypeTransform } from './info-type-transform'
|
|
|
+import { calcNotExactTime } from './date'
|
|
|
+import {
|
|
|
+ biddingSearchScope,
|
|
|
+ biddingSearchConcat,
|
|
|
+ wordsModeList,
|
|
|
+ searchModeList,
|
|
|
+ biddingSearchTime,
|
|
|
+ buyerclassListMapExp,
|
|
|
+ industryListMapExp
|
|
|
+} from '@/assets/js/selector'
|
|
|
+import { dateFormatter } from '@jy/util'
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 接口中的数据转前端标准数据
|
|
|
+ */
|
|
|
+export class FilterHistoryAjaxModel2ViewModel {
|
|
|
+ static formatAll(map) {
|
|
|
+ // wordsMode
|
|
|
+ const { wordsMode, wordsModeText } = this.formatWordsMode(map.wordsMode)
|
|
|
+ // 精准匹配/模糊匹配
|
|
|
+ const { searchMode, searchModeText } = this.formatSearchMode(map.searchMode)
|
|
|
+ // 搜索范围整理
|
|
|
+ const { scope, scopeText } = this.formatScope(map.selectType)
|
|
|
+ // 行业整理
|
|
|
+ const { industry, industryText } = this.formatIndustry(map.industry)
|
|
|
+ // 地区整理
|
|
|
+ const { regionMap, regionMapText} = this.formatRegion(map.regionMap)
|
|
|
+ // 金额筛选整理
|
|
|
+ const {price, priceText} = this.formatPriceText(map.minprice, map.maxprice)
|
|
|
+ // 时间筛选整理
|
|
|
+ const { publishTime, publishTimeText } = this.formatTime(map.publishtime)
|
|
|
+ // 信息类型
|
|
|
+ const { infoType, infoTypeText } = this.formatInfoType(map.subtype)
|
|
|
+ // 采购单位
|
|
|
+ const { buyerClass, buyerClassText } = this.formatBuyerClass(map.buyerclass)
|
|
|
+ // 联系方式
|
|
|
+ const { basicData: buyerTel, basicDataText: buyerTelText } = this.formatContact(map.buyertel)
|
|
|
+ const { basicData: winnerTel, basicDataText: winnerTelText } = this.formatContact(map.winnertel)
|
|
|
+ // 附件
|
|
|
+ const fileExistsText = this.formatAttach(map.fileExists)
|
|
|
+
|
|
|
+ const formatted = {
|
|
|
+ keywords: map.searchvalue,
|
|
|
+ additionalWords: map.additionalWords,
|
|
|
+ wordsMode,
|
|
|
+ wordsModeText,
|
|
|
+ searchMode,
|
|
|
+ searchModeText,
|
|
|
+ searchGroup: map.searchGroup !== undefined ? String(map.searchGroup) : '0',
|
|
|
+ scope,
|
|
|
+ scopeText,
|
|
|
+ industry,
|
|
|
+ industryText,
|
|
|
+ regionMap,
|
|
|
+ regionMapText,
|
|
|
+ price,
|
|
|
+ priceText,
|
|
|
+ dateTime: publishTime, // 标讯搜索恢复数据可能要用到?
|
|
|
+ publishTime,
|
|
|
+ publishTimeText,
|
|
|
+ infoType,
|
|
|
+ infoTypeText,
|
|
|
+ buyerClass,
|
|
|
+ buyerClassText,
|
|
|
+ buyerTel,
|
|
|
+ buyerTelText,
|
|
|
+ winnerTel,
|
|
|
+ winnerTelText,
|
|
|
+ notkey: map.notkey ? map.notkey.replace(/,/g, ",") : '',
|
|
|
+ buyer: map.buyer ? map.buyer.replace(/,/g, ",") : '',
|
|
|
+ winner: map.winner ? map.winner.replace(/,/g, ",") : '',
|
|
|
+ agency: map.agency ? map.agency.replace(/,/g, ",") : '',
|
|
|
+ fileExists: map.fileExists,
|
|
|
+ fileExistsText: fileExistsText
|
|
|
+ }
|
|
|
+ // 删去undefined/null的项
|
|
|
+ for (const key in formatted) {
|
|
|
+ if (formatted[key] === undefined || formatted[key] === null) {
|
|
|
+ delete formatted[key]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return formatted
|
|
|
+ }
|
|
|
+
|
|
|
+ static mapToList(map) {
|
|
|
+ let list = []
|
|
|
+ if (!map) return list
|
|
|
+ for (const key in map) {
|
|
|
+ if (Array.isArray(map[key])) {
|
|
|
+ list = list.concat(map[key])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关键词匹配方式wordsModeList整理
|
|
|
+ * (输出包含文字描述和选择器使用的数据结构)
|
|
|
+ * @param String m '0'/'1'
|
|
|
+ * @returns Object
|
|
|
+ */
|
|
|
+ static formatWordsMode(m) {
|
|
|
+ const result = {
|
|
|
+ wordsMode: undefined,
|
|
|
+ wordsModeText: undefined
|
|
|
+ }
|
|
|
+ if (!m) {
|
|
|
+ m = '0'
|
|
|
+ }
|
|
|
+ m = String(m)
|
|
|
+ const target = wordsModeList.find((item) => m === item.key)
|
|
|
+ if (target) {
|
|
|
+ result.wordsMode = [target.key]
|
|
|
+ result.wordsModeText = target.label
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索方式整理 精准匹配/模糊匹配
|
|
|
+ * @param String m '0'/'1'
|
|
|
+ * @returns Object
|
|
|
+ */
|
|
|
+ static formatSearchMode(m) {
|
|
|
+ const result = {
|
|
|
+ searchMode: undefined,
|
|
|
+ searchModeText: undefined
|
|
|
+ }
|
|
|
+ // m为空默认为0
|
|
|
+ if (!m) {
|
|
|
+ m = '0'
|
|
|
+ }
|
|
|
+ m = String(m)
|
|
|
+ const target = searchModeList.find((item) => m === item.key)
|
|
|
+ if (target) {
|
|
|
+ result.searchMode = [target.key]
|
|
|
+ result.searchModeText = target.label
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索范围整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'content,title,ppa'
|
|
|
+ */
|
|
|
+ static formatScope(val) {
|
|
|
+ const result = {
|
|
|
+ scope: undefined,
|
|
|
+ scopeText: undefined
|
|
|
+ }
|
|
|
+ if (!val) return result
|
|
|
+ const map = {}
|
|
|
+ biddingSearchScope.forEach((item) => {
|
|
|
+ map[item.key] = item.label
|
|
|
+ })
|
|
|
+ // 将字符转换为中文
|
|
|
+ const selectKeyArr = val.split(',')
|
|
|
+ const selectKeyTextArr = selectKeyArr
|
|
|
+ .map((key) => {
|
|
|
+ return map[key]
|
|
|
+ })
|
|
|
+ .filter((key) => !!key)
|
|
|
+
|
|
|
+ result.scope = selectKeyArr
|
|
|
+ result.scopeText = selectKeyTextArr ? selectKeyTextArr.toString().replace(/,/g, ",") : ''
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 行业整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'机械设备_工程机械,机械设备_车辆,机械设备_其他机械设备,行政办公_通用办公设备,行政办公_办公家具'
|
|
|
+ */
|
|
|
+ static formatIndustry(val) {
|
|
|
+ const result = {
|
|
|
+ industry: undefined,
|
|
|
+ industryText: undefined
|
|
|
+ }
|
|
|
+ if (!val || val === '全部') return result
|
|
|
+
|
|
|
+ const industry = {}
|
|
|
+ let industryText = []
|
|
|
+
|
|
|
+ // 整理行业
|
|
|
+ val.split(',').forEach((v) => {
|
|
|
+ const vSplit = v.split('_')
|
|
|
+ const industryChildren = industry[vSplit[0]]
|
|
|
+ if (Array.isArray(industryChildren)) {
|
|
|
+ industryChildren.push(vSplit[1])
|
|
|
+ } else {
|
|
|
+ industry[vSplit[0]] = [vSplit[1]]
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if (Object.keys(industry).length) {
|
|
|
+ result.industry = industry
|
|
|
+ }
|
|
|
+
|
|
|
+ // 整理行业text
|
|
|
+ // 统计完整行业数量
|
|
|
+ const calcChildrenCount = {}
|
|
|
+ for (const key in industryListMapExp) {
|
|
|
+ calcChildrenCount[key] = industryListMapExp[key].length
|
|
|
+ }
|
|
|
+ // 如果行业数据为全部,则只显示一级行业,否则需要显示二级行业
|
|
|
+ for (const key in industry) {
|
|
|
+ if (industry[key].length === calcChildrenCount[key]) {
|
|
|
+ industryText.push(key)
|
|
|
+ } else {
|
|
|
+ industryText = [...industryText, ...industry[key]]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (industryText.length) {
|
|
|
+ result.industryText = industryText ? industryText.toString().replace(/,/g, ",") : ''
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 三级地区整理
|
|
|
+ * @params Object regionMap
|
|
|
+ * {
|
|
|
+ * 北京: {
|
|
|
+ * 朝阳区: [],
|
|
|
+ * 东城区: []
|
|
|
+ * },
|
|
|
+ * 河南: {
|
|
|
+ * 南阳市: [],
|
|
|
+ * 郑州: ['金水区'],
|
|
|
+ * 洛阳市: ['栾川县']
|
|
|
+ * },
|
|
|
+ * 澳门: {}
|
|
|
+ * }
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ */
|
|
|
+ static formatRegion (region) {
|
|
|
+ if (!region || Object.keys(region).length === 0) return '全国'
|
|
|
+ const arr = []
|
|
|
+ for (let povince in region) {
|
|
|
+ if (Object.keys(region[povince]).length === 0) {
|
|
|
+ arr.push(povince)
|
|
|
+ } else {
|
|
|
+ for (let city in region[povince]) {
|
|
|
+ if (region[povince][city].length === 0) {
|
|
|
+ arr.push(city)
|
|
|
+ } else {
|
|
|
+ arr.push(...region[povince][city])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ regionMap: region,
|
|
|
+ regionMapText: arr.toString().replace(/,/g, ",")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 价格区间处理
|
|
|
+ * @param start
|
|
|
+ * @param end
|
|
|
+ * @param unit
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+ static formatPriceText(start, end, unit = '万元') {
|
|
|
+ let priceText = ''
|
|
|
+ let price = ''
|
|
|
+ if (start && end) {
|
|
|
+ priceText = `${start}-${end}${unit}`
|
|
|
+ price = start + '-' + end
|
|
|
+ } else if (start && !end) {
|
|
|
+ price = start
|
|
|
+ priceText = `${start}${unit}以上`
|
|
|
+ } else if (!start && end) {
|
|
|
+ price = end
|
|
|
+ priceText = `${end}${unit}以下`
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ price,
|
|
|
+ priceText,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 时间整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'1653321600_1654012800'
|
|
|
+ * 参数val示例:'fiveyear'
|
|
|
+ */
|
|
|
+ static formatTime(val, spl= '_') {
|
|
|
+ const result = {
|
|
|
+ publishTime: undefined,
|
|
|
+ publishTimeText: undefined
|
|
|
+ }
|
|
|
+ if (!val) return result
|
|
|
+ const map = {}
|
|
|
+ biddingSearchTime.forEach((item) => {
|
|
|
+ map[item.key] = item.label
|
|
|
+ })
|
|
|
+ const t = {
|
|
|
+ start: 0,
|
|
|
+ end: 0,
|
|
|
+ exact: 'exact'
|
|
|
+ }
|
|
|
+ // 如果是精确时间
|
|
|
+ if (val.indexOf(spl) > -1 && val.indexOf('lately') === -1) {
|
|
|
+ const split = val.split(spl)
|
|
|
+ const start = split[0].toString().length > 10 ? Number(split[0]) : split[0] * 1000
|
|
|
+ const end = split[1].toString().length > 10 ? Number(split[1]) : split[1] * 1000
|
|
|
+ const textArr = []
|
|
|
+ if (start && !isNaN(start)) {
|
|
|
+ t.start = start
|
|
|
+ textArr[0] = dateFormatter(start, 'yyyy/MM/dd')
|
|
|
+ }
|
|
|
+ if (end && !isNaN(end)) {
|
|
|
+ t.end = end
|
|
|
+ textArr[1] = dateFormatter(end, 'yyyy/MM/dd')
|
|
|
+ }
|
|
|
+ let publishTime = ''
|
|
|
+ let publishTimeText = ''
|
|
|
+ if (textArr[0] && textArr[1]) {
|
|
|
+ publishTimeText = textArr.join('-')
|
|
|
+ publishTime = val
|
|
|
+ } else if (textArr[0] && !textArr[1]) {
|
|
|
+ publishTimeText = `${textArr[0]}以后`
|
|
|
+ publishTime = split[0] + '_' + '0'
|
|
|
+ } else if (!textArr[0] && textArr[1]) {
|
|
|
+ publishTimeText = `${textArr[1]}以前`
|
|
|
+ publishTime = '0' + '_' + split[1]
|
|
|
+ }
|
|
|
+ // 计算text
|
|
|
+ result.publishTimeText = publishTimeText
|
|
|
+ result.publishTime = publishTime
|
|
|
+ } else {
|
|
|
+ t.exact = val
|
|
|
+ result.publishTimeText = map[val] || ''
|
|
|
+ result.publishTime = val
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 信息类型整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'采购意向,中标,成交,废标,流标'
|
|
|
+ */
|
|
|
+ static formatInfoType(val) {
|
|
|
+ const result = {
|
|
|
+ infoType: undefined,
|
|
|
+ infoTypeText: undefined
|
|
|
+ }
|
|
|
+ if (!val || val === '全部') return result
|
|
|
+ const arr = val.split(',').map((v) => {
|
|
|
+ // 把<拟建>替换成<拟建项目>
|
|
|
+ if (v === '拟建') {
|
|
|
+ return '拟建项目'
|
|
|
+ } else {
|
|
|
+ return v
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const obj = InfoTypeTransform.formatListToMap(arr)
|
|
|
+ result.infoType = InfoTypeTransform.mapToList(obj)
|
|
|
+
|
|
|
+ const map = InfoTypeTransform.listToMap(result.infoType)
|
|
|
+ result.infoTypeText = InfoTypeTransform.formatMapToList(map)
|
|
|
+ return {
|
|
|
+ infoType: result.infoType, // 恢复组件的数组内容
|
|
|
+ infoTypeText: result.infoTypeText ? result.infoTypeText.toString().replace(/,/g, ",") : ''// 文字
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 采购单位类型整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'住建,传媒,建筑业,能源化工,批发零售,信息技术,运输物流,制造业,住宿餐饮'
|
|
|
+ */
|
|
|
+ static formatBuyerClass(val) {
|
|
|
+ const result = {
|
|
|
+ buyerClass: undefined,
|
|
|
+ buyerClassText: undefined
|
|
|
+ }
|
|
|
+ if (!val || val === '全部') return result
|
|
|
+ result.buyerClass = val.split(',')
|
|
|
+
|
|
|
+ // 逻辑和行业类似,如果二级全选,则展示一级分类文字,否则展示二级分类文字
|
|
|
+ // 1. 把选中的整理成原始数据结构
|
|
|
+ const keyList = []
|
|
|
+ const keyListMap = {}
|
|
|
+ for (const key in buyerclassListMapExp) {
|
|
|
+ keyList.push(key)
|
|
|
+ if (val.indexOf(key) !== -1) {
|
|
|
+ // 存在
|
|
|
+ if (Array.isArray(keyListMap[key])) {
|
|
|
+ keyListMap[key] = []
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Array.isArray(buyerclassListMapExp[key])) {
|
|
|
+ // 循环二级子项
|
|
|
+ buyerclassListMapExp[key].forEach((item) => {
|
|
|
+ if (val.indexOf(item) !== -1) {
|
|
|
+ // 存在
|
|
|
+ if (Array.isArray(keyListMap[key])) {
|
|
|
+ keyListMap[key].push(item)
|
|
|
+ } else {
|
|
|
+ keyListMap[key] = [item]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 判断是否某一项全选了
|
|
|
+ let buyerClassText = []
|
|
|
+ for (const key in keyListMap) {
|
|
|
+ if (keyListMap[key].length === buyerclassListMapExp[key].length) {
|
|
|
+ buyerClassText.push(key)
|
|
|
+ } else {
|
|
|
+ buyerClassText = [...buyerClassText, ...keyListMap[key]]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (buyerClassText.length) {
|
|
|
+ result.buyerClassText = buyerClassText ? buyerClassText.toString().replace(/,/g, ",") : ''
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ buyerClass: result.buyerClass,
|
|
|
+ buyerClassText: result.buyerClassText,
|
|
|
+ keyListMap: keyListMap
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理联系方式
|
|
|
+ * @param val
|
|
|
+ * @returns {{basicDataText: undefined, basicData: undefined}}
|
|
|
+ */
|
|
|
+ static formatContact(val = '') {
|
|
|
+ const result = {
|
|
|
+ basicData: undefined,
|
|
|
+ basicDataText: undefined
|
|
|
+ }
|
|
|
+ const map = {}
|
|
|
+ biddingSearchConcat.forEach((item) => {
|
|
|
+ map[item.key] = item.label
|
|
|
+ })
|
|
|
+
|
|
|
+ if (val) {
|
|
|
+ result.basicData = val
|
|
|
+ result.basicDataText = map[val]
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理-附件
|
|
|
+ * @param val
|
|
|
+ * @returns {string}
|
|
|
+ */
|
|
|
+ static formatAttach (val) {
|
|
|
+ if (val == 1 || val == '1') {
|
|
|
+ return '有附件'
|
|
|
+ } else if (val == -1 || val == '-1') {
|
|
|
+ return '无附件'
|
|
|
+ } else {
|
|
|
+ return '全部'
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 保存筛选条件
|
|
|
+ * 将组件初始化filter,格式成保存筛选条件接口需要数据格式
|
|
|
+ * 前端标准数据转接口中的数据
|
|
|
+ */
|
|
|
+export class FilterHistoryViewModel2AjaxModel {
|
|
|
+ static formatAll(map) {
|
|
|
+ // 搜索范围整理
|
|
|
+ const selectType = this.formatScope(map.selectType)
|
|
|
+ // 行业整理
|
|
|
+ const industry = this.formatIndustry(map.industry)
|
|
|
+ // 地区整理
|
|
|
+ // const { area, city } = this.formatAreaCity(map.area)
|
|
|
+ // 金额筛选整理
|
|
|
+ const { minPrice, maxPrice } = this.formatPrice(map.price)
|
|
|
+ // 时间筛选整理
|
|
|
+ const publishTime = map.publishTime?.includes('_') ? this.formatExactTime(map.publishTime, '_', '_') : this.formatTime(map.publishTime)
|
|
|
+ // 信息类型
|
|
|
+ let subtype = this.formatInfoType(map.subtype)
|
|
|
+ if (subtype) {
|
|
|
+ subtype = subtype.replace('拟建项目', '拟建')
|
|
|
+ }
|
|
|
+ // 采购单位类型
|
|
|
+ const buyerClass = this.formatBuyerClass(map.buyerclass)
|
|
|
+ // 包含关系、多个关键词
|
|
|
+ const { additionalWords, wordsMode } = this.formatSelectMoreKey(map.selectMoreKey, map.additionalWords, map.wordsMode)
|
|
|
+ // tab值
|
|
|
+ const searchGroup = this.formatSearchGroup(map.searchGroup)
|
|
|
+ const formatted = {
|
|
|
+ searchvalue: map.input,
|
|
|
+ selectType,
|
|
|
+ industry,
|
|
|
+ minprice: minPrice,
|
|
|
+ maxprice: maxPrice,
|
|
|
+ publishtime: publishTime, // 发布时间
|
|
|
+ subtype, // 信息类型
|
|
|
+ buyerclass: buyerClass, // 采购单位类型
|
|
|
+ buyertel: map.buyertel, // 采购单位联系方式
|
|
|
+ winnertel: map.winnertel, // 中标企业联系方式
|
|
|
+ notkey: map.notkey ? map.notkey.join(',') : '', // 排除词
|
|
|
+ buyer: map.buyer ? map.buyer.join(',') : '', // 采购单位
|
|
|
+ winner: map.winner ? map.winner.join(',') : '', // 中标企业
|
|
|
+ agency: map.agency ? map.agency.join(',') : '', // 招标代理机构
|
|
|
+ fileExists: map.fileExists, // 附件
|
|
|
+ regionMap: map.regionMap, // 地区
|
|
|
+ searchGroup: searchGroup, // 搜索分组:默认0:全部;1:招标采购公告;2:超前项目
|
|
|
+ searchMode: Number(map.searchMode), // 搜索模式:0:精准搜索;1:模糊搜索
|
|
|
+ wordsMode: wordsMode, // 搜索关键词模式;默认0:包含所有,1:包含任意
|
|
|
+ additionalWords: additionalWords, //关键词:附加关键词(副:五组,每组最多15个字符)
|
|
|
+ dateTime: map.publishTime, // 标讯搜索恢复数据可能要用到?
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删去undefined/null的项
|
|
|
+ for (const key in formatted) {
|
|
|
+ if (formatted[key] === undefined || formatted[key] === null) {
|
|
|
+ delete formatted[key]
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return formatted
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索范围整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:[content, title ,ppa]
|
|
|
+ */
|
|
|
+ static formatScope(val = [], split = ',') {
|
|
|
+ if (!Array.isArray(val)) return ''
|
|
|
+ return val.join(split)
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 行业整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:
|
|
|
+ * {
|
|
|
+ * 机械设备: ['工程机械', '车辆', '其他机械设备', '办公家具']
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ static formatIndustry(val = {}, split = ',') {
|
|
|
+ let industry = ''
|
|
|
+ if (!val || Object.keys(val).length === 0) return industry
|
|
|
+
|
|
|
+ const industryArr = []
|
|
|
+
|
|
|
+ for (const key in val) {
|
|
|
+ if (Array.isArray(val[key])) {
|
|
|
+ val[key].forEach((item) => {
|
|
|
+ industryArr.push(`${key}_${item}`)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ industry = industryArr.join(split)
|
|
|
+
|
|
|
+ return industry
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 三级地级市地区整理
|
|
|
+ * @param String area
|
|
|
+ * @param String city
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数area示例
|
|
|
+ * {
|
|
|
+ * 北京: {
|
|
|
+ * 朝阳区: [],
|
|
|
+ * 东城区: []
|
|
|
+ * },
|
|
|
+ * 河南: {
|
|
|
+ * 南阳市: [],
|
|
|
+ * 郑州: ['金水区'],
|
|
|
+ * 洛阳市: ['栾川县']
|
|
|
+ * },
|
|
|
+ * 澳门: {}
|
|
|
+ * }
|
|
|
+ */
|
|
|
+ static formatAreaCity(p = {}, split = ',') {
|
|
|
+ return areaObjToSingle(p, split)
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 金额整理
|
|
|
+ * @returns String
|
|
|
+ */
|
|
|
+ static formatPrice(price, split = '-') {
|
|
|
+ let priceArr = []
|
|
|
+ if(price) {
|
|
|
+ priceArr = price.split(split)
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ minPrice: priceArr[0] || '',
|
|
|
+ maxPrice: priceArr[1] || '',
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 时间整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数time: 时间选择器选择结果
|
|
|
+ * {
|
|
|
+ * start: '',
|
|
|
+ * end: '',
|
|
|
+ * exact: 'exact'
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * exact: 是否只输出精确结果
|
|
|
+ * split: 精确结果的分隔符
|
|
|
+ */
|
|
|
+ static formatTime(time, exact = false, split = '_') {
|
|
|
+ if(!time) return ''
|
|
|
+ const nTime = calcNotExactTime(time)
|
|
|
+ let sortedTime = ''
|
|
|
+ const { start, end } = nTime
|
|
|
+ if (exact) {
|
|
|
+ const startVal = start ? dayjs(start).unix() : ''
|
|
|
+ const endVal = end ? dayjs(end).unix() : ''
|
|
|
+ sortedTime = [startVal, endVal].join(split)
|
|
|
+ if (startVal || endVal) {
|
|
|
+ return [startVal, endVal].join(split)
|
|
|
+ } else {
|
|
|
+ return [].join(split)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sortedTime = time
|
|
|
+ }
|
|
|
+ return sortedTime
|
|
|
+ }
|
|
|
+
|
|
|
+ // 格式化自定义时间
|
|
|
+ static formatExactTime (time, join = '-', split='_') {
|
|
|
+ if(!time) return ''
|
|
|
+ let result = ''
|
|
|
+ let arr = []
|
|
|
+ if(time.indexOf(split) > -1) {
|
|
|
+ arr = time.split(split)
|
|
|
+ }
|
|
|
+ if(Number(arr[0]) === 0 && Number(arr[1]) > 0) {
|
|
|
+ result = `${join}${arr[1]}`
|
|
|
+ } else if(Number(arr[1]) === 0 && Number(arr[0]) > 0) {
|
|
|
+ result = `${arr[0]}${join}`
|
|
|
+ } else {
|
|
|
+ result = `${arr[0]}${join}${arr[1]}`
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 信息类型整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:{}
|
|
|
+ */
|
|
|
+ static formatInfoType(infoType, split = ',') {
|
|
|
+ const typeMap = InfoTypeTransform.listToMap(infoType)
|
|
|
+ const resultType = InfoTypeTransform.formatMapToList(typeMap)
|
|
|
+ return resultType ? resultType.join(',') : ''
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 采购单位类型整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:{}
|
|
|
+ */
|
|
|
+ static formatBuyerClass(val, split = ',') {
|
|
|
+ let buyerClass = ''
|
|
|
+ if (!val || Object.keys(val).length === 0) return buyerClass
|
|
|
+
|
|
|
+ buyerClass = []
|
|
|
+
|
|
|
+ for (const key in val) {
|
|
|
+ if (Array.isArray(val[key])) {
|
|
|
+ val[key].forEach((item) => {
|
|
|
+ buyerClass.push(item)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ buyerClass = buyerClass.join(split)
|
|
|
+
|
|
|
+ return buyerClass
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化包含关键词模式、包含关键词
|
|
|
+ */
|
|
|
+ static formatSelectMoreKey (selectMoreKey, additionalWords, wordsMode) {
|
|
|
+ let aWords = '' // 附加关键词
|
|
|
+ let wMode = 0 // 附加关键词筛选模式
|
|
|
+ if(selectMoreKey) {
|
|
|
+ aWords = additionalWords ? additionalWords.join(',') : ''
|
|
|
+ wMode = Number(wordsMode)
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ additionalWords: aWords,
|
|
|
+ wordsMode: wMode
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 整理当前搜索分组tab 搜索分组:默认全部0 招标采购公告1 超前项目2
|
|
|
+ * @param m
|
|
|
+ */
|
|
|
+ static formatSearchGroup(val) {
|
|
|
+ let result = 0
|
|
|
+ if (val !== undefined && val !== null) {
|
|
|
+ const nVal = Number(val)
|
|
|
+ switch (nVal) {
|
|
|
+ case 0:
|
|
|
+ case 4:
|
|
|
+ case 5:
|
|
|
+ result = 0
|
|
|
+ break
|
|
|
+ case 3:
|
|
|
+ case 1:
|
|
|
+ result = 3
|
|
|
+ break
|
|
|
+ case 2:
|
|
|
+ result = 2
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ result = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 三级地区对象转换成,单个area、city、district
|
|
|
+ */
|
|
|
+function areaObjToSingle(obj, split = ',') {
|
|
|
+ const map = {
|
|
|
+ area: '',
|
|
|
+ city: '',
|
|
|
+ district: ''
|
|
|
+ }
|
|
|
+ if (!obj) return map
|
|
|
+ const area = []
|
|
|
+ let city = []
|
|
|
+ let district = []
|
|
|
+ for (const key in obj) {
|
|
|
+ if (typeof obj[key] === 'object') {
|
|
|
+ if (Object.keys(obj[key]).length === 0) {
|
|
|
+ area.push(key)
|
|
|
+ } else {
|
|
|
+ // 城市项
|
|
|
+ const cityItem = obj[key]
|
|
|
+ for (const cKey in cityItem) {
|
|
|
+ // 区县项
|
|
|
+ const districtItem = cityItem[cKey]
|
|
|
+ if (Array.isArray(districtItem)) {
|
|
|
+ if (districtItem.length === 0) {
|
|
|
+ city.push(cKey)
|
|
|
+ } else {
|
|
|
+ const resetArr = districtItem.map((temp) => {
|
|
|
+ return cKey + '_' + temp
|
|
|
+ })
|
|
|
+ district = district.concat(resetArr)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ area: area.join(split),
|
|
|
+ city: city.join(split),
|
|
|
+ district: district.join(split)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 恢复筛选条件,已存的筛选条件转为原始组件所需筛选
|
|
|
+ */
|
|
|
+export class FilterHistoryAjaxModelRestore {
|
|
|
+ static formatAll (map) {
|
|
|
+ // wordsMode
|
|
|
+ const { additionalWords, wordsMode } = this.formatSelectMoreKey(map.additionalWords, map.wordsMode)
|
|
|
+ // 高亮关键词
|
|
|
+ const matchKeys = this.formatMatchKeys(map.keywords, additionalWords)
|
|
|
+ // 精准匹配/模糊匹配
|
|
|
+ const searchMode= this.formatSearchMode(map.searchMode)
|
|
|
+ // tab值
|
|
|
+ const searchGroup = this.formatSearchGroup(map.searchGroup)
|
|
|
+ // 采购单位
|
|
|
+ const { buyerClass } = this.formatBuyerClass(map.buyerClass)
|
|
|
+
|
|
|
+ const formatted = {
|
|
|
+ input: map.keywords,
|
|
|
+ additionalWords: additionalWords || [],
|
|
|
+ matchKeys,
|
|
|
+ wordsMode,
|
|
|
+ searchMode,
|
|
|
+ searchGroup,
|
|
|
+ selectType: map.scope || [],
|
|
|
+ industry: map.industry || {},
|
|
|
+ regionMap: map.regionMap || {},
|
|
|
+ price: map.price,
|
|
|
+ dateTime: map.publishTime, // 标讯搜索恢复数据可能要用到?
|
|
|
+ publishTime: map.publishTime,
|
|
|
+ subtype: map.infoType || [],
|
|
|
+ buyerclass: buyerClass|| {},
|
|
|
+ buyertel: map.buyerTel,
|
|
|
+ winnertel: map.winnerTel,
|
|
|
+ notkey: map.notkey ? map.notkey.split(',') : [],
|
|
|
+ buyer: map.buyer ? map.buyer.split(',') : [],
|
|
|
+ winner: map.winner ? map.winner.split(',') : [],
|
|
|
+ agency: map.agency ? map.agency .split(',') : [],
|
|
|
+ fileExists: map.fileExists
|
|
|
+ }
|
|
|
+ return formatted
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索方式整理 精准匹配/模糊匹配
|
|
|
+ * @param String m '0'/'1'
|
|
|
+ * @returns Object
|
|
|
+ */
|
|
|
+ static formatSearchMode(m) {
|
|
|
+ let searchMode = '0'
|
|
|
+ if (Array.isArray(m) && m.length) {
|
|
|
+ searchMode = m.join(',')
|
|
|
+ }
|
|
|
+ return searchMode
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理关键词相关
|
|
|
+ * (输出包含文字描述和选择器使用的数据结构)
|
|
|
+ * @param String m '0'/'1'
|
|
|
+ * @returns Object
|
|
|
+ */
|
|
|
+ static formatSelectMoreKey(additionalWords, wordsMode) {
|
|
|
+ const moreKeywordsModeState = {
|
|
|
+ additionalWords: [],
|
|
|
+ wordsMode: undefined
|
|
|
+ }
|
|
|
+ if (additionalWords) {
|
|
|
+ moreKeywordsModeState.additionalWords = additionalWords.split(',')
|
|
|
+ }
|
|
|
+ if (Array.isArray(wordsMode) && wordsMode.length) {
|
|
|
+ moreKeywordsModeState.wordsMode = Number(wordsMode[0])
|
|
|
+ }
|
|
|
+ return moreKeywordsModeState
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理页面需要匹配的高亮关键词
|
|
|
+ */
|
|
|
+ static formatMatchKeys (keywords, additionalWords) {
|
|
|
+ let arr = []
|
|
|
+ if(keywords) {
|
|
|
+ arr.push(keywords)
|
|
|
+ }
|
|
|
+ if(additionalWords?.length > 0) {
|
|
|
+ arr.concat(additionalWords)
|
|
|
+ }
|
|
|
+ return arr
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 整理当前搜索分组tab 搜索分组:默认全部0 招标采购公告1 超前项目2
|
|
|
+ * @param m
|
|
|
+ */
|
|
|
+ static formatSearchGroup(val) {
|
|
|
+ let result = 0
|
|
|
+ if (val !== undefined && val !== null) {
|
|
|
+ const nVal = Number(val)
|
|
|
+ switch (nVal) {
|
|
|
+ case 0:
|
|
|
+ case 4:
|
|
|
+ case 5:
|
|
|
+ result = 0
|
|
|
+ break
|
|
|
+ case 3:
|
|
|
+ case 1:
|
|
|
+ result = 1
|
|
|
+ break
|
|
|
+ case 2:
|
|
|
+ result = 2
|
|
|
+ break
|
|
|
+ default:
|
|
|
+ result = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 行业整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'机械设备_工程机械,机械设备_车辆,机械设备_其他机械设备,行政办公_通用办公设备,行政办公_办公家具'
|
|
|
+ */
|
|
|
+ static formatIndustry(val) {
|
|
|
+ const result = {
|
|
|
+ industry: undefined,
|
|
|
+ }
|
|
|
+ if (!val || val === '全部') return result
|
|
|
+
|
|
|
+ const industry = {}
|
|
|
+
|
|
|
+ // 整理行业
|
|
|
+ val.split(',').forEach((v) => {
|
|
|
+ const vSplit = v.split('_')
|
|
|
+ const industryChildren = industry[vSplit[0]]
|
|
|
+ if (Array.isArray(industryChildren)) {
|
|
|
+ industryChildren.push(vSplit[1])
|
|
|
+ } else {
|
|
|
+ industry[vSplit[0]] = [vSplit[1]]
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if (Object.keys(industry).length) {
|
|
|
+ result.industry = industry
|
|
|
+ }
|
|
|
+
|
|
|
+ // 整理行业text
|
|
|
+ // 统计完整行业数量
|
|
|
+ const calcChildrenCount = {}
|
|
|
+ for (const key in industryListMapExp) {
|
|
|
+ calcChildrenCount[key] = industryListMapExp[key].length
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 采购单位类型整理
|
|
|
+ * @param String val
|
|
|
+ * @returns Object
|
|
|
+ *
|
|
|
+ * 参数val示例:'住建,传媒,建筑业,能源化工,批发零售,信息技术,运输物流,制造业,住宿餐饮'
|
|
|
+ */
|
|
|
+ static formatBuyerClass(val) {
|
|
|
+ const result = {
|
|
|
+ buyerClass: undefined,
|
|
|
+ }
|
|
|
+ if (!val || val === '全部') return result
|
|
|
+
|
|
|
+ // 逻辑和行业类似,如果二级全选,则展示一级分类文字,否则展示二级分类文字
|
|
|
+ // 1. 把选中的整理成原始数据结构
|
|
|
+ const keyListMap = {}
|
|
|
+ for (const key in buyerclassListMapExp) {
|
|
|
+ if (val.indexOf(key) !== -1) {
|
|
|
+ // 存在
|
|
|
+ if (Array.isArray(keyListMap[key])) {
|
|
|
+ keyListMap[key] = []
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Array.isArray(buyerclassListMapExp[key])) {
|
|
|
+ // 循环二级子项
|
|
|
+ buyerclassListMapExp[key].forEach((item) => {
|
|
|
+ if (val.indexOf(item) !== -1) {
|
|
|
+ // 存在
|
|
|
+ if (Array.isArray(keyListMap[key])) {
|
|
|
+ keyListMap[key].push(item)
|
|
|
+ } else {
|
|
|
+ keyListMap[key] = [item]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ buyerClass: keyListMap,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理联系方式
|
|
|
+ * @param val
|
|
|
+ * @returns {{basicData: undefined}}
|
|
|
+ */
|
|
|
+ static formatContact(val = '') {
|
|
|
+ const result = {
|
|
|
+ basicData: undefined,
|
|
|
+ }
|
|
|
+ const map = {}
|
|
|
+ biddingSearchConcat.forEach((item) => {
|
|
|
+ map[item.key] = item.label
|
|
|
+ })
|
|
|
+
|
|
|
+ if (val) {
|
|
|
+ result.basicData = [val]
|
|
|
+ }
|
|
|
+ return result
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 二级地区对象转换成,单个area、city、district
|
|
|
+ */
|
|
|
+export function areaObjTwoToSingle(obj, split = ',') {
|
|
|
+ const map = {
|
|
|
+ area: '',
|
|
|
+ city: ''
|
|
|
+ }
|
|
|
+ if (!obj) return map
|
|
|
+ const area = []
|
|
|
+ let city = []
|
|
|
+ for (const key in obj) {
|
|
|
+ if (Array.isArray(obj[key])) {
|
|
|
+ if (obj[key].length === 0) {
|
|
|
+ area.push(key)
|
|
|
+ } else {
|
|
|
+ city = city.concat(obj[key])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ area: area.join(split),
|
|
|
+ city: city.join(split)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 信息类型 map
|
|
|
+/**
|
|
|
+ * 信息类型格式化,将map类型数据最终格式化成接口所需
|
|
|
+ * @param info
|
|
|
+ */
|
|
|
+export function infoTypeMapFormat (infoType = {}) {
|
|
|
+ const resultType = InfoTypeTransform.formatMoreMapToList(infoType)
|
|
|
+ return resultType ? resultType.join(',') : ''
|
|
|
+}
|