material_adjust_view.js 20 KB

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