config_material_view.js 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. /**
  2. * Created by zhang on 2019/9/10.
  3. */
  4. let configMaterialObj = {
  5. GLJIDMap:{},
  6. relateFilterAgain:false,
  7. configSpread:null,
  8. relatedSpread:null,
  9. evaluateMaterialDatas:[],
  10. bidMaterialDatas:[],
  11. evaluateMaterialSetting:{
  12. header: [
  13. {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
  14. {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String",formatter: "@"},
  15. {headerName: "材料号", headerWidth: 80, dataCode: "code", dataType: "String",formatter: "@"},
  16. {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  17. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  18. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  19. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number"},//decimalField:'glj.quantity'
  20. {headerName: "暂定价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  21. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  22. {headerName: "锁定", headerWidth: 80, dataCode: "locked", hAlign: "left", dataType: "String",cellType:'checkBox'},
  23. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String",visible:false},
  24. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String",visible:false},
  25. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  26. ],
  27. view:{ lockColumns: ["is_related","totalPrice","originPlace","vender","quantity"]}
  28. },
  29. bidMaterialSetting:{
  30. header: [
  31. {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
  32. {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String",formatter: "@"},
  33. {headerName: "材料号", headerWidth: 80, dataCode: "code", dataType: "String",formatter: "@"},
  34. {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  35. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  36. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  37. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"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",visible:false},
  41. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String",visible:false},
  42. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  43. ],
  44. view:{ lockColumns: ["is_related","totalPrice","originPlace","vender","quantity"]}
  45. },
  46. evaluateRelateSetting:{
  47. header: [
  48. {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
  49. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  50. {headerName: "类别", headerWidth: 45, dataCode: "short_name" ,hAlign: "center",dataType: "String"},
  51. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  52. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  53. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  54. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  55. {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number"},
  56. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
  57. {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
  58. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  59. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  60. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  61. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  62. ],
  63. view:{ lockColumns: ["code","type","name","specs","unit","quantity","marketPrice","basePrice","supply","originPlace","vender","remark"]}
  64. },
  65. initSpread:function(){
  66. if(!this.configSpread){
  67. this.configSpread = SheetDataHelper.createNewSpread($("#config_material_sheet")[0],4);
  68. sheetCommonObj.spreadDefaultStyle(this.configSpread);
  69. this.relatedSpread = SheetDataHelper.createNewSpread($("#related_sheet")[0],4);
  70. sheetCommonObj.spreadDefaultStyle(this.relatedSpread);
  71. }
  72. this.initEvaluateMaterialSheet();
  73. this.initbidMaterialSheet();
  74. this.initEvaluateRelateSheet();
  75. materialAdjustObj.initPriceInfoSheet();
  76. materialAdjustObj.initPriceCoeSheet();
  77. //打开别人分享的项目,只读
  78. if(projectReadOnly){
  79. sheetCommonObj.disableSpread(this.configSpread);
  80. sheetCommonObj.disableSpread(this.relatedSpread);
  81. }else {
  82. this.initRightClick();
  83. }
  84. },
  85. initEvaluateMaterialSheet:function(){
  86. this.evaluateMaterialSheet = this.configSpread.getSheet(0);
  87. sheetCommonObj.initSheet(this.evaluateMaterialSheet,this.evaluateMaterialSetting,30);
  88. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEvaluateMaterialValueChange);
  89. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onEvaluateMaterialSelectionChange);
  90. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEvaluateMaterialEditStarting);
  91. this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  92. this.evaluateMaterialSheet.name('evaluateMaterialSheet');
  93. this.evaluateMaterialSheet.setRowHeight(0, 36, 1);
  94. },
  95. initbidMaterialSheet:function(){
  96. this.bidMaterialSheet = this.configSpread.getSheet(1);
  97. sheetCommonObj.initSheet(this.bidMaterialSheet,this.bidMaterialSetting,30);
  98. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onBidEvaluateMaterialValueChange);
  99. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onEvaluateMaterialSelectionChange);
  100. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onBitMaterialEditStarting);
  101. this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  102. this.bidMaterialSheet.name('bidMaterialSheet');
  103. this.bidMaterialSheet.setRowHeight(0, 36, 1);
  104. },
  105. initEvaluateRelateSheet:function () {
  106. this.evaluateRelateSheet = this.relatedSpread.getSheet(0);
  107. sheetCommonObj.initSheet(this.evaluateRelateSheet,this.evaluateRelateSetting,30);
  108. this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEvaluateRelateValueChange);
  109. this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEvaluateRelateEditStarting);
  110. //this.evaluateRelateSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
  111. this.evaluateRelateSheet.name('evaluateRelateSheet');
  112. this.evaluateRelateSheet.setRowHeight(0, 36, 1);
  113. },
  114. showEvaluateMaterialDatas:function () {
  115. this.configSpread.setActiveSheetIndex(0);
  116. let sel = this.evaluateMaterialSheet.getSelections()[0];
  117. let oldData = sel.row<this.evaluateMaterialDatas.length?this.evaluateMaterialDatas[sel.row]:"";
  118. this.evaluateMaterialDatas = this.getEvaluateMaterialDatas();
  119. sheetCommonObj.showData(this.evaluateMaterialSheet, this.evaluateMaterialSetting,this.evaluateMaterialDatas);
  120. this.evaluateMaterialSheet.setRowCount(this.evaluateMaterialDatas.length);
  121. sel.row = oldData?_.findIndex(this.evaluateMaterialDatas,{'ID':oldData.ID}):'';
  122. this.evaluateMaterialSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  123. },
  124. showBidMaterialDatas:function () {
  125. this.configSpread.setActiveSheetIndex(1);
  126. let sel = this.bidMaterialSheet.getSelections()[0];
  127. let oldData = sel.row<this.bidMaterialDatas.length?this.bidMaterialDatas[sel.row]:"";
  128. this.bidMaterialDatas = this.getBidMaterialDatas();
  129. sheetCommonObj.showData(this.bidMaterialSheet, this.bidMaterialSetting,this.bidMaterialDatas);
  130. this.bidMaterialSheet.setRowCount(this.bidMaterialDatas.length);
  131. sel.row = oldData?_.findIndex(this.bidMaterialDatas,{'ID':oldData.ID}):'';
  132. this.bidMaterialSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  133. },
  134. showEvaluateRelateDatas:function () {
  135. this.relatedSpread.setActiveSheetIndex(0);
  136. this.evaluateRelateDatas = this.getEvaluateRelateDatas();
  137. sheetCommonObj.showData(this.evaluateRelateSheet, this.evaluateRelateSetting,this.evaluateRelateDatas);
  138. this.evaluateRelateSheet.setRowCount(this.evaluateRelateDatas.length);
  139. },
  140. refreshSheetDatas:function () {
  141. if(projectGljObject.displayType == filterType.ZGCL){
  142. this.showEvaluateMaterialDatas();
  143. }else if(projectGljObject.displayType == filterType.PBCL){
  144. this.showBidMaterialDatas();
  145. }
  146. this.showEvaluateRelateDatas();
  147. },
  148. setNavLinkText:function (type) {
  149. let text = "关联暂估材料";
  150. switch (type){
  151. case filterType.ZGCL:
  152. text = "关联暂估材料";
  153. break;
  154. case filterType.PBCL:
  155. text = "关联评标材料";
  156. break;
  157. case filterType.AMAE:
  158. text = "关联材料";
  159. break;
  160. }
  161. $("#related_link").text(text);
  162. },
  163. getEvaluateRelateDatas:function () {
  164. //$('filterGljName')
  165. let name = '',datas = [],sheet=null,field='',rdata=[];
  166. switch (projectGljObject.displayType){
  167. case filterType.ZGCL:
  168. sheet = this.evaluateMaterialSheet;
  169. datas = this.evaluateMaterialDatas;
  170. field = "is_evaluate";
  171. break;
  172. case filterType.PBCL:
  173. sheet = this.bidMaterialSheet;
  174. datas = this.bidMaterialDatas;
  175. field = "is_eval_material";
  176. break;
  177. case filterType.AMAE:
  178. sheet = materialAdjustObj.getSheet();
  179. datas = materialAdjustObj.getSheetDatas();
  180. field = "is_contractor_material";
  181. }
  182. let sel = sheet.getSelections()[0];
  183. let srow = sel.row == -1||sel.row == ""?0:sel.row;
  184. if(gljUtil.isDef(srow) && datas.length>srow){
  185. name = this.relateFilterAgain== true? $('#filterGljName').val(): datas[srow].name;
  186. rdata = this.filterEvaluateRelate(name,datas[srow].projectGLJID,field);
  187. }
  188. if(this.relateFilterAgain== false) $('#filterGljName').val(name);
  189. return rdata;
  190. },
  191. filterEvaluateRelate:function (name,projectGLJID,relateField) {
  192. let datas = [];
  193. let projectGLJ = projectObj.project.projectGLJ;
  194. let materialIdList = projectGLJ.datas.constData.materialIdList;
  195. for(let d of projectGLJ.datas.gljList){
  196. if (parseFloat(d.quantity) > 0 ){//材料类型//materialIdList.indexOf(d.type) >= 0 &&
  197. if(projectGljObject.displayType != filterType.AMAE){
  198. if(materialIdList.indexOf(d.type) ==-1) continue;
  199. }
  200. if(d[relateField] == 1 && d.id != projectGLJID) continue;//排除其它已被关联的工料机
  201. if(name != ''){//name为''时不做过滤
  202. if(d.name.indexOf(name)==-1){
  203. if(!(d[relateField] == 1 && d.id == projectGLJID)) continue;//虽然不匹配,但是是关联的暂估材料,这时应该显示
  204. }
  205. }
  206. let t = {
  207. id:d.id,
  208. code : d.code,
  209. type : d.type,
  210. short_name :projectGLJ.getShortNameByID(d.type),
  211. name : d.name,
  212. specs : d.specs,
  213. unit : d.unit,
  214. quantity : d.quantity,
  215. supply:d.supply,
  216. originPlace:d.originPlace,
  217. vender:d.vender,
  218. remark:d.remark,
  219. from:d
  220. };
  221. t.is_related = d[relateField]?1:0;
  222. gljOprObj.setGLJPrice(t,d);
  223. t.totalPrice = scMathUtil.roundForObj(t.quantity * t.marketPrice,getDecimal('bills.totalPrice'));
  224. datas.push(t);
  225. }
  226. }
  227. return _.sortByAll(datas,'code');
  228. },
  229. getEvaluateMaterialDatas:function (projectGLJList, evaluateList, decimalObj) {
  230. projectGLJList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  231. evaluateList = evaluateList ? evaluateList : projectObj.project.evaluate_list.datas;
  232. const billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  233. let datas = [];
  234. let gljMap = _.indexBy(projectGLJList,'id');
  235. for(let e of evaluateList){
  236. let t = {
  237. ID:e.ID,
  238. projectID: e.projectID,
  239. is_related:e.is_related,//关联,1关,0不关
  240. projectGLJID:e.projectGLJID,//关联工料机ID
  241. seq:e.seq,//序号
  242. code:e.code,
  243. name:e.name,
  244. specs:e.specs,
  245. unit:e.unit,
  246. type:e.type,
  247. marketPrice:e.market_price,
  248. quantity:e.quantity,
  249. locked:e.locked,//锁定,1锁,0不锁
  250. remark:e.remark,
  251. originPlace:e.originPlace,//产地
  252. vender:e.vender //厂家
  253. };
  254. let pglj = gljMap[e.projectGLJID];
  255. if(e.is_related && pglj){
  256. gljOprObj.setGLJPrice(t,pglj);
  257. t.originPlace = pglj.originPlace;
  258. t.vender = pglj.vender;
  259. t.brand = pglj.brand;
  260. t.qualityGrace = pglj.qualityGrace;
  261. t.remark = pglj.remark;
  262. t.quantity = pglj.quantity;
  263. }
  264. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,billsDecimal);
  265. datas.push(t);
  266. }
  267. return _.sortByAll(datas,'code');
  268. },
  269. getBidMaterialDatas:function (projectGLJList, bidEvaluationList, decimalObj) {
  270. projectGLJList = projectGLJList ? projectGLJList : projectObj.project.projectGLJ.datas.gljList;
  271. bidEvaluationList = bidEvaluationList ? bidEvaluationList : projectObj.project.bid_evaluation_list.datas;
  272. const billsDecimal = decimalObj ? decimalObj.bills.totalPrice : getDecimal('bills.totalPrice');
  273. let datas = [];
  274. let gljMap = _.indexBy(projectGLJList,'id');
  275. for(let e of bidEvaluationList){
  276. let t = {
  277. ID:e.ID,
  278. projectID: e.projectID,
  279. is_related:e.is_related,//关联,1关,0不关
  280. projectGLJID:e.projectGLJID,//关联工料机ID
  281. seq:e.seq,//序号
  282. code:e.code,
  283. name:e.name,
  284. specs:e.specs,
  285. unit:e.unit,
  286. type:e.type,
  287. marketPrice:e.market_price,
  288. quantity:e.quantity,
  289. remark:e.remark,
  290. originPlace:e.originPlace,//产地
  291. is_evaluate:0,
  292. vender:e.vender //厂家
  293. };
  294. let pglj = gljMap[e.projectGLJID];
  295. if(e.is_related && pglj){
  296. gljOprObj.setGLJPrice(t,pglj);
  297. t.originPlace = pglj.originPlace;
  298. t.vender = pglj.vender;
  299. t.brand = pglj.brand;
  300. t.qualityGrace = pglj.qualityGrace;
  301. t.quantity = pglj.quantity;
  302. t.is_evaluate = pglj.is_evaluate;
  303. }
  304. t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,billsDecimal);
  305. datas.push(t);
  306. }
  307. return _.sortByAll(datas,'code');
  308. },
  309. updateConfigMaterial:function (dataCode,value,recode) {
  310. let task = [];
  311. for(let t of projectObj.project.projectGLJ.datas.gljList){
  312. this.GLJIDMap[t.id] = t;
  313. }
  314. let glj = this.GLJIDMap[recode.id];
  315. if(!glj) return;
  316. let pdata = {doc:{},action:'update'};
  317. pdata['type'] = 'glj_list';
  318. pdata.doc[dataCode] = value;
  319. pdata['id'] = glj.id;
  320. task.push(pdata);
  321. this.getEvaluateUpdateTasks(value,glj,dataCode,task);
  322. this.updateEvaluateMaterial(task,dataCode == "is_evaluate");
  323. },
  324. updateEvaluateMaterial :async function(data,refreshEvaluate=true){
  325. try {
  326. $.bootstrapLoading.start();
  327. let result = await ajaxPost('/glj/updateEvaluateMaterial',{tasks:data});
  328. //先刷新缓存
  329. let [gljs,sendPriceChange] = this.refreshCache(data);
  330. if(refreshEvaluate == true){
  331. let [rationNodes,impactGLJs] = projectObj.project.projectGLJ.batchChangeIsEvaluate(gljs);
  332. projectObj.project.calcProgram.calcNodesAndSave(rationNodes, function () {
  333. projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
  334. });
  335. }
  336. projectGljObject.refreshViewsData();
  337. gljOprObj.refreshView();
  338. if(sendPriceChange == true) projectGljObject.onUnitFileChange();
  339. }catch (e){
  340. console.log(e)
  341. }finally {
  342. $.bootstrapLoading.end();
  343. }
  344. },
  345. refreshCache:function (tasks) {
  346. let gljs = [];
  347. let sendPriceChange = false;
  348. for(let t of tasks){
  349. if(t.type == "evaluate_list"){
  350. refreshDatas(projectObj.project.evaluate_list.datas,t);
  351. }else if(t.type == "bid_evaluation_list"){
  352. refreshDatas(projectObj.project.bid_evaluation_list.datas,t);
  353. }else if(t.type == "contractor_list"){
  354. refreshDatas(projectObj.project.contractor_list.datas,t);
  355. } else {
  356. if(_.isEmpty(this.GLJIDMap)) this.GLJIDMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList,'id');
  357. //剩下两个类型只有更新操作
  358. if(t.type == "unit_price"){
  359. let g = this.GLJIDMap[t.projectGLJID];
  360. if(g) {
  361. let f = updateProperty(g.unit_price,t.doc);
  362. if(f == true) sendPriceChange = true;
  363. gljs.push(g);
  364. }
  365. }
  366. if(t.type == "glj_list"){
  367. let g = this.GLJIDMap[t.id];
  368. if(g){
  369. let f = updateProperty(g,t.doc);
  370. if(f == true) sendPriceChange = true;
  371. gljs.push(g);
  372. }
  373. }
  374. }
  375. }
  376. this.GLJIDMap = {};
  377. return [gljs,sendPriceChange];
  378. function refreshDatas(datas,t_t) {
  379. if(t_t.action == "update"){
  380. let e = _.find(datas,{'ID':t_t.ID});
  381. if(e) updateProperty(e,t_t.doc);
  382. }
  383. if(t_t.action == "add") datas.push(t_t.doc);
  384. if(t_t.action == "delete") _.remove(datas,{'ID':t_t.ID});
  385. }
  386. function updateProperty(obj,doc) {
  387. let updatePrice = false;
  388. for(let k in doc){
  389. obj[k] = doc[k];
  390. if(k == 'base_price' || k == 'market_price') updatePrice = true;
  391. }
  392. return updatePrice;
  393. }
  394. },
  395. getEvaluateUpdateTasks:function (value,glj,dataCode,task) {
  396. let dataList = [],modelType='evaluate_list';
  397. if(dataCode == 'is_evaluate'){
  398. dataList = projectObj.project.evaluate_list.datas;
  399. modelType = 'evaluate_list';
  400. }else if(dataCode == 'is_eval_material'){
  401. dataList = projectObj.project.bid_evaluation_list.datas;
  402. modelType = 'bid_evaluation_list';
  403. }
  404. if(value == 1){ //勾选暂估选项,查看已有的暂估材料列表中是否有名称,编号等完全相同的记录,有则直接关联,无则添加
  405. let evaluate = null;
  406. let pindex = gljUtil.getIndex(glj,gljUtil.materialKeyArray);
  407. for(let e of dataList){
  408. let eIndex = gljUtil.getIndex(e,gljUtil.materialKeyArray);
  409. if(pindex == eIndex){
  410. evaluate = e;
  411. break;
  412. }
  413. }
  414. if(evaluate){//有找到则更新,没有则添加
  415. let edata = {type:modelType,doc:{},action:"update",ID:evaluate.ID};
  416. edata.doc = {projectGLJID:glj.id,is_related:1};
  417. task.push(edata);
  418. if(dataCode == 'is_evaluate'){
  419. let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:glj.id,id : glj.unit_price.id};
  420. //if(evaluate.base_price != glj.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
  421. if(evaluate.market_price != glj.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
  422. if(!_.isEmpty(udata.doc)) task.push(udata);
  423. }
  424. }else {
  425. let ndata = {type:modelType,doc:{},action:"add"};
  426. ndata.doc['ID'] = uuid.v1();
  427. ndata.doc['projectGLJID'] = glj.id;
  428. ndata.doc['is_related'] = 1;
  429. if(dataCode == 'is_evaluate') ndata.doc['locked'] = 0;
  430. ndata.doc['seq'] = glj.code;
  431. ndata.doc['projectID'] = glj.project_id;
  432. ndata.doc['code'] = glj.code;
  433. ndata.doc['name'] = glj.name;
  434. ndata.doc['specs'] = glj.specs;
  435. ndata.doc['unit'] = glj.unit;
  436. ndata.doc['quantity'] = glj.quantity;
  437. ndata.doc['type'] = glj.type;
  438. ndata.doc['market_price'] = glj.unit_price.market_price;
  439. ndata.doc['originPlace'] = glj.originPlace;
  440. ndata.doc['vender'] = glj.vender;
  441. ndata.doc['remark'] = glj.remark;
  442. task.push(ndata);
  443. }
  444. }else if(value == 0){
  445. let t_evaluate = null;
  446. for(let e of dataList){
  447. if(e.projectGLJID == glj.id && e.is_related == 1){
  448. t_evaluate = e;
  449. break;
  450. }
  451. }
  452. if(t_evaluate){
  453. let tdata = {type:modelType,doc:{is_related:0,quantity:'0'},action:"update",ID:t_evaluate.ID};
  454. task.push(tdata);
  455. }
  456. }
  457. },
  458. onEvaluateMaterialSelectionChange:function (sender, args) {
  459. let me = configMaterialObj;
  460. let newSel = args.newSelections[0];
  461. let oldSel = args.oldSelections?args.oldSelections[0]:{};
  462. if(newSel.row != oldSel.row){
  463. me.showEvaluateRelateDatas();
  464. me.relateFilterAgain = false;
  465. }
  466. },
  467. onBidEvaluateMaterialValueChange:function (e,info) {
  468. let me = configMaterialObj,row = info.row, col = info.col;
  469. let dataCode = me.bidMaterialSetting.header[col].dataCode;
  470. let value = info.newValue;
  471. let bid = me.bidMaterialDatas[row];
  472. if (value&&! sheetCommonObj.checkData(col,me.bidMaterialSetting,value)) {
  473. alert('输入的数据类型不对,请重新输入!');
  474. return me.showBidMaterialDatas();
  475. }
  476. if(dataCode == 'marketPrice'){
  477. dataCode = 'market_price';
  478. if(bid.is_related){//关联的情况下,直接修改工料机价格
  479. if(bid.is_evaluate == 1){
  480. alert("当前材料市场价已被锁定,修改请先返回人材机汇总界面解除锁定。");
  481. return me.showBidMaterialDatas();
  482. }
  483. return projectObj.project.projectGLJ.updatePrice(bid,dataCode,value,'rg', null,projectGljObject.refreshViewsData);
  484. }
  485. value = scMathUtil.roundToString(value,getDecimal('glj.unitPrice'));
  486. }
  487. if(value&& dataCode === 'quantity'){//修改数量需做4舍5入
  488. value = scMathUtil.roundToString(value,getDecimal('glj.quantity'));
  489. }
  490. let edata = {type:'bid_evaluation_list',doc:{},action:"update",ID:bid.ID};
  491. if(bid[dataCode] == value) return me.showBidMaterialDatas();
  492. edata.doc[dataCode] = value;
  493. me.updateEvaluateMaterial([edata],false);
  494. },
  495. onSheetRangeChange:function (e,args) {
  496. let me = configMaterialObj,updateMap = {},modelType='',setting={},datas = [],tasks = [];
  497. switch (projectGljObject.displayType){
  498. case filterType.ZGCL:
  499. modelType="evaluate_list";
  500. setting = me.evaluateMaterialSetting;
  501. datas = me.evaluateMaterialDatas;
  502. break;
  503. case filterType.PBCL:
  504. modelType="bid_evaluation_list";
  505. setting = me.bidMaterialSetting;
  506. datas = me.bidMaterialDatas;
  507. break;
  508. }
  509. for(let c of args.changedCells){
  510. let dataCode = setting.header[c.col].dataCode;
  511. let value= args.sheet.getCell(c.row, c.col).text();
  512. let recode = datas[c.row];
  513. if(me.editChecking(recode,dataCode,modelType == "evaluate_list")==false){
  514. me.refreshSheetDatas();
  515. return ;
  516. }
  517. if (value&&!sheetCommonObj.checkData(c.col,setting,value)) {
  518. alert('输入的数据类型不对,请重新输入!');
  519. me.refreshSheetDatas();
  520. return ;
  521. }
  522. if(dataCode=='marketPrice'){
  523. dataCode = 'market_price';
  524. if(recode.is_related){//关联的情况下,直接修改工料机价格 暂时不支持批量修改
  525. return projectObj.project.projectGLJ.updatePrice(recode,dataCode,value,'rg',null,projectGljObject.refreshViewsData);
  526. }
  527. }else {
  528. let tem = updateMap[recode.ID]?updateMap[recode.ID]:{};
  529. if(value&&dataCode === 'quantity') value = scMathUtil.roundToString(value,getDecimal('glj.quantity'));//修改数量需做4舍5入
  530. if(value == recode[dataCode]) continue;
  531. tem[dataCode] = value;
  532. updateMap[recode.ID] = tem;
  533. }
  534. }
  535. for(let ID in updateMap){
  536. let edata = {type:modelType,doc:updateMap[ID],action:"update",ID:ID};
  537. tasks.push(edata);
  538. }
  539. if(tasks.length > 0) me.updateEvaluateMaterial(tasks,false);
  540. },
  541. onEvaluateMaterialValueChange:function (e,info) {
  542. let me = configMaterialObj,row = info.row, col = info.col;
  543. let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
  544. let value = info.newValue;
  545. let evaluate = me.evaluateMaterialDatas[row];
  546. if (value&&! sheetCommonObj.checkData(col,me.evaluateMaterialSetting,value)) {
  547. alert('输入的数据类型不对,请重新输入!');
  548. return me.showEvaluateMaterialDatas();
  549. }
  550. if(dataCode == 'locked') value = value == true?1:0;
  551. if(dataCode == 'marketPrice'){
  552. dataCode = 'market_price';
  553. if(evaluate.is_related){//关联的情况下,直接修改工料机价格
  554. return projectObj.project.projectGLJ.updatePrice(evaluate,dataCode,value,'rg',null,projectGljObject.refreshViewsData);
  555. }
  556. }
  557. if(value && dataCode === 'quantity'){//修改数量需做4舍5入
  558. value= scMathUtil.roundToString(value,getDecimal('glj.quantity'));
  559. }
  560. let edata = {type:'evaluate_list',doc:{},action:"update",ID:evaluate.ID};
  561. if(evaluate[dataCode] == value) return me.showEvaluateMaterialDatas();
  562. edata.doc[dataCode] = value;
  563. me.updateEvaluateMaterial([edata],false);
  564. },
  565. onEvaluateRelateValueChange:function (e,info){
  566. let me = configMaterialObj,row = info.row, col = info.col;
  567. let value = info.newValue;
  568. let sheet = null,datas = [],field = "",type="";
  569. switch (projectGljObject.displayType){
  570. case filterType.ZGCL:
  571. sheet = me.evaluateMaterialSheet;
  572. datas = me.evaluateMaterialDatas;
  573. field = "is_evaluate";
  574. type="evaluate_list";
  575. break;
  576. case filterType.PBCL:
  577. sheet = me.bidMaterialSheet;
  578. datas = me.bidMaterialDatas;
  579. field = "is_eval_material";
  580. type="bid_evaluation_list";
  581. break;
  582. case filterType.AMAE:
  583. sheet = materialAdjustObj.getSheet();
  584. datas = materialAdjustObj.getSheetDatas();
  585. field = "is_contractor_material";
  586. type = "contractor_list";
  587. }
  588. let sel = sheet.getSelections()[0];
  589. let srow = sel.row == -1||sel.row == ""?0:sel.row;
  590. let task = [];
  591. value = value == true?1:0;
  592. if(datas.length>srow){
  593. let evaluate = datas[srow];
  594. let relate = me.evaluateRelateDatas[row];
  595. let pdata = {id:relate.id,doc:{},action:'update',type:"glj_list"};
  596. pdata.doc[field] = value;
  597. task.push(pdata);
  598. let tdata = {type:type,doc:{},action:"update",ID:evaluate.ID};
  599. if(value == 0){//如果是0的话
  600. tdata.doc = {is_related:0,quantity:'0'};
  601. }else {
  602. if(relate.unit != evaluate.unit){//检查单位是否相同,如果不同不能关联
  603. alert("单位不一致,不允许关联!");
  604. return me.showEvaluateRelateDatas();
  605. }
  606. //如果已经关联了其它项目工料机,要把那个项目工料机的是否暂估标记为否
  607. if(evaluate.is_related == 1){
  608. let tdoc = {};
  609. tdoc[field] = 0;
  610. task.push({id:evaluate.projectGLJID,doc:tdoc,action:'update',type:"glj_list"});
  611. }
  612. //更新暂估材料的工料机ID,和关联标记
  613. tdata.doc = {projectGLJID:relate.id,is_related:1};
  614. if(projectGljObject.displayType == filterType.ZGCL){
  615. //更新新关联工料机的市场价格
  616. let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:relate.from.id,id : relate.from.unit_price.id};
  617. //if(evaluate.base_price != relate.from.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
  618. if(evaluate.marketPrice != relate.from.unit_price.market_price) udata.doc['market_price'] = evaluate.marketPrice;
  619. if(!_.isEmpty(udata.doc)) task.push(udata);
  620. }
  621. }
  622. task.push(tdata);
  623. me.updateEvaluateMaterial(task);
  624. }
  625. },
  626. deleteMaterial:function (row) {
  627. let me = configMaterialObj;
  628. let evaluate = {},task=[],type='',field='';
  629. switch (projectGljObject.displayType){
  630. case filterType.ZGCL:
  631. evaluate = me.evaluateMaterialDatas[row];
  632. field = "is_evaluate";
  633. type="evaluate_list";
  634. break;
  635. case filterType.PBCL:
  636. evaluate = me.bidMaterialDatas[row];
  637. field = "is_eval_material";
  638. type="bid_evaluation_list";
  639. break;
  640. case filterType.AMAE:
  641. let t_datas = materialAdjustObj.getSheetDatas();
  642. evaluate = t_datas[row];
  643. field = "is_contractor_material";
  644. type="contractor_list";
  645. }
  646. if(evaluate){
  647. task.push({type:type,action:"delete",ID:evaluate.ID});
  648. if(evaluate.is_related == 1){//如果关联了工料机,则要把工料机标记为不是暂估
  649. let tdoc = {};
  650. tdoc[field] = 0;
  651. task.push({id:evaluate.projectGLJID,doc:tdoc,action:'update',type:"glj_list"})
  652. }
  653. me.updateEvaluateMaterial(task);
  654. }
  655. },
  656. onEvaluateMaterialEditStarting:function (sender, args) {
  657. let me = configMaterialObj;
  658. let row = args.row,col = args.col;
  659. let evaluate = me.evaluateMaterialDatas[row];
  660. let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
  661. if(me.editChecking(evaluate,dataCode,true)==false) args.cancel = true;
  662. },
  663. editChecking:function (record,dataCode,checkLock = false) {//return false 为不能编辑
  664. if(checkLock && record.locked) return false;
  665. if((dataCode == 'quantity'||dataCode == 'unit') && record.is_related) return false;//在关联的情况下,数量和单位不可编辑
  666. return true;
  667. },
  668. onBitMaterialEditStarting:function (sender, args) {
  669. let me = configMaterialObj;
  670. let row = args.row,col = args.col;
  671. let bid = me.bidMaterialDatas[row];
  672. let dataCode = me.bidMaterialSetting.header[col].dataCode;
  673. if(me.editChecking(bid,dataCode)==false) args.cancel = true;
  674. },
  675. onEvaluateRelateEditStarting:function (sender, args) {
  676. let me = configMaterialObj;
  677. let row = args.row,col = args.col;
  678. args.cancel = true;
  679. },
  680. insertEmptyRow:function () {
  681. let m_t = "";
  682. switch (projectGljObject.displayType){
  683. case filterType.ZGCL:
  684. m_t="evaluate_list";
  685. break;
  686. case filterType.PBCL:
  687. m_t="bid_evaluation_list";
  688. break;
  689. }
  690. let ndata = {type:m_t,doc:{},action:"add"};
  691. ndata.doc['ID'] = uuid.v1();
  692. ndata.doc['is_related'] = 0;
  693. if(m_t == "evaluate_list")ndata.doc['locked'] = 0;
  694. ndata.doc['seq'] = "";
  695. ndata.doc['projectID'] = projectObj.project.ID();
  696. ndata.doc['code'] = "";
  697. ndata.doc['name'] = "";
  698. ndata.doc['unit'] = "";
  699. ndata.doc['originPlace'] = "";
  700. ndata.doc['vender'] = "";
  701. ndata.doc['remark'] = "";
  702. configMaterialObj.updateEvaluateMaterial([ndata],false);
  703. },
  704. initRightClick : function() {
  705. let me = this;
  706. $.contextMenu({
  707. selector: '#config_material_sheet',
  708. build: function ($trigger, e) {
  709. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.configSpread);
  710. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  711. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  712. },
  713. items: {
  714. "addFromGLJ":{
  715. name: '从人材机汇总中选择',
  716. icon: 'fa-sign-in',
  717. disabled: function () {
  718. return false;
  719. },
  720. callback: function (key, opt) {
  721. if(projectGljObject.displayType == filterType.AMAE){
  722. materialAdjustObj.checkedDefualtOption("glj_sel_input");
  723. $("#selectFromGLJ").modal('show');
  724. }else {
  725. materialAdjustObj.checkedDefualtOption("pglj_sel_input");
  726. $("#selectPGLJ").modal('show');
  727. }
  728. }
  729. },
  730. "insertRow":{
  731. name: '插入',
  732. icon: 'fa-sign-in',
  733. disabled: function () {
  734. return false;
  735. },
  736. callback: function (key, opt) {
  737. if(projectGljObject.displayType == filterType.AMAE){
  738. materialAdjustObj.insertEmptyRow();
  739. }else {
  740. configMaterialObj.insertEmptyRow();
  741. }
  742. }
  743. },
  744. "deleteAdjust": {
  745. name: "删除",
  746. icon: 'fa-trash-o',
  747. disabled: function () {
  748. return me.rightClickTarget.row === undefined;
  749. },
  750. callback: function (key, opt) {
  751. let row = me.rightClickTarget.row;
  752. me.deleteMaterial(row);
  753. }
  754. }
  755. }
  756. });
  757. }
  758. };
  759. let pgljSelObj={
  760. spread:null,
  761. sheet:null,
  762. datas:[],
  763. setting:{
  764. header: [
  765. {headerName: "选择", headerWidth: 45, dataCode: "select", hAlign: "center", dataType: "String",cellType:'checkBox'},
  766. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  767. {headerName: "类型", headerWidth: 30, dataCode: "short_name", hAlign: "center", dataType: "String"},
  768. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
  769. {headerName: "规格型号", headerWidth: 100, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  770. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  771. {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  772. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  773. {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  774. {headerName: "暂估", headerWidth: 45, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
  775. {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String"},
  776. {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
  777. {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
  778. ],
  779. view: {
  780. lockColumns: ["is_evaluate"]
  781. }
  782. },
  783. checkType:"取消",//记住点击过的按钮的text
  784. initSpread:function () {
  785. if(!this.spread){
  786. this.spread = SheetDataHelper.createNewSpread($("#pglj_from_sheet")[0]);
  787. sheetCommonObj.spreadDefaultStyle(this.spread);
  788. }else {
  789. this.spread.refresh();
  790. }
  791. this.sheet = this.spread.getSheet(0);
  792. sheetCommonObj.initSheet(this.sheet,this.setting);
  793. this.sheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEditStarting);
  794. this.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, this.onClipboardPasting);
  795. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onValueChanged);
  796. this.sheet.setRowHeight(0, 36, 1);
  797. disableRightMenu("pglj_from_sheet",this.spread);
  798. },
  799. onEditStarting:function (e,args) {
  800. args.cancel = true;
  801. },
  802. onClipboardPasting:function (e,args) {
  803. args.cancel = true;
  804. },
  805. onValueChanged:function (e,args) {
  806. let me = pgljSelObj;
  807. let value = args.newValue;
  808. value = value == true?1:0;
  809. me.datas[args.row].select = value;
  810. },
  811. showDatas:function () {
  812. this.datas = [];
  813. let gljList = projectObj.project.projectGLJ.datas.gljList;
  814. gljList = this.filterGLJ(gljList);
  815. gljList = sortProjectGLJ(gljList);
  816. for(let glj of gljList){
  817. this.datas.push(this.getSheetDatas(glj));
  818. }
  819. this.refreshDatas();
  820. },
  821. filterGLJ:function (gljList) {
  822. let typeMap = {};
  823. for(let ch of $(".pglj_sel_input:checked")){
  824. typeMap[$(ch).val()] = true;
  825. }
  826. let inputV = $("#pglj_sel_input").val();
  827. return _.filter(gljList,function (item) {
  828. if(item.quantity === 0 || item.quantity === '0') return false;
  829. let firstS = (item.type+"").substring(0,1);
  830. if(!typeMap[firstS]) return false;
  831. if(inputV!=""){//输入的关键字过滤
  832. if(item.code.indexOf(inputV)==-1 && item.name.indexOf(inputV)==-1) return false
  833. }
  834. return true;
  835. });
  836. },
  837. refreshDatas:function () {
  838. this.checkByType(this.checkType);
  839. sheetCommonObj.showData(this.sheet, this.setting,this.datas);
  840. this.sheet.setRowCount(this.datas.length);
  841. },
  842. getSheetDatas(glj){
  843. let projectGLJ = projectObj.project.projectGLJ;
  844. let materialIdList = projectGLJ.datas.constData.materialIdList;
  845. let data = materialAdjustObj.getCommonObject(glj);
  846. data.select = projectGljObject.displayType == filterType.ZGCL?glj.is_evaluate:glj.is_eval_material;
  847. data.from = glj;
  848. data.short_name = projectGLJ.getShortNameByID(glj.type);
  849. // 只有材料才显示是否暂估
  850. // if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
  851. data.is_eval_material = glj.is_eval_material;
  852. data.is_evaluate = glj.is_evaluate;
  853. return data;
  854. },
  855. checkByType:function (type) {
  856. for(let d of this.datas){
  857. d.select = 0;
  858. switch (type){
  859. case "全选":
  860. d.select = 1;
  861. break;
  862. case "全选主材":
  863. if(d.type == 4) d.select = 1;
  864. break;
  865. case "全选设备":
  866. if(d.type == 5) d.select = 1;
  867. break;
  868. case "取消":
  869. d.select = projectGljObject.displayType == filterType.ZGCL?d.is_evaluate:d.is_eval_material;
  870. break;
  871. }
  872. }
  873. //this.refreshDatas();
  874. },
  875. confirmSelect:function () {
  876. let tasks = [];
  877. let datas = [],modelType= '',field= '';
  878. switch (projectGljObject.displayType){
  879. case filterType.ZGCL:
  880. datas = projectObj.project.evaluate_list.datas;
  881. field = "is_evaluate";
  882. modelType="evaluate_list";
  883. break;
  884. case filterType.PBCL:
  885. datas =projectObj.project.bid_evaluation_list.datas;
  886. field = "is_eval_material";
  887. modelType="bid_evaluation_list";
  888. break;
  889. }
  890. let evaluateMap = _.indexBy(datas,"projectGLJID");
  891. let evaluateKeyMap = {};//关键字映射表
  892. for(let e of datas){
  893. let eIndex = gljUtil.getIndex(e,gljUtil.materialKeyArray);
  894. evaluateKeyMap[eIndex] = e;
  895. }
  896. for(let d of this.datas){
  897. if(d.select == 1){//如果是选中状态
  898. if(d[field] == 1) {//如果已经标记为暂估或评标材料,查看是否已经存在关联的材料
  899. let evl = evaluateMap[d.id];
  900. if(evl){
  901. //这里应该是错误检查的保证,按正常是不应该出现这种情况的
  902. if(evl.is_related !=1) tasks.push({type:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evl.ID});
  903. }else {
  904. tasks.push(getNewEval(d,modelType))
  905. }
  906. }else {//如果不是暂估,要改成暂估
  907. let pdata = {id:d.id,doc:{},action:'update',type:"glj_list"};
  908. pdata.doc[field] = 1;
  909. tasks.push(pdata);
  910. let evaluate = evaluateKeyMap[gljUtil.getIndex(d,gljUtil.materialKeyArray)];
  911. if(evaluate) {//如果已经存在5个关键字相同的暂估材料,则自动关联起来
  912. let edata = {type:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evaluate.ID};
  913. tasks.push(edata);
  914. if(modelType == 'evaluate_list'){
  915. let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:d.id,id : d.from.unit_price.id};
  916. if(evaluate.market_price != d.from.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
  917. if(!_.isEmpty(udata.doc)) tasks.push(udata);
  918. }
  919. }else {//如果不存在,则生成一条新的
  920. tasks.push(getNewEval(d,modelType));
  921. }
  922. }
  923. }else {//未选中状态的,检查一下是否存在关联的情况,取消关联
  924. let tdoc = {};
  925. tdoc[field] = 0;
  926. if(d[field] == 1) tasks.push({id:d.id,doc:tdoc,action:'update',type:"glj_list"});
  927. let evl = evaluateMap[d.id];
  928. if(evl){
  929. if(evl.is_related ==1) tasks.push({type:modelType,doc:{is_related:0},action:"update",ID:evl.ID});
  930. }
  931. let evaluate = evaluateKeyMap[gljUtil.getIndex(d,gljUtil.materialKeyArray)];
  932. if(evaluate) {
  933. if(evaluate.is_related ==1) tasks.push({type:modelType,doc:{is_related:0},action:"update",ID:evaluate.ID});
  934. }
  935. }
  936. }
  937. if(tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
  938. function getNewEval(d,m_t) {
  939. let ndata = {type:m_t,doc:{},action:"add"};
  940. ndata.doc['ID'] = uuid.v1();
  941. ndata.doc['projectGLJID'] = d.id;
  942. ndata.doc['is_related'] = 1;
  943. if(m_t == "evaluate_list")ndata.doc['locked'] = 0;
  944. ndata.doc['seq'] = d.code;
  945. ndata.doc['projectID'] = d.from.project_id;
  946. ndata.doc['code'] = d.code;
  947. ndata.doc['name'] = d.name;
  948. ndata.doc['specs'] = d.specs;
  949. ndata.doc['unit'] = d.unit;
  950. ndata.doc['quantity'] = d.quantity;
  951. ndata.doc['type'] = d.type;
  952. ndata.doc['market_price'] = d.from.unit_price.market_price;
  953. ndata.doc['originPlace'] = d.originPlace;
  954. ndata.doc['vender'] = d.vender;
  955. ndata.doc['remark'] = d.remark;
  956. return ndata;
  957. }
  958. }
  959. };
  960. $(function () {
  961. $("#filterAgain").click(function(){
  962. configMaterialObj.relateFilterAgain = true;//重新过滤标记
  963. configMaterialObj.showEvaluateRelateDatas();
  964. })
  965. $('#selectPGLJ').on('shown.bs.modal',function(e){
  966. pgljSelObj.checkType="取消";
  967. pgljSelObj.initSpread();
  968. pgljSelObj.showDatas();
  969. });
  970. $(".pglj_sel_input").change(function () {
  971. let check = $(this).prop("checked");
  972. if($(this).val() == 0){//勾选的是全选,其它的勾选项跟着改变
  973. for(let a of $(".pglj_sel_input")){
  974. $(a).prop("checked",check)
  975. }
  976. }else {//勾选其它选项
  977. let a_checked = true;
  978. for(let o of $(".pglj_sel_input_other")){//如果其它的有一个不勾选,则所有项也不打勾
  979. if($(o).prop("checked") === false){
  980. a_checked = false;
  981. break;
  982. }
  983. }
  984. $("#pglj_sel_all").prop("checked",a_checked);
  985. }
  986. pgljSelObj.showDatas();
  987. });
  988. $("#pglj_sel_btn_find").click(function () {
  989. pgljSelObj.showDatas();
  990. });
  991. $(".pglj_sel_check_btn").click(function () {
  992. pgljSelObj.checkType = $(this).text();
  993. pgljSelObj.refreshDatas();
  994. })
  995. $("#pglj_sel_confirm").click(function () {
  996. pgljSelObj.confirmSelect();
  997. })
  998. });