| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- /*
- * @Descripttion: 安徽-马鞍山 接口
- * @Author: vian
- * @Date: 2020-08-17 15:40:08
- */
- // INTERFACE_EXPORT =,必须这么写,这样才能在导出时动态加载脚本后,覆盖前端代码
- INTERFACE_EXPORT = (() => {
- 'use strict';
- /**
- *
- * @param {String} areaKey - 地区标识,如:'安徽@马鞍山',有些地区的接口只是取值上有不同,共有一个接口脚本, 需要通过地区标识确定一些特殊处理
- * @param {Number} exportKind - 导出类型,招标、投标、控制价
- * @param {Object} projectData - 项目表数据:{ 建设项目Data, children: [单位工程...] }
- * @param {Object} tenderDetailMap - 单位工程ID与getData接口数据(projectObj.project的结构)的映射。
- * @return {Promise<Array>} - 返回的数据结构必须按照规定:[{ data, exportKind, fileName }],参考web\building_saas\standard_interface\index.js中的注释说明
- */
- async function entry(areaKey, exportKind, projectData, tenderDetailMap) {
- const {
- CONFIG: { TYPE },
- UTIL: {
- getValueByKey,
- getHan,
- getFee,
- },
- Element,
- } = INTERFACE_EXPORT_BASE;
- const {
- EXPORT_KIND: { BID_INVITATION, BID_SUBMISSION, CONTROL },
- fixedFlag,
- } = window.commonConstants
- const { isEmptyVal, isDef } = window.commonUtil;
- const czzt = {
- [BID_INVITATION]: '招标',
- [BID_SUBMISSION]: '投标',
- [CONTROL]: '招标控制',
- };
- const isBidInvitation = exportKind === BID_INVITATION; // 是否是招标
- const isBidSubmission = exportKind === BID_SUBMISSION; // 是否是投标
- const isControl = exportKind === CONTROL; // 是否是控制价
- // 节点定义--------------------------------
- // 建设项目基本信息
- function JingJiBiao(projectName, information) {
- const attrs = [
- { name: 'Xmbh', value: getValueByKey(information, 'projNum') }, // 项目编号
- { name: 'Xmmc', value: projectName }, // 项目名称
- { name: 'Bzlx', value: '清单' }, // 项目编制类型
- { name: 'Jjyj', value: '【18清单】2018部颁清单计价依据' }, // 计价依据
- { name: 'Xmqzzh', value: getValueByKey(information, '') }, // 项目起止桩号
- { name: 'Jsdw', value: getValueByKey(information, '') }, // 建设单位
- { name: 'Czzt', value: czzt[exportKind] }, // 操作状态:招标、投标、招标控制,即导出接口时,所选的文件类型
- { name: 'Jsfs', value: getValueByKey(information, '') || '1', type: TYPE.INT }, // 计税方式,默认1。1=一般计税 2=简易计税
- { name: 'Version', value: '1.0' },
- ];
- Element.call(this, 'JingJiBiao', attrs);
- }
- const subArea = areaKey.split('@')[1];
- // 招标信息
- function ZhaoBiaoXx(information) {
- const attrs = [
- { name: 'Zbr', value: getValueByKey(information, '') }, // 招标人
- { name: 'Zxr', value: getValueByKey(information, '') }, // 造价咨询人
- { name: 'ZbrDb', value: getValueByKey(information, '') }, // 招标人法定代表人或其授权人
- { name: 'ZxrDb', value: getValueByKey(information, '') }, // 造价咨询人法定代表人或其授权人
- { name: 'Bzr', value: getValueByKey(information, '') }, // 编制人
- { name: 'Fhr', value: getValueByKey(information, '') }, // 复核人
- { name: 'BzTime', value: getValueByKey(information, ''), type: TYPE.DATE }, // 编制时间
- { name: 'FhTime', value: getValueByKey(information, ''), type: TYPE.DATE }, // 复核时间
- ];
- // 额外字段
- const extraMap = {
- '淮北': [
- { name: 'ZbrNssbh', value: getValueByKey(information, '') }, // 招标人纳税识别号
- { name: 'ZxrNssbh', value: getValueByKey(information, '') }, // 造价咨询人纳税识别号
- { name: 'ZbrDbSfzh', value: getValueByKey(information, '') }, // 招标人法定代表人或其授权人身份证号
- { name: 'ZxrNssbh', value: getValueByKey(information, '') }, // 造价咨询人法定代表或其授权人纳税识别号
- ]
- };
- if (extraMap[subArea]) {
- attrs.push(...extraMap[subArea]);
- }
- Element.call(this, 'ZhaoBiaoXx', attrs);
- }
- // 招标控制价信息
- function ZhaoBiaoKzXx(information) {
- const attrs = [
- { name: 'Zbr', value: getValueByKey(information, '') }, // 招标人
- { name: 'Zxr', value: getValueByKey(information, '') }, // 造价咨询人
- { name: 'ZbrDb', value: getValueByKey(information, '') }, // 招标人法定代表人或其授权人
- { name: 'ZxrDb', value: getValueByKey(information, '') }, // 造价咨询人法定代表人或其授权人
- { name: 'Bzr', value: getValueByKey(information, '') }, // 编制人
- { name: 'Fhr', value: getValueByKey(information, '') }, // 复核人
- { name: 'BzTime', value: getValueByKey(information, ''), type: TYPE.DATE }, // 编制时间
- { name: 'FhTime', value: getValueByKey(information, ''), type: TYPE.DATE }, // 复核时间
- { name: 'Zbkzj', value: getValueByKey(information, ''), type: TYPE.DECIMAL }, // 控制价总价(元),取“投标报价”的金额。
- ];
- // 额外字段
- const extraMap = {
- '淮北': [
- { name: 'ZbrNssbh', value: getValueByKey(information, '') }, // 招标人纳税识别号
- { name: 'ZxrNssbh', value: getValueByKey(information, '') }, // 造价咨询人纳税识别号
- { name: 'ZbrDbSfzh', value: getValueByKey(information, '') }, // 招标人法定代表人或其授权人身份证号
- { name: 'ZxrNssbh', value: getValueByKey(information, '') }, // 造价咨询人法定代表或其授权人纳税识别号
- ]
- };
- if (extraMap[subArea]) {
- attrs.push(...extraMap[subArea]);
- }
- Element.call(this, 'ZhaoBiaoKzXx', attrs);
- }
- // 招标控制价信息
- function TouBiaoXx(information) {
- const attrs = [
- { name: 'Zbr', value: getValueByKey(information, '') }, // 招标人
- { name: 'Tbr', value: getValueByKey(information, '') }, // 投标人
- { name: 'TbrDb', value: getValueByKey(information, '') }, // 投标人法定代表或其授权
- { name: 'Bzr', value: getValueByKey(information, '') }, // 编制人
- { name: 'BzTime', value: getValueByKey(information, ''), type: TYPE.DATE }, // 编制时间
- { name: 'Tbzj', value: getValueByKey(information, ''), type: TYPE.DECIMAL }, // 控制价总价(元),取“投标报价”的金额。
- ];
- // 额外字段
- const extraMap = {
- '淮北': [
- { name: 'ZbrNssbh', value: getValueByKey(information, '') }, // 招标人纳税识别号
- { name: 'TbrNssbh', value: getValueByKey(information, '') }, // 投标人纳税识别号
- { name: 'TbrDbsfzh', value: getValueByKey(information, '') }, // 投标人法定代表或其授权人身份证号
- ]
- };
- if (extraMap[subArea]) {
- attrs.push(...extraMap[subArea]);
- }
- Element.call(this, 'TouBiaoXx', attrs);
- }
- // 单项工程信息,因项目管理中无“单项工程”这一层,从单位工程的工程特征信息中拼凑出来
- function Dxgcxx(code, name) {
- const attrs = [
- { name: 'Dxgcbh', value: code }, // 单项工程编号
- { name: 'Dxgcmc', value: name }, // 单项工程名称
- ];
- Element.call(this, 'Dxgcxx', attrs);
- }
- // 单位工程信息
- function Dwgcxx(tenderName, feature) {
- const attrs = [
- { name: 'Dwgcbh', value: getValueByKey(feature, '') }, // 单位工程编号
- { name: 'Dwgcmc', value: tenderName }, // 单位工程名称
- ];
- Element.call(this, 'Dwgcxx', attrs);
- }
- // 取费信息(费率信息)
- function Qfxx() {
- Element.call(this, 'Qfxx');
- }
- // 计价费率表
- function JjFlb() {
- Element.call(this, 'JjFlb');
- }
- // 费率明细名称-编码映射表
- const FeeRateCodeMap = {
- 冬季施工增加费: 'DJF',
- 雨季施工增加费: 'YJF',
- 夜间施工增加费: 'YEF',
- 工地转移费: 'ZYF',
- 高原施工增加费: 'GYF',
- 风沙地区增加费: 'FSF',
- 沿海地区增加费: 'YHF',
- 行车干扰增加费: 'XCF',
- 施工辅助费: 'SFF',
- 养老保险费: 'YLF',
- 失业保险费: 'SYF',
- 医疗保险费: 'YBF',
- 住房公积金: 'ZFF',
- 工伤保险费: 'GSF',
- 基本费用: 'JBF',
- 主副食运费补贴: 'YFF',
- 职工探亲补贴: 'TQF',
- 职工取暖补贴: 'QNF',
- 财务费用: 'CWF',
- 利润: 'LR',
- 税金: 'SJ',
- };
- // 费率工程名称-取费类别映射表
- const FeeRateTypeMap = {
- 土方: 1,
- 石方: 3,
- 运输: 2,
- 路面: 4,
- 隧道: 11,
- 构造物I: 5,
- '构造物I(不计冬)': 16,
- 构造物II: 6,
- '构造物III(桥梁)': 9,
- '构造物III(除桥以外不计雨)': 8,
- 技术复杂大桥: 10,
- '钢材及钢结构(桥梁)': 12,
- '钢材及钢结构(除桥以外不计夜)': 13,
- '费率为0': 17,
- '路面(不计雨)': 4,
- '构造物I(不计雨)': 16,
- '构造物III(除桥以外)': 8,
- '钢材及钢结构(除桥以外)': 13,
- 设备: 15,
- 量价: 14,
- };
- // 计价费率表明细,造价书费率页面左侧最底层数据
- function JjFlbMx(rootItem, item) {
- const rate = isEmptyVal(item.rate) ? '100' : item.rate; // 为空时输出=100,为0时输出=0
- const attrs = [
- { name: 'Bm', value: FeeRateCodeMap[item.name] }, // 编码
- { name: 'Name', value: item.name }, // 名称
- { name: 'Fl', value: rate, type: TYPE.DECIMAL }, // 费率
- { name: 'Qflb', value: FeeRateTypeMap[rootItem.name], type: TYPE.INT }, // 取费类别
- ];
- Element.call(this, 'JjFlbMx', attrs);
- }
- // 计价费率项
- function JjFlx() {
- Element.call(this, 'JjFlx');
- }
- // 计价费率项明细,造价书费率页面右侧最顶层数据
- function JjFlxMx(item) {
- // 编码取名称拼音首字母
- const allHanName = getHan(item.name || '');
- const code = pinyinUtil.getFirstLetter(allHanName).toLowerCase();
- let value;
- if (isDef(item.value)) {
- value = item.value;
- } else {
- const selected = item.optionList.find(item => item.selected);
- value = selected.name;
- }
- const attrs = [
- { name: 'Bm', value: code }, // 编码
- { name: 'Mc', value: item.name }, // 名称
- { name: 'ShuZhi', value: value }, // 数值
- ];
- Element.call(this, 'JjFlxMx', attrs);
- }
- // 清单项目
- function QdXm() {
- Element.call(this, 'QdXm');
- }
- // 标题类别:1=100~700清单合计,2=暂估价合计,3=清单不包含暂估价合计,4=计日工,5=暂列金额(不含计日工总额)),6=投标报价,0=其他
- const BillsTitleType = {
- [fixedFlag.ONE_SEVEN_BILLS]: '1',
- [fixedFlag.PROVISIONAL_TOTAL]: '2',
- [fixedFlag.BILLS_TOTAL_WT_PROV]: '3',
- [fixedFlag.DAYWORK_LABOR]: '4',
- [fixedFlag.PROVISIONAL]: '5',
- [fixedFlag.TOTAL_COST]: '6',
- };
- // 清单标题 造价书的第一层数据。
- function QdBt(node) {
- const row = node.row();
- const fee = isBidInvitation ? '0' : getFee(node.data.fees, 'common.tenderTotalFee')
- const attrs = [
- { name: 'Xh', value: row, type: TYPE.INT }, // 序号
- { name: 'Bm', value: node.data.code }, // 编码
- { name: 'Name', value: node.data.name }, // 名称
- { name: 'Je', value: fee, type: TYPE.DECIMAL }, // 金额
- { name: 'Code', value: `F${row}` }, // 行引用
- { name: 'Jsgs', value: node.data.calcBase }, // 计算基数
- { name: 'Lb', value: BillsTitleType[node.getFlag()], type: TYPE.INT }, // 类别
- ];
- Element.call(this, 'QdBt', attrs);
- }
- // 清单明细 (只有100-700章清单标题输出)
- function QdMx(node) {
- const row = node.row();
- const attrs = [
- { name: 'Xh', value: row, type: TYPE.INT }, // 序号
- { name: 'Qdbm', value: node.data.code }, // 编码
- { name: 'Name', value: node.data.name }, // 名称
- { name: 'Dw', value: node.data.unit }, // 单位
- { name: 'Sl', value: node.data.quantity, type: TYPE.DECIMAL }, // 工程量
- { name: 'Sl2', value: '0', type: TYPE.DECIMAL }, // 工程量2
- { name: 'Rgf', value: isBidInvitation ? '0' : getFee(node.data.fees, 'labour.tenderTotalFee'), type: TYPE.DECIMAL }, // 人工费
- ];
- Element.call(this, 'QdMx', attrs);
- }
- // 组装数据 --------------------------------------
- // 组装费率数据
- function setupFeeRate(feeRateDetail) {
- const qfxx = new Qfxx();
- const jjflb = new JjFlb();
- // 费率界面左侧底层数据
- let curRootItem;
- feeRateDetail.datas.rates.forEach(item => {
- if (!item.ParentID) {
- curRootItem = item;
- } else if (!item.sum) { // 最底层
- jjflb.children.push(new JjFlbMx(curRootItem, item));
- }
- });
- // 费率界面右侧顶层数据
- const jjflx = new JjFlx();
- const flxmxData = feeRateDetail
- .getAllSubRates()
- .filter(item => !item.isSub)
- .map(item => new JjFlxMx(item));
- jjflx.children.push(...flxmxData);
- qfxx.children.push(jjflb, jjflx);
- return qfxx;
- }
- // 组装清单数据
- function setupBills(mainTree) {
- const qdxm = new QdXm();
- const qdbtData = mainTree.roots.map(node => new QdBt(node));
- qdxm.children.push(...qdbtData);
- return qdxm;
- }
- // 组装单位工程数据
- function setupTender(tenderData, feature) {
- const detail = tenderDetailMap[tenderData.ID];
- const dwgcxx = new Dwgcxx(tenderData.name, feature);
- dwgcxx.children.push(
- setupFeeRate(detail.FeeRate),
- setupBills(detail.mainTree)
- );
- return dwgcxx;
- }
- // 组装建设项目数据
- function setupConstruction(constructionData) {
- const information = constructionData.property && constructionData.property.basicInformation || [];
- const jingJiBiao = new JingJiBiao(constructionData.name, information);
- // 将单位工程工程特征中,单项工程编号、名称相同的,插入到建设项目和分段(单位工程)的中间层。
- const midLayerMap = {}; // 单项工程key(code@name)与单项工程节点映射
- for (const tenderData of constructionData.children) {
- const feature = tenderData.property && tenderData.property.projectFeature || [];
- const midLayerCode = getValueByKey(feature, 'singleProjNo');
- const midLayerName = getValueByKey(feature, 'singleProjName');
- const midLayerKey = `${midLayerCode}@${midLayerName}`;
- if (!midLayerMap[midLayerKey]) {
- jingJiBiao.children.push(midLayerMap[midLayerKey] = new Dxgcxx(midLayerCode, midLayerName));
- }
- midLayerMap[midLayerKey].children.push(setupTender(tenderData, feature));
- }
- const suffix = INTERFACE_CONFIG[areaKey]['fileSuffix'][exportKind];
- return [{
- data: jingJiBiao,
- exportKind,
- fileName: `${constructionData.name}${suffix}`
- }];
- }
- return setupConstruction(projectData);
- }
- return {
- entry,
- };
- })();
|