zhejiang_2005.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. /**
  2. * Created by CSL on 2019/09/11. 浙江计算程序、基数 等覆盖。
  3. */
  4. let isZJ2005 = true;
  5. const { fixedFlag } = commonConstants;
  6. // 一般计税取不含税市场价、不含税定额价。简易计税取含税市场价、含税定额价。打开项目时,4个价格根据计税类型只载入其二,所以这里可不作区分。
  7. function overwriteRationCalcBases(taxType) {
  8. if (typeof rationCalcBases == 'undefined') return;
  9. for (let key in rationCalcBases) delete rationCalcBases[key];
  10. // let isJY = taxType == '2';
  11. rationCalcBases['人工费'] = function (node, isTender) {
  12. return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
  13. };
  14. rationCalcBases['材料费'] = function (node, isTender) {
  15. return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
  16. };
  17. rationCalcBases['施工机械使用费'] = function (node, isTender) {
  18. return calcTools.rationBaseFee(node, baseMachineTypes, priceTypes.ptMarketPrice, isTender);
  19. };
  20. };
  21. (function overwriteFeeTypes() {
  22. if (typeof cpFeeTypes == 'undefined') return;
  23. cpFeeTypes = [
  24. { type: 'directWork', name: '直接工程费' },
  25. { type: 'direct', name: '直接费' },
  26. { type: 'marketLabour', name: '人工费' },
  27. { type: 'marketMaterial', name: '材料费' },
  28. { type: 'marketMachine', name: '施工机械使用费' },
  29. { type: 'otherDirect', name: '其他直接费' },
  30. { type: 'local', name: '现场经费' },
  31. { type: 'indirect', name: '间接费' },
  32. { type: 'profit', name: '计划利润' },
  33. { type: 'tax', name: '税金' },
  34. { type: 'composite', name: '年度经费综合费' },
  35. { type: 'common', name: '养护工程费' }
  36. ];
  37. })();
  38. // 清单基数
  39. const progression = [];
  40. const deficiency = {};
  41. if (typeof baseFigureMap !== 'undefined') {
  42. const { fixedFlag } = commonConstants;
  43. const budgetMap = {
  44. // 除清单固定类别是“建筑安装工程费”的以外部分可显示
  45. '公路养护工程费': {
  46. base: 'GLYHGCF',
  47. fixedFlag: fixedFlag.CONSTRUCTION_INSTALL_FEE,
  48. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE],
  49. pick: false,
  50. },
  51. // 除清单固定类别是“建筑安装工程费”、“设备购置费”的以外部分可显示
  52. '设备购置费用': {
  53. base: 'SBGZFY',
  54. fixedFlag: fixedFlag.EQUIPMENT_ACQUISITION_FEE,
  55. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.EQUIPMENT_ACQUISITION_FEE],
  56. pick: false,
  57. },
  58. // 除清单固定类别是“建筑安装工程费”、“设备购置费”、“养护工程其他费用”的以外部分可显示
  59. '公路养护工程其他费用': {
  60. base: 'GLYHGCQTFY',
  61. fixedFlag: fixedFlag.MAINTENANCE_EXPENSES,
  62. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.EQUIPMENT_ACQUISITION_FEE, fixedFlag.MAINTENANCE_EXPENSES],
  63. pick: false,
  64. },
  65. // 只有清单固定类别是“养护工程其他费用”部分可显示
  66. '养护工程管理经费': {
  67. progressiveName: '养护工程管理费', // 累进库里配置的名称与基数名称应该是一样的,但是这里不一样且已经在yun上线。特殊处理
  68. isProgressive: true,
  69. base: 'YHGCGLJF',
  70. fixedFlag: null,
  71. filter: [fixedFlag.MAINTENANCE_EXPENSES],
  72. pick: true,
  73. },
  74. // 除清单固定类别是“建筑安装工程费”、“设备购置费”、“养护工程其他费用”、“一二三部分合计”的以外部分可显示
  75. '一二三部分合计': {
  76. base: 'YESBFHJ',
  77. fixedFlag: fixedFlag.ONE_TO_THREE_TOTAL,
  78. filter: [fixedFlag.CONSTRUCTION_INSTALL_FEE, fixedFlag.EQUIPMENT_ACQUISITION_FEE, fixedFlag.MAINTENANCE_EXPENSES, fixedFlag.ONE_TO_THREE_TOTAL],
  79. pick: false,
  80. },
  81. // 只有清单固定类别是“预备费”部分可显示
  82. '工程造价增涨预留费': {
  83. base: 'GCZJZZYLF',
  84. fixedFlag: null,
  85. filter: [fixedFlag.BUDGET_FEE],
  86. pick: true,
  87. }
  88. };
  89. const boqMap = {
  90. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  91. '各章清单合计': {
  92. base: 'GZQDHJ',
  93. fixedFlag: fixedFlag.ONE_SEVEN_BILLS,
  94. filter: [fixedFlag.ONE_SEVEN_BILLS],
  95. pick: false
  96. },
  97. //仅允许用于固定类别是“第100章至700章清单”以外的清单
  98. '专项暂定合计': {
  99. base: 'ZXZDHJ',
  100. fixedFlag: null,
  101. filter: [fixedFlag.ONE_SEVEN_BILLS],
  102. pick: false
  103. },
  104. /*
  105. * 清单固定行[第100章至700章清单]下的[第100章清单]需要允许清单可使用基数{100章以外合计}
  106. * 因此{100章以外合计}不设置关联的清单固定行
  107. * */
  108. //仅允许用于固定类别为“100章清单”引用
  109. '100章以外清单合计': {
  110. base: 'YBZYHQDHJ',
  111. fixedFlag: null,
  112. filter: [fixedFlag.ONE_HUNDRED_BILLS],
  113. pick: true
  114. }
  115. };
  116. for (const name in budgetMap) {
  117. const item = budgetMap[name];
  118. if (item.isProgressive) {
  119. progression.push(item.progressiveName || name);
  120. }
  121. if (item.deficiency) {
  122. deficiency[item.progressiveName || name] = item.deficiency;
  123. }
  124. }
  125. baseFigureMap.budget = budgetMap;
  126. baseFigureMap.boq = boqMap;
  127. }
  128. if (typeof baseFigureTemplate !== 'undefined') {
  129. const { fixedFlag } = commonConstants;
  130. baseFigureTemplate.budget = {
  131. // 公路养护工程费:取清单固定类别是“建筑安装工程费”的金额
  132. GLYHGCF(tender) {
  133. const feeField = 'common';
  134. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  135. return cbTools.getBillsFee(calcBase.fixedFlag.CONSTRUCTION_INSTALL_FEE, feeField, subFeeField);
  136. },
  137. // 设备购置费用:取清单固定类别是“设备购置费”的金额
  138. SBGZFY(tender) {
  139. const feeField = 'common';
  140. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  141. return cbTools.getBillsFee(calcBase.fixedFlag.EQUIPMENT_ACQUISITION_FEE, feeField, subFeeField);
  142. },
  143. // 公路养护工程其他费用:取清单固定类别是“养护工程其他费用”的金额。
  144. GLYHGCQTFY(tender) {
  145. const feeField = 'common';
  146. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  147. return cbTools.getBillsFee(calcBase.fixedFlag.MAINTENANCE_EXPENSES, feeField, subFeeField);
  148. },
  149. // 养护工程管理经费:取清单固定类别是“建筑安装工程费”金额为基数,采用累进办法计算
  150. YHGCGLJF(tender) {
  151. const baseFee = this['GLYHGCF'](tender);
  152. if (!tender) {
  153. calcBase.baseProgressiveFee = baseFee;
  154. }
  155. return calculateUtil.getProgressiveFee(baseFee, '养护工程管理费', projectObj.project.property.progressiveInterval, decimalObj.bills.totalPrice, deficiency);
  156. },
  157. // 一二三部分合计:取清单固定类别是“一二三部分合计”的金额
  158. YESBFHJ(tender) {
  159. const feeField = 'common';
  160. const subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  161. return cbTools.getBillsFee(calcBase.fixedFlag.ONE_TO_THREE_TOTAL, feeField, subFeeField);
  162. },
  163. // 工程造价增涨预留费:以{公路养护工程费}为基数,= P * [(1+i)^(n-1) -1]
  164. // P:公路养护工程费总额(元)
  165. // i:年造价增长率(%)(项目属性已有字段)
  166. // N:增涨计费年限(项目属性已有字段)
  167. GCZJZZYLF(tender) {
  168. const baseFee = this['GLYHGCF'](tender);
  169. //年造价增涨
  170. const costGrowthRate = calcBase.project.property.costGrowthRate
  171. ? calcBase.project.property.costGrowthRate
  172. : 0;
  173. //增涨计费年限
  174. const growthPeriod = projectObj.project.property.growthPeriod
  175. ? calcBase.project.property.growthPeriod
  176. : 0;
  177. return (baseFee * (Math.pow(1 + costGrowthRate, growthPeriod - 1) - 1)).toDecimal(decimalObj.bills.totalPrice);
  178. }
  179. };
  180. baseFigureTemplate.boq = {
  181. //{各章清单合计}
  182. // 取清单固定类别是“第100章至700章清单”的金额
  183. 'GZQDHJ': function (tender) {
  184. let feeField = 'common',
  185. subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  186. return cbTools.getBillsFee(calcBase.fixedFlag.ONE_SEVEN_BILLS, feeField, subFeeField);
  187. },
  188. //{专项暂定合计}
  189. // 汇总专项暂定列有值的清单的金额
  190. 'ZXZDHJ': function (tender) {
  191. let rst = 0,
  192. feeField = 'common',
  193. subFeeField = tender ? 'tenderTotalFee' : 'totalFee';
  194. let billsData = calcBase.project.Bills.datas,
  195. filterData = billsData.filter(function (data) {
  196. return data.specialProvisional;
  197. });
  198. for (let data of filterData) {
  199. if (cbTools.isUnDef(data.feesIndex) || _.isEmpty(data.feesIndex) ||
  200. cbTools.isUnDef(data.feesIndex[feeField]) || cbTools.isUnDef(data.feesIndex[feeField][subFeeField])) {
  201. continue;
  202. }
  203. rst += data.feesIndex[feeField][subFeeField];
  204. }
  205. return rst.toDecimal(decimalObj.bills.totalPrice);
  206. },
  207. //{100章以外清单合计}
  208. // 取清单固定清单[第100章至700章清单]的金额,但扣除清单100章下的金额。
  209. // 如果是固定清单[第100章至700章清单]下100章以外清单引用此基数,要排除自身(目前只允许100章的清单使用,所以暂时不需要此判断)
  210. 'YBZYHQDHJ': function (tender) {
  211. let oneToSeven = cbTools.findNodeByFlag(fixedFlag.ONE_SEVEN_BILLS);
  212. if (!oneToSeven) {
  213. return 0;
  214. }
  215. //100-700章固定节点的所有子节点
  216. let allChildren = [];
  217. function getChildren(nodes) {
  218. allChildren = allChildren.concat(nodes);
  219. for (let node of nodes) {
  220. if (node.children.length > 0) {
  221. getChildren(node.children);
  222. }
  223. }
  224. }
  225. getChildren(oneToSeven.children);
  226. //扣除的节点:100章的节点[100-200)
  227. let deductNodes = allChildren.filter(cbTools.withingOneHundred);
  228. //计算金额
  229. let fullFeeField = tender ? 'common.tenderTotalFee' : 'common.totalFee';
  230. return projectObj.project.calcProgram.getTotalFee([oneToSeven], deductNodes, fullFeeField).toDecimal(decimalObj.bills.totalPrice);
  231. }
  232. };
  233. }
  234. if (typeof gljOprObj !== 'undefined') {
  235. // 添加、替换工料机界面工料机排序
  236. gljOprObj.sortSelectViewGLJ = function (data) {
  237. // 工料机编码:按“-”前的数值排序
  238. const reg = /[^-]+/;
  239. data.sort((a, b) => {
  240. const orgCodeA = a.code;
  241. const orgCodeB = b.code;
  242. const regCodeA = orgCodeA.match(reg);
  243. const regCodeB = orgCodeB.match(reg);
  244. const compareCodeA = regCodeA
  245. ? +regCodeA[0]
  246. ? +regCodeA[0]
  247. : regCodeA[0]
  248. : orgCodeA;
  249. const compareCodeB = regCodeB
  250. ? +regCodeB[0]
  251. ? +regCodeB[0]
  252. : regCodeB
  253. : orgCodeB;
  254. return isNaN(compareCodeA) && isNaN(compareCodeB)
  255. ? compareCodeA.localeCompare(compareCodeB)
  256. : compareCodeA - compareCodeB;
  257. });
  258. // 工料机类型排序:人工、机上人工、混凝土、砂浆、配合比、普通材料、商品混凝土、商品砂浆、外购砼构件、绿化苗木、机械台班、机械组成物、设备。
  259. const TypeMap = {
  260. 1: 1,
  261. 303: 2,
  262. 202: 3,
  263. 203: 4,
  264. 204: 5,
  265. 201: 6,
  266. 205: 7,
  267. 206: 8,
  268. 208: 9,
  269. 209: 10,
  270. 301: 11,
  271. 302: 12,
  272. 5: 13,
  273. };
  274. data.sort((a, b) => {
  275. const typeA = TypeMap[a.gljType];
  276. const typeB = TypeMap[b.gljType];
  277. return typeA - typeB;
  278. });
  279. }
  280. }
  281. if (typeof gljUtil !== 'undefined') {
  282. gljUtil.getCodeSortMath = getCodeSortMath;
  283. gljUtil.getElecCoe = function () {
  284. return 0.24;
  285. }
  286. gljUtil.getElecCode = function () {
  287. return "267";
  288. }
  289. }
  290. if (typeof electrovalenceObj !== 'undefined') {
  291. electrovalenceObj.options = [
  292. { code: "270", name: "电网电", specs: "", unit: "kW·h", type: "201" },
  293. { code: "905", name: "5kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  294. { code: "906", name: "15kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  295. { code: "907", name: "30kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  296. { code: "908", name: "50kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  297. { code: "909", name: "75kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  298. { code: "910", name: "100kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  299. { code: "911", name: "120kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  300. { code: "912", name: "160kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  301. { code: "913", name: "200kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  302. { code: "914", name: "250kW以内柴油发电机组", specs: "", unit: "台班", type: "301" },
  303. { code: "915", name: "320kW以内柴油发电机组", specs: "", unit: "台班", type: "301" }
  304. ]
  305. }
  306. if (typeof materialCalcObj !== 'undefined') {
  307. materialCalcObj.getAssistProductionLabel = function () {
  308. return "辅助生产现场经费费率(%)";
  309. }
  310. }
  311. if (typeof projectObj !== 'undefined') {
  312. projectObj.isInsertEquipmentVisable = function (selected) {
  313. return false; //浙江不管是预算或者工程量清单,都是隐藏
  314. }
  315. }
  316. if (typeof module !== 'undefined') {
  317. let _ = require('lodash');
  318. module.exports = {
  319. sortRationGLJ: function (list) {
  320. list = _.sortByAll(list, [function (item) {
  321. return getMainType(item.gljType ? item.gljType : item.type);
  322. }, getCodeSortMath()]);
  323. return list;
  324. function getMainType(type) {
  325. let str = type + "";
  326. return parseInt(str.substr(0, 1));
  327. }
  328. },
  329. getDefalutAssistProductionFeeRate: function () {
  330. return 15
  331. }
  332. };
  333. }
  334. function getCodeSortMath() {
  335. return function (item) {
  336. let arr = item.code.split('-');
  337. return parseInt(arr[0])
  338. }
  339. }
  340. if (typeof module !== 'undefined') {
  341. module.exports = {
  342. progression,
  343. deficiency
  344. };
  345. }