material_adjust_view.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. /**
  2. * Created by zhang on 2019/5/15.
  3. */
  4. let materialAdjustObj = {
  5. spread:null,
  6. priceInfoSheet:null,
  7. priceCoeSheet:null,
  8. priceInfoDatas:[],
  9. priceCoeDatas:[],
  10. priceInfoSetting:{
  11. header: [
  12. {headerName: "编号", headerWidth: 80, dataCode: "code", dataType: "String"},
  13. {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  14. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  15. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  16. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  17. {headerName: "风险系数%", headerWidth: 60, dataCode: "riskCoe", hAlign: "right", dataType: "Number",validator:"number"},
  18. {headerName: "基准单价", headerWidth: 70, dataCode: "standardPrice", hAlign: "right", dataType: "Number",validator:"number"},
  19. {headerName: "投标单价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  20. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  21. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  22. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  23. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  24. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  25. ],
  26. view:{ lockColumns: ["code","name","specs","unit","quantity","totalPrice","originPlace","vender","supply","remark"]}
  27. },
  28. priceCoeSetting:{
  29. header: [
  30. {headerName: "编号", headerWidth: 80, dataCode: "code", dataType: "String"},
  31. {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  32. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  33. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  34. {headerName: "变值权重B", headerWidth: 90, dataCode: "varWeight", hAlign: "right", dataType: "Number",validator:"number"},
  35. {headerName: "基本价格指数F0", headerWidth: 70, dataCode: "FO", hAlign: "right", dataType: "Number",validator:"number"},
  36. {headerName: "现行价格指数Ft", headerWidth: 70, dataCode: "FI", hAlign: "right", dataType: "Number",validator:"number"},
  37. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  38. {headerName: "单价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  39. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  40. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  41. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  42. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  43. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  44. ],
  45. view:{ lockColumns: ["code","name","specs","unit","quantity","totalPrice","originPlace","vender","supply","remark"]}
  46. },
  47. refreshSheetDatas:function () {
  48. //读项目属性的值,若没有则默认为造价信息差额调整法
  49. let adjustType = $('#adjustType').val();
  50. if (adjustType === 'priceInfo') {
  51. materialAdjustObj.showPriceInfoDatas();
  52. } else {
  53. materialAdjustObj.showPriceCoeDatas();
  54. }
  55. //let sheetIndex = $("#adjustType").val()
  56. },
  57. initSpread:function () {
  58. if(!this.spread){
  59. this.spread = SheetDataHelper.createNewSpread($("#material_adjust_sheet")[0],2);
  60. sheetCommonObj.spreadDefaultStyle(this.spread);
  61. }
  62. this.initPriceInfoSheet();
  63. this.initPriceCoeSheet();
  64. //disableRightMenu("project_glj_sheet",this.projectGljSpread,this.rightClickCallback);
  65. //打开别人分享的项目,只读
  66. if(projectReadOnly){
  67. disableSpread(this.spread);
  68. }else {
  69. this.initRightClick();
  70. }
  71. },
  72. initPriceInfoSheet:function () {
  73. this.priceInfoSheet = this.spread.getSheet(0);
  74. sheetCommonObj.initSheet(this.priceInfoSheet,this.priceInfoSetting,30);
  75. this.priceInfoSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
  76. this.priceInfoSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  77. this.priceInfoSheet.name('priceInfoSheet');
  78. this.priceInfoSheet.setRowHeight(0, 36, 1);
  79. },
  80. initPriceCoeSheet:function () {
  81. this.priceCoeSheet = this.spread.getSheet(1);
  82. sheetCommonObj.initSheet(this.priceCoeSheet,this.priceCoeSetting,30);
  83. this.priceCoeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
  84. this.priceCoeSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  85. this.priceCoeSheet.name('priceCoeSheet');
  86. this.priceCoeSheet.setRowHeight(0, 36, 1);
  87. },
  88. onSheetRangeChange:function (a,args) {
  89. let me = materialAdjustObj,updateMap = {};
  90. let projectGLJ = projectObj.project.projectGLJ;
  91. let setting = $("#adjustType").val() == "priceInfo"?me.priceInfoSetting:me.priceCoeSetting;
  92. let datas = $("#adjustType").val() == "priceInfo"?me.priceInfoDatas:me.priceCoeDatas;
  93. for(let c of args.changedCells){
  94. let dataCode = setting.header[c.col].dataCode;
  95. let value= args.sheet.getCell(c.row, c.col).text();
  96. if (value&&!sheetCommonObj.checkData(c.col,setting,value)) {
  97. alert('输入的数据类型不对,请重新输入!');
  98. me.refreshSheetDatas();
  99. return ;
  100. }
  101. let recode = datas[c.row];
  102. if(dataCode=='marketPrice'){
  103. let editField ="market_price";
  104. projectGLJ.updatePrice(recode,editField,value,'pg',me.refreshSheetDatas);
  105. }else {
  106. let tem = {};
  107. if(value) value = scMathUtil.roundForObj(value,getDecimal("process"));
  108. if(value == recode[dataCode]) continue;
  109. tem[dataCode] = value;
  110. updateMap[recode.id] = tem;
  111. }
  112. }
  113. if( _.isEmpty(updateMap)) return;
  114. projectGLJ.batchUpdateGLJProperty(updateMap,function () {
  115. me.refreshSheetDatas();
  116. });
  117. },
  118. onSheetValueChange:function (a,args) {
  119. let me = materialAdjustObj,row = args.row, col = args.col;
  120. let projectGLJ = projectObj.project.projectGLJ;
  121. let setting = $("#adjustType").val() == "priceInfo"?me.priceInfoSetting:me.priceCoeSetting;
  122. let datas = $("#adjustType").val() == "priceInfo"?me.priceInfoDatas:me.priceCoeDatas;
  123. let dataCode = setting.header[col].dataCode;
  124. let recode = datas[row];
  125. let value = args.newValue;
  126. if(value === undefined ){
  127. me.refreshSheetDatas();
  128. return;
  129. }
  130. if (value&&!projectGljObject.checkData(col,setting,value)) {
  131. alert('输入的数据类型不对,请重新输入!');
  132. me.refreshSheetDatas();
  133. return ;
  134. }
  135. if(recode[dataCode] == value) return;
  136. if(dataCode=='marketPrice'){//修改市场价和修改定额价时需要重新记算很多受影响的树节点,现在改成与定字额工料机那里调相同的方法。
  137. let editField ="market_price";
  138. projectGLJ.updatePrice(recode,editField,value,'pg',me.refreshSheetDatas);
  139. return;
  140. }
  141. if(value) value = scMathUtil.roundForObj(value,getDecimal("process"));
  142. if(value == null) value="";
  143. let updateData = {id: recode.id, field: dataCode, value: value+""};
  144. projectGLJ.pGljUpdate(updateData,me.refreshSheetDatas);
  145. },
  146. deleteAdjust:function () {
  147. let me = this,updateMap={};
  148. let projectGLJ = projectObj.project.projectGLJ;
  149. let datas = $("#adjustType").val() == "priceInfo"?me.priceInfoDatas:me.priceCoeDatas;
  150. let sels = this.spread.getActiveSheet().getSelections();
  151. let select = sels.length > 0? sels[0]:null;
  152. if(!select) return;
  153. for(let i =0;i<select.rowCount;i++){
  154. let recode = datas[select.row+i];
  155. if(recode) updateMap[recode.id] = {is_info_adjust:0,is_coe_adjust:0};
  156. }
  157. if( _.isEmpty(updateMap)) return;
  158. projectGLJ.batchUpdateGLJProperty(updateMap,materialAdjustObj.refreshSheetDatas);
  159. },
  160. showPriceInfoDatas:function () {
  161. this.spread.setActiveSheetIndex(0);
  162. this.priceInfoDatas = this.getPirceInfoDatas();
  163. sheetCommonObj.showData(this.priceInfoSheet, this.priceInfoSetting,this.priceInfoDatas);
  164. this.priceInfoSheet.setRowCount(this.priceInfoDatas.length);
  165. },
  166. showPriceCoeDatas:function () {
  167. this.spread.setActiveSheetIndex(1);
  168. this.priceCoeDatas = this.getPriceCoeDatas();
  169. sheetCommonObj.showData(this.priceCoeSheet, this.priceCoeSetting,this.priceCoeDatas);
  170. this.priceCoeSheet.setRowCount(this.priceCoeDatas.length);
  171. },
  172. getPirceInfoDatas:function(projectGLJList){
  173. let datas = [];
  174. let gljList = this.filterAdjustGlj(projectGLJList, 'is_info_adjust');
  175. gljList = sortProjectGLJ(gljList);
  176. for(let glj of gljList){
  177. datas.push(getInfoObject(glj));
  178. }
  179. return datas;
  180. function getInfoObject(glj) {
  181. let data = materialAdjustObj.getCommonObject(glj);
  182. data.riskCoe = glj.riskCoe;
  183. data.standardPrice = glj.standardPrice;
  184. data.totalPrice = materialAdjustObj.getTotalPrice(data);
  185. return data;
  186. }
  187. },
  188. filterAdjustGlj:function (projectGLJList, field) {
  189. let gljList = projectGLJList?projectGLJList:projectObj.project.projectGLJ.datas.gljList;
  190. return _.filter(gljList,function (item) {
  191. return item.quantity !== 0 && item.quantity !== '0' && item[field] ===1
  192. });
  193. },
  194. getPriceCoeDatas:function (projectGLJList,totalFee) {
  195. let datas = [];
  196. if(!gljUtil.isDef(totalFee)){
  197. let node = projectObj.project.Bills.getEngineeringCostNode(projectObj.mainController);
  198. totalFee = node && node.data.feesIndex && node.data.feesIndex.common?node.data.feesIndex.common.totalFee:0;
  199. }
  200. let gljList = this.filterAdjustGlj(projectGLJList, 'is_coe_adjust');
  201. gljList = sortProjectGLJ(gljList);
  202. for(let glj of gljList){
  203. datas.push(getCoeObject(glj,totalFee));
  204. }
  205. return datas;
  206. function getCoeObject(glj,totalFee) {
  207. let data = materialAdjustObj.getCommonObject(glj);
  208. data.FO = glj.FO;
  209. data.FI = glj.FI;
  210. data.totalPrice = materialAdjustObj.getTotalPrice(data);
  211. if(totalFee !==0) data.varWeight = scMathUtil.roundForObj(data.totalPrice/totalFee,2);
  212. return data;
  213. }
  214. },
  215. getTotalPrice:function (data) {
  216. return scMathUtil.roundForObj(data.quantity * data.marketPrice,getDecimal("bills.totalPrice"))
  217. },
  218. initRightClick : function() {
  219. let me = this;
  220. $.contextMenu({
  221. selector: '#material_adjust_sheet',
  222. build: function ($trigger, e) {
  223. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.spread);
  224. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  225. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  226. },
  227. items: {
  228. "addFromGLJ":{
  229. name: '从人材机汇总中选择',
  230. icon: 'fa-sign-in',
  231. disabled: function () {
  232. return false;
  233. },
  234. callback: function (key, opt) {
  235. $("#selectFromGLJ").modal('show');
  236. }
  237. },
  238. "deleteAdjust": {
  239. name: "删除",
  240. icon: 'fa-trash-o',
  241. disabled: function () {
  242. return me.rightClickTarget.row === undefined;
  243. },
  244. callback: function (key, opt) {
  245. let row = me.rightClickTarget.row;
  246. me.deleteAdjust();
  247. }
  248. }
  249. }
  250. });
  251. },
  252. getCommonObject:function (glj) {
  253. let data ={
  254. select:0,
  255. id:glj.id,
  256. code:glj.code,
  257. name:glj.name,
  258. specs:glj.specs,
  259. unit:glj.unit,
  260. type:glj.type,
  261. quantity:glj.quantity,
  262. supply:glj.supply,
  263. originPlace:glj.originPlace,
  264. vender:glj.vender,
  265. brand:glj.brand,
  266. remark:glj.remark
  267. };
  268. gljOprObj.setGLJPrice(data,glj);
  269. return data;
  270. }
  271. };
  272. let gljFromObj={
  273. spread:null,
  274. sheet:null,
  275. datas:[],
  276. setting:{
  277. header: [
  278. {headerName: "选择", headerWidth: 45, dataCode: "select", hAlign: "center", dataType: "String",cellType:'checkBox'},
  279. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  280. {headerName: "类型", headerWidth: 30, dataCode: "short_name", hAlign: "center", dataType: "String"},
  281. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  282. {headerName: "规格型号", headerWidth: 100, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  283. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  284. {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  285. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  286. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  287. {headerName: "暂估", headerWidth: 45, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
  288. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  289. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  290. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  291. ],
  292. view: {
  293. lockColumns: ["is_evaluate"]
  294. }
  295. },
  296. checkType:"取消",//记住点击过的按钮的text
  297. initSpread:function () {
  298. if(!this.spread){
  299. this.spread = SheetDataHelper.createNewSpread($("#glj_from_sheet")[0]);
  300. sheetCommonObj.spreadDefaultStyle(this.spread);
  301. }
  302. this.sheet = this.spread.getSheet(0);
  303. sheetCommonObj.initSheet(this.sheet,this.setting);
  304. this.sheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEditStarting);
  305. this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
  306. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
  307. this.sheet.setRowHeight(0, 36, 1);
  308. disableRightMenu("glj_from_sheet",this.spread);
  309. },
  310. onEditStarting:function (e,args) {
  311. args.cancel = true;
  312. },
  313. onClipboardPasting:function (e,args) {
  314. args.cancel = true;
  315. },
  316. onValueChanged:function (e,args) {
  317. let me = gljFromObj;
  318. let value = args.newValue;
  319. value = value == true?1:0;
  320. me.datas[args.row].select = value;
  321. },
  322. showDatas:function () {
  323. this.datas = [];
  324. let gljList = projectObj.project.projectGLJ.datas.gljList;
  325. gljList = this.filterGLJ(gljList);
  326. gljList = sortProjectGLJ(gljList);
  327. for(let glj of gljList){
  328. this.datas.push(this.getSheetDatas(glj));
  329. }
  330. this.refreshDatas();
  331. },
  332. filterGLJ:function (gljList) {
  333. let field = $("#adjustType").val() == "priceInfo"?"is_info_adjust":"is_coe_adjust";
  334. let typeMap = {};
  335. for(let ch of $(".glj_sel_input:checked")){
  336. typeMap[$(ch).val()] = true;
  337. }
  338. let inputV = $("#glj_sel_input").val();
  339. return _.filter(gljList,function (item) {
  340. if(item.quantity === 0 || item.quantity === '0' || item[field] ===1) return false;
  341. if(!typeMap[0]){//如果没有勾选所有,下面再细分
  342. let firstS = (item.type+"").substring(0,1);
  343. if(!typeMap[firstS]) return false
  344. }
  345. if(inputV!=""){//输入的关键字过滤
  346. if(item.code.indexOf(inputV)==-1 && item.name.indexOf(inputV)==-1) return false
  347. }
  348. return true;
  349. });
  350. },
  351. refreshDatas:function () {
  352. this.checkByType(this.checkType);
  353. sheetCommonObj.showData(this.sheet, this.setting,this.datas);
  354. this.sheet.setRowCount(this.datas.length);
  355. },
  356. getSheetDatas(glj){
  357. let projectGLJ = projectObj.project.projectGLJ;
  358. let materialIdList = projectGLJ.datas.constData.materialIdList;
  359. let data = materialAdjustObj.getCommonObject(glj);
  360. data.select = 0;
  361. data.short_name = projectGLJ.getShortNameByID(glj.type);
  362. // 只有材料才显示是否暂估
  363. if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
  364. return data;
  365. },
  366. checkByType:function (type) {
  367. for(let d of this.datas){
  368. d.select = 0;
  369. switch (type){
  370. case "全选":
  371. d.select = 1;
  372. break;
  373. case "全选主材":
  374. if(d.type == 4) d.select = 1;
  375. break;
  376. case "全选设备":
  377. if(d.type == 5) d.select = 1;
  378. break;
  379. case "取消":
  380. d.select = 0;
  381. break;
  382. }
  383. }
  384. //this.refreshDatas();
  385. },
  386. confirmSelect:function () {
  387. let updateMap = {};
  388. let adjustType = $("#adjustType").val()
  389. for(let d of this.datas){
  390. if(d.select == 1){
  391. let tem = {is_info_adjust:1,riskCoe:"",standardPrice:d.marketPrice+"",is_coe_adjust:1,FI:"",FO:""};//现在改成添加的话,两个页面都添加,删除两个页面都删除
  392. /* if(adjustType== "priceInfo"){
  393. tem = {is_info_adjust:1,riskCoe:"",standardPrice:d.marketPrice+""};
  394. }else {
  395. tem = {is_coe_adjust:1,FI:"",FO:""};
  396. }*/
  397. updateMap[d.id] = tem;
  398. }
  399. }
  400. if( _.isEmpty(updateMap)) return;
  401. projectObj.project.projectGLJ.batchUpdateGLJProperty(updateMap,function () {
  402. materialAdjustObj.refreshSheetDatas();
  403. });
  404. }
  405. };
  406. $(function () {
  407. $("#adjustType").change(function () {
  408. materialAdjustObj.refreshSheetDatas();
  409. let val = $(this).val();
  410. let mixDatas = {projectID: projectObj.project.projectInfo.ID, updateType: 'update',
  411. properties: {'property.gljAdjustType': val},
  412. options: {}, labourCoes: {}, rations: [], bills: []};
  413. CommonAjax.post('/pm/api/updateMixDatas', {user_id: userID, mixDataArr: mixDatas}, function (rstData) {
  414. projectObj.project.projectInfo.property.gljAdjustType = val;
  415. });
  416. });
  417. $('#selectFromGLJ').on('shown.bs.modal',function(e){
  418. gljFromObj.checkType="取消";
  419. gljFromObj.initSpread();
  420. gljFromObj.showDatas();
  421. });
  422. $(".glj_sel_input").change(function () {
  423. let check = $(this).prop("checked");
  424. if($(this).val() == 0){//勾选的是全选,其它的勾选项跟着改变
  425. for(let a of $(".glj_sel_input")){
  426. $(a).prop("checked",check)
  427. }
  428. }else {//勾选其它选项
  429. let a_checked = true;
  430. for(let o of $(".glj_sel_input_other")){//如果其它的有一个不勾选,则所有项也不打勾
  431. if($(o).prop("checked") === false){
  432. a_checked = false;
  433. break;
  434. }
  435. }
  436. $("#glj_sel_all").prop("checked",a_checked);
  437. }
  438. gljFromObj.showDatas();
  439. });
  440. $("#glj_sel_btn_find").click(function () {
  441. gljFromObj.showDatas();
  442. });
  443. $(".glj_sel_check_btn").click(function () {
  444. gljFromObj.checkType = $(this).text();
  445. gljFromObj.refreshDatas();
  446. })
  447. $("#glj_sel_confirm").click(function () {
  448. gljFromObj.confirmSelect();
  449. })
  450. });