material_adjust_view.js 19 KB

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